X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinestate_backend.cpp;h=419a7e4c149545b3de9ce19cd211da7bef5e563d;hb=806f14bc256bfb9dcd435e9985fabac8898e25f6;hp=444d5f664ab9d3c3135c3296881e4fc790fe3b67;hpb=a16145549dc87c3b12671f797bd77b14bcc7786b;p=libs%2Fgl.git diff --git a/source/backends/vulkan/pipelinestate_backend.cpp b/source/backends/vulkan/pipelinestate_backend.cpp index 444d5f66..419a7e4c 100644 --- a/source/backends/vulkan/pipelinestate_backend.cpp +++ b/source/backends/vulkan/pipelinestate_backend.cpp @@ -35,6 +35,9 @@ void VulkanPipelineState::update() const { const PipelineState &self = *static_cast(this); + if(self.changes&PipelineState::VERTEX_SETUP) + self.vertex_setup->refresh(); + constexpr unsigned pipeline_mask = PipelineState::SHPROG|PipelineState::VERTEX_SETUP|PipelineState::FACE_CULL| PipelineState::DEPTH_TEST|PipelineState::STENCIL_TEST|PipelineState::BLEND|PipelineState::PRIMITIVE_TYPE; if(self.changes&pipeline_mask) @@ -46,7 +49,7 @@ void VulkanPipelineState::update() const for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks) if(u.changed || changed_sets==~0U) { - u.used = self.shprog->uses_binding(u.binding); + u.used = self.shprog->uses_uniform_block_binding(u.binding); if(u.binding>=0) changed_sets |= 1<<(u.binding>>20); u.changed = false; @@ -54,8 +57,10 @@ void VulkanPipelineState::update() const for(const PipelineState::BoundTexture &t: self.textures) if(t.changed || changed_sets==~0U) { - t.used = self.shprog->uses_binding(t.binding); + t.used = self.shprog->uses_texture_binding(t.binding); changed_sets |= 1<<(t.binding>>20); + if(t.texture && t.level>=0) + t.texture->refresh_mip_views(); if(t.sampler) t.sampler->refresh(); t.changed = false; @@ -257,10 +262,7 @@ void VulkanPipelineState::fill_creation_info(vector &buffer) const } if(self.vertex_setup) - { - self.vertex_setup->refresh(); pipeline_info->pVertexInputState = reinterpret_cast(self.vertex_setup->creation_info.data()); - } } uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const @@ -280,6 +282,7 @@ uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const 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)); + result = hash_update<64>(result, t.level); } return result; @@ -334,7 +337,10 @@ 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); + if(t.level<0) + image_ptr->imageView = handle_cast<::VkImageView>(t.texture->view_handle); + else + image_ptr->imageView = handle_cast<::VkImageView>(t.texture->mip_view_handles[t.level]); image_ptr->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; write_ptr->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -369,12 +375,13 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer) const if(first_block.used && first_block.binding==ReflectData::PUSH_CONSTANT) { const UniformBlock &pc_block = *first_block.block; - vk.CmdPushConstants(command_buffer, self.shprog->layout_handle, VK_SHADER_STAGE_ALL, + vk.CmdPushConstants(command_buffer, self.shprog->layout_handle, self.shprog->stage_flags, pc_block.get_offset(), pc_block.get_data_size(), pc_block.get_data_pointer()); } } - vk.CmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, self.shprog->layout_handle, 0, descriptor_set_handles.size(), descriptor_set_handles.data(), 0, 0); + if(!descriptor_set_handles.empty()) + vk.CmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, self.shprog->layout_handle, 0, descriptor_set_handles.size(), descriptor_set_handles.data(), 0, 0); VkViewport viewport = { }; if(self.viewport)