Remove carriage returns.

This commit is contained in:
Michal Krol 2006-04-25 10:11:59 +00:00
parent cb0ae25a4e
commit 6acf1e93a2
14 changed files with 2205 additions and 2205 deletions

View file

@ -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 <windows.h>
*/
#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glext.h>
#ifdef WIN32
#define GETPROCADDRESS wglGetProcAddress
#else
#define GETPROCADDRESS glutGetProcAddress
#endif
#include <GL/glut.h>
#include <GL/glext.h>
#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;
}

View file

@ -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" );

View file

@ -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() */

View file

@ -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;

View file

@ -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;
}

View file

@ -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 <size> 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 <array_len> is not 0, the data quantity is an array of <array_len> size.
* If the <structure> is not NULL, the data quantity is a struct. The <basic_type> is
* invalid and the <field_count> holds the size of the <structure> array.
* The <basic_type> values match those of <type> 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 <size> 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 <array_len> is not 0, the data quantity is an array of <array_len> size.
* If the <structure> is not NULL, the data quantity is a struct. The <basic_type> is
* invalid and the <field_count> holds the size of the <structure> array.
* The <basic_type> values match those of <type> 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

File diff suppressed because it is too large Load diff

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
};

View file

@ -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 )

View file

@ -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 );

View file

@ -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