tu: allow dynamic primitive topology with tessellation
This allows to set VK_PRIMITIVE_TOPOLOGY_PATCH_LIST dynamically when tessellation used. If other values are set via vkCmdSetPrimitiveTopologyEXT for the case, the validation layer can detect the issue. Fixes dEQP-VK.pipeline.extended_dynamic_state.*.topology_patch* Signed-off-by: Hyunjun Ko <zzoon@igalia.com> Reviewed-by: Danylo Piliaiev <dpiliaiev@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12299>
This commit is contained in:
@@ -3790,8 +3790,18 @@ tu_draw_initiator(struct tu_cmd_buffer *cmd, enum pc_di_src_sel src_sel)
|
||||
const struct tu_pipeline *pipeline = cmd->state.pipeline;
|
||||
enum pc_di_primtype primtype = pipeline->ia.primtype;
|
||||
|
||||
if (pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY))
|
||||
primtype = cmd->state.primtype;
|
||||
if (pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY)) {
|
||||
if (primtype < DI_PT_PATCHES0) {
|
||||
/* If tesselation used, only VK_PRIMITIVE_TOPOLOGY_PATCH_LIST can be
|
||||
* set via vkCmdSetPrimitiveTopologyEXT, but primtype is already
|
||||
* calculated at the pipeline creation based on control points
|
||||
* for each patch.
|
||||
*
|
||||
* Just use the primtype as is for the case.
|
||||
*/
|
||||
primtype = cmd->state.primtype;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t initiator =
|
||||
CP_DRAW_INDX_OFFSET_0_PRIM_TYPE(primtype) |
|
||||
|
||||
@@ -2633,8 +2633,6 @@ tu_pipeline_builder_parse_tessellation(struct tu_pipeline_builder *builder,
|
||||
const VkPipelineTessellationStateCreateInfo *tess_info =
|
||||
builder->create_info->pTessellationState;
|
||||
|
||||
assert(!(pipeline->dynamic_state_mask & BIT(TU_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY)));
|
||||
|
||||
assert(pipeline->ia.primtype == DI_PT_PATCHES0);
|
||||
assert(tess_info->patchControlPoints <= 32);
|
||||
pipeline->ia.primtype += tess_info->patchControlPoints;
|
||||
|
||||
Reference in New Issue
Block a user