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:
Juston Li 2023-10-24 14:37:18 -07:00 committed by Marge Bot
parent e3de4a9852
commit 417437c715

View file

@ -63,6 +63,9 @@ struct vn_graphics_pipeline_create_info_fields {
/** VkPipelineViewportStateCreateInfo::pScissors */ /** VkPipelineViewportStateCreateInfo::pScissors */
bool viewport_state_scissors : 1; bool viewport_state_scissors : 1;
/** VkPipelineMultisampleStateCreateInfo::pSampleMask */
bool multisample_state_sample_mask : 1;
/** VkPipelineRenderingCreateInfo, all format fields */ /** VkPipelineRenderingCreateInfo, all format fields */
bool rendering_info_formats : 1; bool rendering_info_formats : 1;
}; };
@ -119,6 +122,8 @@ struct vn_graphics_dynamic_state {
bool viewport : 1; bool viewport : 1;
/** VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT */ /** VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT */
bool viewport_with_count : 1; bool viewport_with_count : 1;
/** VK_DYNAMIC_STATE_SAMPLE_MASK_EXT */
bool sample_mask : 1;
/** VK_DYNAMIC_STATE_SCISSOR */ /** VK_DYNAMIC_STATE_SCISSOR */
bool scissor : 1; bool scissor : 1;
/** VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT */ /** VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT */
@ -193,6 +198,7 @@ struct vn_graphics_pipeline_fix_desc {
*/ */
struct vn_graphics_pipeline_fix_tmp { struct vn_graphics_pipeline_fix_tmp {
VkGraphicsPipelineCreateInfo *infos; VkGraphicsPipelineCreateInfo *infos;
VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
VkPipelineViewportStateCreateInfo *viewport_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; struct vn_graphics_pipeline_fix_tmp *tmp;
VkGraphicsPipelineCreateInfo *infos; VkGraphicsPipelineCreateInfo *infos;
VkPipelineMultisampleStateCreateInfo *multisample_state_infos;
VkPipelineViewportStateCreateInfo *viewport_state_infos; VkPipelineViewportStateCreateInfo *viewport_state_infos;
VK_MULTIALLOC(ma); VK_MULTIALLOC(ma);
vk_multialloc_add(&ma, &tmp, __typeof__(*tmp), 1); vk_multialloc_add(&ma, &tmp, __typeof__(*tmp), 1);
vk_multialloc_add(&ma, &infos, __typeof__(*infos), info_count); 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, vk_multialloc_add(&ma, &viewport_state_infos,
__typeof__(*viewport_state_infos), info_count); __typeof__(*viewport_state_infos), info_count);
@ -569,6 +578,7 @@ vn_graphics_pipeline_fix_tmp_alloc(const VkAllocationCallbacks *alloc,
return NULL; return NULL;
tmp->infos = infos; tmp->infos = infos;
tmp->multisample_state_infos = multisample_state_infos;
tmp->viewport_state_infos = viewport_state_infos; tmp->viewport_state_infos = viewport_state_infos;
return tmp; return tmp;
@ -646,6 +656,9 @@ vn_graphics_dynamic_state_update(
case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT: case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT:
raw.viewport_with_count = true; raw.viewport_with_count = true;
break; break;
case VK_DYNAMIC_STATE_SAMPLE_MASK_EXT:
raw.sample_mask = true;
break;
case VK_DYNAMIC_STATE_SCISSOR: case VK_DYNAMIC_STATE_SCISSOR:
raw.scissor = true; raw.scissor = true;
break; break;
@ -687,6 +700,12 @@ vn_graphics_dynamic_state_update(
dynamic->scissor_with_count |= raw.scissor_with_count; dynamic->scissor_with_count |= raw.scissor_with_count;
dynamic->rasterizer_discard_enable |= raw.rasterizer_discard_enable; 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.rasterization_state = true;
valid.pipeline_layout = true; valid.pipeline_layout = true;
state->rasterizer_discard_enable = if (info->pRasterizationState) {
info->pRasterizationState->rasterizerDiscardEnable; state->rasterizer_discard_enable =
info->pRasterizationState->rasterizerDiscardEnable;
}
const bool is_raster_statically_disabled = const bool is_raster_statically_disabled =
!state->dynamic.rasterizer_discard_enable && !state->dynamic.rasterizer_discard_enable &&
state->rasterizer_discard_enable; state->rasterizer_discard_enable;
if (!is_raster_statically_disabled) { if (!is_raster_statically_disabled) {
/* TODO(VK_EXT_extended_dynamic_state3): pViewportState may be
* invalid.
*/
valid.viewport_state = true; valid.viewport_state = true;
valid.viewport_state_viewports = valid.viewport_state_viewports =
@ -1065,7 +1083,7 @@ vn_graphics_pipeline_state_fill(
*/ */
valid.multisample_state = true; 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 & if ((state->render_pass.attachment_aspects &
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) { (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
@ -1105,7 +1123,7 @@ vn_graphics_pipeline_state_fill(
*/ */
valid.multisample_state = true; 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 |= valid.color_blend_state |=
(bool)(state->render_pass.attachment_aspects & (bool)(state->render_pass.attachment_aspects &
@ -1159,6 +1177,10 @@ vn_graphics_pipeline_state_fill(
.multisample_state = .multisample_state =
!valid.multisample_state && !valid.multisample_state &&
info->pMultisampleState, info->pMultisampleState,
.multisample_state_sample_mask =
!valid.multisample_state_sample_mask &&
info->pMultisampleState &&
info->pMultisampleState->pSampleMask,
.depth_stencil_state = .depth_stencil_state =
!valid.depth_stencil_state && !valid.depth_stencil_state &&
info->pDepthStencilState, info->pDepthStencilState,
@ -1246,6 +1268,15 @@ vn_fix_graphics_pipeline_create_infos(
if (fix_descs[i].erase.base_pipeline_handle) if (fix_descs[i].erase.base_pipeline_handle)
fix_tmp->infos[i].basePipelineHandle = VK_NULL_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 */ /* VkPipelineViewportStateCreateInfo */
if (fix_descs[i].erase.viewport_state_viewports || if (fix_descs[i].erase.viewport_state_viewports ||
fix_descs[i].erase.viewport_state_scissors) { fix_descs[i].erase.viewport_state_scissors) {