freedreno/a3xx: disable blending for integer formats
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 29 Nov 2014 07:10:15 +0000 (02:10 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sun, 30 Nov 2014 18:04:28 +0000 (13:04 -0500)
Also add support for the BLENDABLE bind flag, similarly predicated on
non-int formats.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/a3xx/fd3_screen.c

index 64b1c32bb63c5d402546b14dd7fc3b29dbefb3d7..44f8ac4bb40da63388daacf596db14087ef4b460 100644 (file)
@@ -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 |
index 38716605079ea6ca07d34ff3dec0920c67a3d415..5fc63e8febe7a91ff7a041b834af6cf964e15590 100644 (file)
@@ -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) &&