pvr: add support for VK_KHR_shader_draw_parameters, drawIndirectFirstInstance

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/37512>
This commit is contained in:
Simon Perretta 2025-09-11 11:32:27 +01:00 committed by Marge Bot
parent 0134e86375
commit 27b329eea3
5 changed files with 37 additions and 2 deletions

View file

@ -455,7 +455,7 @@ Vulkan 1.1 -- all DONE: anv, hk, lvp, nvk, panvk/v10+, radv, tu, vn
VK_KHR_multiview DONE (anv, dzn, hasvk, lvp, nvk, panvk/v10+, pvr, radv, tu, v3dv, vn)
VK_KHR_relaxed_block_layout DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn)
VK_KHR_sampler_ycbcr_conversion DONE (anv, hasvk, lvp, nvk, panvk/v10+, radv, tu, v3dv, vn)
VK_KHR_shader_draw_parameters DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, vn)
VK_KHR_shader_draw_parameters DONE (anv, dzn, hasvk, lvp, nvk, panvk, pvr, radv, tu, vn)
VK_KHR_storage_buffer_storage_class DONE (anv, dzn, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn)
VK_KHR_variable_pointers DONE (anv, hasvk, lvp, nvk, panvk, radv, tu, v3dv, vn)

View file

@ -1766,6 +1766,7 @@ bool pco_nir_lower_barriers(nir_shader *shader, pco_data *data);
bool pco_nir_lower_clip_cull_vars(nir_shader *shader);
bool pco_nir_lower_demote_samples(nir_shader *shader);
bool pco_nir_lower_fs_intrinsics(nir_shader *shader);
bool pco_nir_lower_vs_intrinsics(nir_shader *shader);
bool pco_nir_lower_images(nir_shader *shader, pco_data *data);
bool pco_nir_lower_interpolation(nir_shader *shader, pco_fs_data *fs);
bool pco_nir_lower_io(nir_shader *shader);

View file

@ -912,6 +912,7 @@ void pco_lower_nir(pco_ctx *ctx, nir_shader *nir, pco_data *data)
NIR_PASS(_, nir, pco_nir_point_size);
NIR_PASS(_, nir, pco_nir_pvi, &data->vs);
NIR_PASS(_, nir, pco_nir_lower_vs_intrinsics);
}
if (data->common.uses.usclib) {

View file

@ -1121,6 +1121,35 @@ bool pco_nir_lower_fs_intrinsics(nir_shader *shader)
return nir_shader_lower_instructions(shader, is_fs_intr, lower_fs_intr, NULL);
}
static bool
lower_vs_intr(nir_builder *b, nir_intrinsic_instr *intr, UNUSED void *cb_data)
{
b->cursor = nir_before_instr(&intr->instr);
switch (intr->intrinsic) {
/* First vs base vertex is handled in the PDS, so they're equivalent. */
case nir_intrinsic_load_first_vertex:
nir_def_replace(&intr->def, nir_load_base_vertex(b));
nir_instr_free(&intr->instr);
return true;
default:
break;
}
return false;
}
bool pco_nir_lower_vs_intrinsics(nir_shader *shader)
{
assert(shader->info.stage == MESA_SHADER_VERTEX);
return nir_shader_intrinsics_pass(shader,
lower_vs_intr,
nir_metadata_control_flow,
NULL);
}
bool pco_nir_lower_clip_cull_vars(nir_shader *shader)
{
if (shader->info.internal)

View file

@ -194,6 +194,7 @@ static void pvr_physical_device_get_supported_extensions(
.KHR_present_id2 = PVR_USE_WSI_PLATFORM,
.KHR_present_wait2 = PVR_USE_WSI_PLATFORM,
.KHR_separate_depth_stencil_layouts = true,
.KHR_shader_draw_parameters = true,
.KHR_shader_expect_assume = false,
.KHR_shader_float_controls = true,
.KHR_shader_subgroup_extended_types = true,
@ -241,7 +242,7 @@ static void pvr_physical_device_get_supported_features(
.dualSrcBlend = false,
.logicOp = true,
.multiDrawIndirect = false,
.drawIndirectFirstInstance = false,
.drawIndirectFirstInstance = true,
.depthClamp = false,
.depthBiasClamp = false,
.fillModeNonSolid = false,
@ -301,6 +302,9 @@ static void pvr_physical_device_get_supported_features(
.multiviewGeometryShader = false,
.multiviewTessellationShader = false,
/* Vulkan 1.1 / VK_KHR_shader_draw_parameters */
.shaderDrawParameters = true,
/* Vulkan 1.2 / VK_KHR_timeline_semaphore */
.timelineSemaphore = true,