glsl: Specify framebuffer fetch coherency mode in lower_blend_equation_advanced().
This requires passing an extra argument to the lowering pass because the KHR_blend_equation_advanced specification doesn't seem to define any mechanism for the implementation to determine at compile-time whether coherent blending can ever be used (not even an "#extension KHR_blend_equation_advanced_coherent" directive seems to be required in the shader source AFAICT). In the long run we'll probably want to do state-dependent recompiles based on the value of ctx->Color.BlendCoherent, but right now there would be no benefit from that because the only driver that supports coherent framebuffer fetch is i965 on SKL+ hardware, which are unable to support the non-coherent path for the moment because of texture layout issues, so framebuffer fetch coherency is always enabled for them. Reviewed-by: Plamena Manolova <plamena.manolova@intel.com>
This commit is contained in:
@@ -166,7 +166,7 @@ bool lower_tess_level(gl_linked_shader *shader);
|
|||||||
|
|
||||||
bool lower_vertex_id(gl_linked_shader *shader);
|
bool lower_vertex_id(gl_linked_shader *shader);
|
||||||
bool lower_cs_derived(gl_linked_shader *shader);
|
bool lower_cs_derived(gl_linked_shader *shader);
|
||||||
bool lower_blend_equation_advanced(gl_linked_shader *shader);
|
bool lower_blend_equation_advanced(gl_linked_shader *shader, bool coherent);
|
||||||
|
|
||||||
bool lower_subroutine(exec_list *instructions, struct _mesa_glsl_parse_state *state);
|
bool lower_subroutine(exec_list *instructions, struct _mesa_glsl_parse_state *state);
|
||||||
void propagate_invariance(exec_list *instructions);
|
void propagate_invariance(exec_list *instructions);
|
||||||
|
@@ -462,7 +462,7 @@ get_main(gl_linked_shader *sh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
lower_blend_equation_advanced(struct gl_linked_shader *sh)
|
lower_blend_equation_advanced(struct gl_linked_shader *sh, bool coherent)
|
||||||
{
|
{
|
||||||
if (sh->Program->sh.fs.BlendSupport == 0)
|
if (sh->Program->sh.fs.BlendSupport == 0)
|
||||||
return false;
|
return false;
|
||||||
@@ -480,6 +480,7 @@ lower_blend_equation_advanced(struct gl_linked_shader *sh)
|
|||||||
fb->data.location = FRAG_RESULT_DATA0;
|
fb->data.location = FRAG_RESULT_DATA0;
|
||||||
fb->data.read_only = 1;
|
fb->data.read_only = 1;
|
||||||
fb->data.fb_fetch_output = 1;
|
fb->data.fb_fetch_output = 1;
|
||||||
|
fb->data.memory_coherent = coherent;
|
||||||
fb->data.how_declared = ir_var_hidden;
|
fb->data.how_declared = ir_var_hidden;
|
||||||
|
|
||||||
ir_variable *mode = new(mem_ctx) ir_variable(glsl_type::uint_type,
|
ir_variable *mode = new(mem_ctx) ir_variable(glsl_type::uint_type,
|
||||||
|
@@ -99,7 +99,8 @@ process_glsl_ir(struct brw_context *brw,
|
|||||||
|
|
||||||
ralloc_adopt(mem_ctx, shader->ir);
|
ralloc_adopt(mem_ctx, shader->ir);
|
||||||
|
|
||||||
lower_blend_equation_advanced(shader);
|
lower_blend_equation_advanced(
|
||||||
|
shader, ctx->Extensions.KHR_blend_equation_advanced_coherent);
|
||||||
|
|
||||||
/* lower_packing_builtins() inserts arithmetic instructions, so it
|
/* lower_packing_builtins() inserts arithmetic instructions, so it
|
||||||
* must precede lower_instructions().
|
* must precede lower_instructions().
|
||||||
|
@@ -7056,7 +7056,8 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
|||||||
do_mat_op_to_vec(ir);
|
do_mat_op_to_vec(ir);
|
||||||
|
|
||||||
if (stage == MESA_SHADER_FRAGMENT)
|
if (stage == MESA_SHADER_FRAGMENT)
|
||||||
lower_blend_equation_advanced(shader);
|
lower_blend_equation_advanced(
|
||||||
|
shader, ctx->Extensions.KHR_blend_equation_advanced_coherent);
|
||||||
|
|
||||||
lower_instructions(ir,
|
lower_instructions(ir,
|
||||||
MOD_TO_FLOOR |
|
MOD_TO_FLOOR |
|
||||||
|
Reference in New Issue
Block a user