pvr: add support for VK_EXT_provoking_vertex

Signed-off-by: Simon Perretta <simon.perretta@imgtec.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36412>
This commit is contained in:
Simon Perretta 2025-03-05 18:40:21 +00:00 committed by Marge Bot
parent 1adf4e9afc
commit 33620688a7
3 changed files with 27 additions and 10 deletions

View file

@ -651,7 +651,7 @@ Khronos extensions that are not part of any Vulkan version:
VK_EXT_post_depth_coverage DONE (anv/gfx11+, lvp, nvk, radv/gfx10+, tu, vn)
VK_EXT_primitive_topology_list_restart DONE (anv, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn, nvk)
VK_EXT_primitives_generated_query DONE (anv, hasvk, lvp, nvk, radv, tu, vn)
VK_EXT_provoking_vertex DONE (anv, hasvk, hk, lvp, nvk, panvk, radv, tu, v3dv, vn)
VK_EXT_provoking_vertex DONE (anv, hasvk, hk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn)
VK_EXT_queue_family_foreign DONE (anv, hasvk, hk, nvk, lvp, panvk, radv, tu, v3dv, vn)
VK_EXT_rasterization_order_attachment_access DONE (lvp, tu, vn)
VK_EXT_robustness2 DONE (anv, hasvk, hk, lvp, nvk, panvk/v10+, radv, tu, vn)

View file

@ -5226,6 +5226,8 @@ setup_pds_coeff_program(struct pvr_cmd_buffer *const cmd_buffer,
&state->gfx_pipeline->shader_state.fragment;
const struct vk_dynamic_graphics_state *const dynamic_state =
&cmd_buffer->vk.dynamic_graphics_state;
const VkProvokingVertexModeEXT provoking_vertex =
dynamic_state->rs.provoking_vertex;
const VkPrimitiveTopology topology = dynamic_state->ia.primitive_topology;
const struct pvr_pds_coeff_loading_program *program =
&fragment_shader_state->pds_coeff_program;
@ -5246,7 +5248,9 @@ setup_pds_coeff_program(struct pvr_cmd_buffer *const cmd_buffer,
ROGUE_PDSINST_DOUT_FIELDS_DOUTI_SRC_unpack(&pds_coeff_program_buffer[off],
&douti_src);
if (topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN)
if (provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT)
douti_src.shademodel = ROGUE_PDSINST_DOUTI_SHADEMODEL_FLAT_VERTEX2;
else if (topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN)
douti_src.shademodel = ROGUE_PDSINST_DOUTI_SHADEMODEL_FLAT_VERTEX1;
else
douti_src.shademodel = ROGUE_PDSINST_DOUTI_SHADEMODEL_FLAT_VERTEX0;
@ -5456,6 +5460,8 @@ static void pvr_setup_ppp_control(struct pvr_cmd_buffer *const cmd_buffer)
{
struct vk_dynamic_graphics_state *const dynamic_state =
&cmd_buffer->vk.dynamic_graphics_state;
const VkProvokingVertexModeEXT provoking_vertex =
dynamic_state->rs.provoking_vertex;
const VkPrimitiveTopology topology = dynamic_state->ia.primitive_topology;
struct pvr_cmd_buffer_state *const state = &cmd_buffer->state;
struct ROGUE_TA_STATE_HEADER *const header = &state->emit_header;
@ -5466,7 +5472,9 @@ static void pvr_setup_ppp_control(struct pvr_cmd_buffer *const cmd_buffer)
control.drawclippededges = true;
control.wclampen = true;
if (topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN)
if (provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT)
control.flatshade_vtx = ROGUE_TA_FLATSHADE_VTX_VERTEX_2;
else if (topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN)
control.flatshade_vtx = ROGUE_TA_FLATSHADE_VTX_VERTEX_1;
else
control.flatshade_vtx = ROGUE_TA_FLATSHADE_VTX_VERTEX_0;
@ -6027,6 +6035,9 @@ static void pvr_emit_dirty_vdm_state(struct pvr_cmd_buffer *const cmd_buffer,
VDMCTRL_VDM_STATE0) };
struct vk_dynamic_graphics_state *const dynamic_state =
&cmd_buffer->vk.dynamic_graphics_state;
const VkProvokingVertexModeEXT provoking_vertex =
dynamic_state->rs.provoking_vertex;
const VkPrimitiveTopology topology = dynamic_state->ia.primitive_topology;
const struct pvr_cmd_buffer_state *const state = &cmd_buffer->state;
const pco_data *const vs_data = &state->gfx_pipeline->vs_data;
struct pvr_csb *const csb = &sub_cmd->control_stream;
@ -6052,15 +6063,12 @@ static void pvr_emit_dirty_vdm_state(struct pvr_cmd_buffer *const cmd_buffer,
state0.cut_index_present = true;
}
switch (dynamic_state->ia.primitive_topology) {
case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
if (provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT)
state0.flatshade_control = ROGUE_VDMCTRL_FLATSHADE_CONTROL_VERTEX_2;
else if (topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN)
state0.flatshade_control = ROGUE_VDMCTRL_FLATSHADE_CONTROL_VERTEX_1;
break;
default:
else
state0.flatshade_control = ROGUE_VDMCTRL_FLATSHADE_CONTROL_VERTEX_0;
break;
}
/* If we've bound a different vertex buffer, or this draw-call requires
* a different PDS attrib data-section from the last draw call (changed

View file

@ -195,6 +195,7 @@ static void pvr_physical_device_get_supported_extensions(
.EXT_image_2d_view_of_3d = true,
.EXT_index_type_uint8 = false,
.EXT_private_data = true,
.EXT_provoking_vertex = true,
.EXT_scalar_block_layout = true,
.EXT_texel_buffer_alignment = false,
.EXT_tooling_info = true,
@ -282,6 +283,10 @@ static void pvr_physical_device_get_supported_features(
/* Vulkan 1.3 / VK_EXT_private_data */
.privateData = true,
/* VK_EXT_provoking_vertex */
.provokingVertexLast = true,
.transformFeedbackPreservesProvokingVertex = false,
/* Vulkan 1.2 / VK_EXT_scalar_block_layout */
.scalarBlockLayout = true,
@ -517,6 +522,10 @@ static bool pvr_physical_device_get_properties(
.patch = 4,
},
/* VK_EXT_provoking_vertex */
.provokingVertexModePerPipeline = true,
.transformFeedbackPreservesTriangleFanProvokingVertex = false,
/* Vulkan 1.2 / VK_KHR_timeline_semaphore */
.maxTimelineSemaphoreValueDifference = UINT64_MAX,