mesa/glsl: move BlendSupport bitfield to gl_program
authorTimothy Arceri <timothy.arceri@collabora.com>
Thu, 3 Nov 2016 23:10:19 +0000 (10:10 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Thu, 29 Dec 2016 23:57:16 +0000 (10:57 +1100)
This will let us to make _CurrentFragmentProgram a gl_program pointer
allowing for simpilifications to be made.

We also need to add a field to gl_shader to hold it during parsing.

In gl_program we put it inside a union in anticipation of moving
more fields here that can be only fs or vertex stage fields.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/linker.cpp
src/compiler/glsl/lower_blend_equation_advanced.cpp
src/mesa/main/api_validate.c
src/mesa/main/mtypes.h

index 14b71539eb74addc14bf83f50c1a1e72bd1ca6ea..4566aa92ecdf11d2e34e15d7f3018f46eaa93164 100644 (file)
@@ -1818,7 +1818,7 @@ set_shader_inout_layout(struct gl_shader *shader,
       shader->info.EarlyFragmentTests = state->fs_early_fragment_tests;
       shader->info.InnerCoverage = state->fs_inner_coverage;
       shader->info.PostDepthCoverage = state->fs_post_depth_coverage;
-      shader->info.BlendSupport = state->fs_blend_support;
+      shader->BlendSupport = state->fs_blend_support;
       break;
 
    default:
index 209129c3ea0cdf98d1b6c0bec0a6c8757fbe4e20..3726f66973010ff866061c9c21b3282c4b508ae1 100644 (file)
@@ -1829,7 +1829,6 @@ link_fs_inout_layout_qualifiers(struct gl_shader_program *prog,
    linked_shader->info.uses_gl_fragcoord = false;
    linked_shader->info.origin_upper_left = false;
    linked_shader->info.pixel_center_integer = false;
-   linked_shader->info.BlendSupport = 0;
 
    if (linked_shader->Stage != MESA_SHADER_FRAGMENT ||
        (prog->data->Version < 150 &&
@@ -1894,7 +1893,7 @@ link_fs_inout_layout_qualifiers(struct gl_shader_program *prog,
       linked_shader->Program->info.fs.post_depth_coverage |=
          shader->info.PostDepthCoverage;
 
-      linked_shader->info.BlendSupport |= shader->info.BlendSupport;
+      linked_shader->Program->sh.fs.BlendSupport |= shader->BlendSupport;
    }
 }
 
index f8210e3aaa5237eacd7f08026bd59d6f4b37101b..4f9cd8387ffb92a11e9fd2e812fbec3e352280cb 100644 (file)
@@ -463,7 +463,7 @@ get_main(gl_linked_shader *sh)
 bool
 lower_blend_equation_advanced(struct gl_linked_shader *sh)
 {
-   if (sh->info.BlendSupport == 0)
+   if (sh->Program->sh.fs.BlendSupport == 0)
       return false;
 
    /* Lower early returns in main() so there's a single exit point
@@ -547,7 +547,8 @@ lower_blend_equation_advanced(struct gl_linked_shader *sh)
    ir_factory f(&main->body, mem_ctx);
 
    ir_variable *result_dest =
-      calc_blend_result(f, mode, fb, blend_source, sh->info.BlendSupport);
+      calc_blend_result(f, mode, fb, blend_source,
+                        sh->Program->sh.fs.BlendSupport);
 
    /* Copy the result back to the original values.  It would be simpler
     * to demote the program's output variables, and create a new vec4
index 2f9980e7e6cb8c6ad81a4d5b7682421f81804f84..42eeeba1414e5d8ea397d65b089681c9bef4a984 100644 (file)
@@ -102,7 +102,7 @@ check_blend_func_error(struct gl_context *ctx)
       const struct gl_shader_program *sh_prog =
          ctx->_Shader->_CurrentFragmentProgram;
       const GLbitfield blend_support = !sh_prog ? 0 :
-         sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->info.BlendSupport;
+         sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program->sh.fs.BlendSupport;
 
       if ((blend_support & ctx->Color._AdvancedBlendMode) == 0) {
          _mesa_error(ctx, GL_INVALID_OPERATION,
index 35dd8135f26d749f8b5777b5740d90dc7dc10d9d..69d2eeeaf314b68d4b97aaf6109f78521f877d4d 100644 (file)
@@ -1972,6 +1972,15 @@ struct gl_program
          GLuint NumSubroutineFunctions;
          GLuint MaxSubroutineFunctionIndex;
          struct gl_subroutine_function *SubroutineFunctions;
+
+         union {
+            struct {
+               /**
+                * A bitmask of gl_advanced_blend_mode values
+                */
+               GLbitfield BlendSupport;
+            } fs;
+         };
       } sh;
 
       /** ARB assembly-style program fields */
@@ -2278,11 +2287,6 @@ struct gl_shader_info
     */
    bool EarlyFragmentTests;
 
-   /**
-    * A bitmask of gl_advanced_blend_mode values
-    */
-   GLbitfield BlendSupport;
-
    /**
     * Compute shader state from ARB_compute_shader and
     * ARB_compute_variable_group_size layout qualifiers.
@@ -2436,6 +2440,11 @@ struct gl_shader
    struct exec_list *ir;
    struct glsl_symbol_table *symbols;
 
+   /**
+    * A bitmask of gl_advanced_blend_mode values
+    */
+   GLbitfield BlendSupport;
+
    struct gl_shader_info info;
 };