glsl_compiler: Set max GLSL version on the command line
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 9 Sep 2013 19:07:15 +0000 (14:07 -0500)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 7 Oct 2013 16:59:23 +0000 (09:59 -0700)
Infer whether or not to use ES based on the GLSL version (100 or 300 are
for ES).  This replaces the --glsl-es command line option.  Set various
compiler limits based on the minimums required for the specified GLSL
version.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Acked-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/main.cpp

index bc158356e9ba7e73e958f9924e141fd772dff8dd..58e940a34b085801e9abea51e207936571bf49c0 100644 (file)
@@ -38,6 +38,8 @@
 #include "loop_analysis.h"
 #include "standalone_scaffolding.h"
 
 #include "loop_analysis.h"
 #include "standalone_scaffolding.h"
 
+static int glsl_version = 330;
+
 static void
 initialize_context(struct gl_context *ctx, gl_api api)
 {
 static void
 initialize_context(struct gl_context *ctx, gl_api api)
 {
@@ -46,16 +48,150 @@ initialize_context(struct gl_context *ctx, gl_api api)
    /* The standalone compiler needs to claim support for almost
     * everything in order to compile the built-in functions.
     */
    /* The standalone compiler needs to claim support for almost
     * everything in order to compile the built-in functions.
     */
-   ctx->Const.GLSLVersion = 330;
+   ctx->Const.GLSLVersion = glsl_version;
    ctx->Extensions.ARB_ES3_compatibility = true;
 
    ctx->Extensions.ARB_ES3_compatibility = true;
 
-   ctx->Const.MaxClipPlanes = 8;
-   ctx->Const.MaxDrawBuffers = 2;
-
-   /* More than the 1.10 minimum to appease parser tests taken from
-    * apps that (hopefully) already checked the number of coords.
-    */
-   ctx->Const.MaxTextureCoordUnits = 4;
+   switch (ctx->Const.GLSLVersion) {
+   case 100:
+      ctx->Const.MaxClipPlanes = 0;
+      ctx->Const.MaxCombinedTextureImageUnits = 8;
+      ctx->Const.MaxDrawBuffers = 2;
+      ctx->Const.MinProgramTexelOffset = 0;
+      ctx->Const.MaxProgramTexelOffset = 0;
+      ctx->Const.MaxLights = 0;
+      ctx->Const.MaxTextureCoordUnits = 0;
+      ctx->Const.MaxTextureUnits = 8;
+
+      ctx->Const.VertexProgram.MaxAttribs = 8;
+      ctx->Const.VertexProgram.MaxTextureImageUnits = 0;
+      ctx->Const.VertexProgram.MaxUniformComponents = 128 * 4;
+      ctx->Const.VertexProgram.MaxInputComponents = 0; /* not used */
+      ctx->Const.VertexProgram.MaxOutputComponents = 32;
+
+      ctx->Const.FragmentProgram.MaxTextureImageUnits =
+         ctx->Const.MaxCombinedTextureImageUnits;
+      ctx->Const.FragmentProgram.MaxUniformComponents = 16 * 4;
+      ctx->Const.FragmentProgram.MaxInputComponents =
+         ctx->Const.VertexProgram.MaxOutputComponents;
+      ctx->Const.FragmentProgram.MaxOutputComponents = 0; /* not used */
+
+      ctx->Const.MaxVarying = ctx->Const.VertexProgram.MaxOutputComponents / 4;
+      break;
+   case 110:
+   case 120:
+      ctx->Const.MaxClipPlanes = 6;
+      ctx->Const.MaxCombinedTextureImageUnits = 2;
+      ctx->Const.MaxDrawBuffers = 1;
+      ctx->Const.MinProgramTexelOffset = 0;
+      ctx->Const.MaxProgramTexelOffset = 0;
+      ctx->Const.MaxLights = 8;
+      ctx->Const.MaxTextureCoordUnits = 2;
+      ctx->Const.MaxTextureUnits = 2;
+
+      ctx->Const.VertexProgram.MaxAttribs = 16;
+      ctx->Const.VertexProgram.MaxTextureImageUnits = 0;
+      ctx->Const.VertexProgram.MaxUniformComponents = 512;
+      ctx->Const.VertexProgram.MaxInputComponents = 0; /* not used */
+      ctx->Const.VertexProgram.MaxOutputComponents = 32;
+
+      ctx->Const.FragmentProgram.MaxTextureImageUnits =
+         ctx->Const.MaxCombinedTextureImageUnits;
+      ctx->Const.FragmentProgram.MaxUniformComponents = 64;
+      ctx->Const.FragmentProgram.MaxInputComponents =
+         ctx->Const.VertexProgram.MaxOutputComponents;
+      ctx->Const.FragmentProgram.MaxOutputComponents = 0; /* not used */
+
+      ctx->Const.MaxVarying = ctx->Const.VertexProgram.MaxOutputComponents / 4;
+      break;
+   case 130:
+   case 140:
+      ctx->Const.MaxClipPlanes = 8;
+      ctx->Const.MaxCombinedTextureImageUnits = 16;
+      ctx->Const.MaxDrawBuffers = 8;
+      ctx->Const.MinProgramTexelOffset = -8;
+      ctx->Const.MaxProgramTexelOffset = 7;
+      ctx->Const.MaxLights = 8;
+      ctx->Const.MaxTextureCoordUnits = 8;
+      ctx->Const.MaxTextureUnits = 2;
+
+      ctx->Const.VertexProgram.MaxAttribs = 16;
+      ctx->Const.VertexProgram.MaxTextureImageUnits = 16;
+      ctx->Const.VertexProgram.MaxUniformComponents = 1024;
+      ctx->Const.VertexProgram.MaxInputComponents = 0; /* not used */
+      ctx->Const.VertexProgram.MaxOutputComponents = 64;
+
+      ctx->Const.FragmentProgram.MaxTextureImageUnits = 16;
+      ctx->Const.FragmentProgram.MaxUniformComponents = 1024;
+      ctx->Const.FragmentProgram.MaxInputComponents =
+         ctx->Const.VertexProgram.MaxOutputComponents;
+      ctx->Const.FragmentProgram.MaxOutputComponents = 0; /* not used */
+
+      ctx->Const.MaxVarying = ctx->Const.VertexProgram.MaxOutputComponents / 4;
+      break;
+   case 150:
+   case 330:
+      ctx->Const.MaxClipPlanes = 8;
+      ctx->Const.MaxDrawBuffers = 8;
+      ctx->Const.MinProgramTexelOffset = -8;
+      ctx->Const.MaxProgramTexelOffset = 7;
+      ctx->Const.MaxLights = 8;
+      ctx->Const.MaxTextureCoordUnits = 8;
+      ctx->Const.MaxTextureUnits = 2;
+
+      ctx->Const.VertexProgram.MaxAttribs = 16;
+      ctx->Const.VertexProgram.MaxTextureImageUnits = 16;
+      ctx->Const.VertexProgram.MaxUniformComponents = 1024;
+      ctx->Const.VertexProgram.MaxInputComponents = 0; /* not used */
+      ctx->Const.VertexProgram.MaxOutputComponents = 64;
+
+      ctx->Const.GeometryProgram.MaxTextureImageUnits = 16;
+      ctx->Const.GeometryProgram.MaxUniformComponents = 1024;
+      ctx->Const.GeometryProgram.MaxInputComponents =
+         ctx->Const.VertexProgram.MaxOutputComponents;
+      ctx->Const.GeometryProgram.MaxOutputComponents = 128;
+
+      ctx->Const.FragmentProgram.MaxTextureImageUnits = 16;
+      ctx->Const.FragmentProgram.MaxUniformComponents = 1024;
+      ctx->Const.FragmentProgram.MaxInputComponents =
+         ctx->Const.GeometryProgram.MaxOutputComponents;
+      ctx->Const.FragmentProgram.MaxOutputComponents = 0; /* not used */
+
+      ctx->Const.MaxCombinedTextureImageUnits =
+         ctx->Const.VertexProgram.MaxTextureImageUnits
+         + ctx->Const.GeometryProgram.MaxTextureImageUnits
+         + ctx->Const.FragmentProgram.MaxTextureImageUnits;
+
+      ctx->Const.MaxGeometryOutputVertices = 256;
+      ctx->Const.MaxGeometryTotalOutputComponents = 1024;
+
+//      ctx->Const.MaxGeometryVaryingComponents = 64;
+
+      ctx->Const.MaxVarying = 60 / 4;
+      break;
+   case 300:
+      ctx->Const.MaxClipPlanes = 8;
+      ctx->Const.MaxCombinedTextureImageUnits = 32;
+      ctx->Const.MaxDrawBuffers = 4;
+      ctx->Const.MinProgramTexelOffset = -8;
+      ctx->Const.MaxProgramTexelOffset = 7;
+      ctx->Const.MaxLights = 0;
+      ctx->Const.MaxTextureCoordUnits = 0;
+      ctx->Const.MaxTextureUnits = 0;
+
+      ctx->Const.VertexProgram.MaxAttribs = 16;
+      ctx->Const.VertexProgram.MaxTextureImageUnits = 16;
+      ctx->Const.VertexProgram.MaxUniformComponents = 1024;
+      ctx->Const.VertexProgram.MaxInputComponents = 0; /* not used */
+      ctx->Const.VertexProgram.MaxOutputComponents = 16 * 4;
+
+      ctx->Const.FragmentProgram.MaxTextureImageUnits = 16;
+      ctx->Const.FragmentProgram.MaxUniformComponents = 224;
+      ctx->Const.FragmentProgram.MaxInputComponents = 15 * 4;
+      ctx->Const.FragmentProgram.MaxOutputComponents = 0; /* not used */
+
+      ctx->Const.MaxVarying = ctx->Const.FragmentProgram.MaxInputComponents / 4;
+      break;
+   }
 
    ctx->Driver.NewShader = _mesa_new_shader;
 }
 
    ctx->Driver.NewShader = _mesa_new_shader;
 }
