]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/pipelinestate_backend.cpp
Add tessellation shader support to the engine
[libs/gl.git] / source / backends / vulkan / pipelinestate_backend.cpp
index ab5d3dd4cd8ca10a20342eb1b063a0c29c92b8bf..f06e2d324a82e9302135b46c49d7401b9c008f4a 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;
@@ -177,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>();
@@ -191,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;
@@ -264,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;