hasvk: Rip out primitive replication

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19852>
This commit is contained in:
Jason Ekstrand
2022-09-02 22:50:03 -05:00
committed by Marge Bot
parent 7f97cd04c9
commit 5f1dbd80b3
3 changed files with 7 additions and 107 deletions
+1 -7
View File
@@ -31,13 +31,7 @@
extern "C" {
#endif
bool anv_check_for_primitive_replication(struct anv_device *device,
VkShaderStageFlags stages,
nir_shader **shaders,
uint32_t view_mask);
bool anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask,
bool use_primitive_replication);
bool anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask);
bool anv_nir_lower_ycbcr_textures(nir_shader *shader,
const struct anv_pipeline_layout *layout);
@@ -176,8 +176,7 @@ replace_load_view_index_with_layer_id(struct nir_builder *b,
}
bool
anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask,
bool use_primitive_replication)
anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask)
{
assert(shader->info.stage != MESA_SHADER_COMPUTE);
@@ -195,32 +194,6 @@ anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask,
/* This pass assumes a single entrypoint */
nir_function_impl *entrypoint = nir_shader_get_entrypoint(shader);
/* Primitive Replication allows a shader to write different positions for
* each view in the same execution. If only the position depends on the
* view, then it is possible to use the feature instead of instancing to
* implement multiview.
*/
if (use_primitive_replication) {
bool progress = nir_lower_multiview(shader, view_mask);
if (progress) {
nir_builder b;
nir_builder_init(&b, entrypoint);
b.cursor = nir_before_cf_list(&entrypoint->body);
/* Fill Layer ID with zero. Replication will use that as base to
* apply the RTAI offsets.
*/
nir_variable *layer_id_out =
nir_variable_create(shader, nir_var_shader_out,
glsl_int_type(), "layer ID");
layer_id_out->data.location = VARYING_SLOT_LAYER;
nir_store_var(&b, layer_id_out, nir_imm_zero(&b, 1, 32), 0x1);
}
return progress;
}
struct lower_multiview_state state = {
.view_mask = view_mask,
};
@@ -286,39 +259,3 @@ anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask,
return true;
}
bool
anv_check_for_primitive_replication(struct anv_device *device,
VkShaderStageFlags stages,
nir_shader **shaders,
uint32_t view_mask)
{
assert(device->info->ver >= 12);
static int primitive_replication_max_views = -1;
if (primitive_replication_max_views < 0) {
/* TODO: Figure out why we are not getting same benefits for larger than
* 2 views. For now use Primitive Replication just for the 2-view case
* by default.
*/
const unsigned default_max_views = 2;
primitive_replication_max_views =
MIN2(MAX_VIEWS_FOR_PRIMITIVE_REPLICATION,
debug_get_num_option("ANV_PRIMITIVE_REPLICATION_MAX_VIEWS",
default_max_views));
}
/* TODO: We should be able to support replication at 'geometry' stages
* later than Vertex. In that case only the last stage can refer to
* gl_ViewIndex.
*/
if (stages & ~(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT))
return false;
int view_count = util_bitcount(view_mask);
if (view_count == 1 || view_count > primitive_replication_max_views)
return false;
return nir_can_lower_multiview(shaders[MESA_SHADER_VERTEX]);
}
+5 -36
View File
@@ -552,8 +552,7 @@ static void
anv_pipeline_lower_nir(struct anv_pipeline *pipeline,
void *mem_ctx,
struct anv_pipeline_stage *stage,
struct anv_pipeline_layout *layout,
bool use_primitive_replication)
struct anv_pipeline_layout *layout)
{
const struct anv_physical_device *pdevice = pipeline->device->physical;
const struct brw_compiler *compiler = pdevice->compiler;
@@ -575,8 +574,7 @@ anv_pipeline_lower_nir(struct anv_pipeline *pipeline,
if (pipeline->type == ANV_PIPELINE_GRAPHICS) {
struct anv_graphics_pipeline *gfx_pipeline =
anv_pipeline_to_graphics(pipeline);
NIR_PASS(_, nir, anv_nir_lower_multiview, gfx_pipeline->view_mask,
use_primitive_replication);
NIR_PASS(_, nir, anv_nir_lower_multiview, gfx_pipeline->view_mask);
}
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
@@ -1354,24 +1352,6 @@ anv_graphics_pipeline_compile(struct anv_graphics_pipeline *pipeline,
next_stage = &stages[s];
}
bool use_primitive_replication = false;
if (pipeline->base.device->info->ver >= 12 &&
pipeline->view_mask != 0) {
/* For some pipelines HW Primitive Replication can be used instead of
* instancing to implement Multiview. This depend on how viewIndex is
* used in all the active shaders, so this check can't be done per
* individual shaders.
*/
nir_shader *shaders[ANV_GRAPHICS_SHADER_STAGE_COUNT] = {};
for (unsigned s = 0; s < ARRAY_SIZE(shaders); s++)
shaders[s] = stages[s].nir;
use_primitive_replication =
anv_check_for_primitive_replication(pipeline->base.device,
pipeline->active_stages,
shaders, pipeline->view_mask);
}
struct anv_pipeline_stage *prev_stage = NULL;
for (unsigned i = 0; i < ARRAY_SIZE(graphics_shader_order); i++) {
gl_shader_stage s = graphics_shader_order[i];
@@ -1382,8 +1362,7 @@ anv_graphics_pipeline_compile(struct anv_graphics_pipeline *pipeline,
void *stage_ctx = ralloc_context(NULL);
anv_pipeline_lower_nir(&pipeline->base, stage_ctx, &stages[s], layout,
use_primitive_replication);
anv_pipeline_lower_nir(&pipeline->base, stage_ctx, &stages[s], layout);
if (prev_stage && compiler->nir_options[s]->unify_interfaces) {
prev_stage->nir->info.outputs_written |= stages[s].nir->info.inputs_read &
@@ -1574,8 +1553,7 @@ anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
return vk_error(pipeline, VK_ERROR_UNKNOWN);
}
anv_pipeline_lower_nir(&pipeline->base, mem_ctx, &stage, layout,
false /* use_primitive_replication */);
anv_pipeline_lower_nir(&pipeline->base, mem_ctx, &stage, layout);
unsigned local_size = stage.nir->info.workgroup_size[0] *
stage.nir->info.workgroup_size[1] *
@@ -1825,17 +1803,8 @@ anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
pipeline->vb[b].instance_divisor = state->vi->bindings[b].divisor;
}
/* Our implementation of VK_KHR_multiview uses instancing to draw the
* different views when primitive replication cannot be used. If the client
* asks for instancing, we need to multiply by the client's instance count
* at draw time and instance divisor in the vertex bindings by the number
* of views ensure that we repeat the client's per-instance data once for
* each view.
*/
const bool uses_primitive_replication =
anv_pipeline_get_last_vue_prog_data(pipeline)->vue_map.num_pos_slots > 1;
pipeline->instance_multiplier = 1;
if (pipeline->view_mask && !uses_primitive_replication)
if (pipeline->view_mask)
pipeline->instance_multiplier = util_bitcount(pipeline->view_mask);
pipeline->negative_one_to_one =