diff options
author | Marek Olšák <[email protected]> | 2017-02-16 01:17:48 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-02-18 01:22:08 +0100 |
commit | dbd38f2a92633e565fe35c8d9c66f864d6ff4877 (patch) | |
tree | 55d8a0efe8fb24624c12fd647e7fc5e8275fbc8d /src/gallium/drivers/radeonsi/si_shader.c | |
parent | 41a2157a689838e4c97d5a703bc2aeaf5a5e1b48 (diff) |
radeonsi: add a workaround for clamping unaligned RGB 8 & 16-bit vertex loads
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_shader.c')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 8b9fed9fb8c..1829e3ec118 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -368,14 +368,27 @@ static void declare_input_vs( fix_fetch = ctx->shader->key.mono.vs.fix_fetch[input_index]; - /* Do multiple loads for double formats. */ - if (fix_fetch == SI_FIX_FETCH_RGB_64_FLOAT) { + /* Do multiple loads for special formats. */ + switch (fix_fetch) { + case SI_FIX_FETCH_RGB_64_FLOAT: num_fetches = 3; /* 3 2-dword loads */ fetch_stride = 8; - } else if (fix_fetch == SI_FIX_FETCH_RGBA_64_FLOAT) { + break; + case SI_FIX_FETCH_RGBA_64_FLOAT: num_fetches = 2; /* 2 4-dword loads */ fetch_stride = 16; - } else { + break; + case SI_FIX_FETCH_RGB_8: + case SI_FIX_FETCH_RGB_8_INT: + num_fetches = 3; + fetch_stride = 1; + break; + case SI_FIX_FETCH_RGB_16: + case SI_FIX_FETCH_RGB_16_INT: + num_fetches = 3; + fetch_stride = 2; + break; + default: num_fetches = 1; fetch_stride = 0; } @@ -512,6 +525,23 @@ static void declare_input_vs( chan % 2); } break; + case SI_FIX_FETCH_RGB_8: + case SI_FIX_FETCH_RGB_8_INT: + case SI_FIX_FETCH_RGB_16: + case SI_FIX_FETCH_RGB_16_INT: + for (chan = 0; chan < 3; chan++) { + out[chan] = LLVMBuildExtractElement(gallivm->builder, + input[chan], + ctx->i32_0, ""); + } + if (fix_fetch == SI_FIX_FETCH_RGB_8 || + fix_fetch == SI_FIX_FETCH_RGB_16) { + out[3] = LLVMConstReal(ctx->f32, 1); + } else { + out[3] = LLVMBuildBitCast(gallivm->builder, ctx->i32_1, + ctx->f32, ""); + } + break; } } |