mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-24 13:40:37 +02:00
Remove carriage returns.
This commit is contained in:
parent
cb0ae25a4e
commit
6acf1e93a2
14 changed files with 2205 additions and 2205 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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" );
|
||||
|
|
|
|||
|
|
@ -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() */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue