]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Store simpler states by value in PipelineState
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index 84609ab03666370a0ce0793f3e6bdc4e9961daaf..efa08a8634ecf15b755b459121f629a2682da529 100644 (file)
@@ -94,31 +94,28 @@ uint64_t VulkanPipelineState::compute_hash() const
 
        result = hash_round<64>(result, format.get_samples());
 
-       if(const DepthTest *depth_test = self.depth_test)
-               if(depth_test->enabled)
-               {
-                       result = hash_round<64>(result, depth_test->compare);
-                       result = hash_update<64>(result, depth_test->write);
-               }
+       if(self.depth_test.enabled)
+       {
+               result = hash_round<64>(result, self.depth_test.compare);
+               result = hash_update<64>(result, self.depth_test.write);
+       }
 
-       if(const StencilTest *stencil_test = self.stencil_test)
-               if(stencil_test->enabled)
-               {
-                       result = hash_round<64>(result, stencil_test->compare);
-                       result = hash_round<64>(result, stencil_test->stencil_fail_op);
-                       result = hash_round<64>(result, stencil_test->depth_fail_op);
-                       result = hash_round<64>(result, stencil_test->depth_pass_op);
-                       result = hash_update<64>(result, stencil_test->reference);
-               }
+       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(const Blend *blend = self.blend)
-               if(blend->enabled)
-               {
-                       result = hash_round<64>(result, blend->equation);
-                       result = hash_round<64>(result, blend->src_factor);
-                       result = hash_round<64>(result, blend->dst_factor);
-                       result = hash_round<64>(result, blend->write_mask);
-               }
+       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);
@@ -192,44 +189,31 @@ void VulkanPipelineState::fill_creation_info(vector<char> &buffer) const
        multisample_info->alphaToOneEnable = VK_FALSE;
 
        depth_stencil_info->sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
-       if(const DepthTest *depth_test = self.depth_test)
-       {
-               depth_stencil_info->depthTestEnable = depth_test->enabled;
-               depth_stencil_info->depthWriteEnable = depth_test->write;
-               depth_stencil_info->depthCompareOp = static_cast<VkCompareOp>(get_vulkan_predicate(depth_test->compare));
-               depth_stencil_info->depthBoundsTestEnable = VK_FALSE;
-       }
-       if(const StencilTest *stencil_test = self.stencil_test)
+       depth_stencil_info->depthTestEnable = self.depth_test.enabled;
+       depth_stencil_info->depthWriteEnable = self.depth_test.write;
+       depth_stencil_info->depthCompareOp = static_cast<VkCompareOp>(get_vulkan_predicate(self.depth_test.compare));
+       depth_stencil_info->depthBoundsTestEnable = VK_FALSE;
+
+       depth_stencil_info->stencilTestEnable = self.stencil_test.enabled;
+       depth_stencil_info->front.failOp = static_cast<VkStencilOp>(get_vulkan_stencil_op(self.stencil_test.stencil_fail_op));
+       depth_stencil_info->front.passOp = static_cast<VkStencilOp>(get_vulkan_stencil_op(self.stencil_test.depth_pass_op));
+       depth_stencil_info->front.depthFailOp = static_cast<VkStencilOp>(get_vulkan_stencil_op(self.stencil_test.depth_fail_op));
+       depth_stencil_info->front.compareOp = static_cast<VkCompareOp>(get_vulkan_predicate(self.stencil_test.compare));
+       depth_stencil_info->front.compareMask = 0xFFFFFFFFU;
+       depth_stencil_info->front.writeMask = 0xFFFFFFFFU;
+       depth_stencil_info->front.reference = self.stencil_test.reference;
+       depth_stencil_info->back = depth_stencil_info->front;
+
+       for(unsigned i=0; i<n_color_attachments; ++i)
        {
-               depth_stencil_info->stencilTestEnable = stencil_test->enabled;
-               depth_stencil_info->front.failOp = static_cast<VkStencilOp>(get_vulkan_stencil_op(stencil_test->stencil_fail_op));
-               depth_stencil_info->front.passOp = static_cast<VkStencilOp>(get_vulkan_stencil_op(stencil_test->depth_pass_op));
-               depth_stencil_info->front.depthFailOp = static_cast<VkStencilOp>(get_vulkan_stencil_op(stencil_test->depth_fail_op));
-               depth_stencil_info->front.compareOp = static_cast<VkCompareOp>(get_vulkan_predicate(stencil_test->compare));
-               depth_stencil_info->front.compareMask = 0xFFFFFFFFU;
-               depth_stencil_info->front.writeMask = 0xFFFFFFFFU;
-               depth_stencil_info->front.reference = stencil_test->reference;
-               depth_stencil_info->back = depth_stencil_info->front;
-       }
-
-       if(const Blend *blend = self.blend)
-       {
-               for(unsigned i=0; i<n_color_attachments; ++i)
-               {
-                       blend_attachments[i].blendEnable = blend->enabled;
-                       blend_attachments[i].srcColorBlendFactor = static_cast<VkBlendFactor>(get_vulkan_blend_factor(blend->src_factor));
-                       blend_attachments[i].dstColorBlendFactor = static_cast<VkBlendFactor>(get_vulkan_blend_factor(blend->dst_factor));
-                       blend_attachments[i].colorBlendOp = static_cast<VkBlendOp>(get_vulkan_blend_equation(blend->equation));
-                       blend_attachments[i].srcAlphaBlendFactor = blend_attachments[i].srcColorBlendFactor;
-                       blend_attachments[i].dstAlphaBlendFactor = blend_attachments[i].dstColorBlendFactor;
-                       blend_attachments[i].alphaBlendOp = blend_attachments[i].colorBlendOp;
-                       blend_attachments[i].colorWriteMask = get_vulkan_color_mask(blend->write_mask);
-               }
-       }
-       else
-       {
-               for(unsigned i=0; i<n_color_attachments; ++i)
-                       blend_attachments[i].colorWriteMask = VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT;
+               blend_attachments[i].blendEnable = self.blend.enabled;
+               blend_attachments[i].srcColorBlendFactor = static_cast<VkBlendFactor>(get_vulkan_blend_factor(self.blend.src_factor));
+               blend_attachments[i].dstColorBlendFactor = static_cast<VkBlendFactor>(get_vulkan_blend_factor(self.blend.dst_factor));
+               blend_attachments[i].colorBlendOp = static_cast<VkBlendOp>(get_vulkan_blend_equation(self.blend.equation));
+               blend_attachments[i].srcAlphaBlendFactor = blend_attachments[i].srcColorBlendFactor;
+               blend_attachments[i].dstAlphaBlendFactor = blend_attachments[i].dstColorBlendFactor;
+               blend_attachments[i].alphaBlendOp = blend_attachments[i].colorBlendOp;
+               blend_attachments[i].colorWriteMask = get_vulkan_color_mask(self.blend.write_mask);
        }
 
        blend_info->sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
