X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fprogram_backend.cpp;h=993a3e38ef965d11b838fb9b41653cb2fe5b3b29;hb=cebf1330ef6773b7b4496dc279ec02a7ca4351bb;hp=2e9518108eca16e32ba9de5d9325343c1b469a05;hpb=542c01f2798ad38279b043011a5bf1d1b975eb07;p=libs%2Fgl.git diff --git a/source/backends/vulkan/program_backend.cpp b/source/backends/vulkan/program_backend.cpp index 2e951810..993a3e38 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()) @@ -128,7 +128,7 @@ void VulkanProgram::finalize_uniforms() binding.binding = b.bind_point&0xFFFFF; binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; binding.descriptorCount = 1; - binding.stageFlags = VK_SHADER_STAGE_ALL; + binding.stageFlags = stage_flags; binding.pImmutableSamplers = 0; } @@ -138,9 +138,12 @@ 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 = VK_SHADER_STAGE_ALL; + binding.stageFlags = stage_flags; binding.pImmutableSamplers = 0; } @@ -165,12 +168,23 @@ void VulkanProgram::finalize_uniforms() layout_info.pPushConstantRanges = &push_const_range; vk.CreatePipelineLayout(layout_info, layout_handle); + +#if DEBUG + if(!debug_name.empty()) + set_vulkan_object_name(); +#endif +} + +bool VulkanProgram::is_compute() const +{ + return stage_flags&VK_SHADER_STAGE_COMPUTE_BIT; } void VulkanProgram::set_debug_name(const string &name) { #ifdef DEBUG debug_name = name; + set_vulkan_object_name(); if(SpirVModule *spirv = static_cast(this)->specialized_spirv) spirv->set_debug_name(debug_name); #else @@ -178,5 +192,30 @@ void VulkanProgram::set_debug_name(const string &name) #endif } +void VulkanProgram::set_vulkan_object_name() const +{ +#ifdef DEBUG + const VulkanFunctions &vk = device.get_functions(); + + string layout_name = debug_name+" [layout]"; + + VkDebugUtilsObjectNameInfoEXT name_info = { }; + name_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; + name_info.objectType = VK_OBJECT_TYPE_PIPELINE_LAYOUT; + name_info.objectHandle = reinterpret_cast(layout_handle); + name_info.pObjectName = layout_name.c_str(); + vk.SetDebugUtilsObjectName(name_info); + + name_info.objectType = VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT; + for(unsigned i=0; i(desc_set_layout_handles[i]); + name_info.pObjectName = layout_name.c_str(); + vk.SetDebugUtilsObjectName(name_info); + } +#endif +} + } // namespace GL } // namespace Msp