Fix some incorrect GL error values. Reorganize _mesa_compile_shader() code.
authorBrian <brian@yutani.localnet.net>
Thu, 4 Jan 2007 15:21:09 +0000 (08:21 -0700)
committerBrian <brian@yutani.localnet.net>
Thu, 4 Jan 2007 15:21:09 +0000 (08:21 -0700)
src/mesa/shader/shader_api.c
src/mesa/shader/slang/library/slang_core.gc
src/mesa/shader/slang/slang_compile.c
src/mesa/shader/slang/slang_compile.h

index 1e282e7..5af236c 100644 (file)
@@ -240,7 +240,7 @@ _mesa_attach_shader(GLcontext *ctx, GLuint program, GLuint shader)
    GLuint i;
 
    if (!shProg || !sh) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
+      _mesa_error(ctx, GL_INVALID_VALUE,
                   "glAttachShader(bad program or shader name)");
       return;
    }
@@ -277,7 +277,7 @@ _mesa_bind_attrib_location(GLcontext *ctx, GLuint program, GLuint index,
       = _mesa_lookup_shader_program(ctx, program);
 
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glBindAttribLocation(program)");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glBindAttribLocation(program)");
       return;
    }
 
@@ -348,7 +348,7 @@ _mesa_delete_program2(GLcontext *ctx, GLuint name)
 
    shProg = _mesa_lookup_shader_program(ctx, name);
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glDeleteProgram(name)");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteProgram(name)");
       return;
    }
 
@@ -390,7 +390,7 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader)
    GLuint i, j;
 
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
+      _mesa_error(ctx, GL_INVALID_VALUE,
                   "glDetachShader(bad program or shader name)");
       return;
    }
@@ -424,7 +424,7 @@ _mesa_detach_shader(GLcontext *ctx, GLuint program, GLuint shader)
    }
 
    /* not found */
-   _mesa_error(ctx, GL_INVALID_OPERATION,
+   _mesa_error(ctx, GL_INVALID_VALUE,
                "glDetachShader(shader not found)");
 }
 
@@ -442,7 +442,7 @@ _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index,
    GLint sz;
 
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniform");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform");
       return;
    }
 
@@ -477,7 +477,7 @@ _mesa_get_active_uniform(GLcontext *ctx, GLuint program, GLuint index,
    GLint sz;
 
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniform");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform");
       return;
    }
 
@@ -514,7 +514,7 @@ _mesa_get_attached_shaders(GLcontext *ctx, GLuint program, GLsizei maxCount,
          *count = i;
    }
    else {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetAttachedShaders");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedShaders");
    }
 }
 
@@ -527,7 +527,7 @@ _mesa_get_attrib_location(GLcontext *ctx, GLuint program,
       = _mesa_lookup_shader_program(ctx, program);
 
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetAttribLocation");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttribLocation");
       return -1;
    }
 
@@ -720,7 +720,7 @@ _mesa_get_uniformfv(GLcontext *ctx, GLuint program, GLint location,
       }
    }
    else {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(program)");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetUniformfv(program)");
    }
 }
 
@@ -796,34 +796,13 @@ void
 _mesa_compile_shader(GLcontext *ctx, GLuint shaderObj)
 {
    struct gl_shader *sh = _mesa_lookup_shader(ctx, shaderObj);
-   slang_info_log info_log;
-   slang_code_object obj;
-   slang_unit_type type;
 
    if (!sh) {
       _mesa_error(ctx, GL_INVALID_VALUE, "glCompileShader(shaderObj)");
       return;
    }
 
-   slang_info_log_construct(&info_log);
-   _slang_code_object_ctr(&obj);
-
-   if (sh->Type == GL_VERTEX_SHADER) {
-      type = slang_unit_vertex_shader;
-   }
-   else {
-      assert(sh->Type == GL_FRAGMENT_SHADER);
-      type = slang_unit_fragment_shader;
-   }
-
-   if (_slang_compile(sh->Source, &obj, type, &info_log, sh)) {
-      sh->CompileStatus = GL_TRUE;
-   }
-   else {
-      sh->CompileStatus = GL_FALSE;
-      /* XXX temporary */
-      _mesa_problem(ctx, "Program did not compile!");
-   }
+   sh->CompileStatus = _slang_compile(ctx, sh);
 }
 
 
@@ -837,7 +816,7 @@ _mesa_link_program(GLcontext *ctx, GLuint program)
 
    shProg = _mesa_lookup_shader_program(ctx, program);
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glLinkProgram(program)");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glLinkProgram(program)");
       return;
    }
 
@@ -865,7 +844,7 @@ _mesa_use_program(GLcontext *ctx, GLuint program)
       struct gl_shader_program *shProg;
       shProg = _mesa_lookup_shader_program(ctx, program);
       if (!shProg) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
+         _mesa_error(ctx, GL_INVALID_VALUE,
                      "glUseProgramObjectARB(programObj)");
          return;
       }
@@ -975,7 +954,7 @@ _mesa_validate_program(GLcontext *ctx, GLuint program)
    struct gl_shader_program *shProg;
    shProg = _mesa_lookup_shader_program(ctx, program);
    if (!shProg) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glValidateProgram(program)");
+      _mesa_error(ctx, GL_INVALID_VALUE, "glValidateProgram(program)");
       return;
    }
    /* XXX temporary */
index 30fea37..f8ee17e 100644 (file)
@@ -452,7 +452,6 @@ ivec4 __operator / (const ivec4 v, const ivec4 u)
 
 float __operator + (const float a, const float b)
 {
-//   __asm float_add __retVal, a, b;
    __asm vec4_add __retVal.x, a, b;
 }
 
