X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fpipelinestate_backend.cpp;h=d8e4d4a1978504373e5614aad6e59555d358e955;hb=4369f481b06d28056deceecbfcb69550a65c92dc;hp=ab5d3dd4cd8ca10a20342eb1b063a0c29c92b8bf;hpb=98f72f1666f45fa96407c96ff2bb88a5962e66c9;p=libs%2Fgl.git diff --git a/source/backends/vulkan/pipelinestate_backend.cpp b/source/backends/vulkan/pipelinestate_backend.cpp index ab5d3dd4..d8e4d4a1 100644 --- a/source/backends/vulkan/pipelinestate_backend.cpp +++ b/source/backends/vulkan/pipelinestate_backend.cpp @@ -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 &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(); VkPipelineInputAssemblyStateCreateInfo *const &input_assembly_info = sb.add(); + VkPipelineTessellationStateCreateInfo *const &tessellation_info = sb.add(has_tessellation); + VkPipelineTessellationDomainOriginStateCreateInfo *const &tess_origin_info = sb.add(has_tessellation); VkPipelineViewportStateCreateInfo *const &viewport_info = sb.add(); VkPipelineRasterizationStateCreateInfo *const &raster_info = sb.add(); VkPipelineMultisampleStateCreateInfo *const &multisample_info = sb.add(); @@ -191,7 +196,17 @@ void VulkanPipelineState::fill_graphics_creation_info(vector &buffer) cons input_assembly_info->sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; input_assembly_info->topology = static_cast(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 &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; @@ -433,6 +448,10 @@ unsigned VulkanPipelineState::fill_descriptor_writes(unsigned index, unsigned fr ++write_ptr; } +#ifdef DEBUG + self.check_bound_resources(); +#endif + return n_writes; } @@ -441,8 +460,13 @@ void VulkanPipelineState::synchronize_resources() const const PipelineState &self = *static_cast(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