From 91dc863921a683f9c001ab70380fd33425e08355 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Fri, 10 Sep 2021 17:06:43 -0700 Subject: [PATCH] mesa: Move the advanced blend bitmask to shader_info. For drivers that don't lower advanced blend to FBFETCH, we need the bitmask to be in the NIR shader so that it gets carried over to TGSI successfully. Reviewed-by: Rob Clark Reviewed-By: Mike Blumenkrantz Part-of: --- src/compiler/glsl/glsl_to_nir.cpp | 1 + src/compiler/glsl/linker.cpp | 2 +- src/compiler/glsl/lower_blend_equation_advanced.cpp | 4 ++-- src/compiler/glsl/serialize.cpp | 6 ------ src/compiler/shader_info.h | 5 +++++ src/gallium/auxiliary/tgsi/tgsi_ureg.c | 5 +++++ src/mesa/main/draw_validate.c | 2 +- src/mesa/main/mtypes.h | 9 --------- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 6 ------ 9 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 3baa7fc84ec..d5c2f4a1a11 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -256,6 +256,7 @@ glsl_to_nir(struct gl_context *ctx, if (shader->info.stage == MESA_SHADER_FRAGMENT) { shader->info.fs.pixel_center_integer = sh->Program->info.fs.pixel_center_integer; shader->info.fs.origin_upper_left = sh->Program->info.fs.origin_upper_left; + shader->info.fs.advanced_blend_modes = sh->Program->info.fs.advanced_blend_modes; } return shader; diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index b598b63c09f..dd575a87dd2 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -2126,7 +2126,7 @@ link_fs_inout_layout_qualifiers(struct gl_shader_program *prog, shader->SampleInterlockOrdered; linked_shader->Program->info.fs.sample_interlock_unordered |= shader->SampleInterlockUnordered; - linked_shader->Program->sh.fs.BlendSupport |= shader->BlendSupport; + linked_shader->Program->info.fs.advanced_blend_modes |= shader->BlendSupport; } linked_shader->Program->info.fs.pixel_center_integer = pixel_center_integer; diff --git a/src/compiler/glsl/lower_blend_equation_advanced.cpp b/src/compiler/glsl/lower_blend_equation_advanced.cpp index 5ea4222b592..cd2a83f5cc6 100644 --- a/src/compiler/glsl/lower_blend_equation_advanced.cpp +++ b/src/compiler/glsl/lower_blend_equation_advanced.cpp @@ -463,7 +463,7 @@ get_main(gl_linked_shader *sh) bool lower_blend_equation_advanced(struct gl_linked_shader *sh, bool coherent) { - if (sh->Program->sh.fs.BlendSupport == 0) + if (sh->Program->info.fs.advanced_blend_modes == 0) return false; /* Lower early returns in main() so there's a single exit point @@ -548,7 +548,7 @@ lower_blend_equation_advanced(struct gl_linked_shader *sh, bool coherent) ir_variable *result_dest = calc_blend_result(f, mode, fb, blend_source, - sh->Program->sh.fs.BlendSupport); + sh->Program->info.fs.advanced_blend_modes); /* Copy the result back to the original values. It would be simpler * to demote the program's output variables, and create a new vec4 diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index b5c286b0f2c..3356123ab75 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -1127,9 +1127,6 @@ write_shader_metadata(struct blob *metadata, gl_linked_shader *shader) sizeof(struct gl_bindless_image) - ptr_size); } - blob_write_bytes(metadata, &glprog->sh.fs.BlendSupport, - sizeof(glprog->sh.fs.BlendSupport)); - write_shader_parameters(metadata, glprog->Parameters); assert((glprog->driver_cache_blob == NULL) == @@ -1194,9 +1191,6 @@ read_shader_metadata(struct blob_reader *metadata, } } - blob_copy_bytes(metadata, (uint8_t *) &glprog->sh.fs.BlendSupport, - sizeof(glprog->sh.fs.BlendSupport)); - glprog->Parameters = _mesa_new_parameter_list(); read_shader_parameters(metadata, glprog->Parameters); diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 51f8668f8fd..b3aabb9f054 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -410,6 +410,11 @@ typedef struct shader_info { unsigned color1_interp:3; /* glsl_interp_mode */ bool color1_sample:1; bool color1_centroid:1; + + /* Bitmask of gl_advanced_blend_mode values that may be used with this + * shader. + */ + unsigned advanced_blend_modes; } fs; struct { diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 0855824d71c..463c35362e2 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -2350,6 +2350,11 @@ ureg_setup_fragment_shader(struct ureg_program *ureg, assert(0); } } + + if (info->fs.advanced_blend_modes) { + ureg_property(ureg, TGSI_PROPERTY_FS_BLEND_EQUATION_ADVANCED, + info->fs.advanced_blend_modes); + } } static void diff --git a/src/mesa/main/draw_validate.c b/src/mesa/main/draw_validate.c index eb5a05e0065..9396ff05385 100644 --- a/src/mesa/main/draw_validate.c +++ b/src/mesa/main/draw_validate.c @@ -140,7 +140,7 @@ _mesa_update_valid_to_render_state(struct gl_context *ctx) */ const struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_FRAGMENT]; - const GLbitfield blend_support = !prog ? 0 : prog->sh.fs.BlendSupport; + const GLbitfield blend_support = !prog ? 0 : prog->info.fs.advanced_blend_modes; if ((blend_support & BITFIELD_BIT(ctx->Color._AdvancedBlendMode)) == 0) return; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 280aa1b4c25..29ec5c3e5f7 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2258,15 +2258,6 @@ struct gl_program GLuint NumBindlessImages; GLboolean HasBoundBindlessImage; struct gl_bindless_image *BindlessImages; - - union { - struct { - /** - * A bitmask of gl_advanced_blend_mode values - */ - GLbitfield BlendSupport; - } fs; - }; } sh; /** ARB assembly-style program fields */ diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 801aff3de6f..a7e7c78c340 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -6858,12 +6858,6 @@ st_translate_program( goto out; } } - - if (program->shader->Program->sh.fs.BlendSupport) - ureg_property(ureg, - TGSI_PROPERTY_FS_BLEND_EQUATION_ADVANCED, - program->shader->Program->sh.fs.BlendSupport); - } else if (procType == PIPE_SHADER_VERTEX) { for (i = 0; i < numOutputs; i++) {