diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index f59c56e8068..d3441783a6f 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -1688,6 +1688,7 @@ radv_pipeline_init_pre_raster_info(struct radv_pipeline *pipeline, const VkGraphicsPipelineCreateInfo *pCreateInfo) { const VkPipelineTessellationStateCreateInfo *ts = pCreateInfo->pTessellationState; + const VkPipelineViewportStateCreateInfo *vp = pCreateInfo->pViewportState; const VkShaderStageFlagBits tess_stages = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; struct radv_pre_raster_info pre_rast_info = {0}; @@ -1703,6 +1704,15 @@ radv_pipeline_init_pre_raster_info(struct radv_pipeline *pipeline, } } + /* Viewport */ + if (radv_is_raster_enabled(pipeline, pCreateInfo)) { + const VkPipelineViewportDepthClipControlCreateInfoEXT *depth_clip_control = + vk_find_struct_const(vp->pNext, PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT); + if (depth_clip_control) { + pre_rast_info.viewport.negative_one_to_one = !!depth_clip_control->negativeOneToOne; + } + } + return pre_rast_info; } @@ -2008,21 +2018,6 @@ radv_pipeline_init_raster_state(struct radv_pipeline *pipeline, VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT; } -static void -radv_pipeline_init_viewport_state(struct radv_pipeline *pipeline, - const VkGraphicsPipelineCreateInfo *pCreateInfo) -{ - if (!radv_is_raster_enabled(pipeline, pCreateInfo)) - return; - - const VkPipelineViewportDepthClipControlCreateInfoEXT *depth_clip_control = - vk_find_struct_const(pCreateInfo->pViewportState->pNext, - PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT); - if (depth_clip_control) { - pipeline->graphics.negative_one_to_one = !!depth_clip_control->negativeOneToOne; - } -} - static struct radv_depth_stencil_state radv_pipeline_init_depth_stencil_state(struct radv_pipeline *pipeline, const VkGraphicsPipelineCreateInfo *pCreateInfo) @@ -6757,7 +6752,9 @@ radv_graphics_pipeline_init(struct radv_pipeline *pipeline, struct radv_device * if (!radv_pipeline_has_mesh(pipeline)) radv_pipeline_init_input_assembly_state(pipeline, pCreateInfo, &vi_info); radv_pipeline_init_dynamic_state(pipeline, pCreateInfo, &vi_info); - radv_pipeline_init_viewport_state(pipeline, pCreateInfo); + + pipeline->graphics.negative_one_to_one = pre_rast_info.viewport.negative_one_to_one; + radv_pipeline_init_raster_state(pipeline, pCreateInfo); struct radv_depth_stencil_state ds_state = diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 44deaa3028d..7651ff783f1 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1882,6 +1882,10 @@ struct radv_pre_raster_info { uint32_t patch_control_points; VkTessellationDomainOrigin domain_origin; } tess; + + struct { + bool negative_one_to_one; + } viewport; }; struct radv_pipeline {