index 286e25d..da77de7 100644 (file)
@@ -682,7 +682,7 @@ parse_type_specifier(slang_parse_ctx * C, slang_output_ctx * O,
 
          stru = slang_struct_scope_find(O->structs, a_name, 1);
          if (stru == NULL) {
-            slang_info_log_error(C->L, "%s: undeclared type name.",
+            slang_info_log_error(C->L, "undeclared type name '%s'",
                                  slang_atom_pool_id(C->atoms, a_name));
             return 0;
          }
@@ -714,7 +714,9 @@ parse_fully_specified_type(slang_parse_ctx * C, slang_output_ctx * O,
 {
    if (!parse_type_qualifier(C, &type->qualifier))
       return 0;
-   return parse_type_specifier(C, O, &type->specifier);
+   if (!parse_type_specifier(C, O, &type->specifier))
+      return 0;
+   return 1;
 }
 
 /* operation */
@@ -2241,35 +2243,21 @@ slang_create_uniforms(const slang_export_data_table *exports,
 #endif
 
 
-GLboolean
-_slang_compile(const char *source, slang_code_object * object,
+static GLboolean
+compile_shader(GLcontext *ctx, slang_code_object * object,
                slang_unit_type type, slang_info_log * infolog,
                struct gl_shader *shader)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   struct gl_program *program;
+   struct gl_program *program = shader->Programs[0];
    GLboolean success;
    grammar id = 0;
 
-   /* XXX temporary hack */
-   if (!shader->Programs) {
-      GLenum progTarget;
-      if (shader->Type == GL_VERTEX_SHADER)
-         progTarget = GL_VERTEX_PROGRAM_ARB;
-      else
-         progTarget = GL_FRAGMENT_PROGRAM_ARB;
-      shader->Programs
-         = (struct gl_program **) malloc(sizeof(struct gl_program*));
-      shader->Programs[0] = _mesa_new_program(ctx, progTarget, 1);
-      shader->NumPrograms = 1;
-   }
-   program = shader->Programs[0];
    assert(program);
 
    _slang_code_object_dtr(object);
    _slang_code_object_ctr(object);
 
-   success = compile_object(&id, source, object, type, infolog, program);
+   success = compile_object(&id, shader->Source, object, type, infolog, program);
    if (id != 0)
       grammar_destroy(id);
    if (!success)
@@ -2283,22 +2271,72 @@ _slang_compile(const char *source, slang_code_object * object,
 
 #if NEW_SLANG
    {
-      GET_CURRENT_CONTEXT(ctx);
       slang_create_uniforms(&object->expdata, shader);
       _mesa_print_program(program);
       _mesa_print_program_parameters(ctx, program);
    }
 #endif
 
+   return GL_TRUE;
+}
 
-#if defined(USE_X86_ASM) || defined(SLANG_X86)
-   /* XXX: lookup the @main label */
-   if (!_slang_x86_codegen
-       (&object->machine, &object->assembly,
-        object->expcode.entries[0].address))
-      return GL_FALSE;
+
+
+GLboolean
+_slang_compile(GLcontext *ctx, struct gl_shader *shader)
+{
+   GLboolean success;
+   slang_info_log info_log;
+   slang_code_object obj;
+   slang_unit_type type;
+
+   if (shader->Type == GL_VERTEX_SHADER) {
+      type = slang_unit_vertex_shader;
+   }
+   else {
+      assert(shader->Type == GL_FRAGMENT_SHADER);
+      type = slang_unit_fragment_shader;
+   }
+
+   /* XXX temporary hack */
+   if (!shader->Programs) {
+      GLenum progTarget;
+      if (shader->Type == GL_VERTEX_SHADER)
+         progTarget = GL_VERTEX_PROGRAM_ARB;
+      else
+         progTarget = GL_FRAGMENT_PROGRAM_ARB;
+      shader->Programs
+         = (struct gl_program **) malloc(sizeof(struct gl_program*));
+      shader->Programs[0] = _mesa_new_program(ctx, progTarget, 1);
+      shader->NumPrograms = 1;
+   }
+
+   slang_info_log_construct(&info_log);
+   _slang_code_object_ctr(&obj);
+
+   success = compile_shader(ctx, &obj, type, &info_log, shader);
+
+   if (success) {
+#if 0
+      slang_create_uniforms(&object->expdata, shader);
+      _mesa_print_program(program);
+      _mesa_print_program_parameters(ctx, program);
 #endif
+   }
+   else {
+      /* XXX more work on info log needed here */
+      if (info_log.text) {
+         if (shader->InfoLog) {
+            free(shader->InfoLog);
+            shader->InfoLog = NULL;
+         }
+         shader->InfoLog = strdup(info_log.text);
+      }
+   }
 
-   return GL_TRUE;
+   slang_info_log_destruct(&info_log);
+   _slang_code_object_dtr(&obj);
+
+   return success;
 }
 
index 8a72f43..ba129df 100644 (file)
@@ -109,7 +109,7 @@ int slang_info_log_warning (slang_info_log *, const char *, ...);
 void slang_info_log_memory (slang_info_log *);
 
 extern GLboolean
-_slang_compile (const char *, slang_code_object *, slang_unit_type, slang_info_log *, struct gl_shader *shader);
+_slang_compile (GLcontext *ctx, struct gl_shader *shader);
 
 #ifdef __cplusplus
 }