From 6acf1e93a291511cfb20b0e2aeda6e71ceb62a62 Mon Sep 17 00:00:00 2001 From: Michal Krol Date: Tue, 25 Apr 2006 10:11:59 +0000 Subject: Remove carriage returns. --- progs/demos/arbfslight.c | 212 ++--- src/mesa/main/getstring.c | 16 +- src/mesa/main/imports.c | 22 +- src/mesa/main/light.c | 8 +- src/mesa/shader/slang/slang_export.c | 772 ++++++++--------- src/mesa/shader/slang/slang_export.h | 366 ++++---- src/mesa/shader/slang/slang_link.c | 1572 +++++++++++++++++----------------- src/mesa/shader/slang/slang_link.h | 626 +++++++------- src/mesa/swrast/s_arbshader.h | 68 +- src/mesa/swrast/s_triangle.c | 6 +- src/mesa/tnl/t_vb_arbshader.c | 570 ++++++------ src/mesa/x86/rtasm/x86sse.c | 132 +-- src/mesa/x86/rtasm/x86sse.h | 36 +- windows/VC6/mesa/gdi/gdi.dsp | 4 +- 14 files changed, 2205 insertions(+), 2205 deletions(-) diff --git a/progs/demos/arbfslight.c b/progs/demos/arbfslight.c index 1164f2d660..30332a3f64 100644 --- a/progs/demos/arbfslight.c +++ b/progs/demos/arbfslight.c @@ -1,30 +1,30 @@ /* * Use GL_ARB_fragment_shader and GL_ARB_vertex_shader to implement - * simple per-pixel lighting. - * - * Michal Krol + * simple per-pixel lighting. + * + * Michal Krol * 20 February 2006 - * + * * Based on the original demo by: * Brian Paul * 17 April 2003 - */ - -#ifdef WIN32 -#include + */ + +#ifdef WIN32 +#include #endif #include -#include +#include #include -#include -#include - -#ifdef WIN32 -#define GETPROCADDRESS wglGetProcAddress -#else -#define GETPROCADDRESS glutGetProcAddress -#endif +#include +#include + +#ifdef WIN32 +#define GETPROCADDRESS wglGetProcAddress +#else +#define GETPROCADDRESS glutGetProcAddress +#endif static GLfloat diffuse[4] = { 0.5f, 0.5f, 1.0f, 1.0f }; static GLfloat specular[4] = { 0.8f, 0.8f, 0.8f, 1.0f }; @@ -32,12 +32,12 @@ static GLfloat lightPos[4] = { 0.0f, 10.0f, 20.0f, 1.0f }; static GLfloat delta = 1.0f; static GLhandleARB fragShader; -static GLhandleARB vertShader; -static GLhandleARB program; - -static GLint uLightPos; -static GLint uDiffuse; -static GLint uSpecular; +static GLhandleARB vertShader; +static GLhandleARB program; + +static GLint uLightPos; +static GLint uDiffuse; +static GLint uSpecular; static GLboolean anim = GL_TRUE; static GLboolean wire = GL_FALSE; @@ -46,30 +46,30 @@ static GLboolean pixelLight = GL_TRUE; static GLint t0 = 0; static GLint frames = 0; -static GLfloat xRot = 0.0f, yRot = 0.0f; - -static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL; -static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL; -static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL; -static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; -static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL; -static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL; -static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; -static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL; +static GLfloat xRot = 0.0f, yRot = 0.0f; + +static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL; +static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL; +static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL; +static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; +static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL; +static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL; +static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; +static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL; static PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL; static void Redisplay (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - if (pixelLight) - { - glUseProgramObjectARB (program); + if (pixelLight) + { + glUseProgramObjectARB (program); glUniform4fvARB (uLightPos, 1, lightPos); glDisable(GL_LIGHTING); } - else - { + else + { glUseProgramObjectARB (0); glLightfv (GL_LIGHT0, GL_POSITION, lightPos); glEnable(GL_LIGHTING); @@ -78,16 +78,16 @@ static void Redisplay (void) glPushMatrix (); glRotatef (xRot, 1.0f, 0.0f, 0.0f); glRotatef (yRot, 0.0f, 1.0f, 0.0f); - glutSolidSphere (2.0, 10, 5); + glutSolidSphere (2.0, 10, 5); glPopMatrix (); glutSwapBuffers(); frames++; - if (anim) + if (anim) { GLint t = glutGet (GLUT_ELAPSED_TIME); - if (t - t0 >= 5000) + if (t - t0 >= 5000) { GLfloat seconds = (GLfloat) (t - t0) / 1000.0f; GLfloat fps = frames / seconds; @@ -120,9 +120,9 @@ static void Reshape (int width, int height) static void Key (unsigned char key, int x, int y) { (void) x; - (void) y; + (void) y; - switch (key) + switch (key) { case ' ': case 'a': @@ -161,12 +161,12 @@ static void Key (unsigned char key, int x, int y) static void SpecialKey (int key, int x, int y) { - const GLfloat step = 3.0f; + const GLfloat step = 3.0f; (void) x; - (void) y; + (void) y; - switch (key) + switch (key) { case GLUT_KEY_UP: xRot -= step; @@ -186,80 +186,80 @@ static void SpecialKey (int key, int x, int y) static void Init (void) { - static const char *fragShaderText = - "uniform vec4 lightPos;\n" - "uniform vec4 diffuse;\n" + static const char *fragShaderText = + "uniform vec4 lightPos;\n" + "uniform vec4 diffuse;\n" "uniform vec4 specular;\n" - "void main () {\n" - " // Compute dot product of light direction and normal vector\n" - " float dotProd;\n" - " dotProd = clamp (dot (normalize (lightPos).xyz, normalize (gl_TexCoord[0]).xyz), 0.0, 1.0);\n" - " // Compute diffuse and specular contributions\n" - " gl_FragColor = diffuse * dotProd + specular * pow (dotProd, 20.0);\n" + "void main () {\n" + " // Compute dot product of light direction and normal vector\n" + " float dotProd;\n" + " dotProd = clamp (dot (normalize (lightPos).xyz, normalize (gl_TexCoord[0]).xyz), 0.0, 1.0);\n" + " // Compute diffuse and specular contributions\n" + " gl_FragColor = diffuse * dotProd + specular * pow (dotProd, 20.0);\n" "}\n" ; static const char *vertShaderText = - "void main () {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " gl_TexCoord[0] = vec4 (gl_NormalMatrix * gl_Normal, 1.0);\n" + "void main () {\n" + " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" + " gl_TexCoord[0] = vec4 (gl_NormalMatrix * gl_Normal, 1.0);\n" "}\n" ; - - if (!glutExtensionSupported ("GL_ARB_fragment_shader")) + + if (!glutExtensionSupported ("GL_ARB_fragment_shader")) { printf ("Sorry, this demo requires GL_ARB_fragment_shader\n"); exit(1); - } - if (!glutExtensionSupported ("GL_ARB_shader_objects")) - { - printf ("Sorry, this demo requires GL_ARB_shader_objects\n"); - exit(1); - } - if (!glutExtensionSupported ("GL_ARB_shading_language_100")) - { - printf ("Sorry, this demo requires GL_ARB_shading_language_100\n"); - exit(1); - } - if (!glutExtensionSupported ("GL_ARB_vertex_shader")) - { - printf ("Sorry, this demo requires GL_ARB_vertex_shader\n"); - exit(1); + } + if (!glutExtensionSupported ("GL_ARB_shader_objects")) + { + printf ("Sorry, this demo requires GL_ARB_shader_objects\n"); + exit(1); + } + if (!glutExtensionSupported ("GL_ARB_shading_language_100")) + { + printf ("Sorry, this demo requires GL_ARB_shading_language_100\n"); + exit(1); + } + if (!glutExtensionSupported ("GL_ARB_vertex_shader")) + { + printf ("Sorry, this demo requires GL_ARB_vertex_shader\n"); + exit(1); } - glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) GETPROCADDRESS ("glCreateShaderObjectARB"); - glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) GETPROCADDRESS ("glShaderSourceARB"); - glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) GETPROCADDRESS ("glCompileShaderARB"); - glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glCreateProgramObjectARB"); - glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) GETPROCADDRESS ("glAttachObjectARB"); - glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) GETPROCADDRESS ("glLinkProgramARB"); - glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glUseProgramObjectARB"); - glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GETPROCADDRESS ("glGetUniformLocationARB"); - glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) GETPROCADDRESS ("glUniform4fvARB"); - - fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB); - glShaderSourceARB (fragShader, 1, &fragShaderText, NULL); + glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) GETPROCADDRESS ("glCreateShaderObjectARB"); + glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) GETPROCADDRESS ("glShaderSourceARB"); + glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) GETPROCADDRESS ("glCompileShaderARB"); + glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glCreateProgramObjectARB"); + glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) GETPROCADDRESS ("glAttachObjectARB"); + glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) GETPROCADDRESS ("glLinkProgramARB"); + glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glUseProgramObjectARB"); + glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GETPROCADDRESS ("glGetUniformLocationARB"); + glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) GETPROCADDRESS ("glUniform4fvARB"); + + fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB); + glShaderSourceARB (fragShader, 1, &fragShaderText, NULL); glCompileShaderARB (fragShader); - - vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB); - glShaderSourceARB (vertShader, 1, &vertShaderText, NULL); - glCompileShaderARB (vertShader); - - program = glCreateProgramObjectARB (); - glAttachObjectARB (program, fragShader); - glAttachObjectARB (program, vertShader); - glLinkProgramARB (program); - glUseProgramObjectARB (program); - - uLightPos = glGetUniformLocationARB (program, "lightPos"); - uDiffuse = glGetUniformLocationARB (program, "diffuse"); - uSpecular = glGetUniformLocationARB (program, "specular"); - - glUniform4fvARB (uDiffuse, 1, diffuse); - glUniform4fvARB (uSpecular, 1, specular); + + vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB); + glShaderSourceARB (vertShader, 1, &vertShaderText, NULL); + glCompileShaderARB (vertShader); + + program = glCreateProgramObjectARB (); + glAttachObjectARB (program, fragShader); + glAttachObjectARB (program, vertShader); + glLinkProgramARB (program); + glUseProgramObjectARB (program); + + uLightPos = glGetUniformLocationARB (program, "lightPos"); + uDiffuse = glGetUniformLocationARB (program, "diffuse"); + uSpecular = glGetUniformLocationARB (program, "specular"); + + glUniform4fvARB (uDiffuse, 1, diffuse); + glUniform4fvARB (uSpecular, 1, specular); glClearColor (0.3f, 0.3f, 0.3f, 0.0f); glEnable (GL_DEPTH_TEST); - glEnable (GL_LIGHT0); + glEnable (GL_LIGHT0); glEnable (GL_LIGHTING); glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specular); @@ -286,4 +286,4 @@ int main (int argc, char *argv[]) glutMainLoop (); return 0; } - + diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c index 423466aef3..b6eed5810c 100644 --- a/src/mesa/main/getstring.c +++ b/src/mesa/main/getstring.c @@ -54,7 +54,7 @@ _mesa_GetString( GLenum name ) static const char *version_1_3 = "1.3 Mesa " MESA_VERSION_STRING; static const char *version_1_4 = "1.4 Mesa " MESA_VERSION_STRING; static const char *version_1_5 = "1.5 Mesa " MESA_VERSION_STRING; - static const char *version_2_0 = "1.5 Mesa " MESA_VERSION_STRING;/*XXX FIX*/ + static const char *version_2_0 = "1.5 Mesa " MESA_VERSION_STRING;/*XXX FIX*/ static const char *sl_version_110 = "1.10 Mesa " MESA_VERSION_STRING; ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL); @@ -126,12 +126,12 @@ _mesa_GetString( GLenum name ) case GL_EXTENSIONS: if (!ctx->Extensions.String) ctx->Extensions.String = _mesa_make_extension_string(ctx); - return (const GLubyte *) ctx->Extensions.String; -#if FEATURE_ARB_shading_language_100 - case GL_SHADING_LANGUAGE_VERSION_ARB: - if (ctx->Extensions.ARB_shading_language_100) - return (const GLubyte *) sl_version_110; - goto error; + return (const GLubyte *) ctx->Extensions.String; +#if FEATURE_ARB_shading_language_100 + case GL_SHADING_LANGUAGE_VERSION_ARB: + if (ctx->Extensions.ARB_shading_language_100) + return (const GLubyte *) sl_version_110; + goto error; #endif #if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program || \ FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program @@ -143,7 +143,7 @@ _mesa_GetString( GLenum name ) return (const GLubyte *) ctx->Program.ErrorString; } /* FALL-THROUGH */ -#endif +#endif error: default: _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" ); diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c index afa5fc1c7f..5a986f2395 100644 --- a/src/mesa/main/imports.c +++ b/src/mesa/main/imports.c @@ -295,17 +295,17 @@ _mesa_sin(double a) #else return sin(a); #endif -} - -/** Single precision wrapper around either sin() or xf86sin() */ -float -_mesa_sinf(float a) -{ -#if defined(XFree86LOADER) && defined(IN_MODULE) - return (float) xf86sin((double) a); -#else - return (float) sin((double) a); -#endif +} + +/** Single precision wrapper around either sin() or xf86sin() */ +float +_mesa_sinf(float a) +{ +#if defined(XFree86LOADER) && defined(IN_MODULE) + return (float) xf86sin((double) a); +#else + return (float) sin((double) a); +#endif } /** Wrapper around either cos() or xf86cos() */ diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c index 35ec1547e9..63f88b7229 100644 --- a/src/mesa/main/light.c +++ b/src/mesa/main/light.c @@ -125,11 +125,11 @@ _mesa_light(GLcontext *ctx, GLuint lnum, GLenum pname, const GLfloat *params) if (light->SpotCutoff == params[0]) return; FLUSH_VERTICES(ctx, _NEW_LIGHT); - light->SpotCutoff = params[0]; + light->SpotCutoff = params[0]; light->_CosCutoffNeg = (GLfloat) (_mesa_cos(light->SpotCutoff * DEG2RAD)); if (light->_CosCutoffNeg < 0) - light->_CosCutoff = 0; - else + light->_CosCutoff = 0; + else light->_CosCutoff = light->_CosCutoffNeg; if (light->SpotCutoff != 180.0F) light->_Flags |= LIGHT_SPOT; @@ -1265,7 +1265,7 @@ init_light( struct gl_light *l, GLuint n ) ASSIGN_3V( l->EyeDirection, 0.0, 0.0, -1.0 ); l->SpotExponent = 0.0; _mesa_invalidate_spot_exp_table( l ); - l->SpotCutoff = 180.0; + l->SpotCutoff = 180.0; l->_CosCutoffNeg = -1.0f; l->_CosCutoff = 0.0; /* KW: -ve values not admitted */ l->ConstantAttenuation = 1.0; diff --git a/src/mesa/shader/slang/slang_export.c b/src/mesa/shader/slang/slang_export.c index dcf64244b7..9620ef0790 100644 --- a/src/mesa/shader/slang/slang_export.c +++ b/src/mesa/shader/slang/slang_export.c @@ -1,386 +1,386 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5 - * - * Copyright (C) 2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * \file slang_export.c - * interface between assembly code and the application - * \author Michal Krol - */ - -#include "imports.h" -#include "slang_export.h" - -/* - * slang_export_data_quant - */ - -GLvoid slang_export_data_quant_ctr (slang_export_data_quant *self) -{ - self->name = SLANG_ATOM_NULL; - self->size = 0; - self->array_len = 0; - self->structure = NULL; - self->u.basic_type = GL_FLOAT; -} - -GLvoid slang_export_data_quant_dtr (slang_export_data_quant *self) -{ - if (self->structure != NULL) - { - GLuint i; - - for (i = 0; i < self->u.field_count; i++) - slang_export_data_quant_dtr (&self->structure[i]); - slang_alloc_free (self->structure); - } -} - -slang_export_data_quant *slang_export_data_quant_add_field (slang_export_data_quant *self) -{ - const GLuint n = self->u.field_count; - - self->structure = (slang_export_data_quant *) slang_alloc_realloc (self->structure, - n * sizeof (slang_export_data_quant), (n + 1) * sizeof (slang_export_data_quant)); - if (self->structure == NULL) - return NULL; - slang_export_data_quant_ctr (&self->structure[n]); - self->u.field_count++; - return &self->structure[n]; -} - -GLboolean slang_export_data_quant_array (slang_export_data_quant *self) -{ - return self->array_len != 0; -} - -GLboolean slang_export_data_quant_struct (slang_export_data_quant *self) -{ - return self->structure != NULL; -} - -GLboolean slang_export_data_quant_simple (slang_export_data_quant *self) -{ - return self->array_len == 0 && self->structure == NULL; -} - -GLenum slang_export_data_quant_type (slang_export_data_quant *self) -{ - assert (self->structure == NULL); - return self->u.basic_type; -} - -GLuint slang_export_data_quant_fields (slang_export_data_quant *self) -{ - assert (self->structure != NULL); - return self->u.field_count; -} - -GLuint slang_export_data_quant_elements (slang_export_data_quant *self) -{ - if (self->array_len == 0) - return 1; - return self->array_len; -} - -GLuint slang_export_data_quant_components (slang_export_data_quant *self) -{ - return self->size / 4; -} - -GLuint slang_export_data_quant_size (slang_export_data_quant *self) -{ - return self->size; -} - -/* - * slang_export_data_entry - */ - -GLvoid slang_export_data_entry_ctr (slang_export_data_entry *self) -{ - slang_export_data_quant_ctr (&self->quant); - self->access = slang_exp_uniform; - self->address = ~0; -} - -GLvoid slang_export_data_entry_dtr (slang_export_data_entry *self) -{ - slang_export_data_quant_dtr (&self->quant); -} - -/* - * slang_export_data_table - */ - -GLvoid slang_export_data_table_ctr (slang_export_data_table *self) -{ - self->entries = NULL; - self->count = 0; - self->atoms = NULL; -} - -GLvoid slang_export_data_table_dtr (slang_export_data_table *self) -{ - if (self->entries != NULL) - { - GLuint i; - - for (i = 0; i < self->count; i++) - slang_export_data_entry_dtr (&self->entries[i]); - slang_alloc_free (self->entries); - } -} - -slang_export_data_entry *slang_export_data_table_add (slang_export_data_table *self) -{ - const GLuint n = self->count; - - self->entries = (slang_export_data_entry *) slang_alloc_realloc (self->entries, - n * sizeof (slang_export_data_entry), (n + 1) * sizeof (slang_export_data_entry)); - if (self->entries == NULL) - return NULL; - slang_export_data_entry_ctr (&self->entries[n]); - self->count++; - return &self->entries[n]; -} - -/* - * slang_export_code_entry - */ - -static GLvoid slang_export_code_entry_ctr (slang_export_code_entry *self) -{ - self->name = SLANG_ATOM_NULL; - self->address = ~0; -} - -static GLvoid slang_export_code_entry_dtr (slang_export_code_entry *self) -{ -} - -/* - * slang_export_code_table - */ - -GLvoid slang_export_code_table_ctr (slang_export_code_table *self) -{ - self->entries = NULL; - self->count = 0; - self->atoms = NULL; -} - -GLvoid slang_export_code_table_dtr (slang_export_code_table *self) -{ - if (self->entries != NULL) - { - GLuint i; - - for (i = 0; i < self->count; i++) - slang_export_code_entry_dtr (&self->entries[i]); - slang_alloc_free (self->entries); - } -} - -slang_export_code_entry *slang_export_code_table_add (slang_export_code_table *self) -{ - const GLuint n = self->count; - - self->entries = (slang_export_code_entry *) slang_alloc_realloc (self->entries, - n * sizeof (slang_export_code_entry), (n + 1) * sizeof (slang_export_code_entry)); - if (self->entries == NULL) - return NULL; - slang_export_code_entry_ctr (&self->entries[n]); - self->count++; - return &self->entries[n]; -} - -/* - * _slang_find_exported_data() - */ - -#define EXTRACT_ERROR 0 -#define EXTRACT_BASIC 1 -#define EXTRACT_ARRAY 2 -#define EXTRACT_STRUCT 3 -#define EXTRACT_STRUCT_ARRAY 4 - -#define EXTRACT_MAXLEN 255 - -static GLuint extract_name (const char *name, char *parsed, GLuint *element, const char **end) -{ - GLuint i; - - if ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z') || name[0] == '_') - { - parsed[0] = name[0]; - - for (i = 1; i < EXTRACT_MAXLEN; i++) - { - if ((name[i] >= 'a' && name[i] <= 'z') || (name[i] >= 'A' && name[i] <= 'Z') || - (name[i] >= '0' && name[i] <= '9') || name[0] == '_') - { - parsed[i] = name[i]; - } - else - { - if (name[i] == '\0') - { - parsed[i] = '\0'; - return EXTRACT_BASIC; - } - if (name[i] == '.') - { - parsed[i] = '\0'; - *end = &name[i + 1]; - return EXTRACT_STRUCT; - } - if (name[i] == '[') - { - parsed[i] = '\0'; - i++; - if (name[i] >= '0' && name[i] <= '9') - { - *element = name[i] - '0'; - for (i++; ; i++) - { - if (name[i] >= '0' && name[i] <= '9') - *element = *element * 10 + (name[i] - '0'); - else - { - if (name[i] == ']') - { - i++; - if (name[i] == '.') - { - *end = &name[i + 1]; - return EXTRACT_STRUCT_ARRAY; - } - *end = &name[i]; - return EXTRACT_ARRAY; - } - break; - } - } - } - } - break; - } - } - } - return EXTRACT_ERROR; -} - -static GLboolean validate_extracted (slang_export_data_quant *q, GLuint element, GLuint extr) -{ - switch (extr) - { - case EXTRACT_BASIC: - return GL_TRUE; - case EXTRACT_ARRAY: - return element < slang_export_data_quant_elements (q); - case EXTRACT_STRUCT: - return slang_export_data_quant_struct (q); - case EXTRACT_STRUCT_ARRAY: - return slang_export_data_quant_struct (q) && element < slang_export_data_quant_elements (q); - } - return GL_FALSE; -} - -static GLuint calculate_offset (slang_export_data_quant *q, GLuint element) -{ - if (slang_export_data_quant_array (q)) - return element * slang_export_data_quant_size (q); - return 0; -} - -static GLboolean find_exported_data (slang_export_data_quant *q, const char *name, - slang_export_data_quant **quant, GLuint *offset, slang_atom_pool *atoms) -{ - char parsed[EXTRACT_MAXLEN]; - GLuint result, element, i; - const char *end; - slang_atom atom; - const GLuint fields = slang_export_data_quant_fields (q); - - result = extract_name (name, parsed, &element, &end); - if (result == EXTRACT_ERROR) - return GL_FALSE; - - atom = slang_atom_pool_atom (atoms, parsed); - if (atom == SLANG_ATOM_NULL) - return GL_FALSE; - - for (i = 0; i < fields; i++) - if (q->structure[i].name == atom) - { - if (!validate_extracted (&q->structure[i], element, result)) - return GL_FALSE; - *offset += calculate_offset (&q->structure[i], element); - if (result == EXTRACT_BASIC || result == EXTRACT_ARRAY) - { - if (*end != '\0') - return GL_FALSE; - *quant = &q->structure[i]; - return GL_TRUE; - } - return find_exported_data (&q->structure[i], end, quant, offset, atoms); - } - return GL_FALSE; -} - -GLboolean _slang_find_exported_data (slang_export_data_table *table, const char *name, - slang_export_data_entry **entry, slang_export_data_quant **quant, GLuint *offset) -{ - char parsed[EXTRACT_MAXLEN]; - GLuint result, element, i; - const char *end; - slang_atom atom; - - result = extract_name (name, parsed, &element, &end); - if (result == EXTRACT_ERROR) - return GL_FALSE; - - atom = slang_atom_pool_atom (table->atoms, parsed); - if (atom == SLANG_ATOM_NULL) - return GL_FALSE; - - for (i = 0; i < table->count; i++) - if (table->entries[i].quant.name == atom) - { - if (!validate_extracted (&table->entries[i].quant, element, result)) - return GL_FALSE; - *entry = &table->entries[i]; - *offset = calculate_offset (&table->entries[i].quant, element); - if (result == EXTRACT_BASIC || result == EXTRACT_ARRAY) - { - if (*end != '\0') - return GL_FALSE; - *quant = &table->entries[i].quant; - return GL_TRUE; - } - return find_exported_data (&table->entries[i].quant, end, quant, offset, table->atoms); - } - return GL_FALSE; -} - +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 2006 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * \file slang_export.c + * interface between assembly code and the application + * \author Michal Krol + */ + +#include "imports.h" +#include "slang_export.h" + +/* + * slang_export_data_quant + */ + +GLvoid slang_export_data_quant_ctr (slang_export_data_quant *self) +{ + self->name = SLANG_ATOM_NULL; + self->size = 0; + self->array_len = 0; + self->structure = NULL; + self->u.basic_type = GL_FLOAT; +} + +GLvoid slang_export_data_quant_dtr (slang_export_data_quant *self) +{ + if (self->structure != NULL) + { + GLuint i; + + for (i = 0; i < self->u.field_count; i++) + slang_export_data_quant_dtr (&self->structure[i]); + slang_alloc_free (self->structure); + } +} + +slang_export_data_quant *slang_export_data_quant_add_field (slang_export_data_quant *self) +{ + const GLuint n = self->u.field_count; + + self->structure = (slang_export_data_quant *) slang_alloc_realloc (self->structure, + n * sizeof (slang_export_data_quant), (n + 1) * sizeof (slang_export_data_quant)); + if (self->structure == NULL) + return NULL; + slang_export_data_quant_ctr (&self->structure[n]); + self->u.field_count++; + return &self->structure[n]; +} + +GLboolean slang_export_data_quant_array (slang_export_data_quant *self) +{ + return self->array_len != 0; +} + +GLboolean slang_export_data_quant_struct (slang_export_data_quant *self) +{ + return self->structure != NULL; +} + +GLboolean slang_export_data_quant_simple (slang_export_data_quant *self) +{ + return self->array_len == 0 && self->structure == NULL; +} + +GLenum slang_export_data_quant_type (slang_export_data_quant *self) +{ + assert (self->structure == NULL); + return self->u.basic_type; +} + +GLuint slang_export_data_quant_fields (slang_export_data_quant *self) +{ + assert (self->structure != NULL); + return self->u.field_count; +} + +GLuint slang_export_data_quant_elements (slang_export_data_quant *self) +{ + if (self->array_len == 0) + return 1; + return self->array_len; +} + +GLuint slang_export_data_quant_components (slang_export_data_quant *self) +{ + return self->size / 4; +} + +GLuint slang_export_data_quant_size (slang_export_data_quant *self) +{ + return self->size; +} + +/* + * slang_export_data_entry + */ + +GLvoid slang_export_data_entry_ctr (slang_export_data_entry *self) +{ + slang_export_data_quant_ctr (&self->quant); + self->access = slang_exp_uniform; + self->address = ~0; +} + +GLvoid slang_export_data_entry_dtr (slang_export_data_entry *self) +{ + slang_export_data_quant_dtr (&self->quant); +} + +/* + * slang_export_data_table + */ + +GLvoid slang_export_data_table_ctr (slang_export_data_table *self) +{ + self->entries = NULL; + self->count = 0; + self->atoms = NULL; +} + +GLvoid slang_export_data_table_dtr (slang_export_data_table *self) +{ + if (self->entries != NULL) + { + GLuint i; + + for (i = 0; i < self->count; i++) + slang_export_data_entry_dtr (&self->entries[i]); + slang_alloc_free (self->entries); + } +} + +slang_export_data_entry *slang_export_data_table_add (slang_export_data_table *self) +{ + const GLuint n = self->count; + + self->entries = (slang_export_data_entry *) slang_alloc_realloc (self->entries, + n * sizeof (slang_export_data_entry), (n + 1) * sizeof (slang_export_data_entry)); + if (self->entries == NULL) + return NULL; + slang_export_data_entry_ctr (&self->entries[n]); + self->count++; + return &self->entries[n]; +} + +/* + * slang_export_code_entry + */ + +static GLvoid slang_export_code_entry_ctr (slang_export_code_entry *self) +{ + self->name = SLANG_ATOM_NULL; + self->address = ~0; +} + +static GLvoid slang_export_code_entry_dtr (slang_export_code_entry *self) +{ +} + +/* + * slang_export_code_table + */ + +GLvoid slang_export_code_table_ctr (slang_export_code_table *self) +{ + self->entries = NULL; + self->count = 0; + self->atoms = NULL; +} + +GLvoid slang_export_code_table_dtr (slang_export_code_table *self) +{ + if (self->entries != NULL) + { + GLuint i; + + for (i = 0; i < self->count; i++) + slang_export_code_entry_dtr (&self->entries[i]); + slang_alloc_free (self->entries); + } +} + +slang_export_code_entry *slang_export_code_table_add (slang_export_code_table *self) +{ + const GLuint n = self->count; + + self->entries = (slang_export_code_entry *) slang_alloc_realloc (self->entries, + n * sizeof (slang_export_code_entry), (n + 1) * sizeof (slang_export_code_entry)); + if (self->entries == NULL) + return NULL; + slang_export_code_entry_ctr (&self->entries[n]); + self->count++; + return &self->entries[n]; +} + +/* + * _slang_find_exported_data() + */ + +#define EXTRACT_ERROR 0 +#define EXTRACT_BASIC 1 +#define EXTRACT_ARRAY 2 +#define EXTRACT_STRUCT 3 +#define EXTRACT_STRUCT_ARRAY 4 + +#define EXTRACT_MAXLEN 255 + +static GLuint extract_name (const char *name, char *parsed, GLuint *element, const char **end) +{ + GLuint i; + + if ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z') || name[0] == '_') + { + parsed[0] = name[0]; + + for (i = 1; i < EXTRACT_MAXLEN; i++) + { + if ((name[i] >= 'a' && name[i] <= 'z') || (name[i] >= 'A' && name[i] <= 'Z') || + (name[i] >= '0' && name[i] <= '9') || name[0] == '_') + { + parsed[i] = name[i]; + } + else + { + if (name[i] == '\0') + { + parsed[i] = '\0'; + return EXTRACT_BASIC; + } + if (name[i] == '.') + { + parsed[i] = '\0'; + *end = &name[i + 1]; + return EXTRACT_STRUCT; + } + if (name[i] == '[') + { + parsed[i] = '\0'; + i++; + if (name[i] >= '0' && name[i] <= '9') + { + *element = name[i] - '0'; + for (i++; ; i++) + { + if (name[i] >= '0' && name[i] <= '9') + *element = *element * 10 + (name[i] - '0'); + else + { + if (name[i] == ']') + { + i++; + if (name[i] == '.') + { + *end = &name[i + 1]; + return EXTRACT_STRUCT_ARRAY; + } + *end = &name[i]; + return EXTRACT_ARRAY; + } + break; + } + } + } + } + break; + } + } + } + return EXTRACT_ERROR; +} + +static GLboolean validate_extracted (slang_export_data_quant *q, GLuint element, GLuint extr) +{ + switch (extr) + { + case EXTRACT_BASIC: + return GL_TRUE; + case EXTRACT_ARRAY: + return element < slang_export_data_quant_elements (q); + case EXTRACT_STRUCT: + return slang_export_data_quant_struct (q); + case EXTRACT_STRUCT_ARRAY: + return slang_export_data_quant_struct (q) && element < slang_export_data_quant_elements (q); + } + return GL_FALSE; +} + +static GLuint calculate_offset (slang_export_data_quant *q, GLuint element) +{ + if (slang_export_data_quant_array (q)) + return element * slang_export_data_quant_size (q); + return 0; +} + +static GLboolean find_exported_data (slang_export_data_quant *q, const char *name, + slang_export_data_quant **quant, GLuint *offset, slang_atom_pool *atoms) +{ + char parsed[EXTRACT_MAXLEN]; + GLuint result, element, i; + const char *end; + slang_atom atom; + const GLuint fields = slang_export_data_quant_fields (q); + + result = extract_name (name, parsed, &element, &end); + if (result == EXTRACT_ERROR) + return GL_FALSE; + + atom = slang_atom_pool_atom (atoms, parsed); + if (atom == SLANG_ATOM_NULL) + return GL_FALSE; + + for (i = 0; i < fields; i++) + if (q->structure[i].name == atom) + { + if (!validate_extracted (&q->structure[i], element, result)) + return GL_FALSE; + *offset += calculate_offset (&q->structure[i], element); + if (result == EXTRACT_BASIC || result == EXTRACT_ARRAY) + { + if (*end != '\0') + return GL_FALSE; + *quant = &q->structure[i]; + return GL_TRUE; + } + return find_exported_data (&q->structure[i], end, quant, offset, atoms); + } + return GL_FALSE; +} + +GLboolean _slang_find_exported_data (slang_export_data_table *table, const char *name, + slang_export_data_entry **entry, slang_export_data_quant **quant, GLuint *offset) +{ + char parsed[EXTRACT_MAXLEN]; + GLuint result, element, i; + const char *end; + slang_atom atom; + + result = extract_name (name, parsed, &element, &end); + if (result == EXTRACT_ERROR) + return GL_FALSE; + + atom = slang_atom_pool_atom (table->atoms, parsed); + if (atom == SLANG_ATOM_NULL) + return GL_FALSE; + + for (i = 0; i < table->count; i++) + if (table->entries[i].quant.name == atom) + { + if (!validate_extracted (&table->entries[i].quant, element, result)) + return GL_FALSE; + *entry = &table->entries[i]; + *offset = calculate_offset (&table->entries[i].quant, element); + if (result == EXTRACT_BASIC || result == EXTRACT_ARRAY) + { + if (*end != '\0') + return GL_FALSE; + *quant = &table->entries[i].quant; + return GL_TRUE; + } + return find_exported_data (&table->entries[i].quant, end, quant, offset, table->atoms); + } + return GL_FALSE; +} + diff --git a/src/mesa/shader/slang/slang_export.h b/src/mesa/shader/slang/slang_export.h index aaf00773c1..40ceac19e1 100644 --- a/src/mesa/shader/slang/slang_export.h +++ b/src/mesa/shader/slang/slang_export.h @@ -1,183 +1,183 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5 - * - * Copyright (C) 2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#if !defined SLANG_EXPORT_H -#define SLANG_EXPORT_H - -#include "slang_utility.h" - -#if defined __cplusplus -extern "C" { -#endif - -/* - * Basic data quantity to transfer between application and assembly. - * The is the actual size of the data quantity including padding, if any. It is - * used to calculate offsets from the beginning of the data. - * If the is not 0, the data quantity is an array of size. - * If the is not NULL, the data quantity is a struct. The is - * invalid and the holds the size of the array. - * The values match those of parameter for glGetActiveUniformARB. - */ - -typedef struct slang_export_data_quant_ -{ - slang_atom name; - GLuint size; - GLuint array_len; - struct slang_export_data_quant_ *structure; - union - { - GLenum basic_type; - GLuint field_count; - } u; -} slang_export_data_quant; - -GLvoid slang_export_data_quant_ctr (slang_export_data_quant *); -GLvoid slang_export_data_quant_dtr (slang_export_data_quant *); -slang_export_data_quant *slang_export_data_quant_add_field (slang_export_data_quant *); - -/* - * Returns GL_FALSE if the quant is not an array. - */ -GLboolean slang_export_data_quant_array (slang_export_data_quant *); - -/* - * Returns GL_FALSE if the quant is not a structure. - */ -GLboolean slang_export_data_quant_struct (slang_export_data_quant *); - -/* - * Returns GL_TRUE if the quant is neither an array nor a structure. - */ -GLboolean slang_export_data_quant_simple (slang_export_data_quant *); - -/* - * Returns basic type of the quant. It must not be a structure. - */ -GLenum slang_export_data_quant_type (slang_export_data_quant *); - -/* - * Returns number of fields in the quant that is a structure. - */ -GLuint slang_export_data_quant_fields (slang_export_data_quant *); - -/* - * Return number of elements in the quant. - * For arrays, return the size of the array. - * Otherwise, return 1. - */ -GLuint slang_export_data_quant_elements (slang_export_data_quant *); - -/* - * Returns total number of components withing the quant element. - */ -GLuint slang_export_data_quant_components (slang_export_data_quant *); - -/* - * Returns size of the quant element. - */ -GLuint slang_export_data_quant_size (slang_export_data_quant *); - -/* - * Data access pattern. Specifies how data is accessed at what frequency. - */ - -typedef enum -{ - slang_exp_uniform, - slang_exp_varying, - slang_exp_attribute -} slang_export_data_access; - -/* - * Data export entry. Holds the data type information, access pattern and base address. - */ - -typedef struct -{ - slang_export_data_quant quant; - slang_export_data_access access; - GLuint address; -} slang_export_data_entry; - -GLvoid slang_export_data_entry_ctr (slang_export_data_entry *); -GLvoid slang_export_data_entry_dtr (slang_export_data_entry *); - -/* - * Data export table. - */ - -typedef struct -{ - slang_export_data_entry *entries; - GLuint count; - slang_atom_pool *atoms; -} slang_export_data_table; - -GLvoid slang_export_data_table_ctr (slang_export_data_table *); -GLvoid slang_export_data_table_dtr (slang_export_data_table *); -slang_export_data_entry *slang_export_data_table_add (slang_export_data_table *); - -/* - * Code export entry. Contains label name and its entry point (label, address). - */ - -typedef struct -{ - slang_atom name; - GLuint address; -} slang_export_code_entry; - -/* - * Code export table. - */ - -typedef struct -{ - slang_export_code_entry *entries; - GLuint count; - slang_atom_pool *atoms; -} slang_export_code_table; - -GLvoid slang_export_code_table_ctr (slang_export_code_table *); -GLvoid slang_export_code_table_dtr (slang_export_code_table *); -slang_export_code_entry *slang_export_code_table_add (slang_export_code_table *); - -/* - * _slang_find_exported_data() - * - * Parses the name string and returns corresponding data entry, data quantity and offset. - * Returns GL_TRUE if the data is found, returns GL_FALSE otherwise. - */ - -GLboolean _slang_find_exported_data (slang_export_data_table *, const char *, - slang_export_data_entry **, slang_export_data_quant **, GLuint *); - -#ifdef __cplusplus -} -#endif - -#endif - +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 2006 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#if !defined SLANG_EXPORT_H +#define SLANG_EXPORT_H + +#include "slang_utility.h" + +#if defined __cplusplus +extern "C" { +#endif + +/* + * Basic data quantity to transfer between application and assembly. + * The is the actual size of the data quantity including padding, if any. It is + * used to calculate offsets from the beginning of the data. + * If the is not 0, the data quantity is an array of size. + * If the is not NULL, the data quantity is a struct. The is + * invalid and the holds the size of the array. + * The values match those of parameter for glGetActiveUniformARB. + */ + +typedef struct slang_export_data_quant_ +{ + slang_atom name; + GLuint size; + GLuint array_len; + struct slang_export_data_quant_ *structure; + union + { + GLenum basic_type; + GLuint field_count; + } u; +} slang_export_data_quant; + +GLvoid slang_export_data_quant_ctr (slang_export_data_quant *); +GLvoid slang_export_data_quant_dtr (slang_export_data_quant *); +slang_export_data_quant *slang_export_data_quant_add_field (slang_export_data_quant *); + +/* + * Returns GL_FALSE if the quant is not an array. + */ +GLboolean slang_export_data_quant_array (slang_export_data_quant *); + +/* + * Returns GL_FALSE if the quant is not a structure. + */ +GLboolean slang_export_data_quant_struct (slang_export_data_quant *); + +/* + * Returns GL_TRUE if the quant is neither an array nor a structure. + */ +GLboolean slang_export_data_quant_simple (slang_export_data_quant *); + +/* + * Returns basic type of the quant. It must not be a structure. + */ +GLenum slang_export_data_quant_type (slang_export_data_quant *); + +/* + * Returns number of fields in the quant that is a structure. + */ +GLuint slang_export_data_quant_fields (slang_export_data_quant *); + +/* + * Return number of elements in the quant. + * For arrays, return the size of the array. + * Otherwise, return 1. + */ +GLuint slang_export_data_quant_elements (slang_export_data_quant *); + +/* + * Returns total number of components withing the quant element. + */ +GLuint slang_export_data_quant_components (slang_export_data_quant *); + +/* + * Returns size of the quant element. + */ +GLuint slang_export_data_quant_size (slang_export_data_quant *); + +/* + * Data access pattern. Specifies how data is accessed at what frequency. + */ + +typedef enum +{ + slang_exp_uniform, + slang_exp_varying, + slang_exp_attribute +} slang_export_data_access; + +/* + * Data export entry. Holds the data type information, access pattern and base address. + */ + +typedef struct +{ + slang_export_data_quant quant; + slang_export_data_access access; + GLuint address; +} slang_export_data_entry; + +GLvoid slang_export_data_entry_ctr (slang_export_data_entry *); +GLvoid slang_export_data_entry_dtr (slang_export_data_entry *); + +/* + * Data export table. + */ + +typedef struct +{ + slang_export_data_entry *entries; + GLuint count; + slang_atom_pool *atoms; +} slang_export_data_table; + +GLvoid slang_export_data_table_ctr (slang_export_data_table *); +GLvoid slang_export_data_table_dtr (slang_export_data_table *); +slang_export_data_entry *slang_export_data_table_add (slang_export_data_table *); + +/* + * Code export entry. Contains label name and its entry point (label, address). + */ + +typedef struct +{ + slang_atom name; + GLuint address; +} slang_export_code_entry; + +/* + * Code export table. + */ + +typedef struct +{ + slang_export_code_entry *entries; + GLuint count; + slang_atom_pool *atoms; +} slang_export_code_table; + +GLvoid slang_export_code_table_ctr (slang_export_code_table *); +GLvoid slang_export_code_table_dtr (slang_export_code_table *); +slang_export_code_entry *slang_export_code_table_add (slang_export_code_table *); + +/* + * _slang_find_exported_data() + * + * Parses the name string and returns corresponding data entry, data quantity and offset. + * Returns GL_TRUE if the data is found, returns GL_FALSE otherwise. + */ + +GLboolean _slang_find_exported_data (slang_export_data_table *, const char *, + slang_export_data_entry **, slang_export_data_quant **, GLuint *); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index 9d61a29e91..95e390020e 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -1,786 +1,786 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5 - * - * Copyright (C) 2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/** - * \file slang_link.c - * slang linker - * \author Michal Krol - */ - -#include "imports.h" -#include "slang_link.h" -#include "slang_analyse.h" - -static GLboolean entry_has_gl_prefix (slang_atom name, slang_atom_pool *atoms) -{ - const char *str = slang_atom_pool_id (atoms, name); - return str[0] == 'g' && str[1] == 'l' && str[2] == '_'; -} - -/* - * slang_active_variables - */ - -static GLvoid slang_active_variables_ctr (slang_active_variables *self) -{ - self->table = NULL; - self->count = 0; -} - -static GLvoid slang_active_variables_dtr (slang_active_variables *self) -{ - GLuint i; - - for (i = 0; i < self->count; i++) - slang_alloc_free (self->table[i].name); - slang_alloc_free (self->table); -} - -static GLboolean add_simple_variable (slang_active_variables *self, slang_export_data_quant *q, - const char *name) -{ - const GLuint n = self->count; - - self->table = (slang_active_variable *) slang_alloc_realloc (self->table, - n * sizeof (slang_active_variable), (n + 1) * sizeof (slang_active_variable)); - if (self->table == NULL) - return GL_FALSE; - - self->table[n].quant = q; - self->table[n].name = slang_string_duplicate (name); - if (self->table[n].name == NULL) - return GL_FALSE; - self->count++; - - return GL_TRUE; -} - -static GLboolean add_complex_variable (slang_active_variables *self, slang_export_data_quant *q, - char *name, slang_atom_pool *atoms) -{ - slang_string_concat (name, slang_atom_pool_id (atoms, q->name)); - if (slang_export_data_quant_array (q)) - slang_string_concat (name, "[0]"); - - if (slang_export_data_quant_struct (q)) - { - GLuint dot_pos, i; - const GLuint fields = slang_export_data_quant_fields (q); - - slang_string_concat (name, "."); - dot_pos = slang_string_length (name); - - for (i = 0; i < fields; i++) - { - if (!add_complex_variable (self, &q->structure[i], name, atoms)) - return GL_FALSE; - - name[dot_pos] = '\0'; - } - - return GL_TRUE; - } - - return add_simple_variable (self, q, name); -} - -static GLboolean gather_active_variables (slang_active_variables *self, - slang_export_data_table *tbl, slang_export_data_access access) -{ - GLuint i; - - for (i = 0; i < tbl->count; i++) - if (tbl->entries[i].access == access) - { - char name[1024] = ""; - - if (!add_complex_variable (self, &tbl->entries[i].quant, name, tbl->atoms)) - return GL_FALSE; - } - - return GL_TRUE; -} - -/* - * slang_attrib_overrides - */ - -static GLvoid slang_attrib_overrides_ctr (slang_attrib_overrides *self) -{ - self->table = NULL; - self->count = 0; -} - -static GLvoid slang_attrib_overrides_dtr (slang_attrib_overrides *self) -{ - GLuint i; - - for (i = 0; i < self->count; i++) - slang_alloc_free (self->table[i].name); - slang_alloc_free (self->table); -} - -GLboolean slang_attrib_overrides_add (slang_attrib_overrides *self, GLuint index, const GLchar *name) -{ - const GLuint n = self->count; - GLuint i; - - for (i = 0; i < n; i++) - if (slang_string_compare (name, self->table[i].name) == 0) - { - self->table[i].index = index; - return GL_TRUE; - } - - self->table = (slang_attrib_override *) slang_alloc_realloc (self->table, - n * sizeof (slang_attrib_override), (n + 1) * sizeof (slang_attrib_override)); - if (self->table == NULL) - return GL_FALSE; - - self->table[n].index = index; - self->table[n].name = slang_string_duplicate (name); - if (self->table[n].name == NULL) - return GL_FALSE; - self->count++; - - return GL_TRUE; -} - -static GLuint lookup_attrib_override (slang_attrib_overrides *self, const GLchar *name) -{ - GLuint i; - - for (i = 0; self->count; i++) - if (slang_string_compare (name, self->table[i].name) == 0) - return self->table[i].index; - return MAX_VERTEX_ATTRIBS; -} - -/* - * slang_uniform_bindings - */ - -static GLvoid slang_uniform_bindings_ctr (slang_uniform_bindings *self) -{ - self->table = NULL; - self->count = 0; -} - -static GLvoid slang_uniform_bindings_dtr (slang_uniform_bindings *self) -{ - GLuint i; - - for (i = 0; i < self->count; i++) - slang_alloc_free (self->table[i].name); - slang_alloc_free (self->table); -} - -static GLboolean add_simple_uniform_binding (slang_uniform_bindings *self, - slang_export_data_quant *q, const char *name, GLuint index, GLuint addr) -{ - const GLuint n = self->count; - GLuint i; - - for (i = 0; i < n; i++) - if (slang_string_compare (self->table[i].name, name) == 0) - { - self->table[i].address[index] = addr; - return GL_TRUE; - } - - self->table = (slang_uniform_binding *) slang_alloc_realloc (self->table, - n * sizeof (slang_uniform_binding), (n + 1) * sizeof (slang_uniform_binding)); - if (self->table == NULL) - return GL_FALSE; - - self->table[n].quant = q; - self->table[n].name = slang_string_duplicate (name); - if (self->table[n].name == NULL) - return GL_FALSE; - for (i = 0; i < SLANG_SHADER_MAX; i++) - self->table[n].address[i] = ~0; - self->table[n].address[index] = addr; - self->count++; - - return GL_TRUE; -} - -static GLboolean add_complex_uniform_binding (slang_uniform_bindings *self, - slang_export_data_quant *q, char *name, slang_atom_pool *atoms, GLuint index, GLuint addr) -{ - GLuint count, i; - - slang_string_concat (name, slang_atom_pool_id (atoms, q->name)); - count = slang_export_data_quant_elements (q); - for (i = 0; i < count; i++) - { - GLuint bracket_pos; - - bracket_pos = slang_string_length (name); - if (slang_export_data_quant_array (q)) - _mesa_sprintf (name + slang_string_length (name), "[%d]", i); - - if (slang_export_data_quant_struct (q)) - { - GLuint dot_pos, i; - const GLuint fields = slang_export_data_quant_fields (q); - - slang_string_concat (name, "."); - dot_pos = slang_string_length (name); - - for (i = 0; i < fields; i++) - { - if (!add_complex_uniform_binding (self, &q->structure[i], name, atoms, index, addr)) - return GL_FALSE; - - name[dot_pos] = '\0'; - addr += slang_export_data_quant_size (&q->structure[i]); - } - } - else - { - if (!add_simple_uniform_binding (self, q, name, index, addr)) - return GL_FALSE; - - addr += slang_export_data_quant_size (q); - } - - name[bracket_pos] = '\0'; - } - - return GL_TRUE; -} - -static GLboolean gather_uniform_bindings (slang_uniform_bindings *self, - slang_export_data_table *tbl, GLuint index) -{ - GLuint i; - - for (i = 0; i < tbl->count; i++) - if (tbl->entries[i].access == slang_exp_uniform) - { - char name[1024] = ""; - - if (!add_complex_uniform_binding (self, &tbl->entries[i].quant, name, tbl->atoms, index, - tbl->entries[i].address)) - return GL_FALSE; - } - - return GL_TRUE; -} - -/* - * slang_attrib_bindings - */ - -static GLvoid slang_attrib_bindings_ctr (slang_attrib_bindings *self) -{ - GLuint i; - - self->binding_count = 0; - for (i = 0; i < MAX_VERTEX_ATTRIBS; i++) - self->slots[i].addr = ~0; -} - -static GLvoid slang_attrib_bindings_dtr (slang_attrib_bindings *self) -{ - GLuint i; - - for (i = 0; i < self->binding_count; i++) - slang_alloc_free (self->bindings[i].name); -} - -static GLuint can_allocate_attrib_slots (slang_attrib_bindings *self, GLuint index, GLuint count) -{ - GLuint i; - - for (i = 0; i < count; i++) - if (self->slots[index + i].addr != ~0) - break; - return i; -} - -static GLuint allocate_attrib_slots (slang_attrib_bindings *self, GLuint count) -{ - GLuint i; - - for (i = 0; i <= MAX_VERTEX_ATTRIBS - count; i++) - { - GLuint size; - - size = can_allocate_attrib_slots (self, i, count); - if (size == count) - return i; - - /* speed-up the search a bit */ - i += count; - } - return MAX_VERTEX_ATTRIBS; -} - -static GLboolean add_attrib_binding (slang_attrib_bindings *self, slang_export_data_quant *q, - const char *name, GLuint addr, GLuint index_override) -{ - const GLuint n = self->binding_count; - GLuint slot_span, slot_index; - GLuint i; - - assert (slang_export_data_quant_simple (q)); - - switch (slang_export_data_quant_type (q)) - { - case GL_FLOAT: - case GL_FLOAT_VEC2: - case GL_FLOAT_VEC3: - case GL_FLOAT_VEC4: - slot_span = 1; - break; - case GL_FLOAT_MAT2: - slot_span = 2; - break; - case GL_FLOAT_MAT3: - slot_span = 3; - break; - case GL_FLOAT_MAT4: - slot_span = 4; - break; - default: - assert (0); - } - - if (index_override == MAX_VERTEX_ATTRIBS) - slot_index = allocate_attrib_slots (self, slot_span); - else if (can_allocate_attrib_slots (self, index_override, slot_span) == slot_span) - slot_index = index_override; - else - slot_index = MAX_VERTEX_ATTRIBS; - - if (slot_index == MAX_VERTEX_ATTRIBS) - { - /* TODO: info log: error: MAX_VERTEX_ATTRIBS exceeded */ - return GL_FALSE; - } - - self->bindings[n].quant = q; - self->bindings[n].name = slang_string_duplicate (name); - if (self->bindings[n].name == NULL) - return GL_FALSE; - self->bindings[n].first_slot_index = slot_index; - self->binding_count++; - - for (i = 0; i < slot_span; i++) - self->slots[self->bindings[n].first_slot_index + i].addr = addr + i * 4; - - return GL_TRUE; -} - -static GLboolean gather_attrib_bindings (slang_attrib_bindings *self, slang_export_data_table *tbl, - slang_attrib_overrides *ovr) -{ - GLuint i; - - /* First pass. Gather attribs that have overriden index slots. */ - for (i = 0; i < tbl->count; i++) - if (tbl->entries[i].access == slang_exp_attribute && - !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) - { - slang_export_data_quant *quant = &tbl->entries[i].quant; - const GLchar *id = slang_atom_pool_id (tbl->atoms, quant->name); - GLuint index = lookup_attrib_override (ovr, id); - - if (index != MAX_VERTEX_ATTRIBS) - { - if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, index)) - return GL_FALSE; - } - } - - /* Second pass. Gather attribs that have *NOT* overriden index slots. */ - for (i = 0; i < tbl->count; i++) - if (tbl->entries[i].access == slang_exp_attribute && - !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) - { - slang_export_data_quant *quant = &tbl->entries[i].quant; - const GLchar *id = slang_atom_pool_id (tbl->atoms, quant->name); - GLuint index = lookup_attrib_override (ovr, id); - - if (index == MAX_VERTEX_ATTRIBS) - { - if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, index)) - return GL_FALSE; - } - } - - return GL_TRUE; -} - -/* - * slang_varying_bindings - */ - -static GLvoid slang_varying_bindings_ctr (slang_varying_bindings *self) -{ - self->binding_count = 0; - self->slot_count = 0; -} - -static GLvoid slang_varying_bindings_dtr (slang_varying_bindings *self) -{ - GLuint i; - - for (i = 0; i < self->binding_count; i++) - slang_alloc_free (self->bindings[i].name); -} - -static GLvoid update_varying_slots (slang_varying_slot *slots, GLuint count, GLboolean is_vert, - GLuint addr, GLuint do_offset) -{ - GLuint i; - - for (i = 0; i < count; i++) - *(is_vert ? &slots[i].vert_addr : &slots[i].frag_addr) = addr + i * 4 * do_offset; -} - -static GLboolean add_varying_binding (slang_varying_bindings *self, - slang_export_data_quant *q, const char *name, GLboolean is_vert, GLuint addr) -{ - const GLuint n = self->binding_count; - const GLuint slot_span = - slang_export_data_quant_components (q) * slang_export_data_quant_elements (q); - GLuint i; - - for (i = 0; i < n; i++) - if (slang_string_compare (self->bindings[i].name, name) == 0) - { - /* TODO: data quantities must match, or else link fails */ - update_varying_slots (&self->slots[self->bindings[i].first_slot_index], slot_span, - is_vert, addr, 1); - return GL_TRUE; - } - - if (self->slot_count + slot_span > MAX_VARYING_FLOATS) - { - /* TODO: info log: error: MAX_VARYING_FLOATS exceeded */ - return GL_FALSE; - } - - self->bindings[n].quant = q; - self->bindings[n].name = slang_string_duplicate (name); - if (self->bindings[n].name == NULL) - return GL_FALSE; - self->bindings[n].first_slot_index = self->slot_count; - self->binding_count++; - - update_varying_slots (&self->slots[self->bindings[n].first_slot_index], slot_span, is_vert, - addr, 1); - update_varying_slots (&self->slots[self->bindings[n].first_slot_index], slot_span, !is_vert, - ~0, 0); - self->slot_count += slot_span; - - return GL_TRUE; -} - -static GLboolean gather_varying_bindings (slang_varying_bindings *self, - slang_export_data_table *tbl, GLboolean is_vert) -{ - GLuint i; - - for (i = 0; i < tbl->count; i++) - if (tbl->entries[i].access == slang_exp_varying && - !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) - { - if (!add_varying_binding (self, &tbl->entries[i].quant, slang_atom_pool_id (tbl->atoms, - tbl->entries[i].quant.name), is_vert, tbl->entries[i].address)) - return GL_FALSE; - } - - return GL_TRUE; -} - -/* - * slang_texture_bindings - */ - -GLvoid slang_texture_usages_ctr (slang_texture_usages *self) -{ - self->table = NULL; - self->count = 0; -} - -GLvoid slang_texture_usages_dtr (slang_texture_usages *self) -{ - slang_alloc_free (self->table); -} - -/* - * slang_program - */ - -GLvoid slang_program_ctr (slang_program *self) -{ - GLuint i; - - slang_active_variables_ctr (&self->active_uniforms); - slang_active_variables_ctr (&self->active_attribs); - slang_attrib_overrides_ctr (&self->attrib_overrides); - slang_uniform_bindings_ctr (&self->uniforms); - slang_attrib_bindings_ctr (&self->attribs); - slang_varying_bindings_ctr (&self->varyings); - slang_texture_usages_ctr (&self->texture_usage); - for (i = 0; i < SLANG_SHADER_MAX; i++) - { - GLuint j; - - for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++) - self->common_fixed_entries[i][j] = ~0; - for (j = 0; j < SLANG_COMMON_CODE_MAX; j++) - self->code[i][j] = ~0; - self->machines[i] = NULL; - self->assemblies[i] = NULL; - } - for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++) - self->vertex_fixed_entries[i] = ~0; - for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++) - self->fragment_fixed_entries[i] = ~0; -} - -GLvoid slang_program_dtr (slang_program *self) -{ - slang_active_variables_dtr (&self->active_uniforms); - slang_active_variables_dtr (&self->active_attribs); - slang_attrib_overrides_dtr (&self->attrib_overrides); - slang_uniform_bindings_dtr (&self->uniforms); - slang_attrib_bindings_dtr (&self->attribs); - slang_varying_bindings_dtr (&self->varyings); - slang_texture_usages_dtr (&self->texture_usage); -} - -static GLvoid slang_program_rst (slang_program *self) -{ - GLuint i; - - slang_active_variables_dtr (&self->active_uniforms); - slang_active_variables_dtr (&self->active_attribs); - slang_uniform_bindings_dtr (&self->uniforms); - slang_attrib_bindings_dtr (&self->attribs); - slang_varying_bindings_dtr (&self->varyings); - slang_texture_usages_dtr (&self->texture_usage); - - slang_active_variables_ctr (&self->active_uniforms); - slang_active_variables_ctr (&self->active_attribs); - slang_uniform_bindings_ctr (&self->uniforms); - slang_attrib_bindings_ctr (&self->attribs); - slang_varying_bindings_ctr (&self->varyings); - slang_texture_usages_ctr (&self->texture_usage); - for (i = 0; i < SLANG_SHADER_MAX; i++) - { - GLuint j; - - for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++) - self->common_fixed_entries[i][j] = ~0; - for (j = 0; j < SLANG_COMMON_CODE_MAX; j++) - self->code[i][j] = ~0; - } - for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++) - self->vertex_fixed_entries[i] = ~0; - for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++) - self->fragment_fixed_entries[i] = ~0; -} - -/* - * _slang_link() - */ - -static GLuint gd (slang_export_data_table *tbl, const char *name) -{ - slang_atom atom; - GLuint i; - - atom = slang_atom_pool_atom (tbl->atoms, name); - if (atom == SLANG_ATOM_NULL) - return ~0; - - for (i = 0; i < tbl->count; i++) - if (atom == tbl->entries[i].quant.name) - return tbl->entries[i].address; - return ~0; -} - -static GLvoid resolve_common_fixed (GLuint e[], slang_export_data_table *tbl) -{ - e[SLANG_COMMON_FIXED_MODELVIEWMATRIX] = gd (tbl, "gl_ModelViewMatrix"); - e[SLANG_COMMON_FIXED_PROJECTIONMATRIX] = gd (tbl, "gl_ProjectionMatrix"); - e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIX] = gd (tbl, "gl_ModelViewProjectionMatrix"); - e[SLANG_COMMON_FIXED_TEXTUREMATRIX] = gd (tbl, "gl_TextureMatrix"); - e[SLANG_COMMON_FIXED_NORMALMATRIX] = gd (tbl, "gl_NormalMatrix"); - e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSE] = gd (tbl, "gl_ModelViewMatrixInverse"); - e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSE] = gd (tbl, "gl_ProjectionMatrixInverse"); - e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSE] = - gd (tbl, "gl_ModelViewProjectionMatrixInverse"); - e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSE] = gd (tbl, "gl_TextureMatrixInverse"); - e[SLANG_COMMON_FIXED_MODELVIEWMATRIXTRANSPOSE] = gd (tbl, "gl_ModelViewMatrixTranspose"); - e[SLANG_COMMON_FIXED_PROJECTIONMATRIXTRANSPOSE] = gd (tbl, "gl_ProjectionMatrixTranspose"); - e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXTRANSPOSE] = - gd (tbl, "gl_ModelViewProjectionMatrixTranspose"); - e[SLANG_COMMON_FIXED_TEXTUREMATRIXTRANSPOSE] = gd (tbl, "gl_TextureMatrixTranspose"); - e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSETRANSPOSE] = - gd (tbl, "gl_ModelViewMatrixInverseTranspose"); - e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSETRANSPOSE] = - gd (tbl, "gl_ProjectionMatrixInverseTranspose"); - e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSETRANSPOSE] = - gd (tbl, "gl_ModelViewProjectionMatrixInverseTranspose"); - e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSETRANSPOSE] = - gd (tbl, "gl_TextureMatrixInverseTranspose"); - e[SLANG_COMMON_FIXED_NORMALSCALE] = gd (tbl, "gl_NormalScale"); - e[SLANG_COMMON_FIXED_DEPTHRANGE] = gd (tbl, "gl_DepthRange"); - e[SLANG_COMMON_FIXED_CLIPPLANE] = gd (tbl, "gl_ClipPlane"); - e[SLANG_COMMON_FIXED_POINT] = gd (tbl, "gl_Point"); - e[SLANG_COMMON_FIXED_FRONTMATERIAL] = gd (tbl, "gl_FrontMaterial"); - e[SLANG_COMMON_FIXED_BACKMATERIAL] = gd (tbl, "gl_BackMaterial"); - e[SLANG_COMMON_FIXED_LIGHTSOURCE] = gd (tbl, "gl_LightSource"); - e[SLANG_COMMON_FIXED_LIGHTMODEL] = gd (tbl, "gl_LightModel"); - e[SLANG_COMMON_FIXED_FRONTLIGHTMODELPRODUCT] = gd (tbl, "gl_FrontLightModelProduct"); - e[SLANG_COMMON_FIXED_BACKLIGHTMODELPRODUCT] = gd (tbl, "gl_BackLightModelProduct"); - e[SLANG_COMMON_FIXED_FRONTLIGHTPRODUCT] = gd (tbl, "gl_FrontLightProduct"); - e[SLANG_COMMON_FIXED_BACKLIGHTPRODUCT] = gd (tbl, "gl_BackLightProduct"); - e[SLANG_COMMON_FIXED_TEXTUREENVCOLOR] = gd (tbl, "gl_TextureEnvColor"); - e[SLANG_COMMON_FIXED_EYEPLANES] = gd (tbl, "gl_EyePlaneS"); - e[SLANG_COMMON_FIXED_EYEPLANET] = gd (tbl, "gl_EyePlaneT"); - e[SLANG_COMMON_FIXED_EYEPLANER] = gd (tbl, "gl_EyePlaneR"); - e[SLANG_COMMON_FIXED_EYEPLANEQ] = gd (tbl, "gl_EyePlaneQ"); - e[SLANG_COMMON_FIXED_OBJECTPLANES] = gd (tbl, "gl_ObjectPlaneS"); - e[SLANG_COMMON_FIXED_OBJECTPLANET] = gd (tbl, "gl_ObjectPlaneT"); - e[SLANG_COMMON_FIXED_OBJECTPLANER] = gd (tbl, "gl_ObjectPlaneR"); - e[SLANG_COMMON_FIXED_OBJECTPLANEQ] = gd (tbl, "gl_ObjectPlaneQ"); - e[SLANG_COMMON_FIXED_FOG] = gd (tbl, "gl_Fog"); -} - -static GLvoid resolve_vertex_fixed (GLuint e[], slang_export_data_table *tbl) -{ - e[SLANG_VERTEX_FIXED_POSITION] = gd (tbl, "gl_Position"); - e[SLANG_VERTEX_FIXED_POINTSIZE] = gd (tbl, "gl_PointSize"); - e[SLANG_VERTEX_FIXED_CLIPVERTEX] = gd (tbl, "gl_ClipVertex"); - e[SLANG_VERTEX_FIXED_COLOR] = gd (tbl, "gl_Color"); - e[SLANG_VERTEX_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor"); - e[SLANG_VERTEX_FIXED_NORMAL] = gd (tbl, "gl_Normal"); - e[SLANG_VERTEX_FIXED_VERTEX] = gd (tbl, "gl_Vertex"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD0] = gd (tbl, "gl_MultiTexCoord0"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD1] = gd (tbl, "gl_MultiTexCoord1"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD2] = gd (tbl, "gl_MultiTexCoord2"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD3] = gd (tbl, "gl_MultiTexCoord3"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD4] = gd (tbl, "gl_MultiTexCoord4"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD5] = gd (tbl, "gl_MultiTexCoord5"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD6] = gd (tbl, "gl_MultiTexCoord6"); - e[SLANG_VERTEX_FIXED_MULTITEXCOORD7] = gd (tbl, "gl_MultiTexCoord7"); - e[SLANG_VERTEX_FIXED_FOGCOORD] = gd (tbl, "gl_FogCoord"); - e[SLANG_VERTEX_FIXED_FRONTCOLOR] = gd (tbl, "gl_FrontColor"); - e[SLANG_VERTEX_FIXED_BACKCOLOR] = gd (tbl, "gl_BackColor"); - e[SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR] = gd (tbl, "gl_FrontSecondaryColor"); - e[SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR] = gd (tbl, "gl_BackSecondaryColor"); - e[SLANG_VERTEX_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord"); - e[SLANG_VERTEX_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord"); -} - -static GLvoid resolve_fragment_fixed (GLuint e[], slang_export_data_table *tbl) -{ - e[SLANG_FRAGMENT_FIXED_FRAGCOORD] = gd (tbl, "gl_FragCoord"); - e[SLANG_FRAGMENT_FIXED_FRONTFACING] = gd (tbl, "gl_FrontFacing"); - e[SLANG_FRAGMENT_FIXED_FRAGCOLOR] = gd (tbl, "gl_FragColor"); - e[SLANG_FRAGMENT_FIXED_FRAGDATA] = gd (tbl, "gl_FragData"); - e[SLANG_FRAGMENT_FIXED_FRAGDEPTH] = gd (tbl, "gl_FragDepth"); - e[SLANG_FRAGMENT_FIXED_COLOR] = gd (tbl, "gl_Color"); - e[SLANG_FRAGMENT_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor"); - e[SLANG_FRAGMENT_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord"); - e[SLANG_FRAGMENT_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord"); -} - -static GLuint gc (slang_export_code_table *tbl, const char *name) -{ - slang_atom atom; - GLuint i; - - atom = slang_atom_pool_atom (tbl->atoms, name); - if (atom == SLANG_ATOM_NULL) - return ~0; - - for (i = 0; i < tbl->count; i++) - if (atom == tbl->entries[i].name) - return tbl->entries[i].address; - return ~0; -} - -static GLvoid resolve_common_code (GLuint code[], slang_export_code_table *tbl) -{ - code[SLANG_COMMON_CODE_MAIN] = gc (tbl, "@main"); -} - -GLboolean _slang_link (slang_program *prog, slang_translation_unit **units, GLuint count) -{ - GLuint i; - - slang_program_rst (prog); - - for (i = 0; i < count; i++) - { - GLuint index; - - if (units[i]->type == slang_unit_fragment_shader) - { - index = SLANG_SHADER_FRAGMENT; - resolve_fragment_fixed (prog->fragment_fixed_entries, &units[i]->exp_data); - } - else - { - index = SLANG_SHADER_VERTEX; - resolve_vertex_fixed (prog->vertex_fixed_entries, &units[i]->exp_data); - if (!gather_attrib_bindings (&prog->attribs, &units[i]->exp_data, - &prog->attrib_overrides)) - return GL_FALSE; - } - - if (!gather_active_variables (&prog->active_uniforms, &units[i]->exp_data, - slang_exp_uniform)) - return GL_FALSE; - if (!gather_active_variables (&prog->active_attribs, &units[i]->exp_data, - slang_exp_attribute)) - return GL_FALSE; - if (!gather_uniform_bindings (&prog->uniforms, &units[i]->exp_data, index)) - return GL_FALSE; - if (!gather_varying_bindings (&prog->varyings, &units[i]->exp_data, - index == SLANG_SHADER_VERTEX)) - return GL_FALSE; - resolve_common_fixed (prog->common_fixed_entries[index], &units[i]->exp_data); - resolve_common_code (prog->code[index], &units[i]->exp_code); - prog->machines[index] = units[i]->machine; - prog->assemblies[index] = units[i]->assembly; - } - - /* TODO: all varyings read by fragment shader must be written by vertex shader */ - - if (!_slang_analyse_texture_usage (prog)) - return GL_FALSE; - - return GL_TRUE; -} - +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 2006 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * \file slang_link.c + * slang linker + * \author Michal Krol + */ + +#include "imports.h" +#include "slang_link.h" +#include "slang_analyse.h" + +static GLboolean entry_has_gl_prefix (slang_atom name, slang_atom_pool *atoms) +{ + const char *str = slang_atom_pool_id (atoms, name); + return str[0] == 'g' && str[1] == 'l' && str[2] == '_'; +} + +/* + * slang_active_variables + */ + +static GLvoid slang_active_variables_ctr (slang_active_variables *self) +{ + self->table = NULL; + self->count = 0; +} + +static GLvoid slang_active_variables_dtr (slang_active_variables *self) +{ + GLuint i; + + for (i = 0; i < self->count; i++) + slang_alloc_free (self->table[i].name); + slang_alloc_free (self->table); +} + +static GLboolean add_simple_variable (slang_active_variables *self, slang_export_data_quant *q, + const char *name) +{ + const GLuint n = self->count; + + self->table = (slang_active_variable *) slang_alloc_realloc (self->table, + n * sizeof (slang_active_variable), (n + 1) * sizeof (slang_active_variable)); + if (self->table == NULL) + return GL_FALSE; + + self->table[n].quant = q; + self->table[n].name = slang_string_duplicate (name); + if (self->table[n].name == NULL) + return GL_FALSE; + self->count++; + + return GL_TRUE; +} + +static GLboolean add_complex_variable (slang_active_variables *self, slang_export_data_quant *q, + char *name, slang_atom_pool *atoms) +{ + slang_string_concat (name, slang_atom_pool_id (atoms, q->name)); + if (slang_export_data_quant_array (q)) + slang_string_concat (name, "[0]"); + + if (slang_export_data_quant_struct (q)) + { + GLuint dot_pos, i; + const GLuint fields = slang_export_data_quant_fields (q); + + slang_string_concat (name, "."); + dot_pos = slang_string_length (name); + + for (i = 0; i < fields; i++) + { + if (!add_complex_variable (self, &q->structure[i], name, atoms)) + return GL_FALSE; + + name[dot_pos] = '\0'; + } + + return GL_TRUE; + } + + return add_simple_variable (self, q, name); +} + +static GLboolean gather_active_variables (slang_active_variables *self, + slang_export_data_table *tbl, slang_export_data_access access) +{ + GLuint i; + + for (i = 0; i < tbl->count; i++) + if (tbl->entries[i].access == access) + { + char name[1024] = ""; + + if (!add_complex_variable (self, &tbl->entries[i].quant, name, tbl->atoms)) + return GL_FALSE; + } + + return GL_TRUE; +} + +/* + * slang_attrib_overrides + */ + +static GLvoid slang_attrib_overrides_ctr (slang_attrib_overrides *self) +{ + self->table = NULL; + self->count = 0; +} + +static GLvoid slang_attrib_overrides_dtr (slang_attrib_overrides *self) +{ + GLuint i; + + for (i = 0; i < self->count; i++) + slang_alloc_free (self->table[i].name); + slang_alloc_free (self->table); +} + +GLboolean slang_attrib_overrides_add (slang_attrib_overrides *self, GLuint index, const GLchar *name) +{ + const GLuint n = self->count; + GLuint i; + + for (i = 0; i < n; i++) + if (slang_string_compare (name, self->table[i].name) == 0) + { + self->table[i].index = index; + return GL_TRUE; + } + + self->table = (slang_attrib_override *) slang_alloc_realloc (self->table, + n * sizeof (slang_attrib_override), (n + 1) * sizeof (slang_attrib_override)); + if (self->table == NULL) + return GL_FALSE; + + self->table[n].index = index; + self->table[n].name = slang_string_duplicate (name); + if (self->table[n].name == NULL) + return GL_FALSE; + self->count++; + + return GL_TRUE; +} + +static GLuint lookup_attrib_override (slang_attrib_overrides *self, const GLchar *name) +{ + GLuint i; + + for (i = 0; self->count; i++) + if (slang_string_compare (name, self->table[i].name) == 0) + return self->table[i].index; + return MAX_VERTEX_ATTRIBS; +} + +/* + * slang_uniform_bindings + */ + +static GLvoid slang_uniform_bindings_ctr (slang_uniform_bindings *self) +{ + self->table = NULL; + self->count = 0; +} + +static GLvoid slang_uniform_bindings_dtr (slang_uniform_bindings *self) +{ + GLuint i; + + for (i = 0; i < self->count; i++) + slang_alloc_free (self->table[i].name); + slang_alloc_free (self->table); +} + +static GLboolean add_simple_uniform_binding (slang_uniform_bindings *self, + slang_export_data_quant *q, const char *name, GLuint index, GLuint addr) +{ + const GLuint n = self->count; + GLuint i; + + for (i = 0; i < n; i++) + if (slang_string_compare (self->table[i].name, name) == 0) + { + self->table[i].address[index] = addr; + return GL_TRUE; + } + + self->table = (slang_uniform_binding *) slang_alloc_realloc (self->table, + n * sizeof (slang_uniform_binding), (n + 1) * sizeof (slang_uniform_binding)); + if (self->table == NULL) + return GL_FALSE; + + self->table[n].quant = q; + self->table[n].name = slang_string_duplicate (name); + if (self->table[n].name == NULL) + return GL_FALSE; + for (i = 0; i < SLANG_SHADER_MAX; i++) + self->table[n].address[i] = ~0; + self->table[n].address[index] = addr; + self->count++; + + return GL_TRUE; +} + +static GLboolean add_complex_uniform_binding (slang_uniform_bindings *self, + slang_export_data_quant *q, char *name, slang_atom_pool *atoms, GLuint index, GLuint addr) +{ + GLuint count, i; + + slang_string_concat (name, slang_atom_pool_id (atoms, q->name)); + count = slang_export_data_quant_elements (q); + for (i = 0; i < count; i++) + { + GLuint bracket_pos; + + bracket_pos = slang_string_length (name); + if (slang_export_data_quant_array (q)) + _mesa_sprintf (name + slang_string_length (name), "[%d]", i); + + if (slang_export_data_quant_struct (q)) + { + GLuint dot_pos, i; + const GLuint fields = slang_export_data_quant_fields (q); + + slang_string_concat (name, "."); + dot_pos = slang_string_length (name); + + for (i = 0; i < fields; i++) + { + if (!add_complex_uniform_binding (self, &q->structure[i], name, atoms, index, addr)) + return GL_FALSE; + + name[dot_pos] = '\0'; + addr += slang_export_data_quant_size (&q->structure[i]); + } + } + else + { + if (!add_simple_uniform_binding (self, q, name, index, addr)) + return GL_FALSE; + + addr += slang_export_data_quant_size (q); + } + + name[bracket_pos] = '\0'; + } + + return GL_TRUE; +} + +static GLboolean gather_uniform_bindings (slang_uniform_bindings *self, + slang_export_data_table *tbl, GLuint index) +{ + GLuint i; + + for (i = 0; i < tbl->count; i++) + if (tbl->entries[i].access == slang_exp_uniform) + { + char name[1024] = ""; + + if (!add_complex_uniform_binding (self, &tbl->entries[i].quant, name, tbl->atoms, index, + tbl->entries[i].address)) + return GL_FALSE; + } + + return GL_TRUE; +} + +/* + * slang_attrib_bindings + */ + +static GLvoid slang_attrib_bindings_ctr (slang_attrib_bindings *self) +{ + GLuint i; + + self->binding_count = 0; + for (i = 0; i < MAX_VERTEX_ATTRIBS; i++) + self->slots[i].addr = ~0; +} + +static GLvoid slang_attrib_bindings_dtr (slang_attrib_bindings *self) +{ + GLuint i; + + for (i = 0; i < self->binding_count; i++) + slang_alloc_free (self->bindings[i].name); +} + +static GLuint can_allocate_attrib_slots (slang_attrib_bindings *self, GLuint index, GLuint count) +{ + GLuint i; + + for (i = 0; i < count; i++) + if (self->slots[index + i].addr != ~0) + break; + return i; +} + +static GLuint allocate_attrib_slots (slang_attrib_bindings *self, GLuint count) +{ + GLuint i; + + for (i = 0; i <= MAX_VERTEX_ATTRIBS - count; i++) + { + GLuint size; + + size = can_allocate_attrib_slots (self, i, count); + if (size == count) + return i; + + /* speed-up the search a bit */ + i += count; + } + return MAX_VERTEX_ATTRIBS; +} + +static GLboolean add_attrib_binding (slang_attrib_bindings *self, slang_export_data_quant *q, + const char *name, GLuint addr, GLuint index_override) +{ + const GLuint n = self->binding_count; + GLuint slot_span, slot_index; + GLuint i; + + assert (slang_export_data_quant_simple (q)); + + switch (slang_export_data_quant_type (q)) + { + case GL_FLOAT: + case GL_FLOAT_VEC2: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + slot_span = 1; + break; + case GL_FLOAT_MAT2: + slot_span = 2; + break; + case GL_FLOAT_MAT3: + slot_span = 3; + break; + case GL_FLOAT_MAT4: + slot_span = 4; + break; + default: + assert (0); + } + + if (index_override == MAX_VERTEX_ATTRIBS) + slot_index = allocate_attrib_slots (self, slot_span); + else if (can_allocate_attrib_slots (self, index_override, slot_span) == slot_span) + slot_index = index_override; + else + slot_index = MAX_VERTEX_ATTRIBS; + + if (slot_index == MAX_VERTEX_ATTRIBS) + { + /* TODO: info log: error: MAX_VERTEX_ATTRIBS exceeded */ + return GL_FALSE; + } + + self->bindings[n].quant = q; + self->bindings[n].name = slang_string_duplicate (name); + if (self->bindings[n].name == NULL) + return GL_FALSE; + self->bindings[n].first_slot_index = slot_index; + self->binding_count++; + + for (i = 0; i < slot_span; i++) + self->slots[self->bindings[n].first_slot_index + i].addr = addr + i * 4; + + return GL_TRUE; +} + +static GLboolean gather_attrib_bindings (slang_attrib_bindings *self, slang_export_data_table *tbl, + slang_attrib_overrides *ovr) +{ + GLuint i; + + /* First pass. Gather attribs that have overriden index slots. */ + for (i = 0; i < tbl->count; i++) + if (tbl->entries[i].access == slang_exp_attribute && + !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) + { + slang_export_data_quant *quant = &tbl->entries[i].quant; + const GLchar *id = slang_atom_pool_id (tbl->atoms, quant->name); + GLuint index = lookup_attrib_override (ovr, id); + + if (index != MAX_VERTEX_ATTRIBS) + { + if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, index)) + return GL_FALSE; + } + } + + /* Second pass. Gather attribs that have *NOT* overriden index slots. */ + for (i = 0; i < tbl->count; i++) + if (tbl->entries[i].access == slang_exp_attribute && + !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) + { + slang_export_data_quant *quant = &tbl->entries[i].quant; + const GLchar *id = slang_atom_pool_id (tbl->atoms, quant->name); + GLuint index = lookup_attrib_override (ovr, id); + + if (index == MAX_VERTEX_ATTRIBS) + { + if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, index)) + return GL_FALSE; + } + } + + return GL_TRUE; +} + +/* + * slang_varying_bindings + */ + +static GLvoid slang_varying_bindings_ctr (slang_varying_bindings *self) +{ + self->binding_count = 0; + self->slot_count = 0; +} + +static GLvoid slang_varying_bindings_dtr (slang_varying_bindings *self) +{ + GLuint i; + + for (i = 0; i < self->binding_count; i++) + slang_alloc_free (self->bindings[i].name); +} + +static GLvoid update_varying_slots (slang_varying_slot *slots, GLuint count, GLboolean is_vert, + GLuint addr, GLuint do_offset) +{ + GLuint i; + + for (i = 0; i < count; i++) + *(is_vert ? &slots[i].vert_addr : &slots[i].frag_addr) = addr + i * 4 * do_offset; +} + +static GLboolean add_varying_binding (slang_varying_bindings *self, + slang_export_data_quant *q, const char *name, GLboolean is_vert, GLuint addr) +{ + const GLuint n = self->binding_count; + const GLuint slot_span = + slang_export_data_quant_components (q) * slang_export_data_quant_elements (q); + GLuint i; + + for (i = 0; i < n; i++) + if (slang_string_compare (self->bindings[i].name, name) == 0) + { + /* TODO: data quantities must match, or else link fails */ + update_varying_slots (&self->slots[self->bindings[i].first_slot_index], slot_span, + is_vert, addr, 1); + return GL_TRUE; + } + + if (self->slot_count + slot_span > MAX_VARYING_FLOATS) + { + /* TODO: info log: error: MAX_VARYING_FLOATS exceeded */ + return GL_FALSE; + } + + self->bindings[n].quant = q; + self->bindings[n].name = slang_string_duplicate (name); + if (self->bindings[n].name == NULL) + return GL_FALSE; + self->bindings[n].first_slot_index = self->slot_count; + self->binding_count++; + + update_varying_slots (&self->slots[self->bindings[n].first_slot_index], slot_span, is_vert, + addr, 1); + update_varying_slots (&self->slots[self->bindings[n].first_slot_index], slot_span, !is_vert, + ~0, 0); + self->slot_count += slot_span; + + return GL_TRUE; +} + +static GLboolean gather_varying_bindings (slang_varying_bindings *self, + slang_export_data_table *tbl, GLboolean is_vert) +{ + GLuint i; + + for (i = 0; i < tbl->count; i++) + if (tbl->entries[i].access == slang_exp_varying && + !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) + { + if (!add_varying_binding (self, &tbl->entries[i].quant, slang_atom_pool_id (tbl->atoms, + tbl->entries[i].quant.name), is_vert, tbl->entries[i].address)) + return GL_FALSE; + } + + return GL_TRUE; +} + +/* + * slang_texture_bindings + */ + +GLvoid slang_texture_usages_ctr (slang_texture_usages *self) +{ + self->table = NULL; + self->count = 0; +} + +GLvoid slang_texture_usages_dtr (slang_texture_usages *self) +{ + slang_alloc_free (self->table); +} + +/* + * slang_program + */ + +GLvoid slang_program_ctr (slang_program *self) +{ + GLuint i; + + slang_active_variables_ctr (&self->active_uniforms); + slang_active_variables_ctr (&self->active_attribs); + slang_attrib_overrides_ctr (&self->attrib_overrides); + slang_uniform_bindings_ctr (&self->uniforms); + slang_attrib_bindings_ctr (&self->attribs); + slang_varying_bindings_ctr (&self->varyings); + slang_texture_usages_ctr (&self->texture_usage); + for (i = 0; i < SLANG_SHADER_MAX; i++) + { + GLuint j; + + for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++) + self->common_fixed_entries[i][j] = ~0; + for (j = 0; j < SLANG_COMMON_CODE_MAX; j++) + self->code[i][j] = ~0; + self->machines[i] = NULL; + self->assemblies[i] = NULL; + } + for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++) + self->vertex_fixed_entries[i] = ~0; + for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++) + self->fragment_fixed_entries[i] = ~0; +} + +GLvoid slang_program_dtr (slang_program *self) +{ + slang_active_variables_dtr (&self->active_uniforms); + slang_active_variables_dtr (&self->active_attribs); + slang_attrib_overrides_dtr (&self->attrib_overrides); + slang_uniform_bindings_dtr (&self->uniforms); + slang_attrib_bindings_dtr (&self->attribs); + slang_varying_bindings_dtr (&self->varyings); + slang_texture_usages_dtr (&self->texture_usage); +} + +static GLvoid slang_program_rst (slang_program *self) +{ + GLuint i; + + slang_active_variables_dtr (&self->active_uniforms); + slang_active_variables_dtr (&self->active_attribs); + slang_uniform_bindings_dtr (&self->uniforms); + slang_attrib_bindings_dtr (&self->attribs); + slang_varying_bindings_dtr (&self->varyings); + slang_texture_usages_dtr (&self->texture_usage); + + slang_active_variables_ctr (&self->active_uniforms); + slang_active_variables_ctr (&self->active_attribs); + slang_uniform_bindings_ctr (&self->uniforms); + slang_attrib_bindings_ctr (&self->attribs); + slang_varying_bindings_ctr (&self->varyings); + slang_texture_usages_ctr (&self->texture_usage); + for (i = 0; i < SLANG_SHADER_MAX; i++) + { + GLuint j; + + for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++) + self->common_fixed_entries[i][j] = ~0; + for (j = 0; j < SLANG_COMMON_CODE_MAX; j++) + self->code[i][j] = ~0; + } + for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++) + self->vertex_fixed_entries[i] = ~0; + for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++) + self->fragment_fixed_entries[i] = ~0; +} + +/* + * _slang_link() + */ + +static GLuint gd (slang_export_data_table *tbl, const char *name) +{ + slang_atom atom; + GLuint i; + + atom = slang_atom_pool_atom (tbl->atoms, name); + if (atom == SLANG_ATOM_NULL) + return ~0; + + for (i = 0; i < tbl->count; i++) + if (atom == tbl->entries[i].quant.name) + return tbl->entries[i].address; + return ~0; +} + +static GLvoid resolve_common_fixed (GLuint e[], slang_export_data_table *tbl) +{ + e[SLANG_COMMON_FIXED_MODELVIEWMATRIX] = gd (tbl, "gl_ModelViewMatrix"); + e[SLANG_COMMON_FIXED_PROJECTIONMATRIX] = gd (tbl, "gl_ProjectionMatrix"); + e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIX] = gd (tbl, "gl_ModelViewProjectionMatrix"); + e[SLANG_COMMON_FIXED_TEXTUREMATRIX] = gd (tbl, "gl_TextureMatrix"); + e[SLANG_COMMON_FIXED_NORMALMATRIX] = gd (tbl, "gl_NormalMatrix"); + e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSE] = gd (tbl, "gl_ModelViewMatrixInverse"); + e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSE] = gd (tbl, "gl_ProjectionMatrixInverse"); + e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSE] = + gd (tbl, "gl_ModelViewProjectionMatrixInverse"); + e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSE] = gd (tbl, "gl_TextureMatrixInverse"); + e[SLANG_COMMON_FIXED_MODELVIEWMATRIXTRANSPOSE] = gd (tbl, "gl_ModelViewMatrixTranspose"); + e[SLANG_COMMON_FIXED_PROJECTIONMATRIXTRANSPOSE] = gd (tbl, "gl_ProjectionMatrixTranspose"); + e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXTRANSPOSE] = + gd (tbl, "gl_ModelViewProjectionMatrixTranspose"); + e[SLANG_COMMON_FIXED_TEXTUREMATRIXTRANSPOSE] = gd (tbl, "gl_TextureMatrixTranspose"); + e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSETRANSPOSE] = + gd (tbl, "gl_ModelViewMatrixInverseTranspose"); + e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSETRANSPOSE] = + gd (tbl, "gl_ProjectionMatrixInverseTranspose"); + e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSETRANSPOSE] = + gd (tbl, "gl_ModelViewProjectionMatrixInverseTranspose"); + e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSETRANSPOSE] = + gd (tbl, "gl_TextureMatrixInverseTranspose"); + e[SLANG_COMMON_FIXED_NORMALSCALE] = gd (tbl, "gl_NormalScale"); + e[SLANG_COMMON_FIXED_DEPTHRANGE] = gd (tbl, "gl_DepthRange"); + e[SLANG_COMMON_FIXED_CLIPPLANE] = gd (tbl, "gl_ClipPlane"); + e[SLANG_COMMON_FIXED_POINT] = gd (tbl, "gl_Point"); + e[SLANG_COMMON_FIXED_FRONTMATERIAL] = gd (tbl, "gl_FrontMaterial"); + e[SLANG_COMMON_FIXED_BACKMATERIAL] = gd (tbl, "gl_BackMaterial"); + e[SLANG_COMMON_FIXED_LIGHTSOURCE] = gd (tbl, "gl_LightSource"); + e[SLANG_COMMON_FIXED_LIGHTMODEL] = gd (tbl, "gl_LightModel"); + e[SLANG_COMMON_FIXED_FRONTLIGHTMODELPRODUCT] = gd (tbl, "gl_FrontLightModelProduct"); + e[SLANG_COMMON_FIXED_BACKLIGHTMODELPRODUCT] = gd (tbl, "gl_BackLightModelProduct"); + e[SLANG_COMMON_FIXED_FRONTLIGHTPRODUCT] = gd (tbl, "gl_FrontLightProduct"); + e[SLANG_COMMON_FIXED_BACKLIGHTPRODUCT] = gd (tbl, "gl_BackLightProduct"); + e[SLANG_COMMON_FIXED_TEXTUREENVCOLOR] = gd (tbl, "gl_TextureEnvColor"); + e[SLANG_COMMON_FIXED_EYEPLANES] = gd (tbl, "gl_EyePlaneS"); + e[SLANG_COMMON_FIXED_EYEPLANET] = gd (tbl, "gl_EyePlaneT"); + e[SLANG_COMMON_FIXED_EYEPLANER] = gd (tbl, "gl_EyePlaneR"); + e[SLANG_COMMON_FIXED_EYEPLANEQ] = gd (tbl, "gl_EyePlaneQ"); + e[SLANG_COMMON_FIXED_OBJECTPLANES] = gd (tbl, "gl_ObjectPlaneS"); + e[SLANG_COMMON_FIXED_OBJECTPLANET] = gd (tbl, "gl_ObjectPlaneT"); + e[SLANG_COMMON_FIXED_OBJECTPLANER] = gd (tbl, "gl_ObjectPlaneR"); + e[SLANG_COMMON_FIXED_OBJECTPLANEQ] = gd (tbl, "gl_ObjectPlaneQ"); + e[SLANG_COMMON_FIXED_FOG] = gd (tbl, "gl_Fog"); +} + +static GLvoid resolve_vertex_fixed (GLuint e[], slang_export_data_table *tbl) +{ + e[SLANG_VERTEX_FIXED_POSITION] = gd (tbl, "gl_Position"); + e[SLANG_VERTEX_FIXED_POINTSIZE] = gd (tbl, "gl_PointSize"); + e[SLANG_VERTEX_FIXED_CLIPVERTEX] = gd (tbl, "gl_ClipVertex"); + e[SLANG_VERTEX_FIXED_COLOR] = gd (tbl, "gl_Color"); + e[SLANG_VERTEX_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor"); + e[SLANG_VERTEX_FIXED_NORMAL] = gd (tbl, "gl_Normal"); + e[SLANG_VERTEX_FIXED_VERTEX] = gd (tbl, "gl_Vertex"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD0] = gd (tbl, "gl_MultiTexCoord0"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD1] = gd (tbl, "gl_MultiTexCoord1"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD2] = gd (tbl, "gl_MultiTexCoord2"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD3] = gd (tbl, "gl_MultiTexCoord3"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD4] = gd (tbl, "gl_MultiTexCoord4"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD5] = gd (tbl, "gl_MultiTexCoord5"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD6] = gd (tbl, "gl_MultiTexCoord6"); + e[SLANG_VERTEX_FIXED_MULTITEXCOORD7] = gd (tbl, "gl_MultiTexCoord7"); + e[SLANG_VERTEX_FIXED_FOGCOORD] = gd (tbl, "gl_FogCoord"); + e[SLANG_VERTEX_FIXED_FRONTCOLOR] = gd (tbl, "gl_FrontColor"); + e[SLANG_VERTEX_FIXED_BACKCOLOR] = gd (tbl, "gl_BackColor"); + e[SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR] = gd (tbl, "gl_FrontSecondaryColor"); + e[SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR] = gd (tbl, "gl_BackSecondaryColor"); + e[SLANG_VERTEX_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord"); + e[SLANG_VERTEX_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord"); +} + +static GLvoid resolve_fragment_fixed (GLuint e[], slang_export_data_table *tbl) +{ + e[SLANG_FRAGMENT_FIXED_FRAGCOORD] = gd (tbl, "gl_FragCoord"); + e[SLANG_FRAGMENT_FIXED_FRONTFACING] = gd (tbl, "gl_FrontFacing"); + e[SLANG_FRAGMENT_FIXED_FRAGCOLOR] = gd (tbl, "gl_FragColor"); + e[SLANG_FRAGMENT_FIXED_FRAGDATA] = gd (tbl, "gl_FragData"); + e[SLANG_FRAGMENT_FIXED_FRAGDEPTH] = gd (tbl, "gl_FragDepth"); + e[SLANG_FRAGMENT_FIXED_COLOR] = gd (tbl, "gl_Color"); + e[SLANG_FRAGMENT_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor"); + e[SLANG_FRAGMENT_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord"); + e[SLANG_FRAGMENT_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord"); +} + +static GLuint gc (slang_export_code_table *tbl, const char *name) +{ + slang_atom atom; + GLuint i; + + atom = slang_atom_pool_atom (tbl->atoms, name); + if (atom == SLANG_ATOM_NULL) + return ~0; + + for (i = 0; i < tbl->count; i++) + if (atom == tbl->entries[i].name) + return tbl->entries[i].address; + return ~0; +} + +static GLvoid resolve_common_code (GLuint code[], slang_export_code_table *tbl) +{ + code[SLANG_COMMON_CODE_MAIN] = gc (tbl, "@main"); +} + +GLboolean _slang_link (slang_program *prog, slang_translation_unit **units, GLuint count) +{ + GLuint i; + + slang_program_rst (prog); + + for (i = 0; i < count; i++) + { + GLuint index; + + if (units[i]->type == slang_unit_fragment_shader) + { + index = SLANG_SHADER_FRAGMENT; + resolve_fragment_fixed (prog->fragment_fixed_entries, &units[i]->exp_data); + } + else + { + index = SLANG_SHADER_VERTEX; + resolve_vertex_fixed (prog->vertex_fixed_entries, &units[i]->exp_data); + if (!gather_attrib_bindings (&prog->attribs, &units[i]->exp_data, + &prog->attrib_overrides)) + return GL_FALSE; + } + + if (!gather_active_variables (&prog->active_uniforms, &units[i]->exp_data, + slang_exp_uniform)) + return GL_FALSE; + if (!gather_active_variables (&prog->active_attribs, &units[i]->exp_data, + slang_exp_attribute)) + return GL_FALSE; + if (!gather_uniform_bindings (&prog->uniforms, &units[i]->exp_data, index)) + return GL_FALSE; + if (!gather_varying_bindings (&prog->varyings, &units[i]->exp_data, + index == SLANG_SHADER_VERTEX)) + return GL_FALSE; + resolve_common_fixed (prog->common_fixed_entries[index], &units[i]->exp_data); + resolve_common_code (prog->code[index], &units[i]->exp_code); + prog->machines[index] = units[i]->machine; + prog->assemblies[index] = units[i]->assembly; + } + + /* TODO: all varyings read by fragment shader must be written by vertex shader */ + + if (!_slang_analyse_texture_usage (prog)) + return GL_FALSE; + + return GL_TRUE; +} + diff --git a/src/mesa/shader/slang/slang_link.h b/src/mesa/shader/slang/slang_link.h index 6f63a9d31d..c569130086 100644 --- a/src/mesa/shader/slang/slang_link.h +++ b/src/mesa/shader/slang/slang_link.h @@ -1,313 +1,313 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5 - * - * Copyright (C) 2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#if !defined SLANG_LINK_H -#define SLANG_LINK_H - -#include "slang_compile.h" - -#if defined __cplusplus -extern "C" { -#endif - -enum -{ - SLANG_SHADER_VERTEX, - SLANG_SHADER_FRAGMENT, - SLANG_SHADER_MAX -}; - -/* Active variables. - * - * Active uniforms or attribs can be queried by the application to get a list of uniforms - * or attribs actually used by shaders (uniforms) or vertex shader (attribs). - */ - -typedef struct -{ - slang_export_data_quant *quant; - char *name; -} slang_active_variable; - -typedef struct -{ - slang_active_variable *table; - GLuint count; -} slang_active_variables; - -/* - * Attrib binding override. - * - * The application can override GL attrib binding by specifying its preferred index assignment - * for a given attrib name. Those overrides are taken into account while linking the program. - */ - -typedef struct -{ - GLuint index; - GLchar *name; -} slang_attrib_override; - -typedef struct -{ - slang_attrib_override *table; - GLuint count; -} slang_attrib_overrides; - -GLboolean slang_attrib_overrides_add (slang_attrib_overrides *, GLuint, const GLchar *); - -/* - * Uniform bindings. - * - * Each slang_uniform_binding holds an array of addresses to actual memory locations in those - * shader types that use that uniform. Uniform bindings are held in an array and accessed - * by array index which is seen to the application as a uniform location. - * - * When the application writes to a particular uniform, it specifies its location. - * This location is treated as an array index to slang_uniform_bindings::table and tested - * against slang_uniform_bindings::count limit. The result is a pointer to slang_uniform_binding. - * The type of data being written to uniform is tested against slang_uniform_binding::quant. - * If the types are compatible, the array slang_uniform_binding::address is iterated for - * each shader type and if the address is valid (i.e. the uniform is used by this shader type), - * the new uniform value is written at that address. - */ - -typedef struct -{ - slang_export_data_quant *quant; - char *name; - GLuint address[SLANG_SHADER_MAX]; -} slang_uniform_binding; - -typedef struct -{ - slang_uniform_binding *table; - GLuint count; -} slang_uniform_bindings; - -/* - * Attrib bindings. - * - * There is a fixed number of vertex attrib vectors (attrib slots). The slang_attrib_slot::addr - * maps vertex attrib index to the actual memory location of the attrib in vertex shader. - * One vertex attrib can span over many attrib slots (this is the case for matrices). The - * slang_attrib_binding::first_slot_index holds the first slot index that the attrib is bound to. - */ - -typedef struct -{ - slang_export_data_quant *quant; - char *name; - GLuint first_slot_index; -} slang_attrib_binding; - -typedef struct -{ - GLuint addr; -} slang_attrib_slot; - -typedef struct -{ - slang_attrib_binding bindings[MAX_VERTEX_ATTRIBS]; - GLuint binding_count; - slang_attrib_slot slots[MAX_VERTEX_ATTRIBS]; -} slang_attrib_bindings; - -/* - * Varying bindings. - * - * There is a fixed number of varying floats (varying slots). The slang_varying_slot::vert_addr - * maps varying float index to the actual memory location of the output variable in vertex shader. - * The slang_varying_slot::frag_addr maps varying float index to the actual memory location of - * the input variable in fragment shader. - */ - -typedef struct -{ - GLuint vert_addr; - GLuint frag_addr; -} slang_varying_slot; - -typedef struct -{ - slang_export_data_quant *quant; - char *name; - GLuint first_slot_index; -} slang_varying_binding; - -typedef struct -{ - slang_varying_binding bindings[MAX_VARYING_FLOATS]; - GLuint binding_count; - slang_varying_slot slots[MAX_VARYING_FLOATS]; - GLuint slot_count; -} slang_varying_bindings; - -/* - * Texture usage. - * - * A slang_texture_usage struct holds indirect information about texture image unit usage. The - * slang_texture_usages::table is derived from active uniform table by extracting only uniforms - * that are samplers. - * - * To collect current texture usage one must iterate the slang_texture_usages::table and read - * uniform at address slang_texture_usage::frag_address to get texture unit index. This - * index, coupled with texture access type (target) taken from slang_texture_usage::quant - * forms texture usage for that texture unit. - */ - -typedef struct -{ - slang_export_data_quant *quant; - GLuint frag_address; -} slang_texture_usage; - -typedef struct -{ - slang_texture_usage *table; - GLuint count; -} slang_texture_usages; - -GLvoid slang_texture_usages_ctr (slang_texture_usages *); -GLvoid slang_texture_usages_dtr (slang_texture_usages *); - -enum -{ - SLANG_COMMON_FIXED_MODELVIEWMATRIX, - SLANG_COMMON_FIXED_PROJECTIONMATRIX, - SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIX, - SLANG_COMMON_FIXED_TEXTUREMATRIX, - SLANG_COMMON_FIXED_NORMALMATRIX, - SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSE, - SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSE, - SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSE, - SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSE, - SLANG_COMMON_FIXED_MODELVIEWMATRIXTRANSPOSE, - SLANG_COMMON_FIXED_PROJECTIONMATRIXTRANSPOSE, - SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXTRANSPOSE, - SLANG_COMMON_FIXED_TEXTUREMATRIXTRANSPOSE, - SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSETRANSPOSE, - SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSETRANSPOSE, - SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSETRANSPOSE, - SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSETRANSPOSE, - SLANG_COMMON_FIXED_NORMALSCALE, - SLANG_COMMON_FIXED_DEPTHRANGE, - SLANG_COMMON_FIXED_CLIPPLANE, - SLANG_COMMON_FIXED_POINT, - SLANG_COMMON_FIXED_FRONTMATERIAL, - SLANG_COMMON_FIXED_BACKMATERIAL, - SLANG_COMMON_FIXED_LIGHTSOURCE, - SLANG_COMMON_FIXED_LIGHTMODEL, - SLANG_COMMON_FIXED_FRONTLIGHTMODELPRODUCT, - SLANG_COMMON_FIXED_BACKLIGHTMODELPRODUCT, - SLANG_COMMON_FIXED_FRONTLIGHTPRODUCT, - SLANG_COMMON_FIXED_BACKLIGHTPRODUCT, - SLANG_COMMON_FIXED_TEXTUREENVCOLOR, - SLANG_COMMON_FIXED_EYEPLANES, - SLANG_COMMON_FIXED_EYEPLANET, - SLANG_COMMON_FIXED_EYEPLANER, - SLANG_COMMON_FIXED_EYEPLANEQ, - SLANG_COMMON_FIXED_OBJECTPLANES, - SLANG_COMMON_FIXED_OBJECTPLANET, - SLANG_COMMON_FIXED_OBJECTPLANER, - SLANG_COMMON_FIXED_OBJECTPLANEQ, - SLANG_COMMON_FIXED_FOG, - SLANG_COMMON_FIXED_MAX -}; - -enum -{ - SLANG_VERTEX_FIXED_POSITION, - SLANG_VERTEX_FIXED_POINTSIZE, - SLANG_VERTEX_FIXED_CLIPVERTEX, - SLANG_VERTEX_FIXED_COLOR, - SLANG_VERTEX_FIXED_SECONDARYCOLOR, - SLANG_VERTEX_FIXED_NORMAL, - SLANG_VERTEX_FIXED_VERTEX, - SLANG_VERTEX_FIXED_MULTITEXCOORD0, - SLANG_VERTEX_FIXED_MULTITEXCOORD1, - SLANG_VERTEX_FIXED_MULTITEXCOORD2, - SLANG_VERTEX_FIXED_MULTITEXCOORD3, - SLANG_VERTEX_FIXED_MULTITEXCOORD4, - SLANG_VERTEX_FIXED_MULTITEXCOORD5, - SLANG_VERTEX_FIXED_MULTITEXCOORD6, - SLANG_VERTEX_FIXED_MULTITEXCOORD7, - SLANG_VERTEX_FIXED_FOGCOORD, - SLANG_VERTEX_FIXED_FRONTCOLOR, - SLANG_VERTEX_FIXED_BACKCOLOR, - SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR, - SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR, - SLANG_VERTEX_FIXED_TEXCOORD, - SLANG_VERTEX_FIXED_FOGFRAGCOORD, - SLANG_VERTEX_FIXED_MAX -}; - -enum -{ - SLANG_FRAGMENT_FIXED_FRAGCOORD, - SLANG_FRAGMENT_FIXED_FRONTFACING, - SLANG_FRAGMENT_FIXED_FRAGCOLOR, - SLANG_FRAGMENT_FIXED_FRAGDATA, - SLANG_FRAGMENT_FIXED_FRAGDEPTH, - SLANG_FRAGMENT_FIXED_COLOR, - SLANG_FRAGMENT_FIXED_SECONDARYCOLOR, - SLANG_FRAGMENT_FIXED_TEXCOORD, - SLANG_FRAGMENT_FIXED_FOGFRAGCOORD, - SLANG_FRAGMENT_FIXED_MAX -}; - -enum -{ - SLANG_COMMON_CODE_MAIN, - SLANG_COMMON_CODE_MAX -}; - -typedef struct -{ - slang_active_variables active_uniforms; - slang_active_variables active_attribs; - slang_attrib_overrides attrib_overrides; - slang_uniform_bindings uniforms; - slang_attrib_bindings attribs; - slang_varying_bindings varyings; - slang_texture_usages texture_usage; - GLuint common_fixed_entries[SLANG_SHADER_MAX][SLANG_COMMON_FIXED_MAX]; - GLuint vertex_fixed_entries[SLANG_VERTEX_FIXED_MAX]; - GLuint fragment_fixed_entries[SLANG_FRAGMENT_FIXED_MAX]; - GLuint code[SLANG_SHADER_MAX][SLANG_COMMON_CODE_MAX]; - slang_machine *machines[SLANG_SHADER_MAX]; - slang_assembly_file *assemblies[SLANG_SHADER_MAX]; -} slang_program; - -GLvoid slang_program_ctr (slang_program *); -GLvoid slang_program_dtr (slang_program *); - -GLboolean _slang_link (slang_program *, slang_translation_unit **, GLuint); - -#ifdef __cplusplus -} -#endif - -#endif - +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 2006 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#if !defined SLANG_LINK_H +#define SLANG_LINK_H + +#include "slang_compile.h" + +#if defined __cplusplus +extern "C" { +#endif + +enum +{ + SLANG_SHADER_VERTEX, + SLANG_SHADER_FRAGMENT, + SLANG_SHADER_MAX +}; + +/* Active variables. + * + * Active uniforms or attribs can be queried by the application to get a list of uniforms + * or attribs actually used by shaders (uniforms) or vertex shader (attribs). + */ + +typedef struct +{ + slang_export_data_quant *quant; + char *name; +} slang_active_variable; + +typedef struct +{ + slang_active_variable *table; + GLuint count; +} slang_active_variables; + +/* + * Attrib binding override. + * + * The application can override GL attrib binding by specifying its preferred index assignment + * for a given attrib name. Those overrides are taken into account while linking the program. + */ + +typedef struct +{ + GLuint index; + GLchar *name; +} slang_attrib_override; + +typedef struct +{ + slang_attrib_override *table; + GLuint count; +} slang_attrib_overrides; + +GLboolean slang_attrib_overrides_add (slang_attrib_overrides *, GLuint, const GLchar *); + +/* + * Uniform bindings. + * + * Each slang_uniform_binding holds an array of addresses to actual memory locations in those + * shader types that use that uniform. Uniform bindings are held in an array and accessed + * by array index which is seen to the application as a uniform location. + * + * When the application writes to a particular uniform, it specifies its location. + * This location is treated as an array index to slang_uniform_bindings::table and tested + * against slang_uniform_bindings::count limit. The result is a pointer to slang_uniform_binding. + * The type of data being written to uniform is tested against slang_uniform_binding::quant. + * If the types are compatible, the array slang_uniform_binding::address is iterated for + * each shader type and if the address is valid (i.e. the uniform is used by this shader type), + * the new uniform value is written at that address. + */ + +typedef struct +{ + slang_export_data_quant *quant; + char *name; + GLuint address[SLANG_SHADER_MAX]; +} slang_uniform_binding; + +typedef struct +{ + slang_uniform_binding *table; + GLuint count; +} slang_uniform_bindings; + +/* + * Attrib bindings. + * + * There is a fixed number of vertex attrib vectors (attrib slots). The slang_attrib_slot::addr + * maps vertex attrib index to the actual memory location of the attrib in vertex shader. + * One vertex attrib can span over many attrib slots (this is the case for matrices). The + * slang_attrib_binding::first_slot_index holds the first slot index that the attrib is bound to. + */ + +typedef struct +{ + slang_export_data_quant *quant; + char *name; + GLuint first_slot_index; +} slang_attrib_binding; + +typedef struct +{ + GLuint addr; +} slang_attrib_slot; + +typedef struct +{ + slang_attrib_binding bindings[MAX_VERTEX_ATTRIBS]; + GLuint binding_count; + slang_attrib_slot slots[MAX_VERTEX_ATTRIBS]; +} slang_attrib_bindings; + +/* + * Varying bindings. + * + * There is a fixed number of varying floats (varying slots). The slang_varying_slot::vert_addr + * maps varying float index to the actual memory location of the output variable in vertex shader. + * The slang_varying_slot::frag_addr maps varying float index to the actual memory location of + * the input variable in fragment shader. + */ + +typedef struct +{ + GLuint vert_addr; + GLuint frag_addr; +} slang_varying_slot; + +typedef struct +{ + slang_export_data_quant *quant; + char *name; + GLuint first_slot_index; +} slang_varying_binding; + +typedef struct +{ + slang_varying_binding bindings[MAX_VARYING_FLOATS]; + GLuint binding_count; + slang_varying_slot slots[MAX_VARYING_FLOATS]; + GLuint slot_count; +} slang_varying_bindings; + +/* + * Texture usage. + * + * A slang_texture_usage struct holds indirect information about texture image unit usage. The + * slang_texture_usages::table is derived from active uniform table by extracting only uniforms + * that are samplers. + * + * To collect current texture usage one must iterate the slang_texture_usages::table and read + * uniform at address slang_texture_usage::frag_address to get texture unit index. This + * index, coupled with texture access type (target) taken from slang_texture_usage::quant + * forms texture usage for that texture unit. + */ + +typedef struct +{ + slang_export_data_quant *quant; + GLuint frag_address; +} slang_texture_usage; + +typedef struct +{ + slang_texture_usage *table; + GLuint count; +} slang_texture_usages; + +GLvoid slang_texture_usages_ctr (slang_texture_usages *); +GLvoid slang_texture_usages_dtr (slang_texture_usages *); + +enum +{ + SLANG_COMMON_FIXED_MODELVIEWMATRIX, + SLANG_COMMON_FIXED_PROJECTIONMATRIX, + SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIX, + SLANG_COMMON_FIXED_TEXTUREMATRIX, + SLANG_COMMON_FIXED_NORMALMATRIX, + SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSE, + SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSE, + SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSE, + SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSE, + SLANG_COMMON_FIXED_MODELVIEWMATRIXTRANSPOSE, + SLANG_COMMON_FIXED_PROJECTIONMATRIXTRANSPOSE, + SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXTRANSPOSE, + SLANG_COMMON_FIXED_TEXTUREMATRIXTRANSPOSE, + SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSETRANSPOSE, + SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSETRANSPOSE, + SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSETRANSPOSE, + SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSETRANSPOSE, + SLANG_COMMON_FIXED_NORMALSCALE, + SLANG_COMMON_FIXED_DEPTHRANGE, + SLANG_COMMON_FIXED_CLIPPLANE, + SLANG_COMMON_FIXED_POINT, + SLANG_COMMON_FIXED_FRONTMATERIAL, + SLANG_COMMON_FIXED_BACKMATERIAL, + SLANG_COMMON_FIXED_LIGHTSOURCE, + SLANG_COMMON_FIXED_LIGHTMODEL, + SLANG_COMMON_FIXED_FRONTLIGHTMODELPRODUCT, + SLANG_COMMON_FIXED_BACKLIGHTMODELPRODUCT, + SLANG_COMMON_FIXED_FRONTLIGHTPRODUCT, + SLANG_COMMON_FIXED_BACKLIGHTPRODUCT, + SLANG_COMMON_FIXED_TEXTUREENVCOLOR, + SLANG_COMMON_FIXED_EYEPLANES, + SLANG_COMMON_FIXED_EYEPLANET, + SLANG_COMMON_FIXED_EYEPLANER, + SLANG_COMMON_FIXED_EYEPLANEQ, + SLANG_COMMON_FIXED_OBJECTPLANES, + SLANG_COMMON_FIXED_OBJECTPLANET, + SLANG_COMMON_FIXED_OBJECTPLANER, + SLANG_COMMON_FIXED_OBJECTPLANEQ, + SLANG_COMMON_FIXED_FOG, + SLANG_COMMON_FIXED_MAX +}; + +enum +{ + SLANG_VERTEX_FIXED_POSITION, + SLANG_VERTEX_FIXED_POINTSIZE, + SLANG_VERTEX_FIXED_CLIPVERTEX, + SLANG_VERTEX_FIXED_COLOR, + SLANG_VERTEX_FIXED_SECONDARYCOLOR, + SLANG_VERTEX_FIXED_NORMAL, + SLANG_VERTEX_FIXED_VERTEX, + SLANG_VERTEX_FIXED_MULTITEXCOORD0, + SLANG_VERTEX_FIXED_MULTITEXCOORD1, + SLANG_VERTEX_FIXED_MULTITEXCOORD2, + SLANG_VERTEX_FIXED_MULTITEXCOORD3, + SLANG_VERTEX_FIXED_MULTITEXCOORD4, + SLANG_VERTEX_FIXED_MULTITEXCOORD5, + SLANG_VERTEX_FIXED_MULTITEXCOORD6, + SLANG_VERTEX_FIXED_MULTITEXCOORD7, + SLANG_VERTEX_FIXED_FOGCOORD, + SLANG_VERTEX_FIXED_FRONTCOLOR, + SLANG_VERTEX_FIXED_BACKCOLOR, + SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR, + SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR, + SLANG_VERTEX_FIXED_TEXCOORD, + SLANG_VERTEX_FIXED_FOGFRAGCOORD, + SLANG_VERTEX_FIXED_MAX +}; + +enum +{ + SLANG_FRAGMENT_FIXED_FRAGCOORD, + SLANG_FRAGMENT_FIXED_FRONTFACING, + SLANG_FRAGMENT_FIXED_FRAGCOLOR, + SLANG_FRAGMENT_FIXED_FRAGDATA, + SLANG_FRAGMENT_FIXED_FRAGDEPTH, + SLANG_FRAGMENT_FIXED_COLOR, + SLANG_FRAGMENT_FIXED_SECONDARYCOLOR, + SLANG_FRAGMENT_FIXED_TEXCOORD, + SLANG_FRAGMENT_FIXED_FOGFRAGCOORD, + SLANG_FRAGMENT_FIXED_MAX +}; + +enum +{ + SLANG_COMMON_CODE_MAIN, + SLANG_COMMON_CODE_MAX +}; + +typedef struct +{ + slang_active_variables active_uniforms; + slang_active_variables active_attribs; + slang_attrib_overrides attrib_overrides; + slang_uniform_bindings uniforms; + slang_attrib_bindings attribs; + slang_varying_bindings varyings; + slang_texture_usages texture_usage; + GLuint common_fixed_entries[SLANG_SHADER_MAX][SLANG_COMMON_FIXED_MAX]; + GLuint vertex_fixed_entries[SLANG_VERTEX_FIXED_MAX]; + GLuint fragment_fixed_entries[SLANG_FRAGMENT_FIXED_MAX]; + GLuint code[SLANG_SHADER_MAX][SLANG_COMMON_CODE_MAX]; + slang_machine *machines[SLANG_SHADER_MAX]; + slang_assembly_file *assemblies[SLANG_SHADER_MAX]; +} slang_program; + +GLvoid slang_program_ctr (slang_program *); +GLvoid slang_program_dtr (slang_program *); + +GLboolean _slang_link (slang_program *, slang_translation_unit **, GLuint); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/mesa/swrast/s_arbshader.h b/src/mesa/swrast/s_arbshader.h index 7a99ad725e..7cce6f8362 100644 --- a/src/mesa/swrast/s_arbshader.h +++ b/src/mesa/swrast/s_arbshader.h @@ -1,34 +1,34 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5 - * - * Copyright (C) 2006 David Airlie All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * DAVID AIRLIE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - - -#ifndef S_ARBSHADER_H -#define S_ARBSHADER_H - -#include "s_context.h" - -extern void _swrast_exec_arbshader (GLcontext *ctx, struct sw_span *span); - -#endif - +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 2006 David Airlie All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * DAVID AIRLIE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef S_ARBSHADER_H +#define S_ARBSHADER_H + +#include "s_context.h" + +extern void _swrast_exec_arbshader (GLcontext *ctx, struct sw_span *span); + +#endif + diff --git a/src/mesa/swrast/s_triangle.c b/src/mesa/swrast/s_triangle.c index 93df57d77c..f270372345 100644 --- a/src/mesa/swrast/s_triangle.c +++ b/src/mesa/swrast/s_triangle.c @@ -892,7 +892,7 @@ fast_persp_span(GLcontext *ctx, struct sw_span *span, #define INTERP_RGB 1 #define INTERP_ALPHA 1 #define INTERP_SPEC 1 -#define INTERP_MULTITEX 1 +#define INTERP_MULTITEX 1 #define INTERP_VARYING 1 #define RENDER_SPAN( span ) _swrast_write_rgba_span(ctx, &span); #include "s_tritemp.h" @@ -1072,7 +1072,7 @@ _swrast_choose_triangle( GLcontext *ctx ) } } - if (ctx->Texture._EnabledCoordUnits || ctx->FragmentProgram._Active || + if (ctx->Texture._EnabledCoordUnits || ctx->FragmentProgram._Active || ctx->ATIFragmentShader._Enabled || ctx->ShaderObjects._FragmentShaderPresent) { /* Ugh, we do a _lot_ of tests to pick the best textured tri func */ const struct gl_texture_object *texObj2D; @@ -1089,7 +1089,7 @@ _swrast_choose_triangle( GLcontext *ctx ) /* First see if we can use an optimized 2-D texture function */ if (ctx->Texture._EnabledCoordUnits == 0x1 && !ctx->FragmentProgram._Active - && !ctx->ATIFragmentShader._Enabled + && !ctx->ATIFragmentShader._Enabled && !ctx->ShaderObjects._FragmentShaderPresent && ctx->Texture.Unit[0]._ReallyEnabled == TEXTURE_2D_BIT && texObj2D->WrapS == GL_REPEAT diff --git a/src/mesa/tnl/t_vb_arbshader.c b/src/mesa/tnl/t_vb_arbshader.c index d33389e514..de8330066c 100644 --- a/src/mesa/tnl/t_vb_arbshader.c +++ b/src/mesa/tnl/t_vb_arbshader.c @@ -1,285 +1,285 @@ -/* - * Mesa 3-D graphics library - * Version: 6.5 - * - * Copyright (C) 2006 Brian Paul All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: - * Michal Krol - */ - -#include "glheader.h" -#include "imports.h" -#include "macros.h" -#include "shaderobjects.h" -#include "shaderobjects_3dlabs.h" -#include "t_pipeline.h" -#include "slang_utility.h" -#include "slang_link.h" - -typedef struct -{ - GLvector4f outputs[VERT_RESULT_MAX]; - GLvector4f varyings[MAX_VARYING_VECTORS]; - GLvector4f ndc_coords; - GLubyte *clipmask; - GLubyte ormask; - GLubyte andmask; -} arbvs_stage_data; - -#define ARBVS_STAGE_DATA(stage) ((arbvs_stage_data *) stage->privatePtr) - -static GLboolean construct_arb_vertex_shader (GLcontext *ctx, struct tnl_pipeline_stage *stage) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *vb = &tnl->vb; - arbvs_stage_data *store; - GLuint size = vb->Size; - GLuint i; - - stage->privatePtr = _mesa_malloc (sizeof (arbvs_stage_data)); - store = ARBVS_STAGE_DATA(stage); - if (store == NULL) - return GL_FALSE; - - for (i = 0; i < VERT_RESULT_MAX; i++) - { - _mesa_vector4f_alloc (&store->outputs[i], 0, size, 32); - store->outputs[i].size = 4; - } - for (i = 0; i < MAX_VARYING_VECTORS; i++) - { - _mesa_vector4f_alloc (&store->varyings[i], 0, size, 32); - store->varyings[i].size = 4; - } - _mesa_vector4f_alloc (&store->ndc_coords, 0, size, 32); - store->clipmask = (GLubyte *) ALIGN_MALLOC (size, 32); - - return GL_TRUE; -} - -static void destruct_arb_vertex_shader (struct tnl_pipeline_stage *stage) -{ - arbvs_stage_data *store = ARBVS_STAGE_DATA(stage); - - if (store != NULL) - { - GLuint i; - - for (i = 0; i < VERT_RESULT_MAX; i++) - _mesa_vector4f_free (&store->outputs[i]); - for (i = 0; i < MAX_VARYING_VECTORS; i++) - _mesa_vector4f_free (&store->varyings[i]); - _mesa_vector4f_free (&store->ndc_coords); - ALIGN_FREE (store->clipmask); - - _mesa_free (store); - stage->privatePtr = NULL; - } -} - -static void validate_arb_vertex_shader (GLcontext *ctx, struct tnl_pipeline_stage *stage) -{ -} - -static GLvoid fetch_input_float (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, - struct vertex_buffer *vb) -{ - const GLubyte *ptr = (const GLubyte *) vb->AttribPtr[attr]->data; - const GLuint stride = vb->AttribPtr[attr]->stride; - const GLfloat *data = (const GLfloat *) (ptr + stride * i); - GLfloat vec[1]; - - vec[0] = data[0]; - (**pro).UpdateFixedAttribute (pro, index, vec, 0, sizeof (GLfloat), GL_TRUE); -} - -static GLvoid fetch_input_vec3 (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, - struct vertex_buffer *vb) -{ - const GLubyte *ptr = (const GLubyte *) vb->AttribPtr[attr]->data; - const GLuint stride = vb->AttribPtr[attr]->stride; - const GLfloat *data = (const GLfloat *) (ptr + stride * i); - GLfloat vec[3]; - - vec[0] = data[0]; - vec[1] = data[1]; - vec[2] = data[2]; - (**pro).UpdateFixedAttribute (pro, index, vec, 0, 3 * sizeof (GLfloat), GL_TRUE); -} - -static void fetch_input_vec4 (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, - struct vertex_buffer *vb) -{ - const GLubyte *ptr = (const GLubyte *) vb->AttribPtr[attr]->data; - const GLuint size = vb->AttribPtr[attr]->size; - const GLuint stride = vb->AttribPtr[attr]->stride; - const GLfloat *data = (const GLfloat *) (ptr + stride * i); - GLfloat vec[4]; - - switch (size) - { - case 2: - vec[0] = data[0]; - vec[1] = data[1]; - vec[2] = 0.0f; - vec[3] = 1.0f; - break; - case 3: - vec[0] = data[0]; - vec[1] = data[1]; - vec[2] = data[2]; - vec[3] = 1.0f; - break; - case 4: - vec[0] = data[0]; - vec[1] = data[1]; - vec[2] = data[2]; - vec[3] = data[3]; - break; - } - (**pro).UpdateFixedAttribute (pro, index, vec, 0, 4 * sizeof (GLfloat), GL_TRUE); -} - -static GLvoid fetch_output_float (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, - arbvs_stage_data *store) -{ - (**pro).UpdateFixedAttribute (pro, index, &store->outputs[attr].data[i], 0, sizeof (GLfloat), - GL_FALSE); -} - -static void fetch_output_vec4 (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, - GLuint offset, arbvs_stage_data *store) -{ - (**pro).UpdateFixedAttribute (pro, index, &store->outputs[attr].data[i], offset, - 4 * sizeof (GLfloat), GL_FALSE); -} - -static GLboolean run_arb_vertex_shader (GLcontext *ctx, struct tnl_pipeline_stage *stage) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *vb = &tnl->vb; - arbvs_stage_data *store = ARBVS_STAGE_DATA(stage); - struct gl2_program_intf **pro; - GLsizei i, j; - - if (!ctx->ShaderObjects._VertexShaderPresent) - return GL_TRUE; - - pro = ctx->ShaderObjects.CurrentProgram; - (**pro).UpdateFixedUniforms (pro); - - for (i = 0; i < vb->Count; i++) - { - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_VERTEX, _TNL_ATTRIB_POS, i, vb); - fetch_input_vec3 (pro, SLANG_VERTEX_FIXED_NORMAL, _TNL_ATTRIB_NORMAL, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_COLOR, _TNL_ATTRIB_COLOR0, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_SECONDARYCOLOR, _TNL_ATTRIB_COLOR1, i, vb); - fetch_input_float (pro, SLANG_VERTEX_FIXED_FOGCOORD, _TNL_ATTRIB_FOG, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD0, _TNL_ATTRIB_TEX0, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD1, _TNL_ATTRIB_TEX1, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD2, _TNL_ATTRIB_TEX2, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD3, _TNL_ATTRIB_TEX3, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD4, _TNL_ATTRIB_TEX4, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD5, _TNL_ATTRIB_TEX5, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD6, _TNL_ATTRIB_TEX6, i, vb); - fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD7, _TNL_ATTRIB_TEX7, i, vb); - - _slang_exec_vertex_shader (pro); - - fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_POSITION, VERT_RESULT_HPOS, i, 0, store); - fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_FRONTCOLOR, VERT_RESULT_COL0, i, 0, store); - fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR, VERT_RESULT_COL1, i, 0, store); - fetch_output_float (pro, SLANG_VERTEX_FIXED_FOGFRAGCOORD, VERT_RESULT_FOGC, i, store); - for (j = 0; j < 8; j++) - fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_TEXCOORD, VERT_RESULT_TEX0 + j, i, j, store); - fetch_output_float (pro, SLANG_VERTEX_FIXED_POINTSIZE, VERT_RESULT_PSIZ, i, store); - fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_BACKCOLOR, VERT_RESULT_BFC0, i, 0, store); - fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR, VERT_RESULT_BFC1, i, 0, store); - /* XXX: fetch output SLANG_VERTEX_FIXED_CLIPVERTEX */ - - for (j = 0; j < MAX_VARYING_VECTORS; j++) - { - GLuint k; - - for (k = 0; k < VARYINGS_PER_VECTOR; k++) - { - (**pro).UpdateVarying (pro, j * VARYINGS_PER_VECTOR + k, - &store->varyings[j].data[i][k], GL_TRUE); - } - } - } - - vb->ClipPtr = &store->outputs[VERT_RESULT_HPOS]; - vb->ClipPtr->count = vb->Count; - vb->ColorPtr[0] = &store->outputs[VERT_RESULT_COL0]; - vb->SecondaryColorPtr[0] = &store->outputs[VERT_RESULT_COL1]; - for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) - vb->TexCoordPtr[i] = &store->outputs[VERT_RESULT_TEX0 + i]; - vb->ColorPtr[1] = &store->outputs[VERT_RESULT_BFC0]; - vb->SecondaryColorPtr[1] = &store->outputs[VERT_RESULT_BFC1]; - vb->FogCoordPtr = &store->outputs[VERT_RESULT_FOGC]; - vb->PointSizePtr = &store->outputs[VERT_RESULT_PSIZ]; - for (i = 0; i < MAX_VARYING_VECTORS; i++) - vb->VaryingPtr[i] = &store->varyings[i]; - - vb->AttribPtr[VERT_ATTRIB_COLOR0] = vb->ColorPtr[0]; - vb->AttribPtr[VERT_ATTRIB_COLOR1] = vb->SecondaryColorPtr[0]; - vb->AttribPtr[VERT_ATTRIB_FOG] = vb->FogCoordPtr; - for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) - vb->AttribPtr[VERT_ATTRIB_TEX0 + i] = vb->TexCoordPtr[i]; - vb->AttribPtr[_TNL_ATTRIB_POINTSIZE] = &store->outputs[VERT_RESULT_PSIZ]; - for (i = 0; i < MAX_VARYING_VECTORS; i++) - vb->AttribPtr[_TNL_ATTRIB_ATTRIBUTE0 + i] = vb->VaryingPtr[i]; - - store->ormask = 0; - store->andmask = CLIP_FRUSTUM_BITS; - - if (tnl->NeedNdcCoords) - { - vb->NdcPtr = _mesa_clip_tab[vb->ClipPtr->size] (vb->ClipPtr, &store->ndc_coords, - store->clipmask, &store->ormask, &store->andmask); - } - else - { - vb->NdcPtr = NULL; - _mesa_clip_np_tab[vb->ClipPtr->size] (vb->ClipPtr, NULL, store->clipmask, &store->ormask, - &store->andmask); - } - - if (store->andmask) - return GL_FALSE; - - vb->ClipAndMask = store->andmask; - vb->ClipOrMask = store->ormask; - vb->ClipMask = store->clipmask; - - return GL_TRUE; -} - -const struct tnl_pipeline_stage _tnl_arb_vertex_shader_stage = { - "ARB_vertex_shader", - NULL, - construct_arb_vertex_shader, - destruct_arb_vertex_shader, - validate_arb_vertex_shader, - run_arb_vertex_shader -}; - +/* + * Mesa 3-D graphics library + * Version: 6.5 + * + * Copyright (C) 2006 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Michal Krol + */ + +#include "glheader.h" +#include "imports.h" +#include "macros.h" +#include "shaderobjects.h" +#include "shaderobjects_3dlabs.h" +#include "t_pipeline.h" +#include "slang_utility.h" +#include "slang_link.h" + +typedef struct +{ + GLvector4f outputs[VERT_RESULT_MAX]; + GLvector4f varyings[MAX_VARYING_VECTORS]; + GLvector4f ndc_coords; + GLubyte *clipmask; + GLubyte ormask; + GLubyte andmask; +} arbvs_stage_data; + +#define ARBVS_STAGE_DATA(stage) ((arbvs_stage_data *) stage->privatePtr) + +static GLboolean construct_arb_vertex_shader (GLcontext *ctx, struct tnl_pipeline_stage *stage) +{ + TNLcontext *tnl = TNL_CONTEXT(ctx); + struct vertex_buffer *vb = &tnl->vb; + arbvs_stage_data *store; + GLuint size = vb->Size; + GLuint i; + + stage->privatePtr = _mesa_malloc (sizeof (arbvs_stage_data)); + store = ARBVS_STAGE_DATA(stage); + if (store == NULL) + return GL_FALSE; + + for (i = 0; i < VERT_RESULT_MAX; i++) + { + _mesa_vector4f_alloc (&store->outputs[i], 0, size, 32); + store->outputs[i].size = 4; + } + for (i = 0; i < MAX_VARYING_VECTORS; i++) + { + _mesa_vector4f_alloc (&store->varyings[i], 0, size, 32); + store->varyings[i].size = 4; + } + _mesa_vector4f_alloc (&store->ndc_coords, 0, size, 32); + store->clipmask = (GLubyte *) ALIGN_MALLOC (size, 32); + + return GL_TRUE; +} + +static void destruct_arb_vertex_shader (struct tnl_pipeline_stage *stage) +{ + arbvs_stage_data *store = ARBVS_STAGE_DATA(stage); + + if (store != NULL) + { + GLuint i; + + for (i = 0; i < VERT_RESULT_MAX; i++) + _mesa_vector4f_free (&store->outputs[i]); + for (i = 0; i < MAX_VARYING_VECTORS; i++) + _mesa_vector4f_free (&store->varyings[i]); + _mesa_vector4f_free (&store->ndc_coords); + ALIGN_FREE (store->clipmask); + + _mesa_free (store); + stage->privatePtr = NULL; + } +} + +static void validate_arb_vertex_shader (GLcontext *ctx, struct tnl_pipeline_stage *stage) +{ +} + +static GLvoid fetch_input_float (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, + struct vertex_buffer *vb) +{ + const GLubyte *ptr = (const GLubyte *) vb->AttribPtr[attr]->data; + const GLuint stride = vb->AttribPtr[attr]->stride; + const GLfloat *data = (const GLfloat *) (ptr + stride * i); + GLfloat vec[1]; + + vec[0] = data[0]; + (**pro).UpdateFixedAttribute (pro, index, vec, 0, sizeof (GLfloat), GL_TRUE); +} + +static GLvoid fetch_input_vec3 (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, + struct vertex_buffer *vb) +{ + const GLubyte *ptr = (const GLubyte *) vb->AttribPtr[attr]->data; + const GLuint stride = vb->AttribPtr[attr]->stride; + const GLfloat *data = (const GLfloat *) (ptr + stride * i); + GLfloat vec[3]; + + vec[0] = data[0]; + vec[1] = data[1]; + vec[2] = data[2]; + (**pro).UpdateFixedAttribute (pro, index, vec, 0, 3 * sizeof (GLfloat), GL_TRUE); +} + +static void fetch_input_vec4 (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, + struct vertex_buffer *vb) +{ + const GLubyte *ptr = (const GLubyte *) vb->AttribPtr[attr]->data; + const GLuint size = vb->AttribPtr[attr]->size; + const GLuint stride = vb->AttribPtr[attr]->stride; + const GLfloat *data = (const GLfloat *) (ptr + stride * i); + GLfloat vec[4]; + + switch (size) + { + case 2: + vec[0] = data[0]; + vec[1] = data[1]; + vec[2] = 0.0f; + vec[3] = 1.0f; + break; + case 3: + vec[0] = data[0]; + vec[1] = data[1]; + vec[2] = data[2]; + vec[3] = 1.0f; + break; + case 4: + vec[0] = data[0]; + vec[1] = data[1]; + vec[2] = data[2]; + vec[3] = data[3]; + break; + } + (**pro).UpdateFixedAttribute (pro, index, vec, 0, 4 * sizeof (GLfloat), GL_TRUE); +} + +static GLvoid fetch_output_float (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, + arbvs_stage_data *store) +{ + (**pro).UpdateFixedAttribute (pro, index, &store->outputs[attr].data[i], 0, sizeof (GLfloat), + GL_FALSE); +} + +static void fetch_output_vec4 (struct gl2_program_intf **pro, GLuint index, GLuint attr, GLuint i, + GLuint offset, arbvs_stage_data *store) +{ + (**pro).UpdateFixedAttribute (pro, index, &store->outputs[attr].data[i], offset, + 4 * sizeof (GLfloat), GL_FALSE); +} + +static GLboolean run_arb_vertex_shader (GLcontext *ctx, struct tnl_pipeline_stage *stage) +{ + TNLcontext *tnl = TNL_CONTEXT(ctx); + struct vertex_buffer *vb = &tnl->vb; + arbvs_stage_data *store = ARBVS_STAGE_DATA(stage); + struct gl2_program_intf **pro; + GLsizei i, j; + + if (!ctx->ShaderObjects._VertexShaderPresent) + return GL_TRUE; + + pro = ctx->ShaderObjects.CurrentProgram; + (**pro).UpdateFixedUniforms (pro); + + for (i = 0; i < vb->Count; i++) + { + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_VERTEX, _TNL_ATTRIB_POS, i, vb); + fetch_input_vec3 (pro, SLANG_VERTEX_FIXED_NORMAL, _TNL_ATTRIB_NORMAL, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_COLOR, _TNL_ATTRIB_COLOR0, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_SECONDARYCOLOR, _TNL_ATTRIB_COLOR1, i, vb); + fetch_input_float (pro, SLANG_VERTEX_FIXED_FOGCOORD, _TNL_ATTRIB_FOG, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD0, _TNL_ATTRIB_TEX0, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD1, _TNL_ATTRIB_TEX1, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD2, _TNL_ATTRIB_TEX2, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD3, _TNL_ATTRIB_TEX3, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD4, _TNL_ATTRIB_TEX4, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD5, _TNL_ATTRIB_TEX5, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD6, _TNL_ATTRIB_TEX6, i, vb); + fetch_input_vec4 (pro, SLANG_VERTEX_FIXED_MULTITEXCOORD7, _TNL_ATTRIB_TEX7, i, vb); + + _slang_exec_vertex_shader (pro); + + fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_POSITION, VERT_RESULT_HPOS, i, 0, store); + fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_FRONTCOLOR, VERT_RESULT_COL0, i, 0, store); + fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR, VERT_RESULT_COL1, i, 0, store); + fetch_output_float (pro, SLANG_VERTEX_FIXED_FOGFRAGCOORD, VERT_RESULT_FOGC, i, store); + for (j = 0; j < 8; j++) + fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_TEXCOORD, VERT_RESULT_TEX0 + j, i, j, store); + fetch_output_float (pro, SLANG_VERTEX_FIXED_POINTSIZE, VERT_RESULT_PSIZ, i, store); + fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_BACKCOLOR, VERT_RESULT_BFC0, i, 0, store); + fetch_output_vec4 (pro, SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR, VERT_RESULT_BFC1, i, 0, store); + /* XXX: fetch output SLANG_VERTEX_FIXED_CLIPVERTEX */ + + for (j = 0; j < MAX_VARYING_VECTORS; j++) + { + GLuint k; + + for (k = 0; k < VARYINGS_PER_VECTOR; k++) + { + (**pro).UpdateVarying (pro, j * VARYINGS_PER_VECTOR + k, + &store->varyings[j].data[i][k], GL_TRUE); + } + } + } + + vb->ClipPtr = &store->outputs[VERT_RESULT_HPOS]; + vb->ClipPtr->count = vb->Count; + vb->ColorPtr[0] = &store->outputs[VERT_RESULT_COL0]; + vb->SecondaryColorPtr[0] = &store->outputs[VERT_RESULT_COL1]; + for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) + vb->TexCoordPtr[i] = &store->outputs[VERT_RESULT_TEX0 + i]; + vb->ColorPtr[1] = &store->outputs[VERT_RESULT_BFC0]; + vb->SecondaryColorPtr[1] = &store->outputs[VERT_RESULT_BFC1]; + vb->FogCoordPtr = &store->outputs[VERT_RESULT_FOGC]; + vb->PointSizePtr = &store->outputs[VERT_RESULT_PSIZ]; + for (i = 0; i < MAX_VARYING_VECTORS; i++) + vb->VaryingPtr[i] = &store->varyings[i]; + + vb->AttribPtr[VERT_ATTRIB_COLOR0] = vb->ColorPtr[0]; + vb->AttribPtr[VERT_ATTRIB_COLOR1] = vb->SecondaryColorPtr[0]; + vb->AttribPtr[VERT_ATTRIB_FOG] = vb->FogCoordPtr; + for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) + vb->AttribPtr[VERT_ATTRIB_TEX0 + i] = vb->TexCoordPtr[i]; + vb->AttribPtr[_TNL_ATTRIB_POINTSIZE] = &store->outputs[VERT_RESULT_PSIZ]; + for (i = 0; i < MAX_VARYING_VECTORS; i++) + vb->AttribPtr[_TNL_ATTRIB_ATTRIBUTE0 + i] = vb->VaryingPtr[i]; + + store->ormask = 0; + store->andmask = CLIP_FRUSTUM_BITS; + + if (tnl->NeedNdcCoords) + { + vb->NdcPtr = _mesa_clip_tab[vb->ClipPtr->size] (vb->ClipPtr, &store->ndc_coords, + store->clipmask, &store->ormask, &store->andmask); + } + else + { + vb->NdcPtr = NULL; + _mesa_clip_np_tab[vb->ClipPtr->size] (vb->ClipPtr, NULL, store->clipmask, &store->ormask, + &store->andmask); + } + + if (store->andmask) + return GL_FALSE; + + vb->ClipAndMask = store->andmask; + vb->ClipOrMask = store->ormask; + vb->ClipMask = store->clipmask; + + return GL_TRUE; +} + +const struct tnl_pipeline_stage _tnl_arb_vertex_shader_stage = { + "ARB_vertex_shader", + NULL, + construct_arb_vertex_shader, + destruct_arb_vertex_shader, + validate_arb_vertex_shader, + run_arb_vertex_shader +}; + diff --git a/src/mesa/x86/rtasm/x86sse.c b/src/mesa/x86/rtasm/x86sse.c index 82a18f012a..2ce1e64815 100644 --- a/src/mesa/x86/rtasm/x86sse.c +++ b/src/mesa/x86/rtasm/x86sse.c @@ -85,10 +85,10 @@ static void emit_modrm( struct x86_function *p, case mod_INDIRECT: break; case mod_DISP8: - emit_1b(p, regmem.disp); + emit_1b(p, regmem.disp); break; case mod_DISP32: - emit_1i(p, regmem.disp); + emit_1i(p, regmem.disp); break; default: assert(0); @@ -222,20 +222,20 @@ GLubyte *x86_jcc_forward( struct x86_function *p, emit_2ub(p, 0x0f, 0x80 + cc); emit_1i(p, 0); return x86_get_label(p); -} - -GLubyte *x86_jmp_forward( struct x86_function *p) -{ - emit_1ub(p, 0xe9); - emit_1i(p, 0); - return x86_get_label(p); -} - -GLubyte *x86_call_forward( struct x86_function *p) -{ - emit_1ub(p, 0xe8); - emit_1i(p, 0); - return x86_get_label(p); +} + +GLubyte *x86_jmp_forward( struct x86_function *p) +{ + emit_1ub(p, 0xe9); + emit_1i(p, 0); + return x86_get_label(p); +} + +GLubyte *x86_call_forward( struct x86_function *p) +{ + emit_1ub(p, 0xe8); + emit_1i(p, 0); + return x86_get_label(p); } /* Fixup offset from forward jump: @@ -244,29 +244,29 @@ void x86_fixup_fwd_jump( struct x86_function *p, GLubyte *fixup ) { *(int *)(fixup - 4) = x86_get_label(p) - fixup; -} - -void x86_jmp( struct x86_function *p, GLubyte *label) -{ - emit_1ub(p, 0xe9); - emit_1i(p, label - x86_get_label(p) - 4); -} - -void x86_call( struct x86_function *p, GLubyte *label) -{ - emit_1ub(p, 0xe8); - emit_1i(p, label - x86_get_label(p) - 4); -} - -/* michal: - * Temporary. As I need immediate operands, and dont want to mess with the codegen, - * I load the immediate into general purpose register and use it. - */ -void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, GLint imm ) -{ - assert(dst.mod == mod_REG); - emit_1ub(p, 0xb8 + dst.idx); - emit_1i(p, imm); +} + +void x86_jmp( struct x86_function *p, GLubyte *label) +{ + emit_1ub(p, 0xe9); + emit_1i(p, label - x86_get_label(p) - 4); +} + +void x86_call( struct x86_function *p, GLubyte *label) +{ + emit_1ub(p, 0xe8); + emit_1i(p, label - x86_get_label(p) - 4); +} + +/* michal: + * Temporary. As I need immediate operands, and dont want to mess with the codegen, + * I load the immediate into general purpose register and use it. + */ +void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, GLint imm ) +{ + assert(dst.mod == mod_REG); + emit_1ub(p, 0xb8 + dst.idx); + emit_1i(p, imm); } void x86_push( struct x86_function *p, @@ -344,27 +344,27 @@ void x86_test( struct x86_function *p, { emit_1ub(p, 0x85); emit_modrm( p, dst, src ); -} - -void x86_add( struct x86_function *p, - struct x86_reg dst, - struct x86_reg src ) -{ - emit_op_modrm(p, 0x03, 0x01, dst, src ); -} - -void x86_mul( struct x86_function *p, - struct x86_reg src ) -{ - assert (src.file == file_REG32 && src.mod == mod_REG); - emit_op_modrm(p, 0xf7, 0, x86_make_reg (file_REG32, reg_SP), src ); -} - -void x86_sub( struct x86_function *p, - struct x86_reg dst, - struct x86_reg src ) -{ - emit_op_modrm(p, 0x2b, 0x29, dst, src ); +} + +void x86_add( struct x86_function *p, + struct x86_reg dst, + struct x86_reg src ) +{ + emit_op_modrm(p, 0x03, 0x01, dst, src ); +} + +void x86_mul( struct x86_function *p, + struct x86_reg src ) +{ + assert (src.file == file_REG32 && src.mod == mod_REG); + emit_op_modrm(p, 0xf7, 0, x86_make_reg (file_REG32, reg_SP), src ); +} + +void x86_sub( struct x86_function *p, + struct x86_reg dst, + struct x86_reg src ) +{ + emit_op_modrm(p, 0x2b, 0x29, dst, src ); } @@ -1030,12 +1030,12 @@ struct x86_reg x86_fn_arg( struct x86_function *p, void x86_init_func( struct x86_function *p ) { x86_init_func_size(p, 1024); -} - -void x86_init_func_size( struct x86_function *p, GLuint code_size ) -{ - p->store = _mesa_exec_malloc(code_size); - p->csr = p->store; +} + +void x86_init_func_size( struct x86_function *p, GLuint code_size ) +{ + p->store = _mesa_exec_malloc(code_size); + p->csr = p->store; } void x86_release_func( struct x86_function *p ) diff --git a/src/mesa/x86/rtasm/x86sse.h b/src/mesa/x86/rtasm/x86sse.h index 55a98564af..94b320eadf 100644 --- a/src/mesa/x86/rtasm/x86sse.h +++ b/src/mesa/x86/rtasm/x86sse.h @@ -80,7 +80,7 @@ enum sse_cc { */ -void x86_init_func( struct x86_function *p ); +void x86_init_func( struct x86_function *p ); void x86_init_func_size( struct x86_function *p, GLuint code_size ); void x86_release_func( struct x86_function *p ); void (*x86_get_func( struct x86_function *p ))( void ); @@ -109,23 +109,23 @@ void x86_jcc( struct x86_function *p, GLubyte *label ); GLubyte *x86_jcc_forward( struct x86_function *p, - enum x86_cc cc ); - -GLubyte *x86_jmp_forward( struct x86_function *p); - + enum x86_cc cc ); + +GLubyte *x86_jmp_forward( struct x86_function *p); + GLubyte *x86_call_forward( struct x86_function *p); void x86_fixup_fwd_jump( struct x86_function *p, - GLubyte *fixup ); - -void x86_jmp( struct x86_function *p, GLubyte *label ); - -void x86_call( struct x86_function *p, GLubyte *label ); - -/* michal: - * Temporary. As I need immediate operands, and dont want to mess with the codegen, - * I load the immediate into general purpose register and use it. - */ + GLubyte *fixup ); + +void x86_jmp( struct x86_function *p, GLubyte *label ); + +void x86_call( struct x86_function *p, GLubyte *label ); + +/* michal: + * Temporary. As I need immediate operands, and dont want to mess with the codegen, + * I load the immediate into general purpose register and use it. + */ void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, GLint imm ); @@ -168,17 +168,17 @@ void sse_mulps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) void sse_subps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_rsqrtss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, GLubyte shuf ); - + void x86_add( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void x86_cmp( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void x86_dec( struct x86_function *p, struct x86_reg reg ); void x86_inc( struct x86_function *p, struct x86_reg reg ); void x86_lea( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); -void x86_mov( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); +void x86_mov( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void x86_mul( struct x86_function *p, struct x86_reg src ); void x86_pop( struct x86_function *p, struct x86_reg reg ); void x86_push( struct x86_function *p, struct x86_reg reg ); -void x86_ret( struct x86_function *p ); +void x86_ret( struct x86_function *p ); void x86_sub( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void x86_test( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); void x86_xor( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); diff --git a/windows/VC6/mesa/gdi/gdi.dsp b/windows/VC6/mesa/gdi/gdi.dsp index 0713010387..ef38215216 100644 --- a/windows/VC6/mesa/gdi/gdi.dsp +++ b/windows/VC6/mesa/gdi/gdi.dsp @@ -123,7 +123,7 @@ LINK32=link.exe # ADD LINK32 mesa.lib winmm.lib msvcrt.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /nodefaultlib /out:"Release_x86/OPENGL32.DLL" /libpath:"../mesa/Release_x86" # Begin Special Build Tool SOURCE="$(InputPath)" -PostBuild_Cmds=if not exist ..\..\..\..\lib md ..\..\..\..\lib copy Release_x86\OPENGL32.LIB ..\..\..\..\lib copy Release_x86\OPENGL32.DLL ..\..\..\..\lib if exist ..\..\..\..\progs\demos copy Release_x86\OPENGL32.DLL ..\..\..\..\progs\demos +PostBuild_Cmds=if not exist ..\..\..\..\lib md ..\..\..\..\lib copy Release_x86\OPENGL32.LIB ..\..\..\..\lib copy Release_x86\OPENGL32.DLL ..\..\..\..\lib if exist ..\..\..\..\progs\demos copy Release_x86\OPENGL32.DLL ..\..\..\..\progs\demos copy Release_x86\OPENGL32.DLL "C:\Documents and Settings\mjk\Pulpit\pen\noise-demo" # End Special Build Tool !ELSEIF "$(CFG)" == "gdi - Win32 Debug x86" @@ -156,7 +156,7 @@ LINK32=link.exe # ADD LINK32 mesa.lib winmm.lib msvcrtd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /nodefaultlib /out:"Debug_x86/OPENGL32.DLL" /pdbtype:sept /libpath:"../mesa/Debug_x86" # Begin Special Build Tool SOURCE="$(InputPath)" -PostBuild_Cmds=if not exist ..\..\..\..\lib md ..\..\..\..\lib copy Debug_x86\OPENGL32.LIB ..\..\..\..\lib copy Debug_x86\OPENGL32.DLL ..\..\..\..\lib if exist ..\..\..\..\progs\demos copy Debug_x86\OPENGL32.DLL ..\..\..\..\progs\demos +PostBuild_Cmds=if not exist ..\..\..\..\lib md ..\..\..\..\lib copy Debug_x86\OPENGL32.LIB ..\..\..\..\lib copy Debug_x86\OPENGL32.DLL ..\..\..\..\lib if exist ..\..\..\..\progs\demos copy Debug_x86\OPENGL32.DLL ..\..\..\..\progs\demos copy Debug_x86\OPENGL32.DLL "C:\Documents and Settings\mjk\Pulpit\pen\noise-demo" # End Special Build Tool !ENDIF -- cgit v1.2.3