diff options
author | Ilia Mirkin <[email protected]> | 2014-11-28 16:59:21 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-11-29 12:15:43 -0500 |
commit | 3de9fa8ff47bd6b186f9d57511cb9fe08618f62f (patch) | |
tree | 741dee18386906e8fef5cb24f13b0a02fb4b620a /src/gallium/drivers | |
parent | 67c498086d0858a94d53ebb6921cfda847250368 (diff) |
freedreno/a3xx: only enable blend clamp for non-float formats
This fixes arb_color_buffer_float-render GL_RGBA16F.
Signed-off-by: Ilia Mirkin <[email protected]>
Cc: "10.3 10.4" <[email protected]>
Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/freedreno/a3xx/fd3_blend.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/a3xx/fd3_emit.c | 8 |
2 files changed, 7 insertions, 4 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_blend.c b/src/gallium/drivers/freedreno/a3xx/fd3_blend.c index f97b1a7eec3..940d065d75b 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_blend.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_blend.c @@ -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) | diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c index e22a5ba7df5..62ffa73cd20 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c @@ -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)); } } |