freedreno/a3xx: only enable blend clamp for non-float formats
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 28 Nov 2014 21:59:21 +0000 (16:59 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 29 Nov 2014 17:15:43 +0000 (12:15 -0500)
This fixes arb_color_buffer_float-render GL_RGBA16F.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "10.3 10.4" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_blend.c
src/gallium/drivers/freedreno/a3xx/fd3_emit.c

index f97b1a7eec3e5c9efcbd87085eeeed7f696c600b..940d065d75b94be5af839ab293f421d9494ebfc8 100644 (file)
@@ -105,8 +105,7 @@ fd3_blend_state_create(struct pipe_context *pctx,
                                A3XX_RB_MRT_BLEND_CONTROL_RGB_DEST_FACTOR(fd_blend_factor(rt->rgb_dst_factor)) |
                                A3XX_RB_MRT_BLEND_CONTROL_ALPHA_SRC_FACTOR(fd_blend_factor(rt->alpha_src_factor)) |
                                A3XX_RB_MRT_BLEND_CONTROL_ALPHA_BLEND_OPCODE(blend_func(rt->alpha_func)) |
-                               A3XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor)) |
-                               A3XX_RB_MRT_BLEND_CONTROL_CLAMP_ENABLE;
+                               A3XX_RB_MRT_BLEND_CONTROL_ALPHA_DEST_FACTOR(fd_blend_factor(rt->alpha_dst_factor));
 
                so->rb_mrt[i].control =
                                A3XX_RB_MRT_CONTROL_ROP_CODE(rop) |
index e22a5ba7df5bc85a1b72897d7416bf7c88e84a72..62ffa73cd20d8fdb8d90e57fcf8e1a59d863736e 100644 (file)
@@ -566,16 +566,20 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
                }
        }
 
-       if ((dirty & FD_DIRTY_BLEND) && ctx->blend) {
+       if ((dirty & (FD_DIRTY_BLEND | FD_DIRTY_FRAMEBUFFER)) && ctx->blend) {
                struct fd3_blend_stateobj *blend = fd3_blend_stateobj(ctx->blend);
                uint32_t i;
 
                for (i = 0; i < ARRAY_SIZE(blend->rb_mrt); i++) {
+                       bool is_float = util_format_is_float(
+                                       pipe_surface_format(ctx->framebuffer.cbufs[i]));
+
                        OUT_PKT0(ring, REG_A3XX_RB_MRT_CONTROL(i), 1);
                        OUT_RING(ring, blend->rb_mrt[i].control);
 
                        OUT_PKT0(ring, REG_A3XX_RB_MRT_BLEND_CONTROL(i), 1);
-                       OUT_RING(ring, blend->rb_mrt[i].blend_control);
+                       OUT_RING(ring, blend->rb_mrt[i].blend_control |
+                                       COND(!is_float, A3XX_RB_MRT_BLEND_CONTROL_CLAMP_ENABLE));
                }
        }