From 2204bf509d6d85ac47d029809bb004a03fd12a9a Mon Sep 17 00:00:00 2001 From: Indrajit Kumar Das Date: Fri, 13 May 2022 17:03:20 +0530 Subject: [PATCH] mesa/st: add nir shader to clear color buffers using constant value MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit v2: use load_uniform instead of load_ubo to fix vc4 Reviewed-by: Marek Olšák Part-of: --- src/mesa/state_tracker/st_nir.h | 4 ++++ src/mesa/state_tracker/st_nir_builtins.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index 58003d8..28fa476 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -74,6 +74,10 @@ st_nir_make_passthrough_shader(struct st_context *st, unsigned sysval_mask); void st_nir_add_point_size(struct nir_shader *nir); + +struct pipe_shader_state * +st_nir_make_clearcolor_shader(struct st_context *st); + #ifdef __cplusplus } #endif diff --git a/src/mesa/state_tracker/st_nir_builtins.c b/src/mesa/state_tracker/st_nir_builtins.c index 06959dc..bfbe0a9 100644 --- a/src/mesa/state_tracker/st_nir_builtins.c +++ b/src/mesa/state_tracker/st_nir_builtins.c @@ -131,3 +131,35 @@ st_nir_make_passthrough_shader(struct st_context *st, return st_nir_finish_builtin_shader(st, b.shader); } + +/** + * Make a simple shader that reads color value from a constant buffer + * and uses it to clear all color buffers. + */ +struct pipe_shader_state * +st_nir_make_clearcolor_shader(struct st_context *st) +{ + const nir_shader_compiler_options *options = + st_get_nir_compiler_options(st, MESA_SHADER_FRAGMENT); + + nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, options, + "clear color FS"); + b.shader->info.num_ubos = 1; + b.shader->num_outputs = 1; + b.shader->num_uniforms = 1; + + /* Read clear color from constant buffer */ + nir_ssa_def *clear_color = nir_load_uniform(&b, 4, 32, nir_imm_int(&b,0), + .range = 16, + .dest_type = nir_type_float32); + + nir_variable *color_out = + nir_variable_create(b.shader, nir_var_shader_out, glsl_vec_type(4), + "outcolor"); + color_out->data.location = FRAG_RESULT_COLOR; + + /* Write out the color */ + nir_store_var(&b, color_out, clear_color, 0xf); + + return st_nir_finish_builtin_shader(st, b.shader); +} -- 2.7.4