From 03a2ca63562b73d36658e43c0d7d77150421be60 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 19 Apr 2017 09:13:06 +1000 Subject: [PATCH] radv/meta: refactor out some common shaders. The vs vertex generate and fs noop shaders are used in a few places, so refactor them out. Reviewed-by: Bas Nieuwenhuizen Signed-off-by: Dave Airlie --- src/amd/vulkan/radv_meta.c | 35 +++++++++++++++++++++++ src/amd/vulkan/radv_meta.h | 2 ++ src/amd/vulkan/radv_meta_decompress.c | 41 ++------------------------- src/amd/vulkan/radv_meta_fast_clear.c | 41 ++------------------------- src/amd/vulkan/radv_meta_resolve.c | 28 ++---------------- 5 files changed, 43 insertions(+), 104 deletions(-) diff --git a/src/amd/vulkan/radv_meta.c b/src/amd/vulkan/radv_meta.c index 3584396b727..aed2607c22c 100644 --- a/src/amd/vulkan/radv_meta.c +++ b/src/amd/vulkan/radv_meta.c @@ -454,3 +454,38 @@ nir_ssa_def *radv_meta_gen_rect_vertices(nir_builder *vs_b) { return radv_meta_gen_rect_vertices_comp2(vs_b, nir_imm_float(vs_b, 0.0)); } + +/* vertex shader that generates vertices */ +nir_shader * +radv_meta_build_nir_vs_generate_vertices(void) +{ + const struct glsl_type *vec4 = glsl_vec4_type(); + + nir_builder b; + nir_variable *v_position; + + nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, NULL); + b.shader->info->name = ralloc_strdup(b.shader, "meta_vs_gen_verts"); + + nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b); + + v_position = nir_variable_create(b.shader, nir_var_shader_out, vec4, + "gl_Position"); + v_position->data.location = VARYING_SLOT_POS; + + nir_store_var(&b, v_position, outvec, 0xf); + + return b.shader; +} + +nir_shader * +radv_meta_build_nir_fs_noop(void) +{ + nir_builder b; + + nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL); + b.shader->info->name = ralloc_asprintf(b.shader, + "meta_noop_fs"); + + return b.shader; +} diff --git a/src/amd/vulkan/radv_meta.h b/src/amd/vulkan/radv_meta.h index 5cf5d62098c..2a6b0243e8c 100644 --- a/src/amd/vulkan/radv_meta.h +++ b/src/amd/vulkan/radv_meta.h @@ -227,6 +227,8 @@ void radv_blit_to_prime_linear(struct radv_cmd_buffer *cmd_buffer, nir_ssa_def *radv_meta_gen_rect_vertices(nir_builder *vs_b); nir_ssa_def *radv_meta_gen_rect_vertices_comp2(nir_builder *vs_b, nir_ssa_def *comp2); +nir_shader *radv_meta_build_nir_vs_generate_vertices(void); +nir_shader *radv_meta_build_nir_fs_noop(void); #ifdef __cplusplus } #endif diff --git a/src/amd/vulkan/radv_meta_decompress.c b/src/amd/vulkan/radv_meta_decompress.c index 3566fa7f731..b003abba983 100644 --- a/src/amd/vulkan/radv_meta_decompress.c +++ b/src/amd/vulkan/radv_meta_decompress.c @@ -26,45 +26,8 @@ #include "radv_meta.h" #include "radv_private.h" -#include "nir/nir_builder.h" #include "sid.h" -/* vertex shader that generates vertices */ -static nir_shader * -build_nir_vs(void) -{ - const struct glsl_type *vec4 = glsl_vec4_type(); - - nir_builder b; - nir_variable *v_position; - - nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, NULL); - b.shader->info->name = ralloc_strdup(b.shader, "meta_depth_decomp_vs"); - - nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b); - - v_position = nir_variable_create(b.shader, nir_var_shader_out, vec4, - "gl_Position"); - v_position->data.location = VARYING_SLOT_POS; - - nir_store_var(&b, v_position, outvec, 0xf); - - return b.shader; -} - -/* simple passthrough shader */ -static nir_shader * -build_nir_fs(void) -{ - nir_builder b; - - nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL); - b.shader->info->name = ralloc_asprintf(b.shader, - "meta_depth_decomp_noop_fs"); - - return b.shader; -} - static VkResult create_pass(struct radv_device *device) { @@ -115,7 +78,7 @@ create_pipeline(struct radv_device *device, VkDevice device_h = radv_device_to_handle(device); struct radv_shader_module fs_module = { - .nir = build_nir_fs(), + .nir = radv_meta_build_nir_fs_noop(), }; if (!fs_module.nir) { @@ -260,7 +223,7 @@ radv_device_init_meta_depth_decomp_state(struct radv_device *device) zero(device->meta_state.depth_decomp); - struct radv_shader_module vs_module = { .nir = build_nir_vs() }; + struct radv_shader_module vs_module = { .nir = radv_meta_build_nir_vs_generate_vertices() }; if (!vs_module.nir) { /* XXX: Need more accurate error */ res = VK_ERROR_OUT_OF_HOST_MEMORY; diff --git a/src/amd/vulkan/radv_meta_fast_clear.c b/src/amd/vulkan/radv_meta_fast_clear.c index 5f792f1f894..254964287d7 100644 --- a/src/amd/vulkan/radv_meta_fast_clear.c +++ b/src/amd/vulkan/radv_meta_fast_clear.c @@ -26,45 +26,8 @@ #include "radv_meta.h" #include "radv_private.h" -#include "nir/nir_builder.h" #include "sid.h" -/* vertex shader that generates vertices */ -static nir_shader * -build_nir_vs(void) -{ - const struct glsl_type *vec4 = glsl_vec4_type(); - - nir_builder b; - nir_variable *v_position; - - nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, NULL); - b.shader->info->name = ralloc_strdup(b.shader, "meta_fast_clear_vs"); - - nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b); - - v_position = nir_variable_create(b.shader, nir_var_shader_out, vec4, - "gl_Position"); - v_position->data.location = VARYING_SLOT_POS; - - nir_store_var(&b, v_position, outvec, 0xf); - - return b.shader; -} - -/* simple passthrough shader */ -static nir_shader * -build_nir_fs(void) -{ - nir_builder b; - - nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL); - b.shader->info->name = ralloc_asprintf(b.shader, - "meta_fast_clear_noop_fs"); - - return b.shader; -} - static VkResult create_pass(struct radv_device *device) { @@ -119,7 +82,7 @@ create_pipeline(struct radv_device *device, VkDevice device_h = radv_device_to_handle(device); struct radv_shader_module fs_module = { - .nir = build_nir_fs(), + .nir = radv_meta_build_nir_fs_noop(), }; if (!fs_module.nir) { @@ -305,7 +268,7 @@ radv_device_init_meta_fast_clear_flush_state(struct radv_device *device) zero(device->meta_state.fast_clear_flush); - struct radv_shader_module vs_module = { .nir = build_nir_vs() }; + struct radv_shader_module vs_module = { .nir = radv_meta_build_nir_vs_generate_vertices() }; if (!vs_module.nir) { /* XXX: Need more accurate error */ res = VK_ERROR_OUT_OF_HOST_MEMORY; diff --git a/src/amd/vulkan/radv_meta_resolve.c b/src/amd/vulkan/radv_meta_resolve.c index 70dcc30bee6..460a0bcb517 100644 --- a/src/amd/vulkan/radv_meta_resolve.c +++ b/src/amd/vulkan/radv_meta_resolve.c @@ -29,31 +29,7 @@ #include "nir/nir_builder.h" #include "sid.h" -/* vertex shader that generates vertex data */ -static nir_shader * -build_nir_vs(void) -{ - const struct glsl_type *vec4 = glsl_vec4_type(); - - nir_builder b; - nir_variable *v_position; - - nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, NULL); - b.shader->info->name = ralloc_strdup(b.shader, "meta_resolve_vs"); - - nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b); - - v_position = nir_variable_create(b.shader, nir_var_shader_out, vec4, - "gl_Position"); - v_position->data.location = VARYING_SLOT_POS; - - - nir_store_var(&b, v_position, outvec, 0xf); - - return b.shader; -} - -/* simple passthrough shader */ +/* emit 0, 0, 0, 1 */ static nir_shader * build_nir_fs(void) { @@ -264,7 +240,7 @@ radv_device_init_meta_resolve_state(struct radv_device *device) zero(device->meta_state.resolve); - struct radv_shader_module vs_module = { .nir = build_nir_vs() }; + struct radv_shader_module vs_module = { .nir = radv_meta_build_nir_vs_generate_vertices() }; if (!vs_module.nir) { /* XXX: Need more accurate error */ res = VK_ERROR_OUT_OF_HOST_MEMORY;