Mesa (master): radv: add a small interface for creating the trap handler shader
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Aug 24 11:20:44 UTC 2020
Module: Mesa
Branch: master
Commit: 8fd2f5c16d902708136764f7121aad471559fb23
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8fd2f5c16d902708136764f7121aad471559fb23
Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date: Tue Aug 18 18:44:07 2020 +0200
radv: add a small interface for creating the trap handler shader
Similar to the GS copy shader except that NIR is unused because
the shader is written directly using ACO IR.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6384>
---
src/amd/compiler/aco_interface.cpp | 2 ++
src/amd/vulkan/radv_shader.c | 36 +++++++++++++++++++++++++++++++++---
src/amd/vulkan/radv_shader.h | 3 +++
src/amd/vulkan/radv_shader_args.h | 1 +
4 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp
index 5d402495ae5..8f45f503a82 100644
--- a/src/amd/compiler/aco_interface.cpp
+++ b/src/amd/compiler/aco_interface.cpp
@@ -72,6 +72,8 @@ void aco_compile_shader(unsigned shader_count,
/* Instruction Selection */
if (args->is_gs_copy_shader)
aco::select_gs_copy_shader(program.get(), shaders[0], &config, args);
+ else if (args->is_trap_handler_shader)
+ aco::select_trap_handler_shader(program.get(), shaders[0], &config, args);
else
aco::select_program(program.get(), shader_count, shaders, &config, args);
if (args->options->dump_preoptir) {
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 1d227efe4af..8d0cd9d4feb 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -1202,6 +1202,7 @@ shader_variant_compile(struct radv_device *device,
struct radv_shader_info *info,
struct radv_nir_compiler_options *options,
bool gs_copy_shader,
+ bool trap_handler_shader,
bool keep_shader_info,
bool keep_statistic_info,
struct radv_shader_binary **binary_out)
@@ -1234,6 +1235,8 @@ shader_variant_compile(struct radv_device *device,
args.options = options;
args.shader_info = info;
args.is_gs_copy_shader = gs_copy_shader;
+ args.is_trap_handler_shader = trap_handler_shader;
+
radv_declare_shader_args(&args,
gs_copy_shader ? MESA_SHADER_VERTEX
: shaders[shader_count - 1]->info.stage,
@@ -1271,7 +1274,7 @@ shader_variant_compile(struct radv_device *device,
if (keep_shader_info) {
variant->nir_string = radv_dump_nir_shaders(shaders, shader_count);
- if (!gs_copy_shader && !module->nir) {
+ if (!gs_copy_shader && !trap_handler_shader && !module->nir) {
variant->spirv = malloc(module->size);
if (!variant->spirv) {
free(variant);
@@ -1314,7 +1317,8 @@ radv_shader_variant_compile(struct radv_device *device,
options.robust_buffer_access = device->robust_buffer_access;
return shader_variant_compile(device, module, shaders, shader_count, stage, info,
- &options, false, keep_shader_info, keep_statistic_info, binary_out);
+ &options, false, false,
+ keep_shader_info, keep_statistic_info, binary_out);
}
struct radv_shader_variant *
@@ -1332,7 +1336,33 @@ radv_create_gs_copy_shader(struct radv_device *device,
options.key.has_multiview_view_index = multiview;
return shader_variant_compile(device, NULL, &shader, 1, stage,
- info, &options, true, keep_shader_info, keep_statistic_info, binary_out);
+ info, &options, true, false,
+ keep_shader_info, keep_statistic_info, binary_out);
+}
+
+struct radv_shader_variant *
+radv_create_trap_handler_shader(struct radv_device *device)
+{
+ struct radv_nir_compiler_options options = {0};
+ struct radv_shader_variant *shader = NULL;
+ struct radv_shader_binary *binary = NULL;
+ struct radv_shader_info info = {0};
+
+ nir_builder b;
+ nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_COMPUTE, NULL);
+ b.shader->info.name = ralloc_strdup(b.shader, "meta_trap_handler");
+
+ options.explicit_scratch_args = true;
+ info.wave_size = 64;
+
+ shader = shader_variant_compile(device, NULL, &b.shader, 1,
+ MESA_SHADER_COMPUTE, &info, &options,
+ false, true, true, false, &binary);
+
+ ralloc_free(b.shader);
+ free(binary);
+
+ return shader;
}
void
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index cb76e635dc5..1638614091c 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -488,6 +488,9 @@ radv_create_gs_copy_shader(struct radv_device *device, struct nir_shader *nir,
bool multiview, bool keep_shader_info,
bool keep_statistic_info);
+struct radv_shader_variant *
+radv_create_trap_handler_shader(struct radv_device *device);
+
void
radv_shader_variant_destroy(struct radv_device *device,
struct radv_shader_variant *variant);
diff --git a/src/amd/vulkan/radv_shader_args.h b/src/amd/vulkan/radv_shader_args.h
index 451077a9ede..f01c63ffa1a 100644
--- a/src/amd/vulkan/radv_shader_args.h
+++ b/src/amd/vulkan/radv_shader_args.h
@@ -69,6 +69,7 @@ struct radv_shader_args {
struct ac_arg ngg_gs_state;
bool is_gs_copy_shader;
+ bool is_trap_handler_shader;
};
static inline struct radv_shader_args *
More information about the mesa-commit
mailing list