gallium/tgsi: add helper tgsi_get_interp_mode
[mesa.git] / src / gallium / auxiliary / tgsi / tgsi_from_mesa.c
index 31be7d946b7125adb7c3f529f517caeb6a2aac09..a7641c11592f25cad1c26fe8cf05684c37ef1e1b 100644 (file)
@@ -123,10 +123,26 @@ tgsi_get_gl_varying_semantic(gl_varying_slot attr,
       *semantic_name = TGSI_SEMANTIC_VIEWPORT_INDEX;
       *semantic_index = 0;
       break;
+   case VARYING_SLOT_FACE:
+      *semantic_name = TGSI_SEMANTIC_FACE;
+      *semantic_index = 0;
+      break;
    case VARYING_SLOT_PNTC:
       *semantic_name = TGSI_SEMANTIC_PCOORD;
       *semantic_index = 0;
       break;
+   case VARYING_SLOT_TESS_LEVEL_OUTER:
+      *semantic_name = TGSI_SEMANTIC_TESSOUTER;
+      *semantic_index = 0;
+      break;
+   case VARYING_SLOT_TESS_LEVEL_INNER:
+      *semantic_name = TGSI_SEMANTIC_TESSINNER;
+      *semantic_index = 0;
+      break;
+   case VARYING_SLOT_VIEWPORT_MASK:
+      *semantic_name = TGSI_SEMANTIC_VIEWPORT_MASK;
+      *semantic_index = 0;
+      break;
 
    case VARYING_SLOT_TEX0:
    case VARYING_SLOT_TEX1:
@@ -146,9 +162,14 @@ tgsi_get_gl_varying_semantic(gl_varying_slot attr,
    default:
       assert(attr >= VARYING_SLOT_VAR0 ||
              (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7));
-      *semantic_name = TGSI_SEMANTIC_GENERIC;
-      *semantic_index =
-         tgsi_get_generic_gl_varying_index(attr, needs_texcoord_semantic);
+      if (attr >= VARYING_SLOT_PATCH0) {
+         *semantic_name = TGSI_SEMANTIC_PATCH;
+         *semantic_index = attr - VARYING_SLOT_PATCH0;
+      } else {
+         *semantic_name = TGSI_SEMANTIC_GENERIC;
+         *semantic_index =
+            tgsi_get_generic_gl_varying_index(attr, needs_texcoord_semantic);
+      }
       break;
    }
 }
@@ -187,3 +208,102 @@ tgsi_get_gl_frag_result_semantic(gl_frag_result frag_result,
       assert(false);
    }
 }
