diff options
Diffstat (limited to 'src/mesa/shader')
| -rw-r--r-- | src/mesa/shader/arbprogparse.c | 15 | ||||
| -rw-r--r-- | src/mesa/shader/atifragshader.h | 2 | ||||
| -rw-r--r-- | src/mesa/shader/grammar/descrip.mms | 41 | ||||
| -rw-r--r-- | src/mesa/shader/prog_execute.c | 6 | ||||
| -rw-r--r-- | src/mesa/shader/prog_instruction.h | 2 | ||||
| -rw-r--r-- | src/mesa/shader/prog_parameter.c | 4 | ||||
| -rw-r--r-- | src/mesa/shader/prog_print.c | 17 | ||||
| -rw-r--r-- | src/mesa/shader/prog_print.h | 3 | ||||
| -rw-r--r-- | src/mesa/shader/prog_statevars.c | 7 | ||||
| -rw-r--r-- | src/mesa/shader/prog_statevars.h | 2 | ||||
| -rw-r--r-- | src/mesa/shader/prog_uniform.c | 2 | ||||
| -rw-r--r-- | src/mesa/shader/program.c | 5 | ||||
| -rw-r--r-- | src/mesa/shader/shader_api.c | 381 | ||||
| -rw-r--r-- | src/mesa/shader/slang/library/slang_version_syn.h | 64 | ||||
| -rw-r--r-- | src/mesa/shader/slang/library/slang_vertex_builtin.gc | 5 | ||||
| -rw-r--r-- | src/mesa/shader/slang/library/slang_vertex_builtin_gc.h | 146 | ||||
| -rw-r--r-- | src/mesa/shader/slang/slang_link.c | 58 | 
17 files changed, 465 insertions, 295 deletions
| diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c index 8ce5348c09..d1c3cd7214 100644 --- a/src/mesa/shader/arbprogparse.c +++ b/src/mesa/shader/arbprogparse.c @@ -38,6 +38,7 @@  #include "shader/grammar/grammar_mesa.h"  #include "arbprogparse.h"  #include "program.h" +#include "programopt.h"  #include "prog_parameter.h"  #include "prog_statevars.h"  #include "prog_instruction.h" @@ -3353,11 +3354,11 @@ debug_variables (GLcontext * ctx, struct var_cache *vc_head,                 fprintf (stderr, "%s\n",                          Program->Base.Parameters->Parameters[a + b].Name);                 if (Program->Base.Parameters->Parameters[a + b].Type == PROGRAM_STATE_VAR) { -                  const char *s; +                  char *s;                    s = _mesa_program_state_string(Program->Base.Parameters->Parameters                                                   [a + b].StateIndexes);                    fprintf(stderr, "%s\n", s); -                  _mesa_free((char *) s); +                  _mesa_free(s);                 }                 else                    fprintf (stderr, "%f %f %f %f\n", @@ -3871,6 +3872,16 @@ _mesa_parse_arb_fragment_program(GLcontext* ctx, GLenum target,        _mesa_free_parameter_list(program->Base.Parameters);     program->Base.Parameters    = ap.Base.Parameters; +   /* Append fog instructions now if the program has "OPTION ARB_fog_exp" +    * or similar.  We used to leave this up to drivers, but it appears +    * there's no hardware that wants to do fog in a discrete stage separate +    * from the fragment shader. +    */ +   if (program->FogOption != GL_NONE) { +      _mesa_append_fog_code(ctx, program); +      program->FogOption = GL_NONE; +   } +  #if DEBUG_FP     _mesa_printf("____________Fragment program %u ________\n", program->Base.Id);     _mesa_print_program(&program->Base); diff --git a/src/mesa/shader/atifragshader.h b/src/mesa/shader/atifragshader.h index 32fb3a8019..e1dc20e606 100644 --- a/src/mesa/shader/atifragshader.h +++ b/src/mesa/shader/atifragshader.h @@ -8,6 +8,8 @@  #ifndef ATIFRAGSHADER_H  #define ATIFRAGSHADER_H +#include "main/mtypes.h" +  #define MAX_NUM_INSTRUCTIONS_PER_PASS_ATI 8  #define MAX_NUM_PASSES_ATI                2  #define MAX_NUM_FRAGMENT_REGISTERS_ATI    6 diff --git a/src/mesa/shader/grammar/descrip.mms b/src/mesa/shader/grammar/descrip.mms deleted file mode 100644 index f7fbee96bc..0000000000 --- a/src/mesa/shader/grammar/descrip.mms +++ /dev/null @@ -1,41 +0,0 @@ -# Makefile for core library for VMS -# contributed by Jouk Jansen  joukj@hrem.stm.tudelft.nl -# Last revision : 1 June 2005 - -.first -	define gl [----.include.gl] -	define math [--.math] -	define swrast [--.swrast] -	define array_cache [--.array_cache] - -.include [----]mms-config. - -##### MACROS ##### - -VPATH = RCS - -INCDIR = [----.include],[],[--.main],[--.glapi],[-.slang] -LIBDIR = [----.lib] -CFLAGS = /include=($(INCDIR),[])/define=(PTHREADS=1)/name=(as_is,short)/float=ieee/ieee=denorm - -SOURCES = grammar_mesa.c - -OBJECTS = grammar_mesa.obj - -##### RULES ##### - -VERSION=Mesa V3.4 - -##### TARGETS ##### -all :  -	$(MMS)$(MMSQUALIFIERS) $(LIBDIR)$(GL_LIB) - -# Make the library -$(LIBDIR)$(GL_LIB) : $(OBJECTS) -  @ library $(LIBDIR)$(GL_LIB) $(OBJECTS) - -clean : -	purge -	delete *.obj;* - -grammar_mesa.obj : grammar_mesa.c grammar.c diff --git a/src/mesa/shader/prog_execute.c b/src/mesa/shader/prog_execute.c index e9957d3a5f..32b6ff4fd4 100644 --- a/src/mesa/shader/prog_execute.c +++ b/src/mesa/shader/prog_execute.c @@ -93,7 +93,7 @@ get_register_pointer(const struct prog_src_register *source,                  source->File == PROGRAM_STATE_VAR ||                  source->File == PROGRAM_UNIFORM);           params = machine->CurProgram->Parameters; -         if (reg < 0 || reg >= params->NumParameters) +         if (reg < 0 || reg >= (GLint)params->NumParameters)              return ZeroVec;           else              return params->ParameterValues[reg]; @@ -228,7 +228,7 @@ fetch_vector4_deriv(GLcontext * ctx,                      const struct gl_program_machine *machine,                      char xOrY, GLfloat result[4])  { -   if (source->File == PROGRAM_INPUT && source->Index < machine->NumDeriv) { +   if (source->File == PROGRAM_INPUT && source->Index < (GLint)machine->NumDeriv) {        const GLint col = machine->CurElement;        const GLfloat w = machine->Attribs[FRAG_ATTRIB_WPOS][col][3];        const GLfloat invQ = 1.0f / w; @@ -507,7 +507,7 @@ _mesa_execute_program(GLcontext * ctx,  {     const GLuint numInst = program->NumInstructions;     const GLuint maxExec = 10000; -   GLint pc, numExec = 0; +   GLuint pc, numExec = 0;     machine->CurProgram = program; diff --git a/src/mesa/shader/prog_instruction.h b/src/mesa/shader/prog_instruction.h index aca768376a..711166f9dd 100644 --- a/src/mesa/shader/prog_instruction.h +++ b/src/mesa/shader/prog_instruction.h @@ -413,11 +413,13 @@ struct prog_instruction      */     GLint BranchTarget; +#if 0     /**      * For TEX instructions in shaders, the sampler to use for the      * texture lookup.      */     GLint Sampler; +#endif     const char *Comment;  }; diff --git a/src/mesa/shader/prog_parameter.c b/src/mesa/shader/prog_parameter.c index 2dfd923a0f..bfe27d2f63 100644 --- a/src/mesa/shader/prog_parameter.c +++ b/src/mesa/shader/prog_parameter.c @@ -420,7 +420,7 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList,                            const gl_state_index stateTokens[STATE_LENGTH])  {     const GLuint size = 4; /* XXX fix */ -   const char *name; +   char *name;     GLint index;     /* Check if the state reference is already in the list */ @@ -447,7 +447,7 @@ _mesa_add_state_reference(struct gl_program_parameter_list *paramList,     paramList->StateFlags |= _mesa_program_state_flags(stateTokens);     /* free name string here since we duplicated it in add_parameter() */ -   _mesa_free((void *) name); +   _mesa_free(name);     return index;  } diff --git a/src/mesa/shader/prog_print.c b/src/mesa/shader/prog_print.c index 32708ed706..ec260f18a9 100644 --- a/src/mesa/shader/prog_print.c +++ b/src/mesa/shader/prog_print.c @@ -250,7 +250,9 @@ reg_string(enum register_file f, GLint index, gl_prog_print_mode mode,           {              struct gl_program_parameter *param                 = prog->Parameters->Parameters + index; -            sprintf(str, _mesa_program_state_string(param->StateIndexes)); +            char *state = _mesa_program_state_string(param->StateIndexes); +            sprintf(str, state); +            _mesa_free(state);           }           break;        case PROGRAM_ADDRESS: @@ -356,6 +358,19 @@ _mesa_swizzle_string(GLuint swizzle, GLuint negateBase, GLboolean extended)  } +void +_mesa_print_swizzle(GLuint swizzle) +{ +   if (swizzle == SWIZZLE_XYZW) { +      _mesa_printf(".xyzw\n"); +   } +   else { +      const char *s = _mesa_swizzle_string(swizzle, 0, 0); +      _mesa_printf("%s\n", s); +   } +} + +  static const char *  writemask_string(GLuint writeMask)  { diff --git a/src/mesa/shader/prog_print.h b/src/mesa/shader/prog_print.h index 36c47e0dff..3cdb1b195e 100644 --- a/src/mesa/shader/prog_print.h +++ b/src/mesa/shader/prog_print.h @@ -44,6 +44,9 @@ extern const char *  _mesa_swizzle_string(GLuint swizzle, GLuint negateBase, GLboolean extended);  extern void +_mesa_print_swizzle(GLuint swizzle); + +extern void  _mesa_print_alu_instruction(const struct prog_instruction *inst,                              const char *opcode_string, GLuint numRegs); diff --git a/src/mesa/shader/prog_statevars.c b/src/mesa/shader/prog_statevars.c index 9d543157f7..d4e31207e8 100644 --- a/src/mesa/shader/prog_statevars.c +++ b/src/mesa/shader/prog_statevars.c @@ -37,7 +37,6 @@  #include "main/mtypes.h"  #include "prog_statevars.h"  #include "prog_parameter.h" -#include "nvvertparse.h"  /** @@ -428,8 +427,8 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],           value[0] = (ctx->Fog.End == ctx->Fog.Start)              ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start));           value[1] = ctx->Fog.End * -value[0]; -         value[2] = ctx->Fog.Density * ONE_DIV_LN2; -         value[3] = ctx->Fog.Density * ONE_DIV_SQRT_LN2; +         value[2] = (GLfloat)(ctx->Fog.Density * ONE_DIV_LN2); +         value[3] = (GLfloat)(ctx->Fog.Density * ONE_DIV_SQRT_LN2);           return;        case STATE_LIGHT_SPOT_DIR_NORMALIZED: { @@ -785,7 +784,7 @@ append_index(char *dst, GLint index)   * For example, return "state.matrix.texture[2].inverse".   * Use _mesa_free() to deallocate the string.   */ -const char * +char *  _mesa_program_state_string(const gl_state_index state[STATE_LENGTH])  {     char str[1000] = ""; diff --git a/src/mesa/shader/prog_statevars.h b/src/mesa/shader/prog_statevars.h index d3091147f8..20643ca794 100644 --- a/src/mesa/shader/prog_statevars.h +++ b/src/mesa/shader/prog_statevars.h @@ -130,7 +130,7 @@ extern GLbitfield  _mesa_program_state_flags(const gl_state_index state[STATE_LENGTH]); -extern const char * +extern char *  _mesa_program_state_string(const gl_state_index state[STATE_LENGTH]); diff --git a/src/mesa/shader/prog_uniform.c b/src/mesa/shader/prog_uniform.c index 0b1d0232a0..25d7c0997b 100644 --- a/src/mesa/shader/prog_uniform.c +++ b/src/mesa/shader/prog_uniform.c @@ -134,7 +134,7 @@ _mesa_longest_uniform_name(const struct gl_uniform_list *list)     GLint max = 0;     GLuint i;     for (i = 0; list && i < list->NumUniforms; i++) { -      GLuint len = _mesa_strlen(list->Uniforms[i].Name); +      GLint len = (GLint)_mesa_strlen(list->Uniforms[i].Name);        if (len > max)           max = len;     } diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c index 2932c9ebc5..6263fd277f 100644 --- a/src/mesa/shader/program.c +++ b/src/mesa/shader/program.c @@ -58,7 +58,11 @@ _mesa_init_program(GLcontext *ctx)  #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program     ctx->VertexProgram.Enabled = GL_FALSE; +#if FEATURE_es2_glsl +   ctx->VertexProgram.PointSizeEnabled = GL_TRUE; +#else     ctx->VertexProgram.PointSizeEnabled = GL_FALSE; +#endif     ctx->VertexProgram.TwoSideEnabled = GL_FALSE;     _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,                              ctx->Shared->DefaultVertexProgram); @@ -546,7 +550,6 @@ _mesa_insert_instructions(struct gl_program *prog, GLuint start, GLuint count)     return GL_TRUE;  } -  /**   * Delete 'count' instructions at 'start' in the given program.   * Adjust branch targets accordingly. diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 7c5a20bbbe..eb7b71341f 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -50,6 +50,11 @@ +#ifndef GL_PROGRAM_BINARY_LENGTH_OES +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#endif + +  /**   * Allocate a new gl_shader_program object, initialize it.   */ @@ -376,7 +381,7 @@ _mesa_init_shader_state(GLcontext * ctx)      * are generated by the GLSL compiler.      */     ctx->Shader.EmitHighLevelInstructions = GL_TRUE; -   ctx->Shader.EmitCondCodes = GL_TRUE; /* XXX probably want GL_FALSE... */ +   ctx->Shader.EmitCondCodes = GL_FALSE;/*GL_TRUE;*/ /* XXX probably want GL_FALSE... */     ctx->Shader.EmitComments = GL_FALSE;  } @@ -752,6 +757,36 @@ sizeof_glsl_type(GLenum type)  } +static GLboolean +is_boolean_type(GLenum type) +{ +   switch (type) { +   case GL_BOOL: +   case GL_BOOL_VEC2: +   case GL_BOOL_VEC3: +   case GL_BOOL_VEC4: +      return GL_TRUE; +   default: +      return GL_FALSE; +   } +} + + +static GLboolean +is_integer_type(GLenum type) +{ +   switch (type) { +   case GL_INT: +   case GL_INT_VEC2: +   case GL_INT_VEC3: +   case GL_INT_VEC4: +      return GL_TRUE; +   default: +      return GL_FALSE; +   } +} + +  static void  _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index,                          GLsizei maxLength, GLsizei *length, GLint *size, @@ -783,6 +818,30 @@ _mesa_get_active_attrib(GLcontext *ctx, GLuint program, GLuint index,  } +static struct gl_program_parameter * +get_uniform_parameter(const struct gl_shader_program *shProg, GLuint index) +{ +   const struct gl_program *prog; +   GLint progPos; + +   progPos = shProg->Uniforms->Uniforms[index].VertPos; +   if (progPos >= 0) { +      prog = &shProg->VertexProgram->Base; +   } +   else { +      progPos = shProg->Uniforms->Uniforms[index].FragPos; +      if (progPos >= 0) { +         prog = &shProg->FragmentProgram->Base; +      } +   } + +   if (!prog || progPos < 0) +      return NULL; /* should never happen */ + +   return &prog->Parameters->Parameters[progPos]; +} + +  /**   * Called via ctx->Driver.GetActiveUniform().   */ @@ -921,6 +980,9 @@ _mesa_get_programiv(GLcontext *ctx, GLuint program,        if (*params > 0)           (*params)++;  /* add one for terminating zero */        break; +   case GL_PROGRAM_BINARY_LENGTH_OES: +      *params = 0; +      break;     default:        _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname)");        return; @@ -1003,6 +1065,78 @@ _mesa_get_shader_source(GLcontext *ctx, GLuint shader, GLsizei maxLength,  } +static void +get_matrix_dims(GLenum type, GLint *rows, GLint *cols) +{ +   switch (type) { +   case GL_FLOAT_MAT2: +      *rows = *cols = 2; +      break; +   case GL_FLOAT_MAT2x3: +      *rows = 3; +      *cols = 2; +      break; +   case GL_FLOAT_MAT2x4: +      *rows = 4; +      *cols = 2; +      break; +   case GL_FLOAT_MAT3: +      *rows = 3; +      *cols = 3; +      break; +   case GL_FLOAT_MAT3x2: +      *rows = 2; +      *cols = 3; +      break; +   case GL_FLOAT_MAT3x4: +      *rows = 4; +      *cols = 3; +      break; +   case GL_FLOAT_MAT4: +      *rows = 4; +      *cols = 4; +      break; +   case GL_FLOAT_MAT4x2: +      *rows = 2; +      *cols = 4; +      break; +   case GL_FLOAT_MAT4x3: +      *rows = 3; +      *cols = 4; +      break; +   default: +      *rows = *cols = 0; +   } +} + + +/** + * Determine the number of rows and columns occupied by a uniform + * according to its datatype.  For non-matrix types (such as GL_FLOAT_VEC4), + * the number of rows = 1 and cols = number of elements in the vector. + */ +static void +get_uniform_rows_cols(const struct gl_program_parameter *p, +                      GLint *rows, GLint *cols) +{ +   get_matrix_dims(p->DataType, rows, cols); +   if (*rows == 0 && *cols == 0) { +      /* not a matrix type, probably a float or vector */ +      if (p->Size <= 4) { +         *rows = 1; +         *cols = p->Size; +      } +      else { +         *rows = p->Size / 4 + 1; +         if (p->Size % 4 == 0) +            *cols = 4; +         else +            *cols = p->Size % 4; +      } +   } +} + +  #define MAX_UNIFORM_ELEMENTS 16  /** @@ -1014,12 +1148,11 @@ get_uniformfv(GLcontext *ctx, GLuint program, GLint location,                GLfloat *params)  {     struct gl_shader_program *shProg -      = _mesa_lookup_shader_program(ctx, program); +      = _mesa_lookup_shader_program_err(ctx, program, "glGetUniform[if]v");     if (shProg) {        if (shProg->Uniforms &&            location >= 0 && location < (GLint) shProg->Uniforms->NumUniforms) {           GLint progPos; -         GLuint i;           const struct gl_program *prog = NULL;           progPos = shProg->Uniforms->Uniforms[location].VertPos; @@ -1035,22 +1168,29 @@ get_uniformfv(GLcontext *ctx, GLuint program, GLint location,           ASSERT(prog);           if (prog) { +            const struct gl_program_parameter *p = +               &prog->Parameters->Parameters[progPos]; +            GLint rows, cols, i, j, k; +              /* See uniformiv() below */                     -            assert(prog->Parameters->Parameters[progPos].Size <= MAX_UNIFORM_ELEMENTS); +            assert(p->Size <= MAX_UNIFORM_ELEMENTS); -            for (i = 0; i < prog->Parameters->Parameters[progPos].Size; i++) { -               params[i] = prog->Parameters->ParameterValues[progPos][i]; +            get_uniform_rows_cols(p, &rows, &cols); + +            k = 0; +            for (i = 0; i < rows; i++) { +               for (j = 0; j < cols; j++ ) { +                  params[k++] = prog->Parameters->ParameterValues[progPos+i][j]; +               }              } -            return prog->Parameters->Parameters[progPos].Size; + +            return p->Size;           }        }        else {           _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(location)");        }     } -   else { -      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(program)"); -   }     return 0;  } @@ -1084,11 +1224,41 @@ _mesa_get_uniformiv(GLcontext *ctx, GLuint program, GLint location,  /** + * The value returned by GetUniformLocation actually encodes two things: + * 1. the index into the prog->Uniforms[] array for the uniform + * 2. an offset in the prog->ParameterValues[] array for specifying array + *    elements or structure fields. + * This function merges those two values. + */ +static void +merge_location_offset(GLint *location, GLint offset) +{ +   *location = *location | (offset << 16); +} + + +/** + * Seperate the uniform location and parameter offset.  See above. + */ +static void +split_location_offset(GLint *location, GLint *offset) +{ +   *offset = (*location >> 16); +   *location = *location & 0xffff; +} + + +/**   * Called via ctx->Driver.GetUniformLocation(). + * + * The return value will encode two values, the uniform location and an + * offset (used for arrays, structs).   */  static GLint  _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name)  { +   GLint offset = 0, location = -1; +     struct gl_shader_program *shProg =        _mesa_lookup_shader_program_err(ctx, program, "glGetUniformLocation"); @@ -1104,7 +1274,54 @@ _mesa_get_uniform_location(GLcontext *ctx, GLuint program, const GLchar *name)      * actually used.      */ -   return _mesa_lookup_uniform(shProg->Uniforms, name); +   /* XXX we need to be able to parse uniform names for structs and arrays +    * such as: +    *   mymatrix[1] +    *   mystruct.field1 +    */ + +   { +      /* handle 1-dimension arrays here... */ +      char *c = strchr(name, '['); +      if (c) { +         /* truncate name at [ */ +         const GLint len = c - name; +         GLchar *newName = _mesa_malloc(len + 1); +         if (!newName) +            return -1; /* out of mem */ +         _mesa_memcpy(newName, name, len); +         newName[len] = 0; + +         location = _mesa_lookup_uniform(shProg->Uniforms, newName); +         if (location >= 0) { +            const GLint element = _mesa_atoi(c + 1); +            if (element > 0) { +               /* get type of the uniform array element */ +               struct gl_program_parameter *p; +               p = get_uniform_parameter(shProg, location); +               if (p) { +                  GLint rows, cols; +                  get_matrix_dims(p->DataType, &rows, &cols); +                  if (rows < 1) +                     rows = 1; +                  offset = element * rows; +               } +            } +         } + +         _mesa_free(newName); +      } +   } + +   if (location < 0) { +      location = _mesa_lookup_uniform(shProg->Uniforms, name); +   } + +   if (location >= 0) { +      merge_location_offset(&location, offset); +   } + +   return location;  } @@ -1277,23 +1494,33 @@ compatible_types(GLenum userType, GLenum targetType)  /**   * Set the value of a program's uniform variable.   * \param program  the program whose uniform to update - * \param location  the location/index of the uniform + * \param index  the index of the program parameter for the uniform + * \param offset  additional parameter slot offset (for arrays)   * \param type  the datatype of the uniform   * \param count  the number of uniforms to set   * \param elems  number of elements per uniform   * \param values  the new values   */  static void -set_program_uniform(GLcontext *ctx, struct gl_program *program, GLint location, -                    GLenum type, GLsizei count, GLint elems, const void *values) +set_program_uniform(GLcontext *ctx, struct gl_program *program, +                    GLint index, GLint offset, +                    GLenum type, GLsizei count, GLint elems, +                    const void *values)  { +   assert(offset >= 0); +     if (!compatible_types(type, -                         program->Parameters->Parameters[location].DataType)) { +                         program->Parameters->Parameters[index].DataType)) {        _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(type mismatch)");        return;     } -   if (program->Parameters->Parameters[location].Type == PROGRAM_SAMPLER) { +   if (index + offset > (GLint) program->Parameters->Size) { +      /* out of bounds! */ +      return; +   } + +   if (program->Parameters->Parameters[index].Type == PROGRAM_SAMPLER) {        /* This controls which texture unit which is used by a sampler */        GLuint texUnit, sampler; @@ -1305,7 +1532,7 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program, GLint location,           return;        } -      sampler = (GLuint) program->Parameters->ParameterValues[location][0]; +      sampler = (GLuint) program->Parameters->ParameterValues[index][0];        texUnit = ((GLuint *) values)[0];        /* check that the sampler (tex unit index) is legal */ @@ -1324,18 +1551,19 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program, GLint location,     else {        /* ordinary uniform variable */        GLsizei k, i; +      GLint slots = (program->Parameters->Parameters[index].Size + 3) / 4; -      if (count * elems > (GLint) program->Parameters->Parameters[location].Size) { +      if (count * elems > (GLint) program->Parameters->Parameters[index].Size) {           _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(count too large)");           return;        } +      if (count > slots) +         count = slots; +        for (k = 0; k < count; k++) { -         GLfloat *uniformVal = program->Parameters->ParameterValues[location + k]; -         if (type == GL_INT || -             type == GL_INT_VEC2 || -             type == GL_INT_VEC3 || -             type == GL_INT_VEC4) { +         GLfloat *uniformVal = program->Parameters->ParameterValues[index + offset + k]; +         if (is_integer_type(type)) {              const GLint *iValues = ((const GLint *) values) + k * elems;              for (i = 0; i < elems; i++) {                 uniformVal[i] = (GLfloat) iValues[i]; @@ -1347,6 +1575,13 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program, GLint location,                 uniformVal[i] = fValues[i];              }           } + +         /* if the uniform is bool-valued, convert to 1.0 or 0.0 */ +         if (is_boolean_type(program->Parameters->Parameters[index].DataType)) { +            for (i = 0; i < elems; i++) { +               uniformVal[i] = uniformVal[i] ? 1.0f : 0.0f; +            } +         }        }     }  } @@ -1360,7 +1595,7 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,                const GLvoid *values, GLenum type)  {     struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; -   GLint elems; +   GLint elems, offset;     if (!shProg || !shProg->LinkStatus) {        _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)"); @@ -1370,6 +1605,8 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,     if (location == -1)        return;   /* The standard specifies this as a no-op */ +   split_location_offset(&location, &offset); +     if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {        _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location)");        return; @@ -1408,83 +1645,48 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,      * shader.  We may need to update one or both shader's uniform here:      */     if (shProg->VertexProgram) { -      GLint loc = shProg->Uniforms->Uniforms[location].VertPos; -      if (loc >= 0) { +      /* convert uniform location to program parameter index */ +      GLint index = shProg->Uniforms->Uniforms[location].VertPos; +      if (index >= 0) {           set_program_uniform(ctx, &shProg->VertexProgram->Base, -                             loc, type, count, elems, values); +                             index, offset, type, count, elems, values);        }     }     if (shProg->FragmentProgram) { -      GLint loc = shProg->Uniforms->Uniforms[location].FragPos; -      if (loc >= 0) { +      /* convert uniform location to program parameter index */ +      GLint index = shProg->Uniforms->Uniforms[location].FragPos; +      if (index >= 0) {           set_program_uniform(ctx, &shProg->FragmentProgram->Base, -                             loc, type, count, elems, values); +                             index, offset, type, count, elems, values);        }     }  } -static void -get_matrix_dims(GLenum type, GLint *rows, GLint *cols) -{ -   switch (type) { -   case GL_FLOAT_MAT2: -      *rows = *cols = 2; -      break; -   case GL_FLOAT_MAT2x3: -      *rows = 3; -      *cols = 2; -      break; -   case GL_FLOAT_MAT2x4: -      *rows = 4; -      *cols = 2; -      break; -   case GL_FLOAT_MAT3: -      *rows = 3; -      *cols = 3; -      break; -   case GL_FLOAT_MAT3x2: -      *rows = 2; -      *cols = 3; -      break; -   case GL_FLOAT_MAT3x4: -      *rows = 4; -      *cols = 3; -      break; -   case GL_FLOAT_MAT4: -      *rows = 4; -      *cols = 4; -      break; -   case GL_FLOAT_MAT4x2: -      *rows = 2; -      *cols = 4; -      break; -   case GL_FLOAT_MAT4x3: -      *rows = 3; -      *cols = 4; -      break; -   default: -      *rows = *cols = 0; -   } -} - - +/** + * Set a matrix-valued program parameter. + */  static void  set_program_uniform_matrix(GLcontext *ctx, struct gl_program *program, -                           GLuint location, GLuint count, -                           GLuint rows, GLuint cols, +                           GLuint index, GLuint offset, +                           GLuint count, GLuint rows, GLuint cols,                             GLboolean transpose, const GLfloat *values)  {     GLuint mat, row, col; -   GLuint dst = location, src = 0; +   GLuint dst = index + offset, src = 0;     GLint nr, nc;     /* check that the number of rows, columns is correct */ -   get_matrix_dims(program->Parameters->Parameters[location].DataType, &nr, &nc); +   get_matrix_dims(program->Parameters->Parameters[index].DataType, &nr, &nc);     if (rows != nr || cols != nc) {        _mesa_error(ctx, GL_INVALID_OPERATION, -                  "glUniformMatrix(matrix size mismatch"); +                  "glUniformMatrix(matrix size mismatch)"); +      return; +   } + +   if (index + offset > program->Parameters->Size) { +      /* out of bounds! */        return;     } @@ -1525,6 +1727,7 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,                       GLenum matrixType, GLint location, GLsizei count,                       GLboolean transpose, const GLfloat *values)  { +   GLint offset;     struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;     if (!shProg || !shProg->LinkStatus) { @@ -1536,6 +1739,8 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,     if (location == -1)        return;   /* The standard specifies this as a no-op */ +   split_location_offset(&location, &offset); +     if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {        _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)");        return; @@ -1548,18 +1753,22 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,     FLUSH_VERTICES(ctx, _NEW_PROGRAM);     if (shProg->VertexProgram) { -      GLint loc = shProg->Uniforms->Uniforms[location].VertPos; -      if (loc >= 0) { +      /* convert uniform location to program parameter index */ +      GLint index = shProg->Uniforms->Uniforms[location].VertPos; +      if (index >= 0) {           set_program_uniform_matrix(ctx, &shProg->VertexProgram->Base, -                                    loc, count, rows, cols, transpose, values); +                                    index, offset, +                                    count, rows, cols, transpose, values);        }     }     if (shProg->FragmentProgram) { -      GLint loc = shProg->Uniforms->Uniforms[location].FragPos; -      if (loc >= 0) { +      /* convert uniform location to program parameter index */ +      GLint index = shProg->Uniforms->Uniforms[location].FragPos; +      if (index >= 0) {           set_program_uniform_matrix(ctx, &shProg->FragmentProgram->Base, -                                    loc, count, rows, cols, transpose, values); +                                    index, offset, +                                    count, rows, cols, transpose, values);        }     }  } diff --git a/src/mesa/shader/slang/library/slang_version_syn.h b/src/mesa/shader/slang/library/slang_version_syn.h deleted file mode 100644 index 3b94d85927..0000000000 --- a/src/mesa/shader/slang/library/slang_version_syn.h +++ /dev/null @@ -1,64 +0,0 @@ -".syntax version_directive;\n" -"version_directive\n" -"	version_directive_1 .and .loop version_directive_2;\n" -"version_directive_1\n" -"	prior_optional_spaces .and optional_version_directive .and .true .emit $;\n" -"version_directive_2\n" -"	prior_optional_spaces .and version_directive_body .and .true .emit $;\n" -"optional_version_directive\n" -"	version_directive_body .or .true .emit 10 .emit 1;\n" -"version_directive_body\n" -"	'#' .and optional_space .and \"version\" .and space .and version_number .and optional_space .and\n" -"	new_line;\n" -"version_number\n" -"	version_number_110;\n" -"version_number_110\n" -"	leading_zeroes .and \"110\" .emit 10 .emit 1;\n" -"leading_zeroes\n" -"	.loop zero;\n" -"zero\n" -"	'0';\n" -"space\n" -" single_space .and .loop single_space;\n" -"optional_space\n" -" .loop single_space;\n" -"single_space\n" -" ' ' .or '\\t';\n" -"prior_optional_spaces\n" -"	.loop prior_space;\n" -"prior_space\n" -"	c_style_comment_block .or cpp_style_comment_block .or space .or new_line;\n" -"c_style_comment_block\n" -" '/' .and '*' .and c_style_comment_rest;\n" -"c_style_comment_rest\n" -" .loop c_style_comment_char_no_star .and c_style_comment_rest_1;\n" -"c_style_comment_rest_1\n" -" c_style_comment_end .or c_style_comment_rest_2;\n" -"c_style_comment_rest_2\n" -" '*' .and c_style_comment_rest;\n" -"c_style_comment_char_no_star\n" -" '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';\n" -"c_style_comment_end\n" -" '*' .and '/';\n" -"cpp_style_comment_block\n" -" '/' .and '/' .and cpp_style_comment_block_1;\n" -"cpp_style_comment_block_1\n" -" cpp_style_comment_block_2 .or cpp_style_comment_block_3;\n" -"cpp_style_comment_block_2\n" -" .loop cpp_style_comment_char .and new_line;\n" -"cpp_style_comment_block_3\n" -" .loop cpp_style_comment_char;\n" -"cpp_style_comment_char\n" -" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n" -"new_line\n" -" cr_lf .or lf_cr .or '\\n' .or '\\r';\n" -"cr_lf\n" -" '\\r' .and '\\n';\n" -"lf_cr\n" -"	'\\n' .and '\\r';\n" -".string __string_filter;\n" -"__string_filter\n" -" .loop __identifier_char;\n" -"__identifier_char\n" -" 'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9';\n" -"" diff --git a/src/mesa/shader/slang/library/slang_vertex_builtin.gc b/src/mesa/shader/slang/library/slang_vertex_builtin.gc index 20c924a30d..17e86d9a0e 100644 --- a/src/mesa/shader/slang/library/slang_vertex_builtin.gc +++ b/src/mesa/shader/slang/library/slang_vertex_builtin.gc @@ -57,7 +57,10 @@ varying float gl_FogFragCoord;  vec4 ftransform()  { -   __retVal = gl_Vertex * gl_ModelViewProjectionMatrixTranspose; +   __retVal = gl_ModelViewProjectionMatrix[0] * gl_Vertex.xxxx +            + gl_ModelViewProjectionMatrix[1] * gl_Vertex.yyyy +            + gl_ModelViewProjectionMatrix[2] * gl_Vertex.zzzz +            + gl_ModelViewProjectionMatrix[3] * gl_Vertex.wwww;  } diff --git a/src/mesa/shader/slang/library/slang_vertex_builtin_gc.h b/src/mesa/shader/slang/library/slang_vertex_builtin_gc.h index 1a08a54d7e..63d33af78e 100644 --- a/src/mesa/shader/slang/library/slang_vertex_builtin_gc.h +++ b/src/mesa/shader/slang/library/slang_vertex_builtin_gc.h @@ -20,75 +20,81 @@  0,2,2,3,0,12,1,103,108,95,84,101,120,67,111,111,114,100,0,3,18,103,108,95,77,97,120,84,101,120,116,  117,114,101,67,111,111,114,100,115,0,0,0,2,2,3,0,9,1,103,108,95,70,111,103,70,114,97,103,67,111,  111,114,100,0,0,0,1,0,0,12,0,102,116,114,97,110,115,102,111,114,109,0,0,1,9,18,95,95,114,101,116, -86,97,108,0,18,103,108,95,86,101,114,116,101,120,0,18,103,108,95,77,111,100,101,108,86,105,101,119, -80,114,111,106,101,99,116,105,111,110,77,97,116,114,105,120,84,114,97,110,115,112,111,115,101,0,48, -20,0,0,1,0,0,12,0,116,101,120,116,117,114,101,49,68,76,111,100,0,1,1,0,16,115,97,109,112,108,101, -114,0,0,1,1,0,9,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100, -52,0,0,0,9,18,99,111,111,114,100,52,0,59,120,0,18,99,111,111,114,100,0,20,0,9,18,99,111,111,114, -100,52,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,49,100,0,18,95,95,114, -101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12, -0,116,101,120,116,117,114,101,49,68,80,114,111,106,76,111,100,0,1,1,0,16,115,97,109,112,108,101, -114,0,0,1,1,0,10,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111, -114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,0,18,99,111,111,114,100,0,59,120,0,18,99,111, -111,114,100,0,59,121,0,49,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118, -101,99,52,95,116,101,120,98,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101, -114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,116,101,120,116,117,114,101,49,68,80,114,111, -106,76,111,100,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1,1,0,9, -108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120, -0,18,99,111,111,114,100,0,59,120,0,18,99,111,111,114,100,0,59,122,0,49,20,0,9,18,112,99,111,111, -114,100,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,49,100,0,18,95,95,114, -101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12, -0,116,101,120,116,117,114,101,50,68,76,111,100,0,1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0,10, -99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18, -99,111,111,114,100,52,0,59,120,121,0,18,99,111,111,114,100,0,59,120,121,0,20,0,9,18,99,111,111,114, -100,52,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,50,100,0,18,95,95,114, -101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12, -0,116,101,120,116,117,114,101,50,68,80,114,111,106,76,111,100,0,1,1,0,17,115,97,109,112,108,101, -114,0,0,1,1,0,11,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111, -114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,121,0,18,99,111,111,114,100,0,59,120,121,0,18, -99,111,111,114,100,0,59,122,0,49,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0, -4,118,101,99,52,95,116,101,120,98,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112, -108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,116,101,120,116,117,114,101,50,68,80, -114,111,106,76,111,100,0,1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1, -1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0, -59,120,121,0,18,99,111,111,114,100,0,59,120,121,0,18,99,111,111,114,100,0,59,122,0,49,20,0,9,18, -112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,50,100,0, -18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0, -0,0,1,0,0,12,0,116,101,120,116,117,114,101,51,68,76,111,100,0,1,1,0,18,115,97,109,112,108,101,114, -0,0,1,1,0,11,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52, -0,0,0,9,18,99,111,111,114,100,52,0,59,120,121,122,0,18,99,111,111,114,100,0,59,120,121,122,0,20,0, -9,18,99,111,111,114,100,52,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,51, -100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100, -52,0,0,0,0,1,0,0,12,0,116,101,120,116,117,114,101,51,68,80,114,111,106,76,111,100,0,1,1,0,18,115, -97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12, -1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,121,122,0,18,99,111,111,114, -100,0,59,120,121,122,0,18,99,111,111,114,100,0,59,119,0,49,20,0,9,18,112,99,111,111,114,100,0,59, -119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,51,100,0,18,95,95,114,101,116,86,97, -108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,116,101,120, -116,117,114,101,67,117,98,101,76,111,100,0,1,1,0,19,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111, -111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111, -111,114,100,52,0,59,120,121,122,0,18,99,111,111,114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119, -0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,99,117,98,101,0,18,95,95,114,101,116,86,97, -108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,115,104,97, -100,111,119,49,68,76,111,100,0,1,1,0,20,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100, -0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111,111,114,100, -52,0,59,120,121,122,0,18,99,111,111,114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119,0,18,108, +86,97,108,0,18,103,108,95,77,111,100,101,108,86,105,101,119,80,114,111,106,101,99,116,105,111,110, +77,97,116,114,105,120,0,16,8,48,0,57,18,103,108,95,86,101,114,116,101,120,0,59,120,120,120,120,0, +48,18,103,108,95,77,111,100,101,108,86,105,101,119,80,114,111,106,101,99,116,105,111,110,77,97,116, +114,105,120,0,16,10,49,0,57,18,103,108,95,86,101,114,116,101,120,0,59,121,121,121,121,0,48,46,18, +103,108,95,77,111,100,101,108,86,105,101,119,80,114,111,106,101,99,116,105,111,110,77,97,116,114, +105,120,0,16,10,50,0,57,18,103,108,95,86,101,114,116,101,120,0,59,122,122,122,122,0,48,46,18,103, +108,95,77,111,100,101,108,86,105,101,119,80,114,111,106,101,99,116,105,111,110,77,97,116,114,105, +120,0,16,10,51,0,57,18,103,108,95,86,101,114,116,101,120,0,59,119,119,119,119,0,48,46,20,0,0,1,0,0, +12,0,116,101,120,116,117,114,101,49,68,76,111,100,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0, +9,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18, +99,111,111,114,100,52,0,59,120,0,18,99,111,111,114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119, +0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,49,100,0,18,95,95,114,101,116,86,97,108, +0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,116,101,120,116, +117,114,101,49,68,80,114,111,106,76,111,100,0,1,1,0,16,115,97,109,112,108,101,114,0,0,1,1,0,10,99, +111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112, +99,111,111,114,100,0,59,120,0,18,99,111,111,114,100,0,59,120,0,18,99,111,111,114,100,0,59,121,0,49, +20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120, +98,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111, +114,100,0,0,0,0,1,0,0,12,0,116,101,120,116,117,114,101,49,68,80,114,111,106,76,111,100,0,1,1,0,16, +115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0, +12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,0,18,99,111,111,114,100,0, +59,120,0,18,99,111,111,114,100,0,59,122,0,49,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,  111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18, -115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,115,104,97,100,111,119, -49,68,80,114,111,106,76,111,100,0,1,1,0,20,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114, -100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111, -114,100,0,59,120,0,18,99,111,111,114,100,0,59,120,0,18,99,111,111,114,100,0,59,119,0,49,20,0,9,18, -112,99,111,111,114,100,0,59,122,0,18,99,111,111,114,100,0,59,122,0,20,0,9,18,112,99,111,111,114, -100,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,49,100,0,18,95,95,114,101, -116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0, -115,104,97,100,111,119,50,68,76,111,100,0,1,1,0,21,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111, -111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111, -111,114,100,52,0,59,120,121,122,0,18,99,111,111,114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119, -0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,50,100,0,18,95,95,114,101,116,86,97,108, -0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,115,104,97,100, -111,119,50,68,80,114,111,106,76,111,100,0,1,1,0,21,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111, +115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,116,101,120,116,117, +114,101,50,68,76,111,100,0,1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0,10,99,111,111,114,100,0,0, +1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111,111,114,100,52,0, +59,120,121,0,18,99,111,111,114,100,0,59,120,121,0,20,0,9,18,99,111,111,114,100,52,0,59,119,0,18, +108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,50,100,0,18,95,95,114,101,116,86,97,108,0,0, +18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,116,101,120,116,117, +114,101,50,68,80,114,111,106,76,111,100,0,1,1,0,17,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,  111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99, -111,111,114,100,0,59,120,121,0,18,99,111,111,114,100,0,59,120,121,0,18,99,111,111,114,100,0,59,119, -0,49,20,0,9,18,112,99,111,111,114,100,0,59,122,0,18,99,111,111,114,100,0,59,122,0,20,0,9,18,112,99, -111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,50,100,0,18,95, -95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,0 +111,111,114,100,0,59,120,121,0,18,99,111,111,114,100,0,59,120,121,0,18,99,111,111,114,100,0,59,122, +0,49,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101, +120,98,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,112,99,111, +111,114,100,0,0,0,0,1,0,0,12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,76,111,100,0,1,1,0, +17,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2, +0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,121,0,18,99,111,111,114, +100,0,59,120,121,0,18,99,111,111,114,100,0,59,122,0,49,20,0,9,18,112,99,111,111,114,100,0,59,119,0, +18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,50,100,0,18,95,95,114,101,116,86,97,108,0, +0,18,115,97,109,112,108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,116,101,120,116, +117,114,101,51,68,76,111,100,0,1,1,0,18,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100, +0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111,111,114,100, +52,0,59,120,121,122,0,18,99,111,111,114,100,0,59,120,121,122,0,20,0,9,18,99,111,111,114,100,52,0, +59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116,101,120,98,51,100,0,18,95,95,114,101,116,86, +97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,116,101, +120,116,117,114,101,51,68,80,114,111,106,76,111,100,0,1,1,0,18,115,97,109,112,108,101,114,0,0,1,1, +0,12,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2,0,0,12,1,112,99,111,111,114,100,0,0,0, +9,18,112,99,111,111,114,100,0,59,120,121,122,0,18,99,111,111,114,100,0,59,120,121,122,0,18,99,111, +111,114,100,0,59,119,0,49,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118, +101,99,52,95,116,101,120,98,51,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101, +114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,116,101,120,116,117,114,101,67,117,98,101,76, +111,100,0,1,1,0,19,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,1,1,0,9,108,111, +100,0,0,0,1,3,2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111,111,114,100,52,0,59,120,121,122,0, +18,99,111,111,114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119,0,18,108,111,100,0,20,0,4,118,101, +99,52,95,116,101,120,99,117,98,101,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101, +114,0,0,18,99,111,111,114,100,52,0,0,0,0,1,0,0,12,0,115,104,97,100,111,119,49,68,76,111,100,0,1,1, +0,20,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3, +2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111,111,114,100,52,0,59,120,121,122,0,18,99,111,111, +114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116, +101,120,98,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111, +111,114,100,52,0,0,0,0,1,0,0,12,0,115,104,97,100,111,119,49,68,80,114,111,106,76,111,100,0,1,1,0, +20,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2, +0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,0,18,99,111,111,114,100, +0,59,120,0,18,99,111,111,114,100,0,59,119,0,49,20,0,9,18,112,99,111,111,114,100,0,59,122,0,18,99, +111,111,114,100,0,59,122,0,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0,4,118, +101,99,52,95,116,101,120,98,49,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101, +114,0,0,18,112,99,111,111,114,100,0,0,0,0,1,0,0,12,0,115,104,97,100,111,119,50,68,76,111,100,0,1,1, +0,21,115,97,109,112,108,101,114,0,0,1,1,0,11,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3, +2,0,0,12,1,99,111,111,114,100,52,0,0,0,9,18,99,111,111,114,100,52,0,59,120,121,122,0,18,99,111,111, +114,100,0,20,0,9,18,99,111,111,114,100,52,0,59,119,0,18,108,111,100,0,20,0,4,118,101,99,52,95,116, +101,120,98,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112,108,101,114,0,0,18,99,111, +111,114,100,52,0,0,0,0,1,0,0,12,0,115,104,97,100,111,119,50,68,80,114,111,106,76,111,100,0,1,1,0, +21,115,97,109,112,108,101,114,0,0,1,1,0,12,99,111,111,114,100,0,0,1,1,0,9,108,111,100,0,0,0,1,3,2, +0,0,12,1,112,99,111,111,114,100,0,0,0,9,18,112,99,111,111,114,100,0,59,120,121,0,18,99,111,111,114, +100,0,59,120,121,0,18,99,111,111,114,100,0,59,119,0,49,20,0,9,18,112,99,111,111,114,100,0,59,122,0, +18,99,111,111,114,100,0,59,122,0,20,0,9,18,112,99,111,111,114,100,0,59,119,0,18,108,111,100,0,20,0, +4,118,101,99,52,95,116,101,120,98,50,100,0,18,95,95,114,101,116,86,97,108,0,0,18,115,97,109,112, +108,101,114,0,0,18,112,99,111,111,114,100,0,0,0,0,0 diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index a6390846b2..d884be2a75 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -42,6 +42,24 @@  #include "slang_link.h" +/** cast wrapper */ +static struct gl_vertex_program * +vertex_program(struct gl_program *prog) +{ +   assert(prog->Target == GL_VERTEX_PROGRAM_ARB); +   return (struct gl_vertex_program *) prog; +} + + +/** cast wrapper */ +static struct gl_fragment_program * +fragment_program(struct gl_program *prog) +{ +   assert(prog->Target == GL_FRAGMENT_PROGRAM_ARB); +   return (struct gl_fragment_program *) prog; +} + +  /**   * Record a linking error.   */ @@ -363,6 +381,7 @@ static void  _slang_update_inputs_outputs(struct gl_program *prog)  {     GLuint i, j; +   GLuint maxAddrReg = 0;     prog->InputsRead = 0x0;     prog->OutputsWritten = 0x0; @@ -373,30 +392,33 @@ _slang_update_inputs_outputs(struct gl_program *prog)        for (j = 0; j < numSrc; j++) {           if (inst->SrcReg[j].File == PROGRAM_INPUT) {              prog->InputsRead |= 1 << inst->SrcReg[j].Index; +            if (prog->Target == GL_FRAGMENT_PROGRAM_ARB && +                inst->SrcReg[j].Index == FRAG_ATTRIB_FOGC) { +               /* The fragment shader FOGC input is used for fog, +                * front-facing and sprite/point coord. +                */ +               struct gl_fragment_program *fp = fragment_program(prog); +               const GLint swz = GET_SWZ(inst->SrcReg[j].Swizzle, 0); +               if (swz == SWIZZLE_X) +                  fp->UsesFogFragCoord = GL_TRUE; +               else if (swz == SWIZZLE_Y) +                  fp->UsesFrontFacing = GL_TRUE; +               else if (swz == SWIZZLE_Z || swz == SWIZZLE_W) +                  fp->UsesPointCoord = GL_TRUE; +            } +         } +         else if (inst->SrcReg[j].File == PROGRAM_ADDRESS) { +            maxAddrReg = MAX2(maxAddrReg, inst->SrcReg[j].Index + 1);           }        }        if (inst->DstReg.File == PROGRAM_OUTPUT) {           prog->OutputsWritten |= 1 << inst->DstReg.Index;        } +      else if (inst->DstReg.File == PROGRAM_ADDRESS) { +         maxAddrReg = MAX2(maxAddrReg, inst->DstReg.Index + 1); +      }     } -} - - -/** cast wrapper */ -static struct gl_vertex_program * -vertex_program(struct gl_program *prog) -{ -   assert(prog->Target == GL_VERTEX_PROGRAM_ARB); -   return (struct gl_vertex_program *) prog; -} - - -/** cast wrapper */ -static struct gl_fragment_program * -fragment_program(struct gl_program *prog) -{ -   assert(prog->Target == GL_FRAGMENT_PROGRAM_ARB); -   return (struct gl_fragment_program *) prog; +   prog->NumAddressRegs = maxAddrReg;  } | 
