]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/program_backend.cpp
Add tessellation shader support to the engine
[libs/gl.git] / source / backends / vulkan / program_backend.cpp
index a2c40ad3fec3feb0492a49f8f3296ed8d6c1eb2b..10c04d83e7eabe6c6cb3cd7b79f5dfbc84ee7b34 100644 (file)
@@ -59,11 +59,11 @@ void VulkanProgram::add_spirv_stages(const SpirVModule &mod, const map<string, i
                entry_names_size += e.name.size()+1;
 
        StructureBuilder sb(creation_info, 5);
-       VkPipelineShaderStageCreateInfo *&stage_infos = sb.add<VkPipelineShaderStageCreateInfo>(n_stages);
-       char *&name_table = sb.add<char>(entry_names_size);
-       VkSpecializationInfo *&spec_info = sb.add<VkSpecializationInfo>();
-       VkSpecializationMapEntry *&spec_map = sb.add<VkSpecializationMapEntry>(spec_values.size());
-       int *&spec_data = sb.add<int>(spec_values.size());
+       VkPipelineShaderStageCreateInfo *const &stage_infos = sb.add<VkPipelineShaderStageCreateInfo>(n_stages);
+       char *const &name_table = sb.add<char>(entry_names_size);
+       VkSpecializationInfo *const &spec_info = sb.add<VkSpecializationInfo>();
+       VkSpecializationMapEntry *const &spec_map = sb.add<VkSpecializationMapEntry>(spec_values.size());
+       int *const &spec_data = sb.add<int>(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