diff --git a/shader_src/basic.vert b/shader_src/basic.vert index 3ebfb31..2588260 100644 --- a/shader_src/basic.vert +++ b/shader_src/basic.vert @@ -7,14 +7,13 @@ layout(buffer_reference, buffer_reference_align = 16) buffer ObjectBuffer { }; layout( push_constant ) uniform constants { - mat4 view; - mat4 proj; ObjectBuffer objects; -} scene; +} scene_pc; layout(set = 0, binding = 0) uniform SceneUniform { - mat4 test; -} scene_ubo; + mat4 view; + mat4 proj; +} scene; layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inColor; @@ -22,6 +21,6 @@ layout(location = 1) in vec3 inColor; layout(location = 0) out vec3 fragColor; void main() { - gl_Position = scene.proj * scene.view * scene.objects.model[0] * vec4(inPosition, 1.0); + gl_Position = scene.proj * scene.view * scene_pc.objects.model[0] * vec4(inPosition, 1.0); fragColor = inColor; } diff --git a/shader_src/texture.vert b/shader_src/texture.vert index 2d6cba1..8466ff1 100644 --- a/shader_src/texture.vert +++ b/shader_src/texture.vert @@ -6,14 +6,13 @@ layout(buffer_reference, buffer_reference_align = 16) buffer ObjectBuffer { }; layout( push_constant ) uniform constants { - mat4 view; - mat4 proj; ObjectBuffer objects; -} scene; +} scene_pc; layout(set = 0, binding = 0) uniform SceneUniformBuffer { - mat4 test; -} scene_ubo; + mat4 view; + mat4 proj; +} scene; layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inColor; @@ -23,7 +22,7 @@ layout(location = 0) out vec3 fragColor; layout(location = 1) out vec2 fragTex; void main() { - gl_Position = scene.proj * scene.view * scene.objects.model[1] * vec4(inPosition, 1.0); + gl_Position = scene.proj * scene.view * scene_pc.objects.model[1] * vec4(inPosition, 1.0); fragColor = inColor; fragTex = inTex; } diff --git a/src/main.c b/src/main.c index 14426c1..71459df 100644 --- a/src/main.c +++ b/src/main.c @@ -172,7 +172,6 @@ typedef struct SceneContextStruct { VkDescriptorSet* descriptors; GPUBuffer* ubos; void** ubo_ptrs; - uint32_t pcr_size; } SceneContext; struct TextureVertex { @@ -187,10 +186,6 @@ struct Vertex { }; struct SceneUBO { - uint32_t test; -}; - -struct ScenePC { mat4 view; mat4 proj; }; @@ -1312,7 +1307,7 @@ VkResult create_scene(){ return VK_SUCCESS; } -VkResult command_draw_scene(uint32_t pipelines_count, GraphicsPipeline* pipelines, uint32_t* object_counts, Object** objects, uint32_t frame_num, VkDescriptorSet* scene_descriptors, struct ScenePC* scene_constants, VkCommandBuffer command_buffer, VkRenderPass render_pass, VkFramebuffer framebuffer, VkExtent2D extent, VkDeviceAddress object_buffer_addr, int offscreen) { +VkResult command_draw_scene(uint32_t pipelines_count, GraphicsPipeline* pipelines, uint32_t* object_counts, Object** objects, uint32_t frame_num, VkDescriptorSet* scene_descriptors, VkCommandBuffer command_buffer, VkRenderPass render_pass, VkFramebuffer framebuffer, VkExtent2D extent, VkDeviceAddress object_buffer_addr, int offscreen) { VkCommandBufferBeginInfo begin_info = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, .flags = 0, @@ -1371,10 +1366,8 @@ VkResult command_draw_scene(uint32_t pipelines_count, GraphicsPipeline* pipeline }; vkCmdSetScissor(command_buffer, 0, 1, &scissor); - vkCmdPushConstants(command_buffer, pipelines[0].layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(struct ScenePC), scene_constants); - vkCmdPushConstants(command_buffer, pipelines[0].layout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(struct ScenePC), sizeof(VkDeviceAddress), &object_buffer_addr); + vkCmdPushConstants(command_buffer, pipelines[0].layout, VK_SHADER_STAGE_ALL, 0, sizeof(VkDeviceAddress), &object_buffer_addr); - // Bind the scene descriptor vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines[0].layout, 0, 1, &scene_descriptors[frame_num], 0, 0); for(uint i = 0; i < pipelines_count; i++) { @@ -1727,9 +1720,9 @@ VkResult create_graphics_pipeline( } VkPushConstantRange pcr = { - .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, + .stageFlags = VK_SHADER_STAGE_ALL, .offset = 0, - .size = sizeof(struct ScenePC) + sizeof(VkDeviceAddress), + .size = sizeof(VkDeviceAddress), }; VkPipelineLayoutCreateInfo layout_info = { @@ -2706,7 +2699,6 @@ SceneContext create_scene_context(VkDevice device, VkPhysicalDeviceMemoryPropert .descriptors = sets, .ubos = ubos, .ubo_ptrs = ubo_ptrs, - .pcr_size = sizeof(struct ScenePC), }; return scene; @@ -2846,7 +2838,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod vec3 world_position = {0.0f, 0.0f, 0.0f}; versor world_rotation = {-1.0f, 0.0f, 0.0f, 0.0f}; -struct ScenePC get_scene_constants(vec3 world_position, versor world_rotation, float aspect_ratio, float time_delta) { +struct SceneUBO get_scene_ubo(vec3 world_position, versor world_rotation, float aspect_ratio, float time_delta) { vec3 movement_sum = {0.0f, 0.0f, 0.0f}; if(key_flags.forward) { @@ -2923,16 +2915,17 @@ struct ScenePC get_scene_constants(vec3 world_position, versor world_rotation, f glm_quat_rotatev(world_rotation, movement_sum, movement_rot); glm_vec3_add(movement_rot, world_position, world_position); - struct ScenePC constants = {}; + struct SceneUBO ubo = {}; - glm_perspective(1.5708f, aspect_ratio, 0.01, 1000, constants.proj); - glm_quat_look(world_position, world_rotation, constants.view); + glm_perspective(1.5708f, aspect_ratio, 0.01, 1000, ubo.proj); + glm_quat_look(world_position, world_rotation, ubo.view); - return constants; + return ubo; } VkResult draw_frame(VulkanContext* context, SceneContext* scene, uint32_t pipelines_count, GraphicsPipeline* pipelines, uint32_t* objects_counts, Object** objects, VkDeviceAddress object_buffer_addr) { - struct ScenePC scene_constants = get_scene_constants(world_position, world_rotation, (float)context->swapchain_extent.width/(float)context->swapchain_extent.height, 0.01); + struct SceneUBO scene_ubo = get_scene_ubo(world_position, world_rotation, (float)context->swapchain_extent.width/(float)context->swapchain_extent.height, 0.01); + memcpy(scene->ubo_ptrs[context->current_frame], &scene_ubo, sizeof(struct SceneUBO)); VkResult result; result = vkWaitForFences(context->device, 1, &context->in_flight_fences[context->current_frame], VK_TRUE, UINT64_MAX); @@ -2956,7 +2949,7 @@ VkResult draw_frame(VulkanContext* context, SceneContext* scene, uint32_t pipeli return result; } - result = command_draw_scene(pipelines_count, pipelines, objects_counts, objects, context->current_frame, scene->descriptors, &scene_constants, context->swapchain_command_buffers[context->current_frame], context->render_pass, context->swapchain_framebuffers[image_index], context->swapchain_extent, object_buffer_addr, 0); + result = command_draw_scene(pipelines_count, pipelines, objects_counts, objects, context->current_frame, scene->descriptors, context->swapchain_command_buffers[context->current_frame], context->render_pass, context->swapchain_framebuffers[image_index], context->swapchain_extent, object_buffer_addr, 0); if(result != VK_SUCCESS) { return result; } @@ -2966,7 +2959,7 @@ VkResult draw_frame(VulkanContext* context, SceneContext* scene, uint32_t pipeli return result; } - result = command_draw_scene(pipelines_count, pipelines, objects_counts, objects, context->current_frame, scene->descriptors, &scene_constants, context->offscreen_command_buffers[context->current_frame], context->g_renderpass, context->g_framebuffer, context->swapchain_extent, object_buffer_addr, 1); + result = command_draw_scene(pipelines_count, pipelines, objects_counts, objects, context->current_frame, scene->descriptors, context->offscreen_command_buffers[context->current_frame], context->g_renderpass, context->g_framebuffer, context->swapchain_extent, object_buffer_addr, 1); if(result != VK_SUCCESS) { return result; }