X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinestate_backend.cpp;h=7af36eedf82ceadced50b3f576b103ceeff584f8;hp=5f9e7eb9185a4e812c1826edf0e071677e2b20d7;hb=cebf1330ef6773b7b4496dc279ec02a7ca4351bb;hpb=2a70fecfbbe8708be2bdaa75d222dd5a889a8ed3 diff --git a/source/backends/vulkan/pipelinestate_backend.cpp b/source/backends/vulkan/pipelinestate_backend.cpp index 5f9e7eb9..7af36eed 100644 --- a/source/backends/vulkan/pipelinestate_backend.cpp +++ b/source/backends/vulkan/pipelinestate_backend.cpp @@ -48,8 +48,11 @@ void VulkanPipelineState::update() const push_const_compat = hash_update<32>(push_const_compat, self.shprog->get_push_constants_size()); } - constexpr unsigned pipeline_mask = PipelineState::SHPROG|PipelineState::VERTEX_SETUP|PipelineState::FACE_CULL| + constexpr unsigned graphics_mask = PipelineState::VERTEX_SETUP|PipelineState::FACE_CULL| PipelineState::DEPTH_TEST|PipelineState::STENCIL_TEST|PipelineState::BLEND|PipelineState::PRIMITIVE_TYPE; + unsigned pipeline_mask = PipelineState::SHPROG; + if(!self.shprog->is_compute()) + pipeline_mask |= graphics_mask; if(changes&pipeline_mask) { handle = device.get_pipeline_cache().get_pipeline(self); @@ -98,50 +101,63 @@ void VulkanPipelineState::update() const uint64_t VulkanPipelineState::compute_hash() const { const PipelineState &self = *static_cast(this); - const FrameFormat &format = self.framebuffer->get_format(); uint64_t result = hash<64>(self.shprog); - result = hash_update<64>(result, self.vertex_setup->compute_hash()); - result = hash_round<64>(result, self.primitive_type); - if(self.front_face!=NON_MANIFOLD && self.face_cull!=NO_CULL) + if(!self.shprog->is_compute()) { - result = hash_round<64>(result, self.front_face); - result = hash_round<64>(result, self.face_cull); - } + const FrameFormat &format = self.framebuffer->get_format(); - result = hash_round<64>(result, format.get_samples()); + result = hash_update<64>(result, self.vertex_setup->compute_hash()); + result = hash_round<64>(result, self.primitive_type); - if(self.depth_test.enabled) - { - result = hash_round<64>(result, self.depth_test.compare); - result = hash_update<64>(result, self.depth_test.write); - } + if(self.front_face!=NON_MANIFOLD && self.face_cull!=NO_CULL) + { + result = hash_round<64>(result, self.front_face); + result = hash_round<64>(result, self.face_cull); + } - if(self.stencil_test.enabled) - { - result = hash_round<64>(result, self.stencil_test.compare); - result = hash_round<64>(result, self.stencil_test.stencil_fail_op); - result = hash_round<64>(result, self.stencil_test.depth_fail_op); - result = hash_round<64>(result, self.stencil_test.depth_pass_op); - result = hash_update<64>(result, self.stencil_test.reference); - } + result = hash_round<64>(result, format.get_samples()); - if(self.blend.enabled) - { - result = hash_round<64>(result, self.blend.equation); - result = hash_round<64>(result, self.blend.src_factor); - result = hash_round<64>(result, self.blend.dst_factor); - result = hash_round<64>(result, self.blend.write_mask); - } + if(self.depth_test.enabled) + { + result = hash_round<64>(result, self.depth_test.compare); + result = hash_update<64>(result, self.depth_test.write); + } - for(FrameAttachment a: format) - result = hash_update<64>(result, a); + if(self.stencil_test.enabled) + { + result = hash_round<64>(result, self.stencil_test.compare); + result = hash_round<64>(result, self.stencil_test.stencil_fail_op); + result = hash_round<64>(result, self.stencil_test.depth_fail_op); + result = hash_round<64>(result, self.stencil_test.depth_pass_op); + result = hash_update<64>(result, self.stencil_test.reference); + } + + if(self.blend.enabled) + { + result = hash_round<64>(result, self.blend.equation); + result = hash_round<64>(result, self.blend.src_factor); + result = hash_round<64>(result, self.blend.dst_factor); + result = hash_round<64>(result, self.blend.write_mask); + } + + for(FrameAttachment a: format) + result = hash_update<64>(result, a); + } return result; } void VulkanPipelineState::fill_creation_info(vector &buffer) const +{ + if(static_cast(this)->shprog->is_compute()) + fill_compute_creation_info(buffer); + else + fill_graphics_creation_info(buffer); +} + +void VulkanPipelineState::fill_graphics_creation_info(vector &buffer) const { const PipelineState &self = *static_cast(this); @@ -266,6 +282,22 @@ void VulkanPipelineState::fill_creation_info(vector &buffer) const pipeline_info->pVertexInputState = reinterpret_cast(self.vertex_setup->creation_info.data()); } +void VulkanPipelineState::fill_compute_creation_info(vector &buffer) const +{ + const PipelineState &self = *static_cast(this); + + StructureBuilder sb(buffer, 1); + VkComputePipelineCreateInfo *const &pipeline_info = sb.add(); + + pipeline_info->sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + + if(self.shprog) + { + pipeline_info->stage = *reinterpret_cast(self.shprog->creation_info.data()); + pipeline_info->layout = handle_cast<::VkPipelineLayout>(self.shprog->layout_handle); + } +} + uint64_t VulkanPipelineState::compute_descriptor_set_hash(unsigned index) const { const PipelineState &self = *static_cast(this); @@ -446,10 +478,11 @@ void VulkanPipelineState::apply(const VulkanCommandRecorder &vkCmd, const Vulkan unapplied |= PipelineState::SCISSOR; } + VkPipelineBindPoint bind_point = (self.shprog->is_compute() ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS); if(unapplied&PipelineState::SHPROG) - vkCmd.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, handle); + vkCmd.BindPipeline(bind_point, handle); - if(unapplied&PipelineState::VERTEX_SETUP) + if(!self.shprog->is_compute() && (unapplied&PipelineState::VERTEX_SETUP)) if(const VertexSetup *vs = self.vertex_setup) { vkCmd.BindVertexBuffers(0, vs->n_bindings, vs->buffers, vs->offsets); @@ -476,11 +509,11 @@ void VulkanPipelineState::apply(const VulkanCommandRecorder &vkCmd, const Vulkan descriptor_set_handles.push_back(device.get_descriptor_pool().get_descriptor_set( self.descriptor_set_slots[i], self, i, frame)); - vkCmd.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, self.shprog->layout_handle, + vkCmd.BindDescriptorSets(bind_point, self.shprog->layout_handle, first_changed_desc_set, descriptor_set_handles.size(), descriptor_set_handles.data(), 0, 0); } - if(unapplied&(PipelineState::VIEWPORT|PipelineState::SCISSOR)) + if(!self.shprog->is_compute() && (unapplied&(PipelineState::VIEWPORT|PipelineState::SCISSOR))) { Rect fb_rect = self.framebuffer->get_rect();