@@ -103,18 +239,17 @@ load_text_file(void *ctx, const char *file_name)
        return text;
 }
 
        return text;
 }
 
-int glsl_es = 0;
 int dump_ast = 0;
 int dump_hir = 0;
 int dump_lir = 0;
 int do_link = 0;
 
 const struct option compiler_opts[] = {
 int dump_ast = 0;
 int dump_hir = 0;
 int dump_lir = 0;
 int do_link = 0;
 
 const struct option compiler_opts[] = {
-   { "glsl-es",  no_argument, &glsl_es,  1 },
    { "dump-ast", no_argument, &dump_ast, 1 },
    { "dump-hir", no_argument, &dump_hir, 1 },
    { "dump-lir", no_argument, &dump_lir, 1 },
    { "link",     no_argument, &do_link,  1 },
    { "dump-ast", no_argument, &dump_ast, 1 },
    { "dump-hir", no_argument, &dump_hir, 1 },
    { "dump-lir", no_argument, &dump_lir, 1 },
    { "link",     no_argument, &do_link,  1 },
+   { "version",  required_argument, NULL, 'v' },
    { NULL, 0, NULL, 0 }
 };
 
    { NULL, 0, NULL, 0 }
 };
 
@@ -159,11 +294,37 @@ main(int argc, char **argv)
    int status = EXIT_SUCCESS;
    struct gl_context local_ctx;
    struct gl_context *ctx = &local_ctx;
    int status = EXIT_SUCCESS;
    struct gl_context local_ctx;
    struct gl_context *ctx = &local_ctx;
+   bool glsl_es = false;
 
    int c;
    int idx = 0;
 
    int c;
    int idx = 0;
-   while ((c = getopt_long(argc, argv, "", compiler_opts, &idx)) != -1)
-      /* empty */ ;
+   while ((c = getopt_long(argc, argv, "", compiler_opts, &idx)) != -1) {
+      switch (c) {
+      case 'v':
+         glsl_version = strtol(optarg, NULL, 10);
+         switch (glsl_version) {
+         case 100:
+         case 300:
+            glsl_es = true;
+            break;
+         case 110:
+         case 120:
+         case 130:
+         case 140:
+         case 150:
+         case 330:
+            glsl_es = false;
+            break;
+         default:
+            fprintf(stderr, "Unrecognized GLSL version `%s'\n", optarg);
+            usage_fail(argv[0]);
+            break;
+         }
+         break;
+      default:
+         break;
+      }
+   }
 
 
    if (argc <= optind)
 
 
    if (argc <= optind)