+
+/** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */
+enum tgsi_semantic
+tgsi_get_sysval_semantic(unsigned sysval)
+{
+   switch (sysval) {
+   /* Vertex shader */
+   case SYSTEM_VALUE_VERTEX_ID:
+      return TGSI_SEMANTIC_VERTEXID;
+   case SYSTEM_VALUE_INSTANCE_ID:
+      return TGSI_SEMANTIC_INSTANCEID;
+   case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
+      return TGSI_SEMANTIC_VERTEXID_NOBASE;
+   case SYSTEM_VALUE_BASE_VERTEX:
+      return TGSI_SEMANTIC_BASEVERTEX;
+   case SYSTEM_VALUE_BASE_INSTANCE:
+      return TGSI_SEMANTIC_BASEINSTANCE;
+   case SYSTEM_VALUE_DRAW_ID:
+      return TGSI_SEMANTIC_DRAWID;
+
+   /* Geometry shader */
+   case SYSTEM_VALUE_INVOCATION_ID:
+      return TGSI_SEMANTIC_INVOCATIONID;
+
+   /* Fragment shader */
+   case SYSTEM_VALUE_FRAG_COORD:
+      return TGSI_SEMANTIC_POSITION;
+   case SYSTEM_VALUE_POINT_COORD:
+      return TGSI_SEMANTIC_PCOORD;
+   case SYSTEM_VALUE_FRONT_FACE:
+      return TGSI_SEMANTIC_FACE;
+   case SYSTEM_VALUE_SAMPLE_ID:
+      return TGSI_SEMANTIC_SAMPLEID;
+   case SYSTEM_VALUE_SAMPLE_POS:
+      return TGSI_SEMANTIC_SAMPLEPOS;
+   case SYSTEM_VALUE_SAMPLE_MASK_IN:
+      return TGSI_SEMANTIC_SAMPLEMASK;
+   case SYSTEM_VALUE_HELPER_INVOCATION:
+      return TGSI_SEMANTIC_HELPER_INVOCATION;
+
+   /* Tessellation shader */
+   case SYSTEM_VALUE_TESS_COORD:
+      return TGSI_SEMANTIC_TESSCOORD;
+   case SYSTEM_VALUE_VERTICES_IN:
+      return TGSI_SEMANTIC_VERTICESIN;
+   case SYSTEM_VALUE_PRIMITIVE_ID:
+      return TGSI_SEMANTIC_PRIMID;
+   case SYSTEM_VALUE_TESS_LEVEL_OUTER:
+      return TGSI_SEMANTIC_TESSOUTER;
+   case SYSTEM_VALUE_TESS_LEVEL_INNER:
+      return TGSI_SEMANTIC_TESSINNER;
+
+   /* Compute shader */
+   case SYSTEM_VALUE_LOCAL_INVOCATION_ID:
+      return TGSI_SEMANTIC_THREAD_ID;
+   case SYSTEM_VALUE_WORK_GROUP_ID:
+      return TGSI_SEMANTIC_BLOCK_ID;
+   case SYSTEM_VALUE_NUM_WORK_GROUPS:
+      return TGSI_SEMANTIC_GRID_SIZE;
+   case SYSTEM_VALUE_LOCAL_GROUP_SIZE:
+      return TGSI_SEMANTIC_BLOCK_SIZE;
+
+   /* ARB_shader_ballot */
+   case SYSTEM_VALUE_SUBGROUP_SIZE:
+      return TGSI_SEMANTIC_SUBGROUP_SIZE;
+   case SYSTEM_VALUE_SUBGROUP_INVOCATION:
+      return TGSI_SEMANTIC_SUBGROUP_INVOCATION;
+   case SYSTEM_VALUE_SUBGROUP_EQ_MASK:
+      return TGSI_SEMANTIC_SUBGROUP_EQ_MASK;
+   case SYSTEM_VALUE_SUBGROUP_GE_MASK:
+      return TGSI_SEMANTIC_SUBGROUP_GE_MASK;
+   case SYSTEM_VALUE_SUBGROUP_GT_MASK:
+      return TGSI_SEMANTIC_SUBGROUP_GT_MASK;
+   case SYSTEM_VALUE_SUBGROUP_LE_MASK:
+      return TGSI_SEMANTIC_SUBGROUP_LE_MASK;
+   case SYSTEM_VALUE_SUBGROUP_LT_MASK:
+      return TGSI_SEMANTIC_SUBGROUP_LT_MASK;
+
+   default:
+      unreachable("Unexpected system value to TGSI");
+   }
+}
+
+enum tgsi_interpolate_mode
+tgsi_get_interp_mode(enum glsl_interp_mode mode, bool color)
+{
+   switch (mode) {
+   case INTERP_MODE_NONE:
+      return color ? TGSI_INTERPOLATE_COLOR : TGSI_INTERPOLATE_PERSPECTIVE;
+   case INTERP_MODE_FLAT:
+      return TGSI_INTERPOLATE_CONSTANT;
+   case INTERP_MODE_NOPERSPECTIVE:
+      return TGSI_INTERPOLATE_LINEAR;
+   case INTERP_MODE_SMOOTH:
+      return TGSI_INTERPOLATE_PERSPECTIVE;
+   default:
+      unreachable("unknown interpolation mode");
+   }
+}