venus: refactor to add pipeline info fixes helpers

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26751>
This commit is contained in:
Yiwei Zhang
2024-01-02 19:31:32 -08:00
committed by Marge Bot
parent c1d8056bbe
commit a443d4dbc6
+86 -67
View File
@@ -1258,6 +1258,88 @@ vn_graphics_pipeline_state_fill(
};
}
static void
vn_fix_graphics_pipeline_create_info_self(
const struct vn_graphics_pipeline_info_self *ignore,
const VkGraphicsPipelineCreateInfo *info,
struct vn_graphics_pipeline_fix_tmp *fix_tmp,
uint32_t index)
{
/* VkGraphicsPipelineCreateInfo */
if (ignore->shader_stages) {
fix_tmp->infos[index].stageCount = 0;
fix_tmp->infos[index].pStages = NULL;
}
if (ignore->vertex_input_state)
fix_tmp->infos[index].pVertexInputState = NULL;
if (ignore->input_assembly_state)
fix_tmp->infos[index].pInputAssemblyState = NULL;
if (ignore->tessellation_state)
fix_tmp->infos[index].pTessellationState = NULL;
if (ignore->viewport_state)
fix_tmp->infos[index].pViewportState = NULL;
if (ignore->rasterization_state)
fix_tmp->infos[index].pRasterizationState = NULL;
if (ignore->multisample_state)
fix_tmp->infos[index].pMultisampleState = NULL;
if (ignore->depth_stencil_state)
fix_tmp->infos[index].pDepthStencilState = NULL;
if (ignore->color_blend_state)
fix_tmp->infos[index].pColorBlendState = NULL;
if (ignore->pipeline_layout)
fix_tmp->infos[index].layout = VK_NULL_HANDLE;
if (ignore->base_pipeline_handle)
fix_tmp->infos[index].basePipelineHandle = VK_NULL_HANDLE;
/* VkPipelineMultisampleStateCreateInfo */
if (ignore->multisample_state_sample_mask) {
/* Swap original pMultisampleState with temporary state. */
fix_tmp->multisample_state_infos[index] = *info->pMultisampleState;
fix_tmp->infos[index].pMultisampleState =
&fix_tmp->multisample_state_infos[index];
fix_tmp->multisample_state_infos[index].pSampleMask = NULL;
}
/* VkPipelineViewportStateCreateInfo */
if (ignore->viewport_state_viewports || ignore->viewport_state_scissors) {
/* Swap original pViewportState with temporary state. */
fix_tmp->viewport_state_infos[index] = *info->pViewportState;
fix_tmp->infos[index].pViewportState =
&fix_tmp->viewport_state_infos[index];
if (ignore->viewport_state_viewports)
fix_tmp->viewport_state_infos[index].pViewports = NULL;
if (ignore->viewport_state_scissors)
fix_tmp->viewport_state_infos[index].pScissors = NULL;
}
}
static void
vn_fix_graphics_pipeline_create_info_pnext(
const struct vn_graphics_pipeline_info_pnext *ignore,
const VkGraphicsPipelineCreateInfo *info,
struct vn_graphics_pipeline_fix_tmp *fix_tmp,
uint32_t index)
{
/* VkPipelineRenderingCreateInfo */
if (ignore->rendering_info_formats) {
/* All format fields are invalid, but the only field that must be
* erased is pColorAttachmentFormats because the other
* fields are merely VkFormat values. Encoding invalid pointers is
* unsafe; encoding invalid VkFormat values is not unsafe.
*
* However, the fix is difficult because it requires a deep
* rewrite of the pNext chain.
*
* TODO: Fix invalid
* VkPipelineRenderingCreateInfo::pColorAttachmentFormats.
*/
vn_log(NULL, "venus may encode array from invalid pointer "
"VkPipelineRenderingCreateInfo::pColorAttachmentFormats");
}
}
static const VkGraphicsPipelineCreateInfo *
vn_fix_graphics_pipeline_create_infos(
struct vn_device *dev,
@@ -1291,75 +1373,12 @@ vn_fix_graphics_pipeline_create_infos(
for (uint32_t i = 0; i < info_count; i++) {
if (fix_descs[i].self.mask) {
/* VkGraphicsPipelineCreateInfo */
if (fix_descs[i].self.shader_stages) {
fix_tmp->infos[i].stageCount = 0;
fix_tmp->infos[i].pStages = NULL;
}
if (fix_descs[i].self.vertex_input_state)
fix_tmp->infos[i].pVertexInputState = NULL;
if (fix_descs[i].self.input_assembly_state)
fix_tmp->infos[i].pInputAssemblyState = NULL;
if (fix_descs[i].self.tessellation_state)
fix_tmp->infos[i].pTessellationState = NULL;
if (fix_descs[i].self.viewport_state)
fix_tmp->infos[i].pViewportState = NULL;
if (fix_descs[i].self.rasterization_state)
fix_tmp->infos[i].pRasterizationState = NULL;
if (fix_descs[i].self.multisample_state)
fix_tmp->infos[i].pMultisampleState = NULL;
if (fix_descs[i].self.depth_stencil_state)
fix_tmp->infos[i].pDepthStencilState = NULL;
if (fix_descs[i].self.color_blend_state)
fix_tmp->infos[i].pColorBlendState = NULL;
if (fix_descs[i].self.pipeline_layout)
fix_tmp->infos[i].layout = VK_NULL_HANDLE;
if (fix_descs[i].self.base_pipeline_handle)
fix_tmp->infos[i].basePipelineHandle = VK_NULL_HANDLE;
/* VkPipelineMultisampleStateCreateInfo */
if (fix_descs[i].self.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].self.viewport_state_viewports ||
fix_descs[i].self.viewport_state_scissors) {
/* Swap original pViewportState with temporary state. */
fix_tmp->viewport_state_infos[i] = *infos[i].pViewportState;
fix_tmp->infos[i].pViewportState =
&fix_tmp->viewport_state_infos[i];
if (fix_descs[i].self.viewport_state_viewports)
fix_tmp->viewport_state_infos[i].pViewports = NULL;
if (fix_descs[i].self.viewport_state_scissors)
fix_tmp->viewport_state_infos[i].pScissors = NULL;
}
vn_fix_graphics_pipeline_create_info_self(&fix_descs[i].self,
&infos[i], fix_tmp, i);
}
if (fix_descs[i].pnext.mask) {
/* VkPipelineRenderingCreateInfo */
if (fix_descs[i].pnext.rendering_info_formats) {
/* All format fields are invalid, but the only field that must be
* erased is pColorAttachmentFormats because the other
* fields are merely VkFormat values. Encoding invalid pointers is
* unsafe; encoding invalid VkFormat values is not unsafe.
*
* However, the fix is difficult because it requires a deep
* rewrite of the pNext chain.
*
* TODO: Fix invalid
* VkPipelineRenderingCreateInfo::pColorAttachmentFormats.
*/
vn_log(dev->instance,
"venus may encode array from invalid pointer "
"VkPipelineRenderingCreateInfo::pColorAttachmentFormats");
}
vn_fix_graphics_pipeline_create_info_pnext(&fix_descs[i].pnext,
&infos[i], fix_tmp, i);
}
}