mesa/glsl: move BlendSupport bitfield to gl_program
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>
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user