diff options
author | gramanas <anastasis.gramm2@gmail.com> | 2024-05-21 11:56:12 +0300 |
---|---|---|
committer | gramanas <anastasis.gramm2@gmail.com> | 2024-05-21 11:56:12 +0300 |
commit | b04db611ed0eb7ec9e1b7d988f3031fe63a1de52 (patch) | |
tree | 91be243faa9c06f22379e8e774b14463b285a47b /src/game.c | |
parent | 7c26dcc4480025b5d11e315273541b3fb2c34a09 (diff) | |
download | cgame-b04db611ed0eb7ec9e1b7d988f3031fe63a1de52.tar.gz cgame-b04db611ed0eb7ec9e1b7d988f3031fe63a1de52.tar.bz2 cgame-b04db611ed0eb7ec9e1b7d988f3031fe63a1de52.zip |
hot reload shaders bby
Diffstat (limited to 'src/game.c')
-rw-r--r-- | src/game.c | 41 |
1 files changed, 31 insertions, 10 deletions
@@ -1,4 +1,3 @@ -#include <limits.h> #include <stdbool.h> #include <stdlib.h> #include <time.h> @@ -8,7 +7,6 @@ #define SDL_MAIN_HANDLED #define VK_USE_PLATFORM_XCB_KHR #include <SDL2/SDL.h> -#include <SDL2/SDL_image.h> #include <SDL2/SDL_vulkan.h> #include <vulkan/vulkan.h> @@ -23,9 +21,6 @@ #include "state.h" // embedded clgm library -#define CGLM_FORCE_DEPTH_ZERO_TO_ONE -#include "../lib/cglm/include/cglm/cglm.h" - uint32_t currentFrame = 0; state_t s; @@ -727,11 +722,21 @@ vulkan_create_graphics_pipeline() shaderc_compilation_result_t vert_result = load_compile_shader_data("src/shader.vert", shaderc_vertex_shader); if (!vert_result) { vk_log(VK_ERROR, "Can't load vertex shader\n"); + if (s.prev_vert_result) { + vert_result = s.prev_vert_result; + } } + if (s.prev_vert_result && vert_result != s.prev_vert_result) shaderc_result_release(s.prev_vert_result); + s.prev_vert_result = vert_result; shaderc_compilation_result_t frag_result = load_compile_shader_data("src/shader.frag", shaderc_fragment_shader); if (!frag_result) { vk_log(VK_ERROR, "Can't load fragment shader\n"); + if (s.prev_frag_result) { + frag_result = s.prev_frag_result; + } } + if (s.prev_frag_result && frag_result != s.prev_frag_result) shaderc_result_release(s.prev_frag_result); + s.prev_frag_result = frag_result; const char * vert_data = shaderc_result_get_bytes(vert_result); long vert_size = shaderc_result_get_length(vert_result); @@ -857,7 +862,7 @@ vulkan_create_graphics_pipeline() VkPipelineColorBlendStateCreateInfo colorBlending = {0}; colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - colorBlending.logicOpEnable = VK_FALSE; + colorBlending.logicOpEnable = VK_TRUE; colorBlending.logicOp = VK_LOGIC_OP_COPY; // Optional colorBlending.attachmentCount = 1; colorBlending.pAttachments = &colorBlendAttachment; @@ -900,8 +905,12 @@ vulkan_create_graphics_pipeline() vk_log(VK_ERROR, "failed to create graphics pipeline!\n"); } - shaderc_result_release(vert_result); - shaderc_result_release(frag_result); + if (s.prev_vert_result != vert_result) { + shaderc_result_release(vert_result); + } + if (s.prev_frag_result != frag_result) { + shaderc_result_release(frag_result); + } vkDestroyShaderModule(s.vk_device, fragShaderModule, NULL); vkDestroyShaderModule(s.vk_device, vertShaderModule, NULL); @@ -1233,7 +1242,8 @@ vulkan_create_descriptor_set_layout() uboLayoutBinding.binding = 0; uboLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; uboLayoutBinding.descriptorCount = 1; - uboLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + uboLayoutBinding.stageFlags = VK_SHADER_STAGE_ALL; + //uboLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; uboLayoutBinding.pImmutableSamplers = NULL; // optional VkDescriptorSetLayoutCreateInfo layoutInfo = {0}; @@ -1479,6 +1489,13 @@ close_vulkan() /* DestroyDebugUtilsMessengerEXT(s.vk_instance, s.vk_debug_messenger, NULL); */ /* } */ vkDestroyInstance(s.vk_instance, NULL); + + if (s.prev_vert_result) { + shaderc_result_release(s.prev_vert_result); + } + if (s.prev_frag_result) { + shaderc_result_release(s.prev_frag_result); + } } float @@ -1504,6 +1521,10 @@ updateUniformBuffer(uint32_t currentImage) float time = current_time(); UniformBufferObject ubo = {0}; + + ubo.resolution[0] = s.vk_swap_chain_extent.width; + ubo.resolution[1] = s.vk_swap_chain_extent.height; + glm_mat4_identity(ubo.model); if (s.rotate) @@ -1627,7 +1648,7 @@ main(int argc, char* args[]) while (!quit) { handle_input(&quit); draw_frame(); - //SDL_Delay(16); + SDL_Delay(16); } close_vulkan(); |