mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
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:
parent
1adf4e9afc
commit
33620688a7
3 changed files with 27 additions and 10 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue