mesa: initial support for ARB_geometry_shader4
[mesa.git] / src / glsl / apps / compile.c
index b1165420fb8810acc981cac5f4ca9f9b82ee3231..5073b0da827ba5634ed9d68edc1fd1cbc43c3750 100644 (file)
@@ -37,7 +37,7 @@ static void
 usage(void)
 {
    printf("Usage:\n");
-   printf("  compile fragment|vertex <source> <output>\n");
+   printf("  compile fragment|vertex|geometry <source> <output>\n");
 }
 
 int
@@ -50,12 +50,8 @@ main(int argc,
    struct sl_pp_purify_options options;
    char errmsg[100] = "";
    struct sl_pp_context *context;
-   struct sl_pp_token_info *tokens;
    unsigned int version;
-   unsigned int tokens_eaten;
-   struct sl_pp_token_info *outtokens;
    FILE *out;
-   unsigned int i, j;
    unsigned char *outbytes;
    unsigned int cboutbytes;
    unsigned int shader_type;
@@ -69,6 +65,8 @@ main(int argc,
       shader_type = 1;
    } else if (!strcmp(argv[1], "vertex")) {
       shader_type = 2;
+   } else if (!strcmp(argv[1], "geometry")) {
+      shader_type = 3;
    } else {
       usage();
       return 1;
@@ -83,6 +81,7 @@ main(int argc,
 
    fseek(in, 0, SEEK_END);
    size = ftell(in);
+   assert(size != -1);
    fseek(in, 0, SEEK_SET);
 
    out = fopen(argv[3], "w");
@@ -118,7 +117,7 @@ main(int argc,
 
    memset(&options, 0, sizeof(options));
 
-   context = sl_pp_context_create();
+   context = sl_pp_context_create(inbuf, &options);
    if (!context) {
       fprintf(out, "$CONTEXERROR\n");
 
@@ -128,67 +127,28 @@ main(int argc,
       return 0;
    }
 
-   if (sl_pp_tokenise(context, inbuf, &options, &tokens)) {
-      fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
-
-      printf("Error: %s.\n", sl_pp_context_error_message(context));
-      sl_pp_context_destroy(context);
-      free(inbuf);
-      fclose(out);
-      return 0;
-   }
-
-   free(inbuf);
-
-   if (sl_pp_version(context, tokens, &version, &tokens_eaten)) {
-      fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
-
-      printf("Error: %s\n", sl_pp_context_error_message(context));
-      sl_pp_context_destroy(context);
-      free(tokens);
-      fclose(out);
-      return 0;
-   }
-
-   if (sl_pp_context_add_extension(context, "ARB_draw_buffers", "GL_ARB_draw_buffers") ||
-       sl_pp_context_add_extension(context, "ARB_texture_rectangle", "GL_ARB_texture_rectangle")) {
+   if (sl_pp_version(context, &version)) {
       fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
 
       printf("Error: %s\n", sl_pp_context_error_message(context));
       sl_pp_context_destroy(context);
-      free(tokens);
+      free(inbuf);
       fclose(out);
       return 0;
    }
 
-   if (sl_pp_process(context, &tokens[tokens_eaten], &outtokens)) {
+   if (sl_pp_context_add_extension(context, "GL_ARB_draw_buffers") ||
+       sl_pp_context_add_extension(context, "GL_ARB_texture_rectangle")) {
       fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
 
       printf("Error: %s\n", sl_pp_context_error_message(context));
       sl_pp_context_destroy(context);
-      free(tokens);
+      free(inbuf);
       fclose(out);
       return 0;
    }
 
-   free(tokens);
-
-   for (i = j = 0; outtokens[i].token != SL_PP_EOF; i++) {
-      switch (outtokens[i].token) {
-      case SL_PP_NEWLINE:
-      case SL_PP_EXTENSION_REQUIRE:
-      case SL_PP_EXTENSION_ENABLE:
-      case SL_PP_EXTENSION_WARN:
-      case SL_PP_EXTENSION_DISABLE:
-      case SL_PP_LINE:
-         break;
-      default:
-         outtokens[j++] = outtokens[i];
-      }
-   }
-   outtokens[j] = outtokens[i];
-
-   if (sl_cl_compile(context, outtokens, shader_type, 1, &outbytes, &cboutbytes, errmsg, sizeof(errmsg)) == 0) {
+   if (sl_cl_compile(context, shader_type, 1, &outbytes, &cboutbytes, errmsg, sizeof(errmsg)) == 0) {
       unsigned int i;
       unsigned int line = 0;
 
@@ -228,7 +188,7 @@ main(int argc,
    }
 
    sl_pp_context_destroy(context);
-   free(outtokens);
+   free(inbuf);
    fclose(out);
    return 0;
 }