Module: Mesa Branch: main Commit: 77f1f12000ec1ed3d461404b30af9a6d14b96afa URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=77f1f12000ec1ed3d461404b30af9a6d14b96afa
Author: Alyssa Rosenzweig <aly...@rosenzweig.io> Date: Tue May 4 22:20:50 2021 -0400 asahi: Translate blend CSO to lower_blend options We'll just stick this in the key. Signed-off-by: Alyssa Rosenzweig <aly...@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10720> --- src/gallium/drivers/asahi/agx_state.c | 59 +++++++++++++++++++++++++++++++++-- src/gallium/drivers/asahi/agx_state.h | 11 +++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 16751f6b126..d8875e5c87e 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -34,6 +34,7 @@ #include "gallium/auxiliary/util/u_draw.h" #include "gallium/auxiliary/util/u_helpers.h" #include "gallium/auxiliary/util/u_viewport.h" +#include "gallium/auxiliary/util/u_blend.h" #include "gallium/auxiliary/tgsi/tgsi_from_mesa.h" #include "compiler/nir/nir.h" #include "asahi/compiler/agx_compile.h" @@ -51,7 +52,61 @@ static void * agx_create_blend_state(struct pipe_context *ctx, const struct pipe_blend_state *state) { - return MALLOC(1); + struct agx_blend *so = CALLOC_STRUCT(agx_blend); + + assert(!state->alpha_to_coverage); + assert(!state->alpha_to_coverage_dither); + assert(!state->alpha_to_one); + assert(!state->advanced_blend_func); + + if (state->logicop_enable) { + so->logicop_enable = true; + so->logicop_func = state->logicop_func; + return so; + } + + for (unsigned i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) { + unsigned rti = state->independent_blend_enable ? i : 0; + struct pipe_rt_blend_state rt = state->rt[rti]; + + if (!rt.blend_enable) { + static const nir_lower_blend_channel replace = { + .func = BLEND_FUNC_ADD, + .src_factor = BLEND_FACTOR_ZERO, + .invert_src_factor = true, + .dst_factor = BLEND_FACTOR_ZERO, + .invert_dst_factor = false, + }; + + so->rt[i].rgb = replace; + so->rt[i].alpha = replace; + } else { + so->rt[i].rgb.func = util_blend_func_to_shader(rt.rgb_func); + so->rt[i].rgb.src_factor = util_blend_factor_to_shader(rt.rgb_src_factor); + so->rt[i].rgb.invert_src_factor = util_blend_factor_is_inverted(rt.rgb_src_factor); + so->rt[i].rgb.dst_factor = util_blend_factor_to_shader(rt.rgb_dst_factor); + so->rt[i].rgb.invert_dst_factor = util_blend_factor_is_inverted(rt.rgb_dst_factor); + + so->rt[i].alpha.func = util_blend_func_to_shader(rt.alpha_func); + so->rt[i].alpha.src_factor = util_blend_factor_to_shader(rt.alpha_src_factor); + so->rt[i].alpha.invert_src_factor = util_blend_factor_is_inverted(rt.alpha_src_factor); + so->rt[i].alpha.dst_factor = util_blend_factor_to_shader(rt.alpha_dst_factor); + so->rt[i].alpha.invert_dst_factor = util_blend_factor_is_inverted(rt.alpha_dst_factor); + + so->blend_enable = true; + } + + so->rt[i].colormask = rt.colormask; + } + + return so; +} + +static void +agx_bind_blend_state(struct pipe_context *pctx, void *cso) +{ + struct agx_context *ctx = agx_context(pctx); + ctx->blend = cso; } static void * @@ -1150,7 +1205,7 @@ agx_init_state_functions(struct pipe_context *ctx) ctx->create_surface = agx_create_surface; ctx->create_vertex_elements_state = agx_create_vertex_elements; ctx->create_vs_state = agx_create_shader_state; - ctx->bind_blend_state = agx_bind_state; + ctx->bind_blend_state = agx_bind_blend_state; ctx->bind_depth_stencil_alpha_state = agx_bind_zsa_state; ctx->bind_sampler_states = agx_bind_sampler_states; ctx->bind_fs_state = agx_bind_shader_state; diff --git a/src/gallium/drivers/asahi/agx_state.h b/src/gallium/drivers/asahi/agx_state.h index 9d860f41c21..9cd84c139de 100644 --- a/src/gallium/drivers/asahi/agx_state.h +++ b/src/gallium/drivers/asahi/agx_state.h @@ -32,6 +32,7 @@ #include "asahi/lib/agx_device.h" #include "asahi/lib/pool.h" #include "asahi/compiler/agx_compile.h" +#include "compiler/nir/nir_lower_blend.h" #include "util/hash_table.h" #include "util/bitset.h" @@ -97,6 +98,15 @@ struct agx_zsa { bool disable_z_write; }; +struct agx_blend { + bool logicop_enable; + + union { + nir_lower_blend_rt rt[8]; + unsigned logicop_func; + }; +}; + #define AGX_DIRTY_VERTEX (1 << 0) struct agx_context { @@ -113,6 +123,7 @@ struct agx_context { struct agx_attribute *attributes; struct agx_rasterizer *rast; struct agx_zsa zs; + struct agx_blend *blend; uint8_t viewport[AGX_VIEWPORT_LENGTH]; uint8_t render_target[8][AGX_RENDER_TARGET_LENGTH]; _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit