summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2014-11-29 02:10:15 -0500
committerIlia Mirkin <[email protected]>2014-11-30 13:04:28 -0500
commitf866446e8c4c77cfe0f1f78929ff22ba1d4ae4aa (patch)
treed1556db554690fcb6c872320194827b2998541ca
parent8e147e9ec80c5789466e16665925f4a08e3664a3 (diff)
freedreno/a3xx: disable blending for integer formats
Also add support for the BLENDABLE bind flag, similarly predicated on non-int formats. Signed-off-by: Ilia Mirkin <[email protected]>
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_emit.c11
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_screen.c5
2 files changed, 14 insertions, 2 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
index 64b1c32bb63..44f8ac4bb40 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
@@ -573,9 +573,18 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
for (i = 0; i < ARRAY_SIZE(blend->rb_mrt); i++) {
bool is_float = util_format_is_float(
pipe_surface_format(ctx->framebuffer.cbufs[i]));
+ bool is_int = util_format_is_pure_integer(
+ pipe_surface_format(ctx->framebuffer.cbufs[i]));
+ uint32_t control = blend->rb_mrt[i].control;
+
+ if (is_int) {
+ control &= (A3XX_RB_MRT_CONTROL_COMPONENT_ENABLE__MASK |
+ A3XX_RB_MRT_CONTROL_DITHER_MODE__MASK);
+ control |= A3XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY);
+ }
OUT_PKT0(ring, REG_A3XX_RB_MRT_CONTROL(i), 1);
- OUT_RING(ring, blend->rb_mrt[i].control);
+ OUT_RING(ring, control);
OUT_PKT0(ring, REG_A3XX_RB_MRT_BLEND_CONTROL(i), 1);
OUT_RING(ring, blend->rb_mrt[i].blend_control |
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_screen.c b/src/gallium/drivers/freedreno/a3xx/fd3_screen.c
index 38716605079..5fc63e8febe 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_screen.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_screen.c
@@ -63,13 +63,16 @@ fd3_screen_is_format_supported(struct pipe_screen *pscreen,
if ((usage & (PIPE_BIND_RENDER_TARGET |
PIPE_BIND_DISPLAY_TARGET |
PIPE_BIND_SCANOUT |
- PIPE_BIND_SHARED)) &&
+ PIPE_BIND_SHARED |
+ PIPE_BIND_BLENDABLE)) &&
(fd3_pipe2color(format) != ~0) &&
(fd3_pipe2tex(format) != ~0)) {
retval |= usage & (PIPE_BIND_RENDER_TARGET |
PIPE_BIND_DISPLAY_TARGET |
PIPE_BIND_SCANOUT |
PIPE_BIND_SHARED);
+ if (!util_format_is_pure_integer(format))
+ retval |= usage & PIPE_BIND_BLENDABLE;
}
if ((usage & PIPE_BIND_DEPTH_STENCIL) &&