Mesa (main): asahi: Translate blend CSO to lower_blend options
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon May 10 03:38:02 UTC 2021
Module: Mesa
Branch: main
Commit: 77f1f12000ec1ed3d461404b30af9a6d14b96afa
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=77f1f12000ec1ed3d461404b30af9a6d14b96afa
Author: Alyssa Rosenzweig <alyssa at 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 <alyssa at 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];
More information about the mesa-commit
mailing list