mesa: initial support for ARB_geometry_shader4
[mesa.git] / src / glsl / apps / compile.c
index d16dac586819af9ca21bbefc9644af726e224522..5073b0da827ba5634ed9d68edc1fd1cbc43c3750 100644 (file)
 #include "../cl/sl_cl_parse.h"
 
 
+static void
+usage(void)
+{
+   printf("Usage:\n");
+   printf("  compile fragment|vertex|geometry <source> <output>\n");
+}
+
 int
 main(int argc,
      char *argv[])
@@ -42,19 +49,15 @@ main(int argc,
    char *inbuf;
    struct sl_pp_purify_options options;
    char errmsg[100] = "";
-   unsigned int errline = 0;
    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;
 
    if (argc != 4) {
+      usage();
       return 1;
    }
 
@@ -62,22 +65,30 @@ 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;
    }
 
    in = fopen(argv[2], "rb");
    if (!in) {
+      printf("Could not open `%s' for read.\n", argv[2]);
+      usage();
       return 1;
    }
 
    fseek(in, 0, SEEK_END);
    size = ftell(in);
+   assert(size != -1);
    fseek(in, 0, SEEK_SET);
 
    out = fopen(argv[3], "w");
    if (!out) {
       fclose(in);
+      printf("Could not open `%s' for write.\n", argv[3]);
+      usage();
       return 1;
    }
 
@@ -87,7 +98,8 @@ main(int argc,
 
       fclose(out);
       fclose(in);
-      return 1;
+      printf("Out of memory.\n");
+      return 0;
    }
 
    if (fread(inbuf, 1, size, in) != size) {
@@ -96,7 +108,8 @@ main(int argc,
       free(inbuf);
       fclose(out);
       fclose(in);
-      return 1;
+      printf("Could not read from `%s'.\n", argv[2]);
+      return 0;
    }
    inbuf[size] = '\0';
 
@@ -104,62 +117,38 @@ 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");
 
       free(inbuf);
       fclose(out);
-      return 1;
+      printf("Could not create parse context.\n");
+      return 0;
    }
 
-   if (sl_pp_tokenise(context, inbuf, &options, &tokens)) {
+   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(inbuf);
       fclose(out);
-      return 1;
-   }
-
-   free(inbuf);
-
-   if (sl_pp_version(context, tokens, &version, &tokens_eaten)) {
-      fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
-
-      sl_pp_context_destroy(context);
-      free(tokens);
-      fclose(out);
-      return -1;
+      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 -1;
+      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;
 
@@ -194,12 +183,12 @@ main(int argc,
       free(outbytes);
    } else {
       fprintf(out, "$SYNTAXERROR: `%s'\n", errmsg);
-      return -1;
+
+      printf("Error: %s\n", errmsg);
    }
 
    sl_pp_context_destroy(context);
-   free(outtokens);
+   free(inbuf);
    fclose(out);
-
    return 0;
 }