OSDN Git Service

r600: port over the get_lds_unique_index from radeonsi
authorDave Airlie <airlied@redhat.com>
Mon, 30 Nov 2015 04:43:07 +0000 (14:43 +1000)
committerDave Airlie <airlied@redhat.com>
Sun, 6 Dec 2015 23:59:00 +0000 (09:59 +1000)
On r600 this needs to subtract 9 due to texcoord interactions.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h

index 338427e..4d59af2 100644 (file)
@@ -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)
 {
index 398e7da..f5b1c4b 100644 (file)
@@ -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"