diff --git a/util/test/demos/vk/vk_test.cpp b/util/test/demos/vk/vk_test.cpp index 7fe3c72c7..e8e910b10 100644 --- a/util/test/demos/vk/vk_test.cpp +++ b/util/test/demos/vk/vk_test.cpp @@ -921,6 +921,43 @@ void VulkanGraphicsTest::Present() mainWindow->Present(queue); } +VkPipelineShaderStageCreateInfo VulkanGraphicsTest::LoadShaderModule(const std::string &filename, + ShaderStage stage, + const char *entry_point) +{ + VkShaderModule ret = VK_NULL_HANDLE; + + std::vector spirv; + + FILE *f = fopen(filename.c_str(), "rb"); + if(f) + { + fseek(f, 0, SEEK_END); + spirv.resize(ftell(f) / sizeof(uint32_t)); + fseek(f, 0, SEEK_SET); + fread(spirv.data(), sizeof(uint32_t), spirv.size(), f); + fclose(f); + } + + if(spirv.empty()) + return {}; + + CHECK_VKR(vkCreateShaderModule(device, vkh::ShaderModuleCreateInfo(spirv), NULL, &ret)); + + shaders.push_back(ret); + + VkShaderStageFlagBits vkstage[] = { + VK_SHADER_STAGE_VERTEX_BIT, + VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, + VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, + VK_SHADER_STAGE_GEOMETRY_BIT, + VK_SHADER_STAGE_FRAGMENT_BIT, + VK_SHADER_STAGE_COMPUTE_BIT, + }; + + return vkh::PipelineShaderStageCreateInfo(ret, vkstage[(int)stage], entry_point); +} + VkPipelineShaderStageCreateInfo VulkanGraphicsTest::CompileShaderModule( const std::string &source_text, ShaderLang lang, ShaderStage stage, const char *entry_point, const std::map ¯os, SPIRVTarget target) diff --git a/util/test/demos/vk/vk_test.h b/util/test/demos/vk/vk_test.h index 257ea28dd..0d6ed857b 100644 --- a/util/test/demos/vk/vk_test.h +++ b/util/test/demos/vk/vk_test.h @@ -217,6 +217,8 @@ struct VulkanGraphicsTest : public GraphicsTest void SubmitAndPresent(const std::vector &cmds); void Present(); + VkPipelineShaderStageCreateInfo LoadShaderModule(const std::string &filename, ShaderStage stage, + const char *entry_point = "main"); VkPipelineShaderStageCreateInfo CompileShaderModule( const std::string &source_text, ShaderLang lang, ShaderStage stage, const char *entry_point = "main", const std::map ¯os = {},