Mesa (main): radv: Add last_vgt_api_stage and use it to simplify some code.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jul 8 15:21:57 UTC 2021
Module: Mesa
Branch: main
Commit: 00d11c2065c2a9d52a59ba095a9fe4ef55a132d6
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=00d11c2065c2a9d52a59ba095a9fe4ef55a132d6
Author: Timur Kristóf <timur.kristof at gmail.com>
Date: Mon Jul 5 08:51:09 2021 +0200
radv: Add last_vgt_api_stage and use it to simplify some code.
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11711>
---
src/amd/vulkan/radv_pipeline.c | 49 ++++++++++++++++++------------------------
src/amd/vulkan/radv_private.h | 3 +++
src/amd/vulkan/radv_shader.c | 21 ++++++++----------
src/amd/vulkan/radv_shader.h | 2 +-
4 files changed, 34 insertions(+), 41 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 5de27eeb85f..ee0f0a862b6 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -144,32 +144,26 @@ radv_pipeline_get_color_blend_state(const VkGraphicsPipelineCreateInfo *pCreateI
static bool
radv_pipeline_has_ngg(const struct radv_pipeline *pipeline)
{
- struct radv_shader_variant *variant = NULL;
- if (pipeline->shaders[MESA_SHADER_GEOMETRY])
- variant = pipeline->shaders[MESA_SHADER_GEOMETRY];
- else if (pipeline->shaders[MESA_SHADER_TESS_EVAL])
- variant = pipeline->shaders[MESA_SHADER_TESS_EVAL];
- else if (pipeline->shaders[MESA_SHADER_VERTEX])
- variant = pipeline->shaders[MESA_SHADER_VERTEX];
- else
+ if (pipeline->graphics.last_vgt_api_stage == MESA_SHADER_NONE)
return false;
+
+ struct radv_shader_variant *variant =
+ pipeline->shaders[pipeline->graphics.last_vgt_api_stage];
+
return variant->info.is_ngg;
}
bool
radv_pipeline_has_ngg_passthrough(const struct radv_pipeline *pipeline)
{
+ if (pipeline->graphics.last_vgt_api_stage == MESA_SHADER_NONE)
+ return false;
+
assert(radv_pipeline_has_ngg(pipeline));
- struct radv_shader_variant *variant = NULL;
- if (pipeline->shaders[MESA_SHADER_GEOMETRY])
- variant = pipeline->shaders[MESA_SHADER_GEOMETRY];
- else if (pipeline->shaders[MESA_SHADER_TESS_EVAL])
- variant = pipeline->shaders[MESA_SHADER_TESS_EVAL];
- else if (pipeline->shaders[MESA_SHADER_VERTEX])
- variant = pipeline->shaders[MESA_SHADER_VERTEX];
- else
- return false;
+ struct radv_shader_variant *variant =
+ pipeline->shaders[pipeline->graphics.last_vgt_api_stage];
+
return variant->info.is_ngg_passthrough;
}
@@ -2423,9 +2417,6 @@ radv_set_driver_locations(struct radv_pipeline *pipeline, nir_shader **shaders,
unsigned vs_info_idx = MESA_SHADER_VERTEX;
unsigned tes_info_idx = MESA_SHADER_TESS_EVAL;
- /* Which stage is the last in the vertex, tess, geometry pipeline */
- unsigned last_vtg_stage = MESA_SHADER_VERTEX;
-
if (pipeline->device->physical_device->rad_info.chip_class >= GFX9) {
/* These are merged into the next stage */
vs_info_idx = has_tess ? MESA_SHADER_TESS_CTRL : MESA_SHADER_GEOMETRY;
@@ -2463,11 +2454,6 @@ radv_set_driver_locations(struct radv_pipeline *pipeline, nir_shader **shaders,
/* Copy data to merged stage */
infos[tes_info_idx].tes.num_linked_outputs = tes2gs.num_linked_io_vars;
-
- last_vtg_stage = MESA_SHADER_GEOMETRY;
-
- } else {
- last_vtg_stage = MESA_SHADER_TESS_EVAL;
}
} else if (has_gs) {
nir_linked_io_var_info vs2gs = nir_assign_linked_io_var_locations(
@@ -2475,13 +2461,13 @@ radv_set_driver_locations(struct radv_pipeline *pipeline, nir_shader **shaders,
infos[MESA_SHADER_VERTEX].vs.num_linked_outputs = vs2gs.num_linked_io_vars;
infos[MESA_SHADER_GEOMETRY].gs.num_linked_inputs = vs2gs.num_linked_io_vars;
- last_vtg_stage = MESA_SHADER_GEOMETRY;
/* Copy data to merged stage */
infos[vs_info_idx].vs.num_linked_outputs = vs2gs.num_linked_io_vars;
}
- nir_foreach_shader_out_variable(var, shaders[last_vtg_stage])
+ assert(pipeline->graphics.last_vgt_api_stage != MESA_SHADER_NONE);
+ nir_foreach_shader_out_variable(var, shaders[pipeline->graphics.last_vgt_api_stage])
{
var->data.driver_location = var->data.location;
}
@@ -3282,6 +3268,8 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_device *device,
modules[i]->sha1);
pipeline->active_stages |= mesa_to_vk_shader_stage(i);
+ if (i < MESA_SHADER_FRAGMENT)
+ pipeline->graphics.last_vgt_api_stage = i;
}
}
@@ -3456,7 +3444,10 @@ radv_create_shaders(struct radv_pipeline *pipeline, struct radv_device *device,
/* Lower I/O intrinsics to memory instructions. */
bool io_to_mem = radv_lower_io_to_mem(device, nir[i], &infos[i], pipeline_key);
- bool lowered_ngg = radv_lower_ngg(device, nir[i], !!nir[MESA_SHADER_GEOMETRY], &infos[i], pipeline_key, &keys[i]);
+ bool lowered_ngg = pipeline_has_ngg && i == pipeline->graphics.last_vgt_api_stage &&
+ !radv_use_llvm_for_stage(device, i);
+ if (lowered_ngg)
+ radv_lower_ngg(device, nir[i], &infos[i], pipeline_key, &keys[i]);
/* optimize the lowered ALU operations */
bool more_algebraic = true;
@@ -5380,6 +5371,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline, struct radv_device *device,
pipeline->device = device;
pipeline->layout = radv_pipeline_layout_from_handle(pCreateInfo->layout);
+ pipeline->graphics.last_vgt_api_stage = MESA_SHADER_NONE;
assert(pipeline->layout);
struct radv_blend_state blend = radv_pipeline_init_blend_state(pipeline, pCreateInfo, extra);
@@ -5649,6 +5641,7 @@ radv_compute_pipeline_create(VkDevice _device, VkPipelineCache _cache,
vk_object_base_init(&device->vk, &pipeline->base, VK_OBJECT_TYPE_PIPELINE);
pipeline->device = device;
+ pipeline->graphics.last_vgt_api_stage = MESA_SHADER_NONE;
pipeline->layout = radv_pipeline_layout_from_handle(pCreateInfo->layout);
assert(pipeline->layout);
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 7c8eee3de92..26c2aaa1ce4 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1766,6 +1766,9 @@ struct radv_pipeline {
/* Whether the pipeline uses NGG (GFX10+). */
bool is_ngg;
+
+ /* Last pre-PS API stage */
+ gl_shader_stage last_vgt_api_stage;
} graphics;
};
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index eda2cdf2176..0b623a39dcb 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -810,14 +810,17 @@ radv_lower_io_to_mem(struct radv_device *device, struct nir_shader *nir,
return false;
}
-bool radv_lower_ngg(struct radv_device *device, struct nir_shader *nir, bool has_gs,
+void radv_lower_ngg(struct radv_device *device, struct nir_shader *nir,
struct radv_shader_info *info,
const struct radv_pipeline_key *pl_key,
struct radv_shader_variant_key *key)
{
/* TODO: support the LLVM backend with the NIR lowering */
- if (radv_use_llvm_for_stage(device, nir->info.stage))
- return false;
+ assert(!radv_use_llvm_for_stage(device, nir->info.stage));
+
+ assert(nir->info.stage == MESA_SHADER_VERTEX ||
+ nir->info.stage == MESA_SHADER_TESS_EVAL ||
+ nir->info.stage == MESA_SHADER_GEOMETRY);
ac_nir_ngg_config out_conf = {0};
const struct gfx10_ngg_info *ngg_info = &info->ngg_info;
@@ -832,8 +835,7 @@ bool radv_lower_ngg(struct radv_device *device, struct nir_shader *nir, bool has
if (nir->info.stage == MESA_SHADER_VERTEX ||
nir->info.stage == MESA_SHADER_TESS_EVAL) {
- if (has_gs || !key->vs_common_out.as_ngg)
- return false;
+ assert(key->vs_common_out.as_ngg);
unsigned num_vertices_per_prim = 3;
@@ -862,21 +864,16 @@ bool radv_lower_ngg(struct radv_device *device, struct nir_shader *nir, bool has
info->is_ngg_passthrough = out_conf.passthrough;
key->vs_common_out.as_ngg_passthrough = out_conf.passthrough;
} else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
- if (!info->is_ngg)
- return false;
-
+ assert(info->is_ngg);
ac_nir_lower_ngg_gs(
nir, info->wave_size, max_workgroup_size,
info->ngg_info.esgs_ring_size,
info->gs.gsvs_vertex_size,
info->ngg_info.ngg_emit_size * 4u,
key->vs.provoking_vtx_last);
- return true;
} else {
- return false;
+ unreachable("invalid SW stage passed to radv_lower_ngg");
}
-
- return true;
}
static void *
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 33614e68b7b..10015c41eb3 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -560,7 +560,7 @@ void radv_lower_io(struct radv_device *device, nir_shader *nir);
bool radv_lower_io_to_mem(struct radv_device *device, struct nir_shader *nir,
struct radv_shader_info *info, const struct radv_pipeline_key *pl_key);
-bool radv_lower_ngg(struct radv_device *device, struct nir_shader *nir, bool has_gs,
+void radv_lower_ngg(struct radv_device *device, struct nir_shader *nir,
struct radv_shader_info *info,
const struct radv_pipeline_key *pl_key,
struct radv_shader_variant_key *key);
More information about the mesa-commit
mailing list