gs: inject const int gl_VerticesIn at link time
authorZack Rusin <zackr@vmware.com>
Wed, 7 Jul 2010 04:54:33 +0000 (00:54 -0400)
committerZack Rusin <zackr@vmware.com>
Thu, 8 Jul 2010 04:28:29 +0000 (00:28 -0400)
src/mesa/main/mtypes.h
src/mesa/slang/library/slang_geometry_builtin.gc
src/mesa/slang/slang_builtin.c
src/mesa/slang/slang_codegen.c
src/mesa/slang/slang_link.c
src/mesa/state_tracker/st_program.c

index a3f89f2f9b9b41ab72a6c043f1f8d11a3a77b5c6..cbb9eb84f3350018627db972615625df07e4230c 100644 (file)
@@ -252,17 +252,16 @@ typedef enum
  */
 typedef enum
 {
-   GEOM_ATTRIB_VERTICES = 0, /*gl_VerticesIn*/
-   GEOM_ATTRIB_POSITION = 1,
-   GEOM_ATTRIB_COLOR0 = 2,
-   GEOM_ATTRIB_COLOR1 = 3,
-   GEOM_ATTRIB_SECONDARY_COLOR0 = 4,
-   GEOM_ATTRIB_SECONDARY_COLOR1 = 5,
-   GEOM_ATTRIB_FOG_FRAG_COORD = 6,
-   GEOM_ATTRIB_POINT_SIZE = 7,
-   GEOM_ATTRIB_CLIP_VERTEX = 8,
-   GEOM_ATTRIB_PRIMITIVE_ID = 9,
-   GEOM_ATTRIB_TEX_COORD = 10,
+   GEOM_ATTRIB_POSITION = 0,
+   GEOM_ATTRIB_COLOR0 = 1,
+   GEOM_ATTRIB_COLOR1 = 2,
+   GEOM_ATTRIB_SECONDARY_COLOR0 = 3,
+   GEOM_ATTRIB_SECONDARY_COLOR1 = 4,
+   GEOM_ATTRIB_FOG_FRAG_COORD = 5,
+   GEOM_ATTRIB_POINT_SIZE = 6,
+   GEOM_ATTRIB_CLIP_VERTEX = 7,
+   GEOM_ATTRIB_PRIMITIVE_ID = 8,
+   GEOM_ATTRIB_TEX_COORD = 9,
 
    GEOM_ATTRIB_VAR0 = 16,
    GEOM_ATTRIB_MAX = (GEOM_ATTRIB_VAR0 + MAX_VARYING)
@@ -273,7 +272,6 @@ typedef enum
  * These are used in bitfields in many places.
  */
 /*@{*/
-#define GEOM_BIT_VERTICES    (1 << GEOM_ATTRIB_VERTICES)
 #define GEOM_BIT_COLOR0      (1 << GEOM_ATTRIB_COLOR0)
 #define GEOM_BIT_COLOR1      (1 << GEOM_ATTRIB_COLOR1)
 #define GEOM_BIT_SCOLOR0     (1 << GEOM_ATTRIB_SECONDARY_COLOR0)
index c349a6acc04dc758a953158a998864585df0240d..07524912ba1e26684b624d3847be910b93bc861d 100644 (file)
@@ -21,7 +21,6 @@
 
 const int _mesa_VerticesInMax = 6;
 
-__fixed_input int gl_VerticesIn;
 __fixed_input int gl_PrimitiveIDIn;
 __fixed_output int gl_PrimitiveID;
 __fixed_output int gl_Layer;
index 5c1a0406608268dacf50f11c3b78428783c1c76f..bb6fd662cccf6daf8a21fe3ba10690adc267c824 100644 (file)
@@ -746,7 +746,6 @@ static const struct input_info vertInputs[] = {
 };
 
 static const struct input_info geomInputs[] = {
-   { "gl_VerticesIn", GEOM_ATTRIB_VERTICES, GL_FLOAT, SWIZZLE_NOOP },
    { "gl_PrimitiveIDIn", GEOM_ATTRIB_PRIMITIVE_ID, GL_FLOAT, SWIZZLE_NOOP },
    { "gl_FrontColorIn", GEOM_ATTRIB_COLOR0, GL_FLOAT_VEC4, SWIZZLE_NOOP },
    { "gl_BackColorIn", GEOM_ATTRIB_COLOR1, GL_FLOAT_VEC4, SWIZZLE_NOOP },
index 494901dc1c8d5505da3ccfbe4a4500b2fab26a70..b2fe5b1f8635e7f4c0da784efc1167b017cd988f 100644 (file)
@@ -4191,6 +4191,11 @@ _slang_gen_variable(slang_assemble_ctx * A, slang_operation *oper)
    slang_variable *var = _slang_variable_locate(oper->locals, name, GL_TRUE);
    slang_ir_node *n;
    if (!var || !var->declared) {
+      if (A->program->Target == MESA_GEOMETRY_PROGRAM &&
+          !strcmp((char*)name, "gl_VerticesIn") ){
+         A->UnresolvedRefs = GL_TRUE;
+         return NULL;
+      }
       slang_info_log_error(A->log, "undefined variable '%s'", (char *) name);
       return NULL;
    }
index 8aa007bd1ec94a6982f4f770ba97702f04672c49..c89ab8b9f665249ff9c90fb57a1b43674949f934 100644 (file)
@@ -661,8 +661,8 @@ get_inputs_read_mask(GLenum target, GLuint index, GLboolean relAddr)
       else if (target == MESA_GEOMETRY_PROGRAM) {
          switch (index) {
          case GEOM_ATTRIB_VAR0:
-            mask = ((1U << (GEOM_ATTRIB_VAR0 + MAX_VARYING)) - 1)
-                   - ((1U << GEOM_ATTRIB_VAR0) - 1);
+            mask = ((1ULL << (GEOM_ATTRIB_VAR0 + MAX_VARYING)) - 1)
+                   - ((1ULL << GEOM_ATTRIB_VAR0) - 1);
             break;
          default:
             ; /* a non-array input attribute */
@@ -810,7 +810,25 @@ remove_extra_version_directives(GLchar *source)
    }
 }
 
-
+static int
+vertices_per_prim(int prim)
+{
+   switch (prim) {
+   case GL_POINTS:
+      return 1;
+   case GL_LINES:
+      return 2;
+   case GL_TRIANGLES:
+      return 3;
+   case GL_LINES_ADJACENCY_ARB:
+      return 4;
+   case GL_TRIANGLES_ADJACENCY_ARB:
+      return 6;
+   default:
+      ASSERT(!"Bad primitive");
+      return 3;
+   }
+}
 
 /**
  * Return a new shader whose source code is the concatenation of
@@ -847,6 +865,10 @@ concat_shaders(struct gl_shader_program *shProg, GLenum shaderType)
       return NULL;
    }
 
+   if (shaderType == GL_GEOMETRY_SHADER_ARB) {
+      totalLen += 32;
+   }
+
    source = (GLchar *) malloc(totalLen + 1);
    if (!source) {
       free(shaderLengths);
@@ -861,6 +883,14 @@ concat_shaders(struct gl_shader_program *shProg, GLenum shaderType)
          len += shaderLengths[i];
       }
    }
+   if (shaderType == GL_GEOMETRY_SHADER_ARB) {
+      GLchar gs_pre[32];
+      GLuint num_verts = vertices_per_prim(shProg->Geom.InputType);
+      _mesa_snprintf(gs_pre, 31,
+                     "const int gl_VerticesIn = %d;\n", num_verts);
+      memcpy(source + len, gs_pre, strlen(gs_pre));
+      len += strlen(gs_pre);
+   }
    source[len] = '\0';
    /*
    printf("---NEW CONCATENATED SHADER---:\n%s\n------------\n", source);
@@ -883,7 +913,6 @@ concat_shaders(struct gl_shader_program *shProg, GLenum shaderType)
    return newShader;
 }
 
-
 /**
  * Search the shader program's list of shaders to find the one that
  * defines main().
index 172d7dfe90563e795ffb30fc9254d7e6942e86d2..1d748965f801efcfdd6781fc22b929e16b549464 100644 (file)
@@ -490,10 +490,7 @@ st_translate_geometry_program(struct st_context *st,
    }
 
    /* which vertex output goes to the first geometry input */
-   if (inputsRead & GEOM_BIT_VERTICES)
-      vslot = 0;
-   else
-      vslot = 1;
+   vslot = 0;
 
    /*
     * Convert Mesa program inputs to TGSI input register semantics.
@@ -511,8 +508,7 @@ st_translate_geometry_program(struct st_context *st,
          stgp->index_to_input[vslot] = attr;
          ++vslot;
 
-         if (attr != GEOM_ATTRIB_VERTICES &&
-             attr != GEOM_ATTRIB_PRIMITIVE_ID) {
+         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
             gs_array_offset += 2;
          } else
             ++gs_builtin_inputs;
@@ -523,9 +519,6 @@ st_translate_geometry_program(struct st_context *st,
 #endif
 
          switch (attr) {
-         case GEOM_ATTRIB_VERTICES:
-            debug_assert(0);
-            break;
          case GEOM_ATTRIB_PRIMITIVE_ID:
             stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
             stgp->input_semantic_index[slot] = 0;