nir: treat per-view outputs as arrayed IO
This is needed for implementing multiview in panvk, where the address
calculation for multiview outputs is not well-represented by lowering to
nir_intrinsic_store_output with a single offset.
The case where a variable is both per-view and per-{vertex,primitive} is
now unsupported. This would come up with drivers implementing
NV_mesh_shader or using nir_lower_multiview on geometry, tessellation,
or mesh shaders. No drivers currently do either of these. There was some
code that attempted to handle the nested per-view case by unwrapping
per-view/arrayed types twice, but it's unclear to what extent this
actually worked.
ANV and Turnip both rely on per-view outputs being assigned a unique
driver location for each view, so I've added on option to configure that
behavior rather than removing it.
Signed-off-by: Benjamin Lee <benjamin.lee@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31704>
This commit is contained in:
@@ -4377,6 +4377,15 @@ typedef struct nir_shader_compiler_options {
|
||||
/** Whether derivative intrinsics must be scalarized. */
|
||||
bool scalarize_ddx;
|
||||
|
||||
/**
|
||||
* Assign a range of driver locations to per-view outputs, with unique
|
||||
* slots for each view. If unset, per-view outputs will be treated
|
||||
* similarly to other arrayed IO, and only slots for one view will be
|
||||
* assigned. Regardless of this setting, per-view outputs are only assigned
|
||||
* slots for one value in var->data.location.
|
||||
*/
|
||||
bool per_view_unique_driver_locations;
|
||||
|
||||
/** Options determining lowering and behavior of inputs and outputs. */
|
||||
nir_io_options io_options;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user