]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Synchronize sampled images in addition to storage images
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index 1578f9976d61452b200fd0066bb02f16ca4074e5..d8e4d4a1978504373e5614aad6e59555d358e955 100644 (file)
@@ -49,7 +49,8 @@ void VulkanPipelineState::update() const
        }
 
        constexpr unsigned graphics_mask = PipelineState::FRAMEBUFFER|PipelineState::VERTEX_SETUP|PipelineState::FACE_CULL|
-               PipelineState::DEPTH_TEST|PipelineState::STENCIL_TEST|PipelineState::BLEND|PipelineState::PRIMITIVE_TYPE;
+               PipelineState::DEPTH_TEST|PipelineState::STENCIL_TEST|PipelineState::BLEND|PipelineState::PRIMITIVE_TYPE|
+               PipelineState::PATCH_SIZE;
        unsigned pipeline_mask = PipelineState::SHPROG;
        if(!self.shprog->is_compute())
                pipeline_mask |= graphics_mask;
@@ -118,6 +119,8 @@ uint64_t VulkanPipelineState::compute_hash() const
                }
 
                result = hash_round<64>(result, format.get_samples());
+               if(format.get_samples()>1)
+                       result = hash_round<64>(result, self.blend.alpha_to_coverage);
 
                if(self.depth_test.enabled)
                {
@@ -164,6 +167,7 @@ void VulkanPipelineState::fill_graphics_creation_info(vector<char> &buffer) cons
        const FrameFormat &format = self.framebuffer->get_format();
        RenderPass render_pass;
        render_pass.framebuffer = self.framebuffer;
+       render_pass.to_present = self.framebuffer->is_presentable();
        render_pass.update(device);
 
        unsigned n_color_attachments = 0;
@@ -174,9 +178,13 @@ void VulkanPipelineState::fill_graphics_creation_info(vector<char> &buffer) cons
                        ++n_color_attachments;
        }
 
-       StructureBuilder sb(buffer, 10);
+       bool has_tessellation = (self.shprog && self.shprog->has_tessellation());
+
+       StructureBuilder sb(buffer, 12);
        VkGraphicsPipelineCreateInfo *const &pipeline_info = sb.add<VkGraphicsPipelineCreateInfo>();
        VkPipelineInputAssemblyStateCreateInfo *const &input_assembly_info = sb.add<VkPipelineInputAssemblyStateCreateInfo>();
+       VkPipelineTessellationStateCreateInfo *const &tessellation_info = sb.add<VkPipelineTessellationStateCreateInfo>(has_tessellation);
+       VkPipelineTessellationDomainOriginStateCreateInfo *const &tess_origin_info = sb.add<VkPipelineTessellationDomainOriginStateCreateInfo>(has_tessellation);
        VkPipelineViewportStateCreateInfo *const &viewport_info = sb.add<VkPipelineViewportStateCreateInfo>();
        VkPipelineRasterizationStateCreateInfo *const &raster_info = sb.add<VkPipelineRasterizationStateCreateInfo>();
        VkPipelineMultisampleStateCreateInfo *const &multisample_info = sb.add<VkPipelineMultisampleStateCreateInfo>();
@@ -188,7 +196,17 @@ void VulkanPipelineState::fill_graphics_creation_info(vector<char> &buffer) cons
 
        input_assembly_info->sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
        input_assembly_info->topology = static_cast<VkPrimitiveTopology>(get_vulkan_primitive_type(self.primitive_type));
-       input_assembly_info->primitiveRestartEnable = true;
+       input_assembly_info->primitiveRestartEnable = !has_tessellation;
+
+       if(has_tessellation)
+       {
+               tessellation_info->sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
+               tessellation_info->pNext = tess_origin_info;
+               tessellation_info->patchControlPoints = self.patch_size;
+
+               tess_origin_info->sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO;
+               tess_origin_info->domainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT;
+       }
 
        viewport_info->sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
        viewport_info->viewportCount = 1;
@@ -216,7 +234,7 @@ void VulkanPipelineState::fill_graphics_creation_info(vector<char> &buffer) cons
        multisample_info->sampleShadingEnable = VK_FALSE;
        multisample_info->minSampleShading = 1.0f;
        multisample_info->pSampleMask = 0;
-       multisample_info->alphaToCoverageEnable = VK_FALSE;
+       multisample_info->alphaToCoverageEnable = (format.get_samples()>1 && self.blend.alpha_to_coverage ? VK_TRUE : VK_FALSE);
        multisample_info->alphaToOneEnable = VK_FALSE;
 
        depth_stencil_info->sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
@@ -261,7 +279,7 @@ void VulkanPipelineState::fill_graphics_creation_info(vector<char> &buffer) cons
        pipeline_info->sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
 
        pipeline_info->pInputAssemblyState = input_assembly_info;
-       pipeline_info->pTessellationState = 0;
+       pipeline_info->pTessellationState = (has_tessellation ? tessellation_info : 0);
        pipeline_info->pViewportState = viewport_info;
        pipeline_info->pRasterizationState = raster_info;
        pipeline_info->pMultisampleState = multisample_info;
@@ -430,6 +448,10 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, unsigned fr
                ++write_ptr;
        }
 
+#ifdef DEBUG
+       self.check_bound_resources();
+#endif
+
        return n_writes;
 }
 
@@ -438,8 +460,13 @@ void VulkanPipelineState::synchronize_resources() const
        const PipelineState &self = *static_cast<const PipelineState *>(this);
 
        for(const PipelineState::BoundResource &r: self.resources)
-               if(r.type==PipelineState::STORAGE_TEXTURE)
-                       r.texture->change_layout(-1, VK_IMAGE_LAYOUT_GENERAL, false);
+               if(r.used)
+               {
+                       if(r.type==PipelineState::STORAGE_TEXTURE)
+                               r.texture->change_layout(-1, VK_IMAGE_LAYOUT_GENERAL, false);
+                       else if(r.type==PipelineState::SAMPLED_TEXTURE)
+                               r.texture->change_layout(-1, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false);
+               }
 }
 
 void VulkanPipelineState::apply(const VulkanCommandRecorder &vkCmd, const VulkanPipelineState *last, unsigned frame, bool negative_viewport) const