mesa/src/amd/vulkan/nir/radv_nir.h
Samuel Pitoiset 656d7e887a radv: fix lowering the view index to an input varying for FS
When multiview is used and the FS is compiled separately with GPL, the
view index still needs to be lowered, otherwise it's crashing later.

The lowering doesn't need to know the previous stage because ViewIndex
is a global thing (ie. it's neither a per-vertex or a per-primitive
varying).

This fixes recent
dEQP-VK.pipeline.pipeline_library.graphics_library.misc.other.view_index_from_device_index_*_pre_rasterization

Cc: mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31192>
2024-09-17 06:36:08 +00:00

95 lines
3.1 KiB
C

/*
* Copyright © 2023 Valve Corporation
*
* SPDX-License-Identifier: MIT
*/
#ifndef RADV_NIR_H
#define RADV_NIR_H
#include <stdbool.h>
#include <stdint.h>
#include "amd_family.h"
#include "nir.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct nir_shader nir_shader;
struct radeon_info;
struct radv_pipeline_layout;
struct radv_shader_stage;
struct radv_shader_info;
struct radv_shader_args;
struct radv_shader_layout;
struct radv_device;
struct radv_graphics_state_key;
void radv_nir_apply_pipeline_layout(nir_shader *shader, struct radv_device *device,
const struct radv_shader_stage *stage);
void radv_nir_lower_abi(nir_shader *shader, enum amd_gfx_level gfx_level, const struct radv_shader_stage *stage,
const struct radv_graphics_state_key *gfx_state, uint32_t address32_hi);
bool radv_nir_lower_hit_attrib_derefs(nir_shader *shader);
bool radv_nir_lower_ray_payload_derefs(nir_shader *shader, uint32_t offset);
bool radv_nir_lower_ray_queries(nir_shader *shader, struct radv_device *device);
bool radv_nir_lower_vs_inputs(nir_shader *shader, const struct radv_shader_stage *vs_stage,
const struct radv_graphics_state_key *gfx_state, const struct radeon_info *gpu_info);
bool radv_nir_lower_primitive_shading_rate(nir_shader *nir, enum amd_gfx_level gfx_level);
bool radv_nir_lower_fs_intrinsics(nir_shader *nir, const struct radv_shader_stage *fs_stage,
const struct radv_graphics_state_key *gfx_state);
bool radv_nir_lower_fs_barycentric(nir_shader *shader, const struct radv_graphics_state_key *gfx_state,
unsigned rast_prim);
bool radv_nir_lower_intrinsics_early(nir_shader *nir, bool lower_view_index_to_zero);
bool radv_nir_lower_view_index(nir_shader *nir);
bool radv_nir_lower_viewport_to_zero(nir_shader *nir);
bool radv_nir_export_multiview(nir_shader *nir);
void radv_nir_lower_io_to_scalar_early(nir_shader *nir, nir_variable_mode mask);
unsigned radv_map_io_driver_location(unsigned semantic);
void radv_nir_lower_io(struct radv_device *device, nir_shader *nir);
bool radv_nir_lower_io_to_mem(struct radv_device *device, struct radv_shader_stage *stage);
void radv_nir_lower_poly_line_smooth(nir_shader *nir, const struct radv_graphics_state_key *gfx_state);
bool radv_nir_lower_cooperative_matrix(nir_shader *shader, unsigned wave_size);
bool radv_nir_lower_draw_id_to_zero(nir_shader *shader);
bool radv_nir_remap_color_attachment(nir_shader *shader, const struct radv_graphics_state_key *gfx_state);
typedef struct radv_nir_opt_tid_function_options {
bool use_masked_swizzle_amd : 1;
bool use_dpp16_shift_amd : 1;
bool use_shuffle_xor : 1;
bool use_clustered_rotate : 1;
/* The can be smaller than the api subgroup/ballot size
* if some invocations are always inactive.
*/
uint8_t hw_subgroup_size;
uint8_t hw_ballot_bit_size;
uint8_t hw_ballot_num_comp;
} radv_nir_opt_tid_function_options;
bool radv_nir_opt_tid_function(nir_shader *shader, const radv_nir_opt_tid_function_options *options);
#ifdef __cplusplus
}
#endif
#endif /* RADV_NIR_H */