diff options
author | Dave Airlie <[email protected]> | 2015-11-30 14:43:07 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2015-12-07 09:59:00 +1000 |
commit | 839dae0dc0d92f47dddaf67964603f3c9c4a0ad7 (patch) | |
tree | 2cda074011c98dad48befc95857584e119899f4e /src | |
parent | 420afe06d1374509b8628d48162a0294bae7a14b (diff) |
r600: port over the get_lds_unique_index from radeonsi
On r600 this needs to subtract 9 due to texcoord interactions.
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 38 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.h | 1 |
2 files changed, 39 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 338427e894e..4d59af224d1 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -568,6 +568,44 @@ static int r600_spi_sid(struct r600_shader_io * io) return index; }; +/* we need this to get a common lds index for vs/tcs/tes input/outputs */ +int r600_get_lds_unique_index(unsigned semantic_name, unsigned index) +{ + switch (semantic_name) { + case TGSI_SEMANTIC_POSITION: + return 0; + case TGSI_SEMANTIC_PSIZE: + return 1; + case TGSI_SEMANTIC_CLIPDIST: + assert(index <= 1); + return 2 + index; + case TGSI_SEMANTIC_GENERIC: + if (index <= 63-4) + return 4 + index - 9; + else + /* same explanation as in the default statement, + * the only user hitting this is st/nine. + */ + return 0; + + /* patch indices are completely separate and thus start from 0 */ + case TGSI_SEMANTIC_TESSOUTER: + return 0; + case TGSI_SEMANTIC_TESSINNER: + return 1; + case TGSI_SEMANTIC_PATCH: + return 2 + index; + + default: + /* Don't fail here. The result of this function is only used + * for LS, TCS, TES, and GS, where legacy GL semantics can't + * occur, but this function is called for all vertex shaders + * before it's known whether LS will be compiled or not. + */ + return 0; + } +} + /* turn input into interpolate on EG */ static int evergreen_interp_input(struct r600_shader_ctx *ctx, int index) { diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 398e7da7666..f5b1c4b3f3b 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -154,6 +154,7 @@ struct r600_pipe_shader { TGSI_INTERPOLATE_LOC_CENTER/SAMPLE/COUNT. Other input values return -1. */ int eg_get_interpolator_index(unsigned interpolate, unsigned location); +int r600_get_lds_unique_index(unsigned semantic_name, unsigned index); #ifdef __cplusplus } // extern "C" |