diff --git a/docs/features.txt b/docs/features.txt index 39c589a99fb..881a23b296c 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -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) diff --git a/src/imagination/pco/pco_internal.h b/src/imagination/pco/pco_internal.h index b35910c9c38..6051f7363b5 100644 --- a/src/imagination/pco/pco_internal.h +++ b/src/imagination/pco/pco_internal.h @@ -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); diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index d6bd1b3077c..76388e9351f 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -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) { diff --git a/src/imagination/pco/pco_nir_pvfio.c b/src/imagination/pco/pco_nir_pvfio.c index 04799be13f7..a4b661aed5b 100644 --- a/src/imagination/pco/pco_nir_pvfio.c +++ b/src/imagination/pco/pco_nir_pvfio.c @@ -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) diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 87e0d6ebe0f..aa2feac5512 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -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,