[Mesa-dev] [PATCH 6/7] st/mesa: add support for advanced blend when fb can be fetched from
Nicolai Hähnle
nhaehnle at gmail.com
Thu Jan 5 15:52:23 UTC 2017
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
On 02.01.2017 07:01, Ilia Mirkin wrote:
> This implements support for emitting FBFETCH ops, using the existing
> lowering pass for advanced blend logic, and disabling hw blend when
> advanced blending is enabled.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/mesa/state_tracker/st_atom_blend.c | 2 +-
> src/mesa/state_tracker/st_cb_texturebarrier.c | 13 +++++++++++++
> src/mesa/state_tracker/st_extensions.c | 2 ++
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 28 ++++++++++++++++++++-------
> 4 files changed, 37 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom_blend.c b/src/mesa/state_tracker/st_atom_blend.c
> index b8d65bd..f76cfab 100644
> --- a/src/mesa/state_tracker/st_atom_blend.c
> +++ b/src/mesa/state_tracker/st_atom_blend.c
> @@ -205,7 +205,7 @@ update_blend( struct st_context *st )
> blend->logicop_enable = 1;
> blend->logicop_func = translate_logicop(ctx->Color.LogicOp);
> }
> - else if (ctx->Color.BlendEnabled) {
> + else if (ctx->Color.BlendEnabled && !ctx->Color._AdvancedBlendMode) {
> /* blending enabled */
> for (i = 0, j = 0; i < num_state; i++) {
>
> diff --git a/src/mesa/state_tracker/st_cb_texturebarrier.c b/src/mesa/state_tracker/st_cb_texturebarrier.c
> index 7fd1cbd..29cd37c 100644
> --- a/src/mesa/state_tracker/st_cb_texturebarrier.c
> +++ b/src/mesa/state_tracker/st_cb_texturebarrier.c
> @@ -55,6 +55,18 @@ st_TextureBarrier(struct gl_context *ctx)
>
>
> /**
> + * Called via ctx->Driver.BlendBarrier()
> + */
> +static void
> +st_BlendBarrier(struct gl_context *ctx)
> +{
> + struct pipe_context *pipe = st_context(ctx)->pipe;
> +
> + pipe->texture_barrier(pipe, PIPE_TEXTURE_BARRIER_FRAMEBUFFER);
> +}
> +
> +
> +/**
> * Called via ctx->Driver.MemoryBarrier()
> */
> static void
> @@ -118,5 +130,6 @@ st_MemoryBarrier(struct gl_context *ctx, GLbitfield barriers)
> void st_init_texture_barrier_functions(struct dd_function_table *functions)
> {
> functions->TextureBarrier = st_TextureBarrier;
> + functions->BlendBarrier = st_BlendBarrier;
> functions->MemoryBarrier = st_MemoryBarrier;
> }
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index df6ad08..4921d37 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -614,6 +614,8 @@ void st_init_extensions(struct pipe_screen *screen,
> { o(ARB_transform_feedback2), PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME },
> { o(ARB_transform_feedback3), PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS },
>
> + { o(KHR_blend_equation_advanced), PIPE_CAP_TGSI_FS_FBFETCH },
> +
> { o(EXT_blend_equation_separate), PIPE_CAP_BLEND_EQUATION_SEPARATE },
> { o(EXT_depth_bounds_test), PIPE_CAP_DEPTH_BOUNDS_TEST },
> { o(EXT_draw_buffers2), PIPE_CAP_INDEP_BLEND_ENABLE },
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 9599296..42c9b87 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -2500,10 +2500,19 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
> else
> decl->size = type_size(var->type);
>
> - entry = new(mem_ctx) variable_storage(var,
> - PROGRAM_OUTPUT,
> - decl->mesa_index,
> - decl->array_id);
> + if (var->data.fb_fetch_output) {
> + st_dst_reg dst = st_dst_reg(get_temp(var->type));
> + st_src_reg src = st_src_reg(PROGRAM_OUTPUT, decl->mesa_index,
> + var->type, component, decl->array_id);
> + emit_asm(NULL, TGSI_OPCODE_FBFETCH, dst, src);
> + entry = new(mem_ctx) variable_storage(var, dst.file, dst.index,
> + dst.array_id);
> + } else {
> + entry = new(mem_ctx) variable_storage(var,
> + PROGRAM_OUTPUT,
> + decl->mesa_index,
> + decl->array_id);
> + }
> entry->component = component;
>
> this->variables.push_tail(entry);
> @@ -6788,8 +6797,9 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
> continue;
>
> bool progress;
> - exec_list *ir = prog->_LinkedShaders[i]->ir;
> - gl_shader_stage stage = prog->_LinkedShaders[i]->Stage;
> + struct gl_linked_shader *shader = prog->_LinkedShaders[i];
> + exec_list *ir = shader->ir;
> + gl_shader_stage stage = shader->Stage;
> const struct gl_shader_compiler_options *options =
> &ctx->Const.ShaderCompilerOptions[stage];
> enum pipe_shader_type ptarget = st_shader_stage_to_ptarget(stage);
> @@ -6805,7 +6815,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
> */
> if (options->EmitNoIndirectInput || options->EmitNoIndirectOutput ||
> options->EmitNoIndirectTemp || options->EmitNoIndirectUniform) {
> - lower_variable_index_to_cond_assign(prog->_LinkedShaders[i]->Stage, ir,
> + lower_variable_index_to_cond_assign(stage, ir,
> options->EmitNoIndirectInput,
> options->EmitNoIndirectOutput,
> options->EmitNoIndirectTemp,
> @@ -6835,6 +6845,10 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
> if (!pscreen->get_param(pscreen, PIPE_CAP_TEXTURE_GATHER_OFFSETS))
> lower_offset_arrays(ir);
> do_mat_op_to_vec(ir);
> +
> + if (stage == MESA_SHADER_FRAGMENT)
> + lower_blend_equation_advanced(shader);
> +
> lower_instructions(ir,
> MOD_TO_FLOOR |
> DIV_TO_MUL_RCP |
>
More information about the mesa-dev
mailing list