@@ -400,21 +384,14 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer, unsigned frame,
                        0, descriptor_set_handles.size(), descriptor_set_handles.data(), dynamic_offsets.size(), dynamic_offsets.data());
        }
 
+       Rect fb_rect = self.framebuffer->get_rect();
+
+       Rect viewport_rect = fb_rect.intersect(self.viewport);
        VkViewport viewport = { };
-       if(self.viewport)
-       {
-               viewport.x = self.viewport->left;
-               viewport.y = self.viewport->bottom;
-               viewport.width = self.viewport->width;
-               viewport.height = self.viewport->height;
-       }
-       else
-       {
-               viewport.x = 0;
-               viewport.y = 0;
-               viewport.width = self.framebuffer->get_width();
-               viewport.height = self.framebuffer->get_height();
-       }
+       viewport.x = viewport_rect.left;
+       viewport.y = viewport_rect.bottom;
+       viewport.width = viewport_rect.width;
+       viewport.height = viewport_rect.height;
        if(negative_viewport)
        {
                viewport.y += viewport.height;
@@ -424,21 +401,12 @@ void VulkanPipelineState::apply(VkCommandBuffer command_buffer, unsigned frame,
        viewport.maxDepth = 1.0f;
        vk.CmdSetViewport(command_buffer, 0, 1, &viewport);
 
+       Rect scissor_rect = fb_rect.intersect(self.scissor);
        VkRect2D scissor = { };
-       if(self.scissor)
-       {
-               scissor.offset.x = self.scissor->left;
-               scissor.offset.y = self.scissor->bottom;
-               scissor.extent.width = self.scissor->width;
-               scissor.extent.height = self.scissor->height;
-       }
-       else
-       {
-               scissor.offset.x = 0;
-               scissor.offset.y = 0;
-               scissor.extent.width = self.framebuffer->get_width();
-               scissor.extent.height = self.framebuffer->get_height();
-       }
+       scissor.offset.x = scissor_rect.left;
+       scissor.offset.y = scissor_rect.bottom;
+       scissor.extent.width = scissor_rect.width;
+       scissor.extent.height = scissor_rect.height;
        vk.CmdSetScissor(command_buffer, 0, 1, &scissor);
 }