diff options
author | Ilia Mirkin <[email protected]> | 2014-11-29 02:13:07 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-11-30 13:04:28 -0500 |
commit | 618ff11457f477ce1d30ecfbcee469287760838b (patch) | |
tree | a0910609cb6bdb4353724e844892b6e87aba0b2b /src/gallium/drivers/freedreno/a3xx/fd3_gmem.c | |
parent | f866446e8c4c77cfe0f1f78929ff22ba1d4ae4aa (diff) |
freedreno/a3xx: don't use half precision shaders for int/float32
Integer outputs end up getting mangled due to cov.f32f16, and float32
loses precision. Use full precision shaders in both of those cases.
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno/a3xx/fd3_gmem.c')
-rw-r--r-- | src/gallium/drivers/freedreno/a3xx/fd3_gmem.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c index dae0b113635..8edfb8b46d1 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c @@ -43,12 +43,6 @@ #include "fd3_format.h" #include "fd3_zsa.h" -static const struct ir3_shader_key key = { - // XXX should set this based on render target format! We don't - // want half_precision if float32 render target!!! - .half_precision = true, -}; - static void emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, struct pipe_surface **bufs, uint32_t *bases, uint32_t bin_w) @@ -161,7 +155,9 @@ emit_binning_workaround(struct fd_context *ctx) struct fd3_emit emit = { .vtx = &fd3_ctx->solid_vbuf_state, .prog = &ctx->solid_prog, - .key = key, + .key = { + .half_precision = true, + }, }; OUT_PKT0(ring, REG_A3XX_RB_MODE_CONTROL, 2); @@ -336,10 +332,14 @@ fd3_emit_tile_gmem2mem(struct fd_context *ctx, struct fd_tile *tile) struct fd3_context *fd3_ctx = fd3_context(ctx); struct fd_ringbuffer *ring = ctx->ring; struct pipe_framebuffer_state *pfb = &ctx->framebuffer; + enum pipe_format format = pipe_surface_format(pfb->cbufs[0]); struct fd3_emit emit = { .vtx = &fd3_ctx->solid_vbuf_state, .prog = &ctx->solid_prog, - .key = key, + .key = { + .half_precision = fd3_half_precision(format), + }, + .format = format, }; OUT_PKT0(ring, REG_A3XX_RB_DEPTH_CONTROL, 1); @@ -458,10 +458,14 @@ fd3_emit_tile_mem2gmem(struct fd_context *ctx, struct fd_tile *tile) struct fd_gmem_stateobj *gmem = &ctx->gmem; struct fd_ringbuffer *ring = ctx->ring; struct pipe_framebuffer_state *pfb = &ctx->framebuffer; + enum pipe_format format = pipe_surface_format(pfb->cbufs[0]); struct fd3_emit emit = { .vtx = &fd3_ctx->blit_vbuf_state, .prog = &ctx->blit_prog, - .key = key, + .key = { + .half_precision = fd3_half_precision(format), + }, + .format = format, }; float x0, y0, x1, y1; unsigned bin_w = tile->bin_w; |