mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 15:40:11 +01:00
venus: pipeline fixes for VK_EXT_extended_dynamic_state3
- pMultisampleState->pSampleMask should be ignored when VK_DYNAMIC_STATE_SAMPLE_MASK_EXT is used. - pRasterizationState can be null now Signed-off-by: Juston Li <justonli@google.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25921>
This commit is contained in:
parent
e3de4a9852
commit
417437c715
1 changed files with 38 additions and 7 deletions
|
|
@ -63,6 +63,9 @@ struct vn_graphics_pipeline_create_info_fields {
|
|||
/** VkPipelineViewportStateCreateInfo::pScissors */
|
||||
bool viewport_state_scissors : 1;
|
||||
|
||||
/** VkPipelineMultisampleStateCreateInfo::pSampleMask */
|
||||
bool multisample_state_sample_mask : 1;
|
||||
|
||||
/** VkPipelineRenderingCreateInfo, all format fields */
|
||||
bool rendering_info_formats : 1;
|
||||
};
|
||||
|
|
@ -119,6 +122,8 @@ struct vn_graphics_dynamic_state {
|
|||
bool viewport : 1;
|
||||
/** VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT */
|
||||
bool viewport_with_count : 1;
|
||||
/** VK_DYNAMIC_STATE_SAMPLE_MASK_EXT */
|
||||
bool sample_mask : 1;
|
||||
/** VK_DYNAMIC_STATE_SCISSOR */
|
||||
bool scissor : 1;
|
||||
/** VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT */
|
||||
|
|
@ -193,6 +198,7 @@ struct vn_graphics_pipeline_fix_desc {
|
|||
*/
|
||||
struct vn_graphics_pipeline_fix_tmp {
|
||||
VkGraphicsPipelineCreateInfo *infos;
|
||||
VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
|
||||
VkPipelineViewportStateCreateInfo *viewport_state_infos;
|
||||
};
|
||||
|
||||
|
|
@ -557,11 +563,14 @@ vn_graphics_pipeline_fix_tmp_alloc(const VkAllocationCallbacks *alloc,
|
|||
{
|
||||
struct vn_graphics_pipeline_fix_tmp *tmp;
|
||||
VkGraphicsPipelineCreateInfo *infos;
|
||||
VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
|
||||
VkPipelineViewportStateCreateInfo *viewport_state_infos;
|
||||
|
||||
VK_MULTIALLOC(ma);
|
||||
vk_multialloc_add(&ma, &tmp, __typeof__(*tmp), 1);
|
||||
vk_multialloc_add(&ma, &infos, __typeof__(*infos), info_count);
|
||||
vk_multialloc_add(&ma, &multisample_state_infos,
|
||||
__typeof__(*multisample_state_infos), info_count);
|
||||
vk_multialloc_add(&ma, &viewport_state_infos,
|
||||
__typeof__(*viewport_state_infos), info_count);
|
||||
|
||||
|
|
@ -569,6 +578,7 @@ vn_graphics_pipeline_fix_tmp_alloc(const VkAllocationCallbacks *alloc,
|
|||
return NULL;
|
||||
|
||||
tmp->infos = infos;
|
||||
tmp->multisample_state_infos = multisample_state_infos;
|
||||
tmp->viewport_state_infos = viewport_state_infos;
|
||||
|
||||
return tmp;
|
||||
|
|
@ -646,6 +656,9 @@ vn_graphics_dynamic_state_update(
|
|||
case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT:
|
||||
raw.viewport_with_count = true;
|
||||
break;
|
||||
case VK_DYNAMIC_STATE_SAMPLE_MASK_EXT:
|
||||
raw.sample_mask = true;
|
||||
break;
|
||||
case VK_DYNAMIC_STATE_SCISSOR:
|
||||
raw.scissor = true;
|
||||
break;
|
||||
|
|
@ -687,6 +700,12 @@ vn_graphics_dynamic_state_update(
|
|||
dynamic->scissor_with_count |= raw.scissor_with_count;
|
||||
dynamic->rasterizer_discard_enable |= raw.rasterizer_discard_enable;
|
||||
}
|
||||
if (direct_gpl.fragment_shader) {
|
||||
dynamic->sample_mask |= raw.sample_mask;
|
||||
}
|
||||
if (direct_gpl.fragment_output) {
|
||||
dynamic->sample_mask |= raw.sample_mask;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -983,17 +1002,16 @@ vn_graphics_pipeline_state_fill(
|
|||
valid.rasterization_state = true;
|
||||
valid.pipeline_layout = true;
|
||||
|
||||
state->rasterizer_discard_enable =
|
||||
info->pRasterizationState->rasterizerDiscardEnable;
|
||||
if (info->pRasterizationState) {
|
||||
state->rasterizer_discard_enable =
|
||||
info->pRasterizationState->rasterizerDiscardEnable;
|
||||
}
|
||||
|
||||
const bool is_raster_statically_disabled =
|
||||
!state->dynamic.rasterizer_discard_enable &&
|
||||
state->rasterizer_discard_enable;
|
||||
|
||||
if (!is_raster_statically_disabled) {
|
||||
/* TODO(VK_EXT_extended_dynamic_state3): pViewportState may be
|
||||
* invalid.
|
||||
*/
|
||||
valid.viewport_state = true;
|
||||
|
||||
valid.viewport_state_viewports =
|
||||
|
|
@ -1065,7 +1083,7 @@ vn_graphics_pipeline_state_fill(
|
|||
*/
|
||||
valid.multisample_state = true;
|
||||
|
||||
/* TODO(VK_EXT_extended_dynamic_state3): pSampleMask may be invalid. */
|
||||
valid.multisample_state_sample_mask = !state->dynamic.sample_mask;
|
||||
|
||||
if ((state->render_pass.attachment_aspects &
|
||||
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
|
||||
|
|
@ -1105,7 +1123,7 @@ vn_graphics_pipeline_state_fill(
|
|||
*/
|
||||
valid.multisample_state = true;
|
||||
|
||||
/* TODO(VK_EXT_extended_dynamic_state3): pSampleMask may be invalid */
|
||||
valid.multisample_state_sample_mask = !state->dynamic.sample_mask;
|
||||
|
||||
valid.color_blend_state |=
|
||||
(bool)(state->render_pass.attachment_aspects &
|
||||
|
|
@ -1159,6 +1177,10 @@ vn_graphics_pipeline_state_fill(
|
|||
.multisample_state =
|
||||
!valid.multisample_state &&
|
||||
info->pMultisampleState,
|
||||
.multisample_state_sample_mask =
|
||||
!valid.multisample_state_sample_mask &&
|
||||
info->pMultisampleState &&
|
||||
info->pMultisampleState->pSampleMask,
|
||||
.depth_stencil_state =
|
||||
!valid.depth_stencil_state &&
|
||||
info->pDepthStencilState,
|
||||
|
|
@ -1246,6 +1268,15 @@ vn_fix_graphics_pipeline_create_infos(
|
|||
if (fix_descs[i].erase.base_pipeline_handle)
|
||||
fix_tmp->infos[i].basePipelineHandle = VK_NULL_HANDLE;
|
||||
|
||||
/* VkPipelineMultisampleStateCreateInfo */
|
||||
if (fix_descs[i].erase.multisample_state_sample_mask) {
|
||||
/* Swap original pMultisampleState with temporary state. */
|
||||
fix_tmp->multisample_state_infos[i] = *infos[i].pMultisampleState;
|
||||
fix_tmp->infos[i].pMultisampleState = &fix_tmp->multisample_state_infos[i];
|
||||
|
||||
fix_tmp->multisample_state_infos[i].pSampleMask = NULL;
|
||||
}
|
||||
|
||||
/* VkPipelineViewportStateCreateInfo */
|
||||
if (fix_descs[i].erase.viewport_state_viewports ||
|
||||
fix_descs[i].erase.viewport_state_scissors) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue