X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fprogram_backend.cpp;h=10c04d83e7eabe6c6cb3cd7b79f5dfbc84ee7b34;hb=9eb9f592d37e9a1e05c2ff70887a1c5f26b98864;hp=a2c40ad3fec3feb0492a49f8f3296ed8d6c1eb2b;hpb=9ef77734bac36f2b16380ef3e131d3164fe241ce;p=libs%2Fgl.git diff --git a/source/backends/vulkan/program_backend.cpp b/source/backends/vulkan/program_backend.cpp index a2c40ad3..10c04d83 100644 --- a/source/backends/vulkan/program_backend.cpp +++ b/source/backends/vulkan/program_backend.cpp @@ -59,11 +59,11 @@ void VulkanProgram::add_spirv_stages(const SpirVModule &mod, const map(n_stages); - char *&name_table = sb.add(entry_names_size); - VkSpecializationInfo *&spec_info = sb.add(); - VkSpecializationMapEntry *&spec_map = sb.add(spec_values.size()); - int *&spec_data = sb.add(spec_values.size()); + VkPipelineShaderStageCreateInfo *const &stage_infos = sb.add(n_stages); + char *const &name_table = sb.add(entry_names_size); + VkSpecializationInfo *const &spec_info = sb.add(); + VkSpecializationMapEntry *const &spec_map = sb.add(spec_values.size()); + int *const &spec_data = sb.add(spec_values.size()); unsigned i = 0; for(const SpirVModule::Constant &c: mod.get_spec_constants()) @@ -138,7 +138,10 @@ void VulkanProgram::finalize_uniforms() bindings.emplace_back(); VkDescriptorSetLayoutBinding &binding = bindings.back(); binding.binding = u.binding&0xFFFFF; - binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + if(is_sampled_image(u.type)) + binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + else + binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; binding.descriptorCount = 1; binding.stageFlags = stage_flags; binding.pImmutableSamplers = 0; @@ -172,6 +175,17 @@ void VulkanProgram::finalize_uniforms() #endif } +bool VulkanProgram::is_compute() const +{ + return stage_flags&VK_SHADER_STAGE_COMPUTE_BIT; +} + +bool VulkanProgram::has_tessellation() const +{ + constexpr unsigned tess_flags = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; + return (stage_flags&tess_flags)==tess_flags; +} + void VulkanProgram::set_debug_name(const string &name) { #ifdef DEBUG