X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinestate_backend.cpp;h=444d5f664ab9d3c3135c3296881e4fc790fe3b67;hp=4714ff67015a1fe736d3459f1375f8a39ccd4677;hb=a16145549dc87c3b12671f797bd77b14bcc7786b;hpb=bbdf52425b736a59d01dda215458c3a1c9bdb320 diff --git a/source/backends/vulkan/pipelinestate_backend.cpp b/source/backends/vulkan/pipelinestate_backend.cpp index 4714ff67..444d5f66 100644 --- a/source/backends/vulkan/pipelinestate_backend.cpp +++ b/source/backends/vulkan/pipelinestate_backend.cpp @@ -51,6 +51,15 @@ void VulkanPipelineState::update() const changed_sets |= 1<<(u.binding>>20); u.changed = false; } + for(const PipelineState::BoundTexture &t: self.textures) + if(t.changed || changed_sets==~0U) + { + t.used = self.shprog->uses_binding(t.binding); + changed_sets |= 1<<(t.binding>>20); + if(t.sampler) + t.sampler->refresh(); + t.changed = false; + } descriptor_set_handles.resize(self.shprog->get_n_descriptor_sets()); for(unsigned i=0; i(result, b.binding); result = hash_update<64>(result, reinterpret_cast(b.block)); } + for(const PipelineState::BoundTexture &t: self.textures) + if(t.used && (t.binding>>20)==index) + { + result = hash_update<64>(result, t.binding); + result = hash_update<64>(result, reinterpret_cast(t.texture)); + result = hash_update<64>(result, reinterpret_cast(t.sampler)); + } return result; } @@ -282,13 +298,20 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector=0 && static_cast(u.binding>>20)==index) ++n_buffers; - - StructureBuilder sb(buffer, 2); - VkWriteDescriptorSet *&writes = sb.add(n_buffers); + unsigned n_images = 0; + for(const PipelineState::BoundTexture &t: self.textures) + if(t.used && (t.binding>>20)==index) + ++n_images; + unsigned n_writes = n_buffers+n_images; + + StructureBuilder sb(buffer, 3); + VkWriteDescriptorSet *&writes = sb.add(n_writes); VkDescriptorBufferInfo *&buffers = sb.add(n_buffers); + VkDescriptorImageInfo *&images = sb.add(n_images); VkWriteDescriptorSet *write_ptr = writes; VkDescriptorBufferInfo *buffer_ptr = buffers; + VkDescriptorImageInfo *image_ptr = images; for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks) if(u.used && u.binding>=0 && static_cast(u.binding>>20)==index) @@ -307,7 +330,24 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, vector>20)==index) + { + image_ptr->sampler = handle_cast<::VkSampler>(t.sampler->handle); + image_ptr->imageView = handle_cast<::VkImageView>(t.texture->view_handle); + image_ptr->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + write_ptr->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + write_ptr->dstBinding = t.binding&0xFFFFF; + write_ptr->descriptorCount = 1; + write_ptr->descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + write_ptr->pImageInfo = image_ptr; + + ++image_ptr; + ++write_ptr; + } + + return n_writes; } void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const