More GLSL code:

- uniforms (only GetLocation, Uniform1f and Uniform4fv for now for demos);
- fix bugs and optimize array size handling;
- 2D texture sampling (needs Enable(TEXTURE_2D) to work);
- decrease built-in library assembly size by 30%.
This commit is contained in:
Michal Krol 2006-02-21 12:35:06 +00:00
parent 8986e36f36
commit cc1591667d
33 changed files with 3046 additions and 2989 deletions

View file

@ -3,7 +3,7 @@
* simple per-pixel lighting.
*
* Michal Krol
* 17 February 2006
* 20 February 2006
*
* Based on the original demo by:
* Brian Paul
@ -34,6 +34,10 @@ static GLfloat delta = 1.0f;
static GLhandleARB fragShader;
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;
@ -50,7 +54,9 @@ static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
static PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL;
static void Redisplay (void)
{
@ -59,8 +65,7 @@ static void Redisplay (void)
if (pixelLight)
{
glUseProgramObjectARB (program);
/* XXX source from uniform lightPos */
glTexCoord4fv (lightPos);
glUniform4fvARB (uLightPos, 1, lightPos);
glDisable(GL_LIGHTING);
}
else
@ -181,21 +186,11 @@ static void SpecialKey (int key, int x, int y)
static void Init (void)
{
static const char *fragShaderText =
static const char *fragShaderText =
"uniform vec4 lightPos;\n"
"uniform vec4 diffuse;\n"
"uniform vec4 specular;\n"
"void main () {\n"
/* XXX source from uniform lightPos */
" vec4 lightPos;\n"
" lightPos = gl_TexCoord[1];\n"
/* XXX source from uniform diffuse */
" vec4 diffuse;\n"
" diffuse = vec4 (0.5, 0.5, 1.0, 1.0);\n"
/* XXX source from uniform specular */
" vec4 specular;\n"
" specular = vec4 (0.8, 0.8, 0.8, 1.0);\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"
@ -207,9 +202,6 @@ static void Init (void)
"void main () {\n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
" gl_TexCoord[0] = vec4 (gl_NormalMatrix * gl_Normal, 1.0);\n"
/* XXX source from uniform lightPos */
" gl_TexCoord[1] = gl_MultiTexCoord0;\n"
"}\n"
;
@ -241,6 +233,8 @@ static void Init (void)
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);
@ -255,6 +249,13 @@ static void Init (void)
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);

View file

@ -2,7 +2,7 @@
* GLSL noise demo.
*
* Michal Krol
* 17 February 2006
* 20 February 2006
*
* Based on the original demo by:
* Stefan Gustavson (stegu@itn.liu.se) 2004, 2005
@ -28,6 +28,8 @@ static GLhandleARB fragShader;
static GLhandleARB vertShader;
static GLhandleARB program;
static GLint uTime;
static GLfloat u_time = 0.0f;
static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
@ -36,14 +38,15 @@ static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
static void Redisplay (void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* XXX source from uniform time */
glTexCoord1f (u_time);
glUniform1fARB (uTime, u_time);
glPushMatrix ();
glutSolidSphere (2.0, 20, 10);
@ -85,16 +88,11 @@ static void Key (unsigned char key, int x, int y)
static void Init (void)
{
static const char *fragShaderText =
static const char *fragShaderText =
"uniform float time;\n"
"void main () {\n"
/* XXX source from uniform time */
" float time;\n"
" time = gl_TexCoord[1].x;\n"
" vec4 v;\n"
" v = vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time);\n"
" gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (v))), 1.0);\n"
" gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (\n"
" vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time)))), 1.0);\n"
"}\n"
;
static const char *vertShaderText =
@ -102,9 +100,6 @@ static void Init (void)
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
" gl_TexCoord[0] = gl_Vertex;\n"
" gl_FrontColor = gl_Color;\n"
/* XXX source from uniform time */
" gl_TexCoord[1] = gl_MultiTexCoord0;\n"
"}\n"
;
@ -136,6 +131,8 @@ static void Init (void)
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) wglGetProcAddress ("glAttachObjectARB");
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) wglGetProcAddress ("glLinkProgramARB");
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glUseProgramObjectARB");
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GETPROCADDRESS ("glGetUniformLocationARB");
glUniform1fARB = (PFNGLUNIFORM1FARBPROC) GETPROCADDRESS ("glUniform1fARB");
fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
@ -150,6 +147,8 @@ static void Init (void)
glAttachObjectARB (program, vertShader);
glLinkProgramARB (program);
glUseProgramObjectARB (program);
uTime = glGetUniformLocationARB (program, "time");
glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
glEnable (GL_CULL_FACE);

View file

@ -318,7 +318,9 @@ void GLAPIENTRY
_mesa_UseProgramObjectARB (GLhandleARB programObj)
{
GET_CURRENT_CONTEXT(ctx);
struct gl2_program_intf **pro;
struct gl2_program_intf **pro;
FLUSH_VERTICES(ctx, _NEW_PROGRAM);
if (programObj == 0)
{
@ -411,18 +413,71 @@ Errors TODO
Uniform1i{v}ARB is used to load a sampler value.
*/
*/
#define _RELEASE_PROGRAM(obj)\
(**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro)
#define _LOOKUP_PROGRAM(obj, function)\
struct gl2_unknown_intf **unk;\
_glthread_LOCK_MUTEX (ctx->Shared->Mutex);\
unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, obj);\
_glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);\
if (unk == NULL) {\
_mesa_error (ctx, GL_INVALID_VALUE, function);\
break;\
}\
pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);\
if (pro == NULL) {\
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
break;\
}
#define _CURRENT_PROGRAM(function)\
if (ctx->ShaderObjects.CurrentProgram == NULL) {\
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
break;\
}\
pro = ctx->ShaderObjects.CurrentProgram;
#define _IS_LINKED(function)\
if ((**pro).GetLinkStatus (pro) == GL_FALSE) {\
_mesa_error (ctx, GL_INVALID_OPERATION, function);\
_RELEASE_PROGRAM(obj);\
break;\
}
#define GET_PROGRAM(obj, function)\
struct gl2_program_intf **pro = NULL;\
do {\
_LOOKUP_PROGRAM(obj, function);\
} while (0)
#define GET_LINKED_PROGRAM(obj, function)\
struct gl2_program_intf **pro = NULL;\
do {\
_LOOKUP_PROGRAM(obj, function);\
_IS_LINKED(function);\
} while (0)
#define CURRENT_LINKED_PROGRAM(function)\
struct gl2_program_intf **pro = NULL;\
do {\
_CURRENT_PROGRAM(function);\
_IS_LINKED(function);\
} while (0)
/* XXX */
GLboolean _slang_write_uniform (struct gl2_program_intf **, GLint, GLsizei, const GLvoid *, GLenum);
void GLAPIENTRY
_mesa_Uniform1fARB (GLint location, GLfloat v0)
{
GET_CURRENT_CONTEXT(ctx);
if (ctx->ShaderObjects.CurrentProgram == NULL)
{
{
GET_CURRENT_CONTEXT(ctx);
CURRENT_LINKED_PROGRAM("glUniform1fARB");
if (!_slang_write_uniform (pro, location, 1, &v0, GL_FLOAT))
_mesa_error (ctx, GL_INVALID_OPERATION, "glUniform1fARB");
return;
}
}
void GLAPIENTRY
@ -548,13 +603,11 @@ _mesa_Uniform3fvARB (GLint location, GLsizei count, const GLfloat *value)
void GLAPIENTRY
_mesa_Uniform4fvARB (GLint location, GLsizei count, const GLfloat *value)
{
GET_CURRENT_CONTEXT(ctx);
GET_CURRENT_CONTEXT(ctx);
CURRENT_LINKED_PROGRAM("glUniform4fvARB");
if (ctx->ShaderObjects.CurrentProgram == NULL)
{
if (!_slang_write_uniform (pro, location, count, value, GL_FLOAT_VEC4_ARB))
_mesa_error (ctx, GL_INVALID_OPERATION, "glUniform4fvARB");
return;
}
}
void GLAPIENTRY
@ -900,43 +953,23 @@ _mesa_GetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei
if (count != NULL)
*count = cnt;
}
}
/* XXX */
GLint _slang_get_uniform_location (struct gl2_program_intf **, const char *);
GLint GLAPIENTRY
_mesa_GetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name)
{
GET_CURRENT_CONTEXT(ctx);
struct gl2_unknown_intf **unk;
struct gl2_program_intf **pro;
GET_CURRENT_CONTEXT(ctx);
GLint loc = -1;
GET_LINKED_PROGRAM(programObj, "glGetUniformLocationARB");
_glthread_LOCK_MUTEX (ctx->Shared->Mutex);
unk = (struct gl2_unknown_intf **) _mesa_HashLookup (ctx->Shared->GL2Objects, programObj);
_glthread_UNLOCK_MUTEX (ctx->Shared->Mutex);
if (unk == NULL)
{
_mesa_error (ctx, GL_INVALID_VALUE, "glGetUniformLocationARB");
if (pro == NULL)
return -1;
}
pro = (struct gl2_program_intf **) (**unk).QueryInterface (unk, UIID_PROGRAM);
if (pro == NULL)
{
_mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformLocationARB");
return -1;
}
if ((**pro).GetLinkStatus (pro) == GL_FALSE)
{
_mesa_error (ctx, GL_INVALID_OPERATION, "glGetUniformLocationARB");
(**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
return -1;
}
/* TODO */
(**pro)._container._generic._unknown.Release ((struct gl2_unknown_intf **) pro);
loc = _slang_get_uniform_location (pro, name);
_RELEASE_PROGRAM(pro);
return loc;
}

View file

@ -44,6 +44,7 @@
#else
#include "slang_utility.h"
#include "slang_compile.h"
#include "slang_link.h"
#endif
struct gl2_unknown_obj
@ -683,6 +684,7 @@ struct gl2_program_obj
ShHandle linker;
ShHandle uniforms;
#endif
slang_program prog;
};
struct gl2_program_impl
@ -694,13 +696,13 @@ struct gl2_program_impl
static void
_program_destructor (struct gl2_unknown_intf **intf)
{
#if USE_3DLABS_FRONTEND
struct gl2_program_impl *impl = (struct gl2_program_impl *) intf;
#if USE_3DLABS_FRONTEND
ShDestruct (impl->_obj.linker);
ShDestruct (impl->_obj.uniforms);
#endif
_container_destructor (intf);
slang_program_dtr (&impl->_obj.prog);
}
static struct gl2_unknown_intf **
@ -759,12 +761,15 @@ _program_Link (struct gl2_program_intf **intf)
struct gl2_program_impl *impl = (struct gl2_program_impl *) intf;
#if USE_3DLABS_FRONTEND
ShHandle *handles;
GLuint i;
#endif
GLuint i, count;
slang_translation_unit *units[2];
impl->_obj.link_status = GL_FALSE;
_mesa_free ((void *) impl->_obj._container._generic.info_log);
impl->_obj._container._generic.info_log = NULL;
slang_program_dtr (&impl->_obj.prog);
slang_program_ctr (&impl->_obj.prog);
#if USE_3DLABS_FRONTEND
handles = (ShHandle *) _mesa_malloc (impl->_obj._container.attached_count * sizeof (ShHandle));
@ -796,9 +801,30 @@ _program_Link (struct gl2_program_intf **intf)
impl->_obj._container._generic.info_log = _mesa_strdup (ShGetInfoLog (impl->_obj.linker));
#else
/* TODO: do the real linking */
impl->_obj.link_status = GL_TRUE;
impl->_obj._container._generic.info_log = _mesa_strdup ("Link OK.\n");
count = impl->_obj._container.attached_count;
if (count == 0 || count > 2)
return;
for (i = 0; i < count; i++)
{
struct gl2_generic_intf **obj;
struct gl2_unknown_intf **unk;
struct gl2_shader_impl *sha;
obj = impl->_obj._container.attached[i];
unk = (**obj)._unknown.QueryInterface ((struct gl2_unknown_intf **) obj, UIID_SHADER);
(**obj)._unknown.Release ((struct gl2_unknown_intf **) obj);
if (unk == NULL)
return;
sha = (struct gl2_shader_impl *) unk;
units[i] = &sha->_obj.unit;
(**unk).Release (unk);
}
impl->_obj.link_status = _slang_link (&impl->_obj.prog, units, count);
if (impl->_obj.link_status)
impl->_obj._container._generic.info_log = _mesa_strdup ("Link OK.\n");
else
impl->_obj._container._generic.info_log = _mesa_strdup ("Link failed.\n");
#endif
}
@ -851,6 +877,7 @@ _program_constructor (struct gl2_program_impl *impl)
impl->_obj.linker = ShConstructLinker (EShExVertexFragment, 0);
impl->_obj.uniforms = ShConstructUniformMap ();
#endif
slang_program_ctr (&impl->_obj.prog);
}
struct gl2_fragment_shader_obj
@ -1173,13 +1200,13 @@ void exec_vertex_shader (struct gl2_vertex_shader_intf **vs)
{
slang_function *f;
slang_assembly_file_restore_point point;
slang_machine mach;
slang_assemble_ctx A;
f = &unit->functions.functions[i];
slang_assembly_file_restore_point_save (unit->assembly, &point);
mach = *unit->machine;
mach.ip = unit->assembly->count;
slang_machine_init (unit->machine);
unit->machine->ip = unit->assembly->count;
A.file = unit->assembly;
A.mach = unit->machine;
@ -1192,9 +1219,9 @@ void exec_vertex_shader (struct gl2_vertex_shader_intf **vs)
_slang_assemble_function_call (&A, f, NULL, 0, GL_FALSE);
slang_assembly_file_push (unit->assembly, slang_asm_exit);
_slang_execute2 (unit->assembly, &mach);
_slang_execute2 (unit->assembly, unit->machine);
slang_assembly_file_restore_point_load (unit->assembly, &point);
_mesa_memcpy (unit->machine->mem, mach.mem, SLANG_MACHINE_MEMORY_SIZE * sizeof (slang_machine_slot));
}
}
@ -1215,14 +1242,13 @@ void exec_fragment_shader (struct gl2_fragment_shader_intf **fs)
{
slang_function *f;
slang_assembly_file_restore_point point;
slang_machine mach;
slang_assemble_ctx A;
f = &unit->functions.functions[i];
slang_assembly_file_restore_point_save (unit->assembly, &point);
mach = *unit->machine;
mach.ip = unit->assembly->count;
mach.kill = 0;
slang_machine_init (unit->machine);
unit->machine->ip = unit->assembly->count;
A.file = unit->assembly;
A.mach = unit->machine;
@ -1235,13 +1261,57 @@ void exec_fragment_shader (struct gl2_fragment_shader_intf **fs)
_slang_assemble_function_call (&A, f, NULL, 0, GL_FALSE);
slang_assembly_file_push (unit->assembly, slang_asm_exit);
_slang_execute2 (unit->assembly, &mach);
_slang_execute2 (unit->assembly, unit->machine);
slang_assembly_file_restore_point_load (unit->assembly, &point);
_mesa_memcpy (unit->machine->mem, mach.mem, SLANG_MACHINE_MEMORY_SIZE * sizeof (slang_machine_slot));
unit->machine->kill = mach.kill;
}
}
GLint _slang_get_uniform_location (struct gl2_program_intf **pro, const char *name)
{
struct gl2_program_impl *impl;
slang_uniform_bindings *bind;
GLuint i;
impl = (struct gl2_program_impl *) pro;
bind = &impl->_obj.prog.uniforms;
for (i = 0; i < bind->count; i++)
if (_mesa_strcmp (bind->table[i].name, name) == 0)
return i;
return -1;
}
GLboolean _slang_write_uniform (struct gl2_program_intf **pro, GLint loc, GLsizei count,
const GLvoid *data, GLenum type)
{
struct gl2_program_impl *impl;
slang_uniform_bindings *bind;
slang_uniform_binding *b;
GLuint i;
if (loc == -1)
return GL_TRUE;
impl = (struct gl2_program_impl *) pro;
bind = &impl->_obj.prog.uniforms;
if (loc >= bind->count)
return GL_FALSE;
b = &bind->table[loc];
/* TODO: check sizes */
/* TODO: check if not structure */
if (b->quant->u.basic_type != type)
return GL_FALSE;
for (i = 0; i < SLANG_UNIFORM_BINDING_MAX; i++)
if (b->address[i] != ~0)
{
_mesa_memcpy (&impl->_obj.prog.machines[i]->mem[b->address[i] / 4], data,
count * b->quant->size);
}
return GL_TRUE;
}
void
_mesa_init_shaderobjects_3dlabs (GLcontext *ctx)
{

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -26,7 +26,7 @@ varying float gl_FogFragCoord;
//
vec4 texture1D (sampler1D sampler, float coord, float bias) {
// XXX:
// XXX:
return vec4 (0.0);
}
@ -39,66 +39,48 @@ vec4 texture1DProj (sampler1D sampler, vec4 coord, float bias) {
}
vec4 texture2D (sampler2D sampler, vec2 coord, float bias) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 texture2DProj (sampler2D sampler, vec3 coord, float bias) {
vec2 u;
u.s = coord.s / coord.p;
u.t = coord.t / coord.p;
return texture2D (sampler, u, bias);
return texture2D (sampler, vec2 (coord.s / coord.p, coord.t / coord.p), bias);
}
vec4 texture2DProj (sampler2D sampler, vec4 coord, float bias) {
vec2 u;
u.s = coord.s / coord.q;
u.t = coord.t / coord.q;
return texture2D (sampler, u, bias);
return texture2D (sampler, vec2 (coord.s / coord.q, coord.t / coord.q), bias);
}
vec4 texture3D (sampler3D sampler, vec3 coord, float bias) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 texture3DProj (sampler3D sampler, vec4 coord, float bias) {
vec3 u;
u.s = coord.s / coord.q;
u.t = coord.t / coord.q;
u.p = coord.p / coord.q;
return texture3D (sampler, u, bias);
return texture3D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q), bias);
}
vec4 textureCube (samplerCube sampler, vec3 coord, float bias) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 shadow1D (sampler1DShadow sampler, vec3 coord, float bias) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 shadow2D (sampler2DShadow sampler, vec3 coord, float bias) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 shadow1DProj (sampler1DShadow sampler, vec4 coord, float bias) {
vec3 u;
u.s = coord.s / coord.q;
u.t = 0.0;
u.p = coord.p / coord.q;
return shadow1D (sampler, u, bias);
return shadow1D (sampler, vec3 (coord.s / coord.q, 0.0, coord.p / coord.q), bias);
}
vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord, float bias) {
vec3 u;
u.s = coord.s / coord.q;
u.t = coord.t / coord.q;
u.p = coord.p / coord.q;
return shadow2D (sampler, u, bias);
return shadow2D (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q), bias);
}
//
@ -106,42 +88,42 @@ vec4 shadow2DProj (sampler2DShadow sampler, vec4 coord, float bias) {
//
float dFdx (float p) {
// XXX:
// XXX:
return 0.0;
}
vec2 dFdx (vec2 p) {
// XXX:
// XXX:
return vec2 (0.0);
}
vec3 dFdx (vec3 p) {
// XXX:
// XXX:
return vec3 (0.0);
}
vec4 dFdx (vec4 p) {
// XXX:
// XXX:
return vec4 (0.0);
}
float dFdy (float p) {
// XXX:
// XXX:
return 0.0;
}
vec2 dFdy (vec2 p) {
// XXX:
// XXX:
return vec2 (0.0);
}
vec3 dFdy (vec3 p) {
// XXX:
// XXX:
return vec3 (0.0);
}
vec4 dFdy (vec4 p) {
// XXX:
// XXX:
return vec4 (0.0);
}

View file

@ -21,51 +21,47 @@
0,1,0,12,0,116,101,120,116,117,114,101,50,68,0,1,0,0,17,115,97,109,112,108,101,114,0,0,1,0,0,10,99,
111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,
12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,0,1,0,0,17,115,97,109,112,108,101,114,0,0,1,
0,0,11,99,111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,3,2,0,10,1,117,0,0,0,9,18,117,0,59,115,
0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,112,0,49,20,0,9,18,117,0,59,116,0,18,
99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,112,0,49,20,0,8,58,116,101,120,116,117,
114,101,50,68,0,18,115,97,109,112,108,101,114,0,0,18,117,0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,
116,101,120,116,117,114,101,50,68,80,114,111,106,0,1,0,0,17,115,97,109,112,108,101,114,0,0,1,0,0,
12,99,111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,3,2,0,10,1,117,0,0,0,9,18,117,0,59,115,0,
18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,18,
99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,20,0,8,58,116,101,120,116,117,
114,101,50,68,0,18,115,97,109,112,108,101,114,0,0,18,117,0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,
116,101,120,116,117,114,101,51,68,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,
114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,116,
101,120,116,117,114,101,51,68,80,114,111,106,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,12,99,
111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,3,2,0,11,1,117,0,0,0,9,18,117,0,59,115,0,18,99,
111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,18,99,111,
111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,112,0,18,99,111,111,
114,100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,20,0,8,58,116,101,120,116,117,114,101,51,68,
0,18,115,97,109,112,108,101,114,0,0,18,117,0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,116,101,120,116,
117,114,101,67,117,98,101,0,1,0,0,19,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,
0,1,0,0,9,98,105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,
100,111,119,49,68,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,
9,98,105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,100,111,
0,0,11,99,111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,8,58,116,101,120,116,117,114,101,50,68,
0,18,115,97,109,112,108,101,114,0,0,58,118,101,99,50,0,18,99,111,111,114,100,0,59,115,0,18,99,111,
111,114,100,0,59,112,0,49,0,18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,112,0,49,0,
0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,0,1,0,0,
17,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,8,
58,116,101,120,116,117,114,101,50,68,0,18,115,97,109,112,108,101,114,0,0,58,118,101,99,50,0,18,99,
111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,0,18,99,111,111,114,100,0,59,116,0,
18,99,111,111,114,100,0,59,113,0,49,0,0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,116,101,120,116,117,
114,101,51,68,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,9,98,
105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,
101,51,68,80,114,111,106,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,
1,0,0,9,98,105,97,115,0,0,0,1,8,58,116,101,120,116,117,114,101,51,68,0,18,115,97,109,112,108,101,
114,0,0,58,118,101,99,51,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,0,
18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,0,18,99,111,111,114,100,0,59,
112,0,18,99,111,111,114,100,0,59,113,0,49,0,0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,116,101,120,
116,117,114,101,67,117,98,101,0,1,0,0,19,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,
100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,
97,100,111,119,49,68,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,
0,9,98,105,97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,100,111,
119,50,68,0,1,0,0,21,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,9,98,105,
97,115,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,100,111,119,49,68,
80,114,111,106,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,
98,105,97,115,0,0,0,1,3,2,0,11,1,117,0,0,0,9,18,117,0,59,115,0,18,99,111,111,114,100,0,59,115,0,18,
99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,17,48,0,48,0,0,20,0,9,18,117,0,59,112,0,
18,99,111,111,114,100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,20,0,8,58,115,104,97,100,111,
119,49,68,0,18,115,97,109,112,108,101,114,0,0,18,117,0,0,18,98,105,97,115,0,0,0,0,0,1,0,12,0,115,
104,97,100,111,119,50,68,80,114,111,106,0,1,0,0,21,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,
111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,3,2,0,11,1,117,0,0,0,9,18,117,0,59,115,0,18,99,111,
111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,18,99,111,111,
114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,112,0,18,99,111,111,114,
100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,20,0,8,58,115,104,97,100,111,119,50,68,0,18,115,
97,109,112,108,101,114,0,0,18,117,0,0,18,98,105,97,115,0,0,0,0,0,1,0,9,0,100,70,100,120,0,1,0,0,9,
112,0,0,0,1,8,17,48,0,48,0,0,0,0,1,0,10,0,100,70,100,120,0,1,0,0,10,112,0,0,0,1,8,58,118,101,99,50,
0,17,48,0,48,0,0,0,0,0,0,1,0,11,0,100,70,100,120,0,1,0,0,11,112,0,0,0,1,8,58,118,101,99,51,0,17,48,
0,48,0,0,0,0,0,0,1,0,12,0,100,70,100,120,0,1,0,0,12,112,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,
0,0,0,0,0,1,0,9,0,100,70,100,121,0,1,0,0,9,112,0,0,0,1,8,17,48,0,48,0,0,0,0,1,0,10,0,100,70,100,
121,0,1,0,0,10,112,0,0,0,1,8,58,118,101,99,50,0,17,48,0,48,0,0,0,0,0,0,1,0,11,0,100,70,100,121,0,1,
0,0,11,112,0,0,0,1,8,58,118,101,99,51,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,100,70,100,121,0,1,0,0,12,
112,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,9,0,102,119,105,100,116,104,0,1,0,0,9,
112,0,0,0,1,8,58,97,98,115,0,58,100,70,100,120,0,18,112,0,0,0,0,0,58,97,98,115,0,58,100,70,100,121,
0,18,112,0,0,0,0,0,46,0,0,1,0,10,0,102,119,105,100,116,104,0,1,0,0,10,112,0,0,0,1,8,58,97,98,115,0,
58,100,70,100,120,0,18,112,0,0,0,0,0,58,97,98,115,0,58,100,70,100,121,0,18,112,0,0,0,0,0,46,0,0,1,
0,11,0,102,119,105,100,116,104,0,1,0,0,11,112,0,0,0,1,8,58,97,98,115,0,58,100,70,100,120,0,18,112,
0,0,0,0,0,58,97,98,115,0,58,100,70,100,121,0,18,112,0,0,0,0,0,46,0,0,1,0,12,0,102,119,105,100,116,
104,0,1,0,0,12,112,0,0,0,1,8,58,97,98,115,0,58,100,70,100,120,0,18,112,0,0,0,0,0,58,97,98,115,0,58,
100,70,100,121,0,18,112,0,0,0,0,0,46,0,0,0
98,105,97,115,0,0,0,1,8,58,115,104,97,100,111,119,49,68,0,18,115,97,109,112,108,101,114,0,0,58,118,
101,99,51,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,0,17,48,0,48,0,0,
0,18,99,111,111,114,100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,0,0,0,18,98,105,97,115,0,0,
0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,80,114,111,106,0,1,0,0,21,115,97,109,112,108,101,114,0,
0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,98,105,97,115,0,0,0,1,8,58,115,104,97,100,111,119,50,68,
0,18,115,97,109,112,108,101,114,0,0,58,118,101,99,51,0,18,99,111,111,114,100,0,59,115,0,18,99,111,
111,114,100,0,59,113,0,49,0,18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,0,
18,99,111,111,114,100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,0,0,0,18,98,105,97,115,0,0,0,
0,0,1,0,9,0,100,70,100,120,0,1,0,0,9,112,0,0,0,1,8,17,48,0,48,0,0,0,0,1,0,10,0,100,70,100,120,0,1,
0,0,10,112,0,0,0,1,8,58,118,101,99,50,0,17,48,0,48,0,0,0,0,0,0,1,0,11,0,100,70,100,120,0,1,0,0,11,
112,0,0,0,1,8,58,118,101,99,51,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,100,70,100,120,0,1,0,0,12,112,0,0,
0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,9,0,100,70,100,121,0,1,0,0,9,112,0,0,0,1,8,17,
48,0,48,0,0,0,0,1,0,10,0,100,70,100,121,0,1,0,0,10,112,0,0,0,1,8,58,118,101,99,50,0,17,48,0,48,0,0,
0,0,0,0,1,0,11,0,100,70,100,121,0,1,0,0,11,112,0,0,0,1,8,58,118,101,99,51,0,17,48,0,48,0,0,0,0,0,0,
1,0,12,0,100,70,100,121,0,1,0,0,12,112,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,9,0,
102,119,105,100,116,104,0,1,0,0,9,112,0,0,0,1,8,58,97,98,115,0,58,100,70,100,120,0,18,112,0,0,0,0,
0,58,97,98,115,0,58,100,70,100,121,0,18,112,0,0,0,0,0,46,0,0,1,0,10,0,102,119,105,100,116,104,0,1,
0,0,10,112,0,0,0,1,8,58,97,98,115,0,58,100,70,100,120,0,18,112,0,0,0,0,0,58,97,98,115,0,58,100,70,
100,121,0,18,112,0,0,0,0,0,46,0,0,1,0,11,0,102,119,105,100,116,104,0,1,0,0,11,112,0,0,0,1,8,58,97,
98,115,0,58,100,70,100,120,0,18,112,0,0,0,0,0,58,97,98,115,0,58,100,70,100,121,0,18,112,0,0,0,0,0,
46,0,0,1,0,12,0,102,119,105,100,116,104,0,1,0,0,12,112,0,0,0,1,8,58,97,98,115,0,58,100,70,100,120,
0,18,112,0,0,0,0,0,58,97,98,115,0,58,100,70,100,121,0,18,112,0,0,0,0,0,46,0,0,0

View file

@ -48,7 +48,7 @@ vec4 ftransform () {
//
vec4 texture1DLod (sampler1D sampler, float coord, float lod) {
// XXX:
// XXX:
return vec4 (0.0);
}
@ -61,64 +61,46 @@ vec4 texture1DProjLod (sampler1D sampler, vec4 coord, float lod) {
}
vec4 texture2DLod (sampler2D sampler, vec2 coord, float lod) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 texture2DProjLod (sampler2D sampler, vec3 coord, float lod) {
vec2 u;
u.s = coord.s / coord.p;
u.t = coord.t / coord.p;
return texture2DLod (sampler, u, lod);
return texture2DLod (sampler, vec2 (coord.s / coord.p, coord.t / coord.p), lod);
}
vec4 texture2DProjLod (sampler2D sampler, vec4 coord, float lod) {
vec2 u;
u.s = coord.s / coord.q;
u.t = coord.t / coord.q;
return texture2DLod (sampler, u, lod);
return texture2DLod (sampler, vec2 (coord.s / coord.q, coord.t / coord.q), lod);
}
vec4 texture3DLod (sampler3D sampler, vec3 coord, float lod) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 texture3DProjLod (sampler3D sampler, vec4 coord, float lod) {
vec3 u;
u.s = coord.s / coord.q;
u.t = coord.t / coord.q;
u.p = coord.p / coord.q;
return texture3DLod (sampler, u, lod);
return texture3DLod (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q), lod);
}
vec4 textureCubeLod (samplerCube sampler, vec3 coord, float lod) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 shadow1DLod (sampler1DShadow sampler, vec3 coord, float lod) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 shadow2DLod (sampler2DShadow sampler, vec3 coord, float lod) {
// XXX:
// XXX:
return vec4 (0.0);
}
vec4 shadow1DProjLod (sampler1DShadow sampler, vec4 coord, float lod) {
vec3 u;
u.s = coord.s / coord.q;
u.t = 0.0;
u.p = coord.p / coord.q;
return shadow1DLod (sampler, u, lod);
return shadow1DLod (sampler, vec3 (coord.s / coord.q, 0.0, coord.p / coord.q), lod);
}
vec4 shadow2DProjLod (sampler2DShadow sampler, vec4 coord, float lod) {
vec3 u;
u.s = coord.s / coord.q;
u.t = coord.t / coord.q;
u.p = coord.p / coord.q;
return shadow2DLod (sampler, u, lod);
return shadow2DLod (sampler, vec3 (coord.s / coord.q, coord.t / coord.q, coord.p / coord.q), lod);
}

View file

@ -33,39 +33,35 @@
111,100,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,76,111,100,0,1,0,0,17,115,97,109,112,
108,101,114,0,0,1,0,0,10,99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,
17,48,0,48,0,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,76,111,100,0,1,0,
0,17,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,3,
2,0,10,1,117,0,0,0,9,18,117,0,59,115,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,
112,0,49,20,0,9,18,117,0,59,116,0,18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,112,
0,49,20,0,8,58,116,101,120,116,117,114,101,50,68,76,111,100,0,18,115,97,109,112,108,101,114,0,0,18,
117,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,50,68,80,114,111,106,76,111,
100,0,1,0,0,17,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,108,111,100,
0,0,0,1,3,2,0,10,1,117,0,0,0,9,18,117,0,59,115,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,
114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,
100,0,59,113,0,49,20,0,8,58,116,101,120,116,117,114,101,50,68,76,111,100,0,18,115,97,109,112,108,
101,114,0,0,18,117,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,51,68,76,111,
100,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,9,108,111,100,
0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,51,68,80,
114,111,106,76,111,100,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,
0,0,9,108,111,100,0,0,0,1,3,2,0,11,1,117,0,0,0,9,18,117,0,59,115,0,18,99,111,111,114,100,0,59,115,
0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,18,99,111,111,114,100,0,59,116,0,18,
99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,112,0,18,99,111,111,114,100,0,59,112,0,18,99,
111,111,114,100,0,59,113,0,49,20,0,8,58,116,101,120,116,117,114,101,51,68,76,111,100,0,18,115,97,
109,112,108,101,114,0,0,18,117,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,
67,117,98,101,76,111,100,0,1,0,0,19,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,
1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,100,
111,119,49,68,76,111,100,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,
1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,100,
111,119,50,68,76,111,100,0,1,0,0,21,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,
1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,97,100,
111,119,49,68,80,114,111,106,76,111,100,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,
111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,3,2,0,11,1,117,0,0,0,9,18,117,0,59,115,0,18,99,111,111,
114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,20,0,9,18,117,0,59,116,0,17,48,0,48,0,0,20,
0,9,18,117,0,59,112,0,18,99,111,111,114,100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,20,0,8,
58,115,104,97,100,111,119,49,68,76,111,100,0,18,115,97,109,112,108,101,114,0,0,18,117,0,0,18,108,
111,100,0,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,80,114,111,106,76,111,100,0,1,0,0,21,115,
97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,3,2,0,11,1,
117,0,0,0,9,18,117,0,59,115,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,
20,0,9,18,117,0,59,116,0,18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,20,0,
9,18,117,0,59,112,0,18,99,111,111,114,100,0,59,112,0,18,99,111,111,114,100,0,59,113,0,49,20,0,8,58,
115,104,97,100,111,119,50,68,76,111,100,0,18,115,97,109,112,108,101,114,0,0,18,117,0,0,18,108,111,
100,0,0,0,0,0,0
0,17,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,
58,116,101,120,116,117,114,101,50,68,76,111,100,0,18,115,97,109,112,108,101,114,0,0,58,118,101,99,
50,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,112,0,49,0,18,99,111,111,114,100,
0,59,116,0,18,99,111,111,114,100,0,59,112,0,49,0,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,116,101,120,
116,117,114,101,50,68,80,114,111,106,76,111,100,0,1,0,0,17,115,97,109,112,108,101,114,0,0,1,0,0,12,
99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,116,101,120,116,117,114,101,50,68,76,111,
100,0,18,115,97,109,112,108,101,114,0,0,58,118,101,99,50,0,18,99,111,111,114,100,0,59,115,0,18,99,
111,111,114,100,0,59,113,0,49,0,18,99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,
49,0,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,51,68,76,111,100,0,1,0,0,18,
115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,
118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,116,101,120,116,117,114,101,51,68,80,114,111,106,
76,111,100,0,1,0,0,18,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,108,
111,100,0,0,0,1,8,58,116,101,120,116,117,114,101,51,68,76,111,100,0,18,115,97,109,112,108,101,114,
0,0,58,118,101,99,51,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,0,18,
99,111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,0,18,99,111,111,114,100,0,59,112,
0,18,99,111,111,114,100,0,59,113,0,49,0,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,116,101,120,116,117,
114,101,67,117,98,101,76,111,100,0,1,0,0,19,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,
100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,
97,100,111,119,49,68,76,111,100,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,
100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,
97,100,111,119,50,68,76,111,100,0,1,0,0,21,115,97,109,112,108,101,114,0,0,1,0,0,11,99,111,111,114,
100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,118,101,99,52,0,17,48,0,48,0,0,0,0,0,0,1,0,12,0,115,104,
97,100,111,119,49,68,80,114,111,106,76,111,100,0,1,0,0,20,115,97,109,112,108,101,114,0,0,1,0,0,12,
99,111,111,114,100,0,0,1,0,0,9,108,111,100,0,0,0,1,8,58,115,104,97,100,111,119,49,68,76,111,100,0,
18,115,97,109,112,108,101,114,0,0,58,118,101,99,51,0,18,99,111,111,114,100,0,59,115,0,18,99,111,
111,114,100,0,59,113,0,49,0,17,48,0,48,0,0,0,18,99,111,111,114,100,0,59,112,0,18,99,111,111,114,
100,0,59,113,0,49,0,0,0,18,108,111,100,0,0,0,0,0,1,0,12,0,115,104,97,100,111,119,50,68,80,114,111,
106,76,111,100,0,1,0,0,21,115,97,109,112,108,101,114,0,0,1,0,0,12,99,111,111,114,100,0,0,1,0,0,9,
108,111,100,0,0,0,1,8,58,115,104,97,100,111,119,50,68,76,111,100,0,18,115,97,109,112,108,101,114,0,
0,58,118,101,99,51,0,18,99,111,111,114,100,0,59,115,0,18,99,111,111,114,100,0,59,113,0,49,0,18,99,
111,111,114,100,0,59,116,0,18,99,111,111,114,100,0,59,113,0,49,0,18,99,111,111,114,100,0,59,112,0,
18,99,111,111,114,100,0,59,113,0,49,0,0,0,18,108,111,100,0,0,0,0,0,0

View file

@ -156,14 +156,14 @@ GLboolean slang_assembly_file_restore_point_load (slang_assembly_file *file,
/* utility functions */
static GLboolean sizeof_variable (slang_assemble_ctx *A, slang_type_specifier *spec,
slang_type_qualifier qual, slang_operation *array_size, GLuint *size)
slang_type_qualifier qual, GLuint array_len, GLuint *size)
{
slang_storage_aggregate agg;
/* calculate the size of the variable's aggregate */
if (!slang_storage_aggregate_construct (&agg))
return GL_FALSE;
if (!_slang_aggregate_variable (&agg, spec, array_size, A->space.funcs, A->space.structs,
if (!_slang_aggregate_variable (&agg, spec, array_len, A->space.funcs, A->space.structs,
A->space.vars, A->mach, A->file, A->atoms))
{
slang_storage_aggregate_destruct (&agg);
@ -184,7 +184,7 @@ static GLboolean sizeof_variable2 (slang_assemble_ctx *A, slang_variable *var, G
var->address = *size;
if (var->type.qualifier == slang_qual_out || var->type.qualifier == slang_qual_inout)
var->address += 4;
return sizeof_variable (A, &var->type.specifier, var->type.qualifier, var->array_size, size);
return sizeof_variable (A, &var->type.specifier, var->type.qualifier, var->array_len, size);
}
static GLboolean sizeof_variables (slang_assemble_ctx *A, slang_variable_scope *vars, GLuint start,
@ -233,7 +233,7 @@ slang_function *_slang_locate_function (slang_function_scope *funcs, slang_atom
if (!slang_assembly_typeinfo_construct (&ti))
return NULL;
if (!_slang_typeof_operation (&params[j], space, &ti, atoms))
if (!_slang_typeof_operation_ (&params[j], space, &ti, atoms))
{
slang_assembly_typeinfo_destruct (&ti);
return NULL;
@ -301,7 +301,7 @@ GLboolean _slang_assemble_function (slang_assemble_ctx *A, slang_function *fun)
/* calculate return value size */
param_size = 0;
if (fun->header.type.specifier.type != slang_spec_void)
if (!sizeof_variable (A, &fun->header.type.specifier, slang_qual_none, NULL, &param_size))
if (!sizeof_variable (A, &fun->header.type.specifier, slang_qual_none, 0, &param_size))
return GL_FALSE;
A->local.ret_size = param_size;
@ -344,7 +344,7 @@ GLboolean _slang_assemble_function (slang_assemble_ctx *A, slang_function *fun)
/* execute the function body */
A->file->code[skip].param[0] = A->file->count;
if (!_slang_assemble_operation_ (A, fun->body, /*slang_ref_freelance*/slang_ref_forbid))
if (!_slang_assemble_operation (A, fun->body, /*slang_ref_freelance*/slang_ref_forbid))
return GL_FALSE;
/* this is the end of the function - restore the old function frame */
@ -363,7 +363,7 @@ GLboolean _slang_assemble_function (slang_assemble_ctx *A, slang_function *fun)
return GL_TRUE;
}
GLboolean _slang_cleanup_stack_ (slang_assemble_ctx *A, slang_operation *op)
GLboolean _slang_cleanup_stack (slang_assemble_ctx *A, slang_operation *op)
{
slang_assembly_typeinfo ti;
GLuint size = 0;
@ -371,7 +371,7 @@ GLboolean _slang_cleanup_stack_ (slang_assemble_ctx *A, slang_operation *op)
/* get type info of the operation and calculate its size */
if (!slang_assembly_typeinfo_construct (&ti))
return GL_FALSE;
if (!_slang_typeof_operation (op, &A->space, &ti, A->atoms))
if (!_slang_typeof_operation (A, op, &ti))
{
slang_assembly_typeinfo_destruct (&ti);
return GL_FALSE;
@ -379,7 +379,7 @@ GLboolean _slang_cleanup_stack_ (slang_assemble_ctx *A, slang_operation *op)
if (ti.spec.type != slang_spec_void)
if (A->ref == slang_ref_force)
size = 4;
else if (!sizeof_variable (A, &ti.spec, slang_qual_none, NULL, &size))
else if (!sizeof_variable (A, &ti.spec, slang_qual_none, 0, &size))
{
slang_assembly_typeinfo_destruct (&ti);
return GL_FALSE;
@ -478,13 +478,13 @@ GLboolean _slang_dereference (slang_assemble_ctx *A, slang_operation *op)
/* get type information of the given operation */
if (!slang_assembly_typeinfo_construct (&ti))
return GL_FALSE;
if (!_slang_typeof_operation (op, &A->space, &ti, A->atoms))
if (!_slang_typeof_operation (A, op, &ti))
goto end1;
/* construct aggregate from the type info */
if (!slang_storage_aggregate_construct (&agg))
goto end1;
if (!_slang_aggregate_variable (&agg, &ti.spec, ti.array_size, A->space.funcs, A->space.structs,
if (!_slang_aggregate_variable (&agg, &ti.spec, ti.array_len, A->space.funcs, A->space.structs,
A->space.vars, A->mach, A->file, A->atoms))
goto end;
@ -515,7 +515,7 @@ GLboolean _slang_assemble_function_call (slang_assemble_ctx *A, slang_function *
{
GLuint ret_size = 0;
if (!sizeof_variable (A, &fun->header.type.specifier, slang_qual_none, NULL, &ret_size))
if (!sizeof_variable (A, &fun->header.type.specifier, slang_qual_none, 0, &ret_size))
return GL_FALSE;
if (!PLAB (A->file, slang_asm_local_alloc, ret_size))
return GL_FALSE;
@ -530,7 +530,7 @@ GLboolean _slang_assemble_function_call (slang_assemble_ctx *A, slang_function *
if (!PLAB2 (A->file, slang_asm_local_addr, A->local.addr_tmp, 4))
return GL_FALSE;
/* TODO: optimize the "out" parameter case */
if (!_slang_assemble_operation_ (A, &params[i], slang_ref_force))
if (!_slang_assemble_operation (A, &params[i], slang_ref_force))
return GL_FALSE;
p_swz[i] = A->swz;
p_ref[i] = A->ref;
@ -551,7 +551,7 @@ GLboolean _slang_assemble_function_call (slang_assemble_ctx *A, slang_function *
}
else
{
if (!_slang_assemble_operation_ (A, &params[i], slang_ref_forbid))
if (!_slang_assemble_operation (A, &params[i], slang_ref_forbid))
return GL_FALSE;
p_swz[i] = A->swz;
p_ref[i] = A->ref;
@ -583,7 +583,7 @@ GLboolean _slang_assemble_function_call (slang_assemble_ctx *A, slang_function *
else
{
/* pop the value of the parameter */
if (!_slang_cleanup_stack_ (A, &params[j]))
if (!_slang_cleanup_stack (A, &params[j]))
return GL_FALSE;
}
}
@ -646,6 +646,7 @@ static const struct
{ "float_noise3", slang_asm_float_noise3, slang_asm_float_copy },
{ "float_noise4", slang_asm_float_noise4, slang_asm_float_copy },
{ "int_to_float", slang_asm_int_to_float, slang_asm_float_copy },
{ "vec4_tex2d", slang_asm_vec4_tex2d, slang_asm_none },
/* mesa-specific extensions */
{ "float_print", slang_asm_float_deref, slang_asm_float_print },
{ "int_print", slang_asm_int_deref, slang_asm_int_print },
@ -721,13 +722,13 @@ static GLboolean equality (slang_assemble_ctx *A, slang_operation *op, GLboolean
/* get type of operation */
if (!slang_assembly_typeinfo_construct (&ti))
return GL_FALSE;
if (!_slang_typeof_operation (op, &A->space, &ti, A->atoms))
if (!_slang_typeof_operation (A, op, &ti))
goto end1;
/* convert it to an aggregate */
if (!slang_storage_aggregate_construct (&agg))
goto end1;
if (!_slang_aggregate_variable (&agg, &ti.spec, NULL, A->space.funcs, A->space.structs,
if (!_slang_aggregate_variable (&agg, &ti.spec, 0, A->space.funcs, A->space.structs,
A->space.vars, A->mach, A->file, A->atoms))
goto end;
@ -784,19 +785,19 @@ static GLboolean handle_subscript (slang_assemble_ctx *A, slang_assembly_typeinf
GLuint asize = 0, esize = 0;
/* get type info of the master expression (matrix, vector or an array */
if (!_slang_typeof_operation (&op->children[0], &A->space, tia, A->atoms))
if (!_slang_typeof_operation (A, &op->children[0], tia))
return GL_FALSE;
if (!sizeof_variable (A, &tia->spec, slang_qual_none, tia->array_size, &asize))
if (!sizeof_variable (A, &tia->spec, slang_qual_none, tia->array_len, &asize))
return GL_FALSE;
/* get type info of the result (matrix column, vector row or array element) */
if (!_slang_typeof_operation (op, &A->space, tie, A->atoms))
if (!_slang_typeof_operation (A, op, tie))
return GL_FALSE;
if (!sizeof_variable (A, &tie->spec, slang_qual_none, NULL, &esize))
if (!sizeof_variable (A, &tie->spec, slang_qual_none, 0, &esize))
return GL_FALSE;
/* assemble the master expression */
if (!_slang_assemble_operation_ (A, &op->children[0], ref))
if (!_slang_assemble_operation (A, &op->children[0], ref))
return GL_FALSE;
/* when indexing an l-value swizzle, push the swizzle_tmp */
@ -805,7 +806,7 @@ static GLboolean handle_subscript (slang_assemble_ctx *A, slang_assembly_typeinf
return GL_FALSE;
/* assemble the subscript expression */
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
if (ref == slang_ref_force && tia->is_swizzled)
@ -882,11 +883,11 @@ static GLboolean handle_field (slang_assemble_ctx *A, slang_assembly_typeinfo *t
slang_assembly_typeinfo *tib, slang_operation *op, slang_ref_type ref)
{
/* get type info of the result (field or swizzle) */
if (!_slang_typeof_operation (op, &A->space, tia, A->atoms))
if (!_slang_typeof_operation (A, op, tia))
return GL_FALSE;
/* get type info of the master expression being accessed (struct or vector) */
if (!_slang_typeof_operation (&op->children[0], &A->space, tib, A->atoms))
if (!_slang_typeof_operation (A, &op->children[0], tib))
return GL_FALSE;
/* if swizzling a vector in-place, the swizzle temporary is needed */
@ -895,7 +896,7 @@ static GLboolean handle_field (slang_assemble_ctx *A, slang_assembly_typeinfo *t
return GL_FALSE;
/* assemble the master expression */
if (!_slang_assemble_operation_ (A, &op->children[0], ref))
if (!_slang_assemble_operation (A, &op->children[0], ref))
return GL_FALSE;
/* assemble the field expression */
@ -941,7 +942,7 @@ static GLboolean handle_field (slang_assemble_ctx *A, slang_assembly_typeinfo *t
field = &tib->spec._struct->fields->variables[i];
if (!slang_storage_aggregate_construct (&agg))
return GL_FALSE;
if (!_slang_aggregate_variable (&agg, &field->type.specifier, field->array_size,
if (!_slang_aggregate_variable (&agg, &field->type.specifier, field->array_len,
A->space.funcs, A->space.structs, A->space.vars, A->mach, A->file, A->atoms))
{
slang_storage_aggregate_destruct (&agg);
@ -989,14 +990,8 @@ static GLboolean handle_field (slang_assemble_ctx *A, slang_assembly_typeinfo *t
return GL_TRUE;
}
GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op, slang_ref_type ref)
GLboolean _slang_assemble_operation (slang_assemble_ctx *A, slang_operation *op, slang_ref_type ref)
{
GLuint assem;
assem = A->file->count;
if (!push_new (A->file))
return GL_FALSE;
/* set default results */
A->ref = /*(ref == slang_ref_freelance) ? slang_ref_force : */ref;
A->swz.num_components = 0;
@ -1010,9 +1005,9 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
for (i = 0; i < op->num_children; i++)
{
if (!_slang_assemble_operation_ (A, &op->children[i], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[i], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[i]))
if (!_slang_cleanup_stack (A, &op->children[i]))
return GL_FALSE;
}
}
@ -1032,25 +1027,26 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
{
GLuint i;
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_force))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_force))
return GL_FALSE;
for (i = 1; i < op->num_children; i++)
if (!_slang_assemble_operation_ (A, &op->children[i], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[i], slang_ref_forbid))
return GL_FALSE;
if (!call_asm_instruction (A, op->a_id))
return GL_FALSE;
}
break;
case slang_oper_break:
A->file->code[assem].type = slang_asm_jump;
A->file->code[assem].param[0] = A->flow.loop_end;
if (!PLAB (A->file, slang_asm_jump, A->flow.loop_end))
return GL_FALSE;
break;
case slang_oper_continue:
A->file->code[assem].type = slang_asm_jump;
A->file->code[assem].param[0] = A->flow.loop_start;
if (!PLAB (A->file, slang_asm_jump, A->flow.loop_start))
return GL_FALSE;
break;
case slang_oper_discard:
A->file->code[assem].type = slang_asm_discard;
if (!PUSH (A->file, slang_asm_discard))
return GL_FALSE;
if (!PUSH (A->file, slang_asm_exit))
return GL_FALSE;
break;
@ -1060,7 +1056,7 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
/* push the result's address */
if (!PLAB2 (A->file, slang_asm_local_addr, 0, A->local.ret_size))
return GL_FALSE;
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
A->swz.num_components = 0;
@ -1077,7 +1073,7 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
case slang_oper_expression:
if (ref == slang_ref_force)
return GL_FALSE;
if (!_slang_assemble_operation_ (A, &op->children[0], ref))
if (!_slang_assemble_operation (A, &op->children[0], ref))
return GL_FALSE;
break;
case slang_oper_if:
@ -1101,22 +1097,22 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
case slang_oper_literal_bool:
if (ref == slang_ref_force)
return GL_FALSE;
A->file->code[assem].type = slang_asm_bool_push;
A->file->code[assem].literal = op->literal;
if (!PLIT (A->file, slang_asm_bool_push, op->literal))
return GL_FALSE;
A->ref = slang_ref_forbid;
break;
case slang_oper_literal_int:
if (ref == slang_ref_force)
return GL_FALSE;
A->file->code[assem].type = slang_asm_int_push;
A->file->code[assem].literal = op->literal;
if (!PLIT (A->file, slang_asm_int_push, op->literal))
return GL_FALSE;
A->ref = slang_ref_forbid;
break;
case slang_oper_literal_float:
if (ref == slang_ref_force)
return GL_FALSE;
A->file->code[assem].type = slang_asm_float_push;
A->file->code[assem].literal = op->literal;
if (!PLIT (A->file, slang_asm_float_push, op->literal))
return GL_FALSE;
A->ref = slang_ref_forbid;
break;
case slang_oper_identifier:
@ -1129,7 +1125,7 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
if (var == NULL)
return GL_FALSE;
size = 0;
if (!sizeof_variable (A, &var->type.specifier, slang_qual_none, var->array_size, &size))
if (!sizeof_variable (A, &var->type.specifier, slang_qual_none, var->array_len, &size))
return GL_FALSE;
/* prepare stack for dereferencing */
@ -1164,11 +1160,11 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
case slang_oper_sequence:
if (ref == slang_ref_force)
return GL_FALSE;
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[0]))
if (!_slang_cleanup_stack (A, &op->children[0]))
return GL_FALSE;
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
A->ref = slang_ref_forbid;
break;
@ -1265,18 +1261,18 @@ GLboolean _slang_assemble_operation_ (slang_assemble_ctx *A, slang_operation *op
A->ref = slang_ref_forbid;
break;
case slang_oper_equal:
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
if (!equality (A, op->children, GL_TRUE))
return GL_FALSE;
A->ref = slang_ref_forbid;
break;
case slang_oper_notequal:
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
if (!equality (A, op->children, GL_FALSE))
return GL_FALSE;

View file

@ -73,6 +73,7 @@ typedef enum slang_assembly_type_
slang_asm_addr_deref,
slang_asm_addr_add,
slang_asm_addr_multiply,
slang_asm_vec4_tex2d,
slang_asm_jump,
slang_asm_jump_if_zero,
slang_asm_enter,
@ -179,7 +180,7 @@ slang_function *_slang_locate_function (slang_function_scope *funcs, slang_atom
GLboolean _slang_assemble_function (slang_assemble_ctx *, struct slang_function_ *);
GLboolean _slang_cleanup_stack_ (slang_assemble_ctx *, slang_operation *);
GLboolean _slang_cleanup_stack (slang_assemble_ctx *, slang_operation *);
GLboolean _slang_dereference (slang_assemble_ctx *, slang_operation *);
@ -189,7 +190,7 @@ GLboolean _slang_assemble_function_call (slang_assemble_ctx *, slang_function *,
GLboolean _slang_assemble_function_call_name (slang_assemble_ctx *, const char *, slang_operation *,
GLuint, GLboolean);
GLboolean _slang_assemble_operation_ (slang_assemble_ctx *, struct slang_operation_ *, slang_ref_type);
GLboolean _slang_assemble_operation (slang_assemble_ctx *, struct slang_operation_ *, slang_ref_type);
#ifdef __cplusplus
}

View file

@ -127,12 +127,12 @@ GLboolean _slang_assemble_assignment (slang_assemble_ctx *A, slang_operation *op
if (!slang_assembly_typeinfo_construct (&ti))
return GL_FALSE;
if (!_slang_typeof_operation (op, &A->space, &ti, A->atoms))
if (!_slang_typeof_operation (A, op, &ti))
goto end1;
if (!slang_storage_aggregate_construct (&agg))
goto end1;
if (!_slang_aggregate_variable (&agg, &ti.spec, NULL, A->space.funcs, A->space.structs,
if (!_slang_aggregate_variable (&agg, &ti.spec, 0, A->space.funcs, A->space.structs,
A->space.vars, A->mach, A->file, A->atoms))
goto end;
@ -167,10 +167,10 @@ GLboolean _slang_assemble_assign (slang_assemble_ctx *A, slang_operation *op, co
if (slang_string_compare ("=", oper) == 0)
{
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_force))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_force))
return GL_FALSE;
swz = A->swz;
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
A->swz = swz;
if (!_slang_assemble_assignment (A, op->children))

View file

@ -52,7 +52,7 @@ GLboolean _slang_assemble_logicaland (slang_assemble_ctx *A, slang_operation *op
GLuint zero_jump, end_jump;
/* evaluate left expression */
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
/* jump to pushing 0 if not true */
@ -61,7 +61,7 @@ GLboolean _slang_assemble_logicaland (slang_assemble_ctx *A, slang_operation *op
return GL_FALSE;
/* evaluate right expression */
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
/* jump to the end of the expression */
@ -98,7 +98,7 @@ GLboolean _slang_assemble_logicalor (slang_assemble_ctx *A, slang_operation *op)
GLuint right_jump, end_jump;
/* evaluate left expression */
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
/* jump to evaluation of right expression if not true */
@ -117,7 +117,7 @@ GLboolean _slang_assemble_logicalor (slang_assemble_ctx *A, slang_operation *op)
/* evaluate right expression */
A->file->code[right_jump].param[0] = A->file->count;
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
/* the end of the expression */
@ -144,7 +144,7 @@ GLboolean _slang_assemble_select (slang_assemble_ctx *A, slang_operation *op)
GLuint cond_jump, end_jump;
/* execute condition expression */
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
/* jump to false expression if not true */
@ -153,7 +153,7 @@ GLboolean _slang_assemble_select (slang_assemble_ctx *A, slang_operation *op)
return GL_FALSE;
/* execute true expression */
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
/* jump to the end of the expression */
@ -165,7 +165,7 @@ GLboolean _slang_assemble_select (slang_assemble_ctx *A, slang_operation *op)
A->file->code[cond_jump].param[0] = A->file->count;
/* execute false expression */
if (!_slang_assemble_operation_ (A, &op->children[2], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[2], slang_ref_forbid))
return GL_FALSE;
/* resolve the end of the expression */
@ -199,9 +199,9 @@ GLboolean _slang_assemble_for (slang_assemble_ctx *A, slang_operation *op)
slang_assembly_flow_control save_flow = A->flow;
/* execute initialization statement */
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[0]))
if (!_slang_cleanup_stack (A, &op->children[0]))
return GL_FALSE;
/* skip the "go to the end of the loop" and loop-increment statements */
@ -219,16 +219,16 @@ GLboolean _slang_assemble_for (slang_assemble_ctx *A, slang_operation *op)
cont_label = A->file->count;
/* execute loop-increment statement */
if (!_slang_assemble_operation_ (A, &op->children[2], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[2], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[2]))
if (!_slang_cleanup_stack (A, &op->children[2]))
return GL_FALSE;
/* resolve the condition point */
A->file->code[start_jump].param[0] = A->file->count;
/* execute condition statement */
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
/* jump to the end of the loop if not true */
@ -239,9 +239,9 @@ GLboolean _slang_assemble_for (slang_assemble_ctx *A, slang_operation *op)
/* execute loop body */
A->flow.loop_start = cont_label;
A->flow.loop_end = break_label;
if (!_slang_assemble_operation_ (A, &op->children[3], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[3], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[3]))
if (!_slang_cleanup_stack (A, &op->children[3]))
return GL_FALSE;
A->flow = save_flow;
@ -303,9 +303,9 @@ GLboolean _slang_assemble_do (slang_assemble_ctx *A, slang_operation *op)
/* execute loop body */
A->flow.loop_start = cont_label;
A->flow.loop_end = break_label;
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[0]))
if (!_slang_cleanup_stack (A, &op->children[0]))
return GL_FALSE;
A->flow = save_flow;
@ -313,7 +313,7 @@ GLboolean _slang_assemble_do (slang_assemble_ctx *A, slang_operation *op)
A->file->code[cont_jump].param[0] = A->file->count;
/* execute condition statement */
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid))
return GL_FALSE;
/* jump to the end of the loop if not true */
@ -368,7 +368,7 @@ GLboolean _slang_assemble_while (slang_assemble_ctx *A, slang_operation *op)
A->file->code[skip_jump].param[0] = A->file->count;
/* execute condition statement */
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
/* jump to the end of the loop if not true */
@ -379,9 +379,9 @@ GLboolean _slang_assemble_while (slang_assemble_ctx *A, slang_operation *op)
/* execute loop body */
A->flow.loop_start = A->file->code[skip_jump].param[0];
A->flow.loop_end = break_label;
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[1]))
if (!_slang_cleanup_stack (A, &op->children[1]))
return GL_FALSE;
A->flow = save_flow;
@ -414,7 +414,7 @@ GLboolean _slang_assemble_if (slang_assemble_ctx *A, slang_operation *op)
GLuint cond_jump, else_jump;
/* execute condition statement */
if (!_slang_assemble_operation_ (A, &op->children[0], slang_ref_forbid))
if (!_slang_assemble_operation (A, &op->children[0], slang_ref_forbid))
return GL_FALSE;
/* jump to false-statement if not true */
@ -423,9 +423,9 @@ GLboolean _slang_assemble_if (slang_assemble_ctx *A, slang_operation *op)
return GL_FALSE;
/* execute true-statement */
if (!_slang_assemble_operation_ (A, &op->children[1], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[1], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[1]))
if (!_slang_cleanup_stack (A, &op->children[1]))
return GL_FALSE;
/* skip if-false statement */
@ -437,9 +437,9 @@ GLboolean _slang_assemble_if (slang_assemble_ctx *A, slang_operation *op)
A->file->code[cond_jump].param[0] = A->file->count;
/* execute false-statement */
if (!_slang_assemble_operation_ (A, &op->children[2], slang_ref_forbid/*slang_ref_freelance*/))
if (!_slang_assemble_operation (A, &op->children[2], slang_ref_forbid/*slang_ref_freelance*/))
return GL_FALSE;
if (!_slang_cleanup_stack_ (A, &op->children[2]))
if (!_slang_cleanup_stack (A, &op->children[2]))
return GL_FALSE;
/* resolve end of if-false statement */

View file

@ -155,12 +155,12 @@ static GLboolean constructor_aggregate (slang_assemble_ctx *A, const slang_stora
if (!slang_assembly_typeinfo_construct (&ti))
return GL_FALSE;
if (!_slang_typeof_operation (op, &A->space, &ti, A->atoms))
if (!_slang_typeof_operation (A, op, &ti))
goto end1;
if (!slang_storage_aggregate_construct (&agg))
goto end1;
if (!_slang_aggregate_variable (&agg, &ti.spec, NULL, A->space.funcs, A->space.structs,
if (!_slang_aggregate_variable (&agg, &ti.spec, 0, A->space.funcs, A->space.structs,
A->space.vars, A->mach, A->file, A->atoms))
goto end2;
@ -169,7 +169,7 @@ static GLboolean constructor_aggregate (slang_assemble_ctx *A, const slang_stora
if (!_slang_flatten_aggregate (&flat_agg, &agg))
goto end;
if (!_slang_assemble_operation_ (A, op, slang_ref_forbid))
if (!_slang_assemble_operation (A, op, slang_ref_forbid))
goto end;
for (i = 0; i < flat_agg.count; i++)
@ -205,13 +205,13 @@ GLboolean _slang_assemble_constructor (slang_assemble_ctx *A, slang_operation *o
/* get typeinfo of the constructor (the result of constructor expression) */
if (!slang_assembly_typeinfo_construct (&ti))
return GL_FALSE;
if (!_slang_typeof_operation (op, &A->space, &ti, A->atoms))
if (!_slang_typeof_operation (A, op, &ti))
goto end1;
/* create an aggregate of the constructor */
if (!slang_storage_aggregate_construct (&agg))
goto end1;
if (!_slang_aggregate_variable (&agg, &ti.spec, NULL, A->space.funcs, A->space.structs,
if (!_slang_aggregate_variable (&agg, &ti.spec, 0, A->space.funcs, A->space.structs,
A->space.vars, A->mach, A->file, A->atoms))
goto end2;

View file

@ -38,14 +38,13 @@ GLboolean slang_assembly_typeinfo_construct (slang_assembly_typeinfo *ti)
{
if (!slang_type_specifier_construct (&ti->spec))
return GL_FALSE;
ti->array_size = NULL;
ti->array_len = 0;
return GL_TRUE;
}
GLvoid slang_assembly_typeinfo_destruct (slang_assembly_typeinfo *ti)
{
slang_type_specifier_destruct (&ti->spec);
/* do not free ti->array_size */
}
/* _slang_typeof_operation() */
@ -63,7 +62,13 @@ static GLboolean typeof_existing_function (const char *name, slang_operation *pa
return exists;
}
GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_space *space,
GLboolean _slang_typeof_operation (slang_assemble_ctx *A, slang_operation *op,
slang_assembly_typeinfo *ti)
{
return _slang_typeof_operation_ (op, &A->space, ti, A->atoms);
}
GLboolean _slang_typeof_operation_ (slang_operation *op, slang_assembly_name_space *space,
slang_assembly_typeinfo *ti, slang_atom_pool *atoms)
{
ti->can_be_referenced = GL_FALSE;
@ -94,7 +99,7 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
case slang_oper_divassign:
case slang_oper_preincrement:
case slang_oper_predecrement:
if (!_slang_typeof_operation (op->children, space, ti, atoms))
if (!_slang_typeof_operation_ (op->children, space, ti, atoms))
return 0;
break;
case slang_oper_literal_bool:
@ -126,12 +131,12 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
if (!slang_type_specifier_copy (&ti->spec, &var->type.specifier))
return GL_FALSE;
ti->can_be_referenced = GL_TRUE;
ti->array_size = var->array_size;
ti->array_len = var->array_len;
}
break;
case slang_oper_sequence:
/* TODO: check [0] and [1] if they match */
if (!_slang_typeof_operation (&op->children[1], space, ti, atoms))
if (!_slang_typeof_operation_ (&op->children[1], space, ti, atoms))
return GL_FALSE;
ti->can_be_referenced = GL_FALSE;
ti->is_swizzled = GL_FALSE;
@ -144,7 +149,7 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
/*case slang_oper_andassign:*/
case slang_oper_select:
/* TODO: check [1] and [2] if they match */
if (!_slang_typeof_operation (&op->children[1], space, ti, atoms))
if (!_slang_typeof_operation_ (&op->children[1], space, ti, atoms))
return GL_FALSE;
ti->can_be_referenced = GL_FALSE;
ti->is_swizzled = GL_FALSE;
@ -172,7 +177,7 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
break;
/*case slang_oper_modulus:*/
case slang_oper_plus:
if (!_slang_typeof_operation (op->children, space, ti, atoms))
if (!_slang_typeof_operation_ (op->children, space, ti, atoms))
return GL_FALSE;
ti->can_be_referenced = GL_FALSE;
ti->is_swizzled = GL_FALSE;
@ -188,7 +193,7 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
if (!slang_assembly_typeinfo_construct (&_ti))
return GL_FALSE;
if (!_slang_typeof_operation (op->children, space, &_ti, atoms))
if (!_slang_typeof_operation_ (op->children, space, &_ti, atoms))
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
@ -259,7 +264,7 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
if (!slang_assembly_typeinfo_construct (&_ti))
return GL_FALSE;
if (!_slang_typeof_operation (op->children, space, &_ti, atoms))
if (!_slang_typeof_operation_ (op->children, space, &_ti, atoms))
{
slang_assembly_typeinfo_destruct (&_ti);
return GL_FALSE;
@ -374,7 +379,7 @@ GLboolean _slang_typeof_operation (slang_operation *op, slang_assembly_name_spac
break;
case slang_oper_postincrement:
case slang_oper_postdecrement:
if (!_slang_typeof_operation (op->children, space, ti, atoms))
if (!_slang_typeof_operation_ (op->children, space, ti, atoms))
return GL_FALSE;
ti->can_be_referenced = GL_FALSE;
ti->is_swizzled = GL_FALSE;

View file

@ -38,7 +38,7 @@ typedef struct slang_assembly_typeinfo_
GLboolean is_swizzled;
slang_swizzle swz;
slang_type_specifier spec;
slang_operation *array_size;
GLuint array_len;
} slang_assembly_typeinfo;
GLboolean slang_assembly_typeinfo_construct (slang_assembly_typeinfo *);
@ -49,7 +49,8 @@ GLvoid slang_assembly_typeinfo_destruct (slang_assembly_typeinfo *);
* Returns GL_TRUE on success.
* Returns GL_FALSE otherwise.
*/
GLboolean _slang_typeof_operation (slang_operation *, slang_assembly_name_space *,
GLboolean _slang_typeof_operation (slang_assemble_ctx *, slang_operation *, slang_assembly_typeinfo *);
GLboolean _slang_typeof_operation_ (slang_operation *, slang_assembly_name_space *,
slang_assembly_typeinfo *, slang_atom_pool *);
/*

View file

@ -134,7 +134,9 @@ int slang_translation_unit_construct2 (slang_translation_unit *unit, slang_assem
unit->machine = mach;
unit->free_machine = 0;
unit->atom_pool = atoms;
unit->free_atom_pool = 0;
unit->free_atom_pool = 0;
slang_export_data_table_ctr (&unit->exp_data);
slang_active_uniforms_ctr (&unit->uniforms);
return 1;
}
@ -156,7 +158,9 @@ void slang_translation_unit_destruct (slang_translation_unit *unit)
{
slang_atom_pool_destruct (unit->atom_pool);
slang_alloc_free (unit->atom_pool);
}
}
slang_active_uniforms_dtr (&unit->uniforms);
slang_export_data_table_dtr (&unit->exp_data);
}
/* slang_info_log */
@ -349,44 +353,99 @@ static int check_revision (slang_parse_ctx *C)
static int parse_statement (slang_parse_ctx *, slang_output_ctx *, slang_operation *);
static int parse_expression (slang_parse_ctx *, slang_output_ctx *, slang_operation *);
static int parse_type_specifier (slang_parse_ctx *, slang_output_ctx *, slang_type_specifier *);
static int parse_type_specifier (slang_parse_ctx *, slang_output_ctx *, slang_type_specifier *);
static GLboolean parse_array_len (slang_parse_ctx *C, slang_output_ctx *O, GLuint *len)
{
slang_operation array_size;
slang_assembly_name_space space;
GLboolean result;
if (!slang_operation_construct (&array_size))
return GL_FALSE;
if (!parse_expression (C, O, &array_size))
{
slang_operation_destruct (&array_size);
return GL_FALSE;
}
space.funcs = O->funs;
space.structs = O->structs;
space.vars = O->vars;
result = _slang_evaluate_int (O->assembly, O->machine, &space, &array_size, len, C->atoms);
slang_operation_destruct (&array_size);
return result;
}
static GLboolean calculate_var_size (slang_parse_ctx *C, slang_output_ctx *O, slang_variable *var)
{
slang_storage_aggregate agg;
if (!slang_storage_aggregate_construct (&agg))
return GL_FALSE;
if (!_slang_aggregate_variable (&agg, &var->type.specifier, var->array_len, O->funs, O->structs,
O->vars, O->machine, O->assembly, C->atoms))
{
slang_storage_aggregate_destruct (&agg);
return GL_FALSE;
}
var->size = _slang_sizeof_aggregate (&agg);
slang_storage_aggregate_destruct (&agg);
return GL_TRUE;
}
static GLboolean convert_to_array (slang_parse_ctx *C, slang_variable *var,
const slang_type_specifier *sp)
{
/* sized array - mark it as array, copy the specifier to the array element and
* parse the expression */
var->type.specifier.type = slang_spec_array;
var->type.specifier._array = (slang_type_specifier *) slang_alloc_malloc (sizeof (
slang_type_specifier));
if (var->type.specifier._array == NULL)
{
slang_info_log_memory (C->L);
return GL_FALSE;
}
if (!slang_type_specifier_construct (var->type.specifier._array))
{
slang_alloc_free (var->type.specifier._array);
var->type.specifier._array = NULL;
slang_info_log_memory (C->L);
return GL_FALSE;
}
return slang_type_specifier_copy (var->type.specifier._array, sp);
}
/* structure field */
#define FIELD_NONE 0
#define FIELD_NEXT 1
#define FIELD_ARRAY 2
static int parse_struct_field_var (slang_parse_ctx *C, slang_output_ctx *O, slang_variable *var)
{
static GLboolean parse_struct_field_var (slang_parse_ctx *C, slang_output_ctx *O, slang_variable *var,
const slang_type_specifier *sp)
{
var->a_name = parse_identifier (C);
if (var->a_name == SLANG_ATOM_NULL)
return 0;
return GL_FALSE;
switch (*C->I++)
{
case FIELD_NONE:
case FIELD_NONE:
if (!slang_type_specifier_copy (&var->type.specifier, sp))
return GL_FALSE;
break;
case FIELD_ARRAY:
var->array_size = (slang_operation *) slang_alloc_malloc (sizeof (slang_operation));
if (var->array_size == NULL)
{
slang_info_log_memory (C->L);
return 0;
}
if (!slang_operation_construct (var->array_size))
{
slang_alloc_free (var->array_size);
var->array_size = NULL;
return 0;
}
if (!parse_expression (C, O, var->array_size))
return 0;
case FIELD_ARRAY:
if (!convert_to_array (C, var, sp))
return GL_FALSE;
if (!parse_array_len (C, O, &var->array_len))
return GL_FALSE;
break;
default:
return 0;
return GL_FALSE;
}
return 1;
return calculate_var_size (C, O, var);
}
static int parse_struct_field (slang_parse_ctx *C, slang_output_ctx *O, slang_struct *st,
@ -413,9 +472,7 @@ static int parse_struct_field (slang_parse_ctx *C, slang_output_ctx *O, slang_st
if (!slang_variable_construct (var))
return 0;
st->fields->num_variables++;
if (!slang_type_specifier_copy (&var->type.specifier, sp))
return 0;
if (!parse_struct_field_var (C, &o, var))
if (!parse_struct_field_var (C, &o, var, sp))
return 0;
}
while (*C->I++ != FIELD_NONE);
@ -467,7 +524,8 @@ static int parse_struct (slang_parse_ctx *C, slang_output_ctx *O, slang_struct *
{
slang_type_specifier_destruct (&sp);
return 0;
}
}
slang_type_specifier_destruct (&sp);
}
while (*C->I++ != FIELD_NONE);
@ -1215,8 +1273,6 @@ static int parse_expression (slang_parse_ctx *C, slang_output_ctx *O, slang_oper
static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
slang_variable *param)
{
slang_storage_aggregate agg;
/* parse and validate the parameter's type qualifiers (there can be two at most) because
* not all combinations are valid */
if (!parse_type_qualifier (C, &param->type.qualifier))
@ -1261,36 +1317,30 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
/* if the parameter is an array, parse its size (the size must be explicitly defined */
if (*C->I++ == PARAMETER_ARRAY_PRESENT)
{
param->array_size = (slang_operation *) slang_alloc_malloc (sizeof (slang_operation));
if (param->array_size == NULL)
{
slang_info_log_memory (C->L);
return 0;
}
if (!slang_operation_construct (param->array_size))
{
slang_alloc_free (param->array_size);
param->array_size = NULL;
slang_info_log_memory (C->L);
return 0;
}
if (!parse_expression (C, O, param->array_size))
return 0;
/* TODO: execute the array_size */
{
slang_type_specifier p;
if (!slang_type_specifier_construct (&p))
return GL_FALSE;
if (!slang_type_specifier_copy (&p, &param->type.specifier))
{
slang_type_specifier_destruct (&p);
return GL_FALSE;
}
if (!convert_to_array (C, param, &p))
{
slang_type_specifier_destruct (&p);
return GL_FALSE;
}
slang_type_specifier_destruct (&p);
if (!parse_array_len (C, O, &param->array_len))
return GL_FALSE;
}
/* calculate the parameter size */
if (!slang_storage_aggregate_construct (&agg))
return 0;
if (!_slang_aggregate_variable (&agg, &param->type.specifier, param->array_size, O->funs,
O->structs, O->vars, O->machine, O->assembly, C->atoms))
{
slang_storage_aggregate_destruct (&agg);
return 0;
}
param->size = _slang_sizeof_aggregate (&agg);
slang_storage_aggregate_destruct (&agg);
if (!calculate_var_size (C, O, param))
return GL_FALSE;
/* TODO: allocate the local address here? */
return 1;
}
@ -1551,7 +1601,7 @@ static GLboolean initialize_global (slang_assemble_ctx *A, slang_variable *var)
op_assign.children[1] = *var->initializer;
/* insert the actual expression */
result = _slang_assemble_operation_ (A, &op_assign, slang_ref_forbid);
result = _slang_assemble_operation (A, &op_assign, slang_ref_forbid);
/* carefully destroy the operations */
op_assign.num_children = 0;
@ -1649,79 +1699,29 @@ static int parse_init_declarator (slang_parse_ctx *C, slang_output_ctx *O,
}
if (!parse_expression (C, O, var->initializer))
return 0;
/* TODO: execute the initializer */
break;
#if 0
case VARIABLE_ARRAY_UNKNOWN:
/* unsized array - mark it as array and copy the specifier to the array element */
var->type.specifier.type = slang_spec_array;
var->type.specifier._array = (slang_type_specifier *) slang_alloc_malloc (sizeof (
slang_type_specifier));
if (var->type.specifier._array == NULL)
{
slang_info_log_memory (C->L);
return 0;
}
slang_type_specifier_construct (var->type.specifier._array);
if (!slang_type_specifier_copy (var->type.specifier._array, &type->specifier))
return 0;
if (!convert_to_array (C, var, &type->specifier))
return GL_FALSE;
break;
#endif
case VARIABLE_ARRAY_EXPLICIT:
/* sized array - mark it as array, copy the specifier to the array element and
* parse the expression */
var->type.specifier.type = slang_spec_array;
var->type.specifier._array = (slang_type_specifier *) slang_alloc_malloc (sizeof (
slang_type_specifier));
if (var->type.specifier._array == NULL)
{
slang_info_log_memory (C->L);
return 0;
}
if (!slang_type_specifier_construct (var->type.specifier._array))
{
slang_alloc_free (var->type.specifier._array);
var->type.specifier._array = NULL;
slang_info_log_memory (C->L);
return 0;
}
if (!slang_type_specifier_copy (var->type.specifier._array, &type->specifier))
return 0;
var->array_size = (slang_operation *) slang_alloc_malloc (sizeof (slang_operation));
if (var->array_size == NULL)
{
slang_info_log_memory (C->L);
return 0;
}
if (!slang_operation_construct (var->array_size))
{
slang_alloc_free (var->array_size);
var->array_size = NULL;
slang_info_log_memory (C->L);
return 0;
}
if (!parse_expression (C, O, var->array_size))
return 0;
if (!convert_to_array (C, var, &type->specifier))
return GL_FALSE;
if (!parse_array_len (C, O, &var->array_len))
return GL_FALSE;
break;
default:
return 0;
}
/* allocate global address space for a variable with a known size */
if (C->global_scope && !(var->type.specifier.type == slang_spec_array && var->array_size == NULL))
if (C->global_scope && !(var->type.specifier.type == slang_spec_array && var->array_len == 0))
{
slang_storage_aggregate agg;
if (!slang_storage_aggregate_construct (&agg))
return 0;
if (!_slang_aggregate_variable (&agg, &var->type.specifier, var->array_size, O->funs,
O->structs, O->vars, O->machine, O->assembly, C->atoms))
{
slang_storage_aggregate_destruct (&agg);
return 0;
}
var->size = _slang_sizeof_aggregate (&agg);
slang_storage_aggregate_destruct (&agg);
if (!calculate_var_size (C, O, var))
return GL_FALSE;
var->address = slang_var_pool_alloc (O->global_pool, var->size);
}
@ -2132,8 +2132,16 @@ int _slang_compile (const char *source, slang_translation_unit *unit, slang_unit
slang_translation_unit_destruct (&builtin_units[i]);
}*/
if (id != 0)
grammar_destroy (id);
grammar_destroy (id);
if (!success)
return 0;
unit->exp_data.atoms = unit->atom_pool;
if (!_slang_build_export_data_table (&unit->exp_data, &unit->globals))
return 0;
if (!_slang_gather_active_uniforms (&unit->uniforms, &unit->exp_data))
return 0;
return success;
return 1;
}

View file

@ -60,7 +60,9 @@ typedef struct slang_translation_unit_
struct slang_machine_ *machine;
int free_machine;
slang_atom_pool *atom_pool;
int free_atom_pool;
int free_atom_pool;
slang_export_data_table exp_data;
slang_active_uniforms uniforms;
} slang_translation_unit;
int slang_translation_unit_construct (slang_translation_unit *);

View file

@ -172,9 +172,8 @@ int slang_struct_equal (const slang_struct *x, const slang_struct *y)
if (!slang_type_specifier_equal (&varx->type.specifier, &vary->type.specifier))
return 0;
if (varx->type.specifier.type == slang_spec_array)
{
/* TODO: compare array sizes */
}
if (varx->array_len != vary->array_len)
return GL_FALSE;
}
return 1;
}

View file

@ -269,7 +269,7 @@ int slang_variable_construct (slang_variable *var)
if (!slang_fully_specified_type_construct (&var->type))
return 0;
var->a_name = SLANG_ATOM_NULL;
var->array_size = NULL;
var->array_len = 0;
var->initializer = NULL;
var->address = ~0;
var->size = 0;
@ -280,11 +280,6 @@ int slang_variable_construct (slang_variable *var)
void slang_variable_destruct (slang_variable *var)
{
slang_fully_specified_type_destruct (&var->type);
if (var->array_size != NULL)
{
slang_operation_destruct (var->array_size);
slang_alloc_free (var->array_size);
}
if (var->initializer != NULL)
{
slang_operation_destruct (var->initializer);
@ -304,26 +299,7 @@ int slang_variable_copy (slang_variable *x, const slang_variable *y)
return 0;
}
z.a_name = y->a_name;
if (y->array_size != NULL)
{
z.array_size = (slang_operation *) slang_alloc_malloc (sizeof (slang_operation));
if (z.array_size == NULL)
{
slang_variable_destruct (&z);
return 0;
}
if (!slang_operation_construct (z.array_size))
{
slang_alloc_free (z.array_size);
slang_variable_destruct (&z);
return 0;
}
if (!slang_operation_copy (z.array_size, y->array_size))
{
slang_variable_destruct (&z);
return 0;
}
}
z.array_len = y->array_len;
if (y->initializer != NULL)
{
z.initializer = (slang_operation *) slang_alloc_malloc (sizeof (slang_operation));
@ -364,3 +340,192 @@ slang_variable *_slang_locate_variable (slang_variable_scope *scope, slang_atom
return NULL;
}
/*
* slang_active_uniforms
*/
GLvoid slang_active_uniforms_ctr (slang_active_uniforms *self)
{
self->table = NULL;
self->count = 0;
}
GLvoid slang_active_uniforms_dtr (slang_active_uniforms *self)
{
GLuint i;
for (i = 0; i < self->count; i++)
slang_alloc_free (self->table[i].name);
slang_alloc_free (self->table);
}
GLboolean slang_active_uniforms_add (slang_active_uniforms *self, slang_export_data_quant *q,
const char *name)
{
const GLuint n = self->count;
self->table = (slang_active_uniform *) slang_alloc_realloc (self->table,
n * sizeof (slang_active_uniform), (n + 1) * sizeof (slang_active_uniform));
if (self->table == NULL)
return GL_FALSE;
self->table[n].quant = q;
self->table[n].name = slang_string_duplicate (name);
if (self->table[n].name == NULL)
return GL_FALSE;
self->count++;
return GL_TRUE;
}
static GLenum gl_type_from_specifier (const slang_type_specifier *type)
{
switch (type->type)
{
case slang_spec_bool:
return GL_BOOL_ARB;
case slang_spec_bvec2:
return GL_BOOL_VEC2_ARB;
case slang_spec_bvec3:
return GL_BOOL_VEC3_ARB;
case slang_spec_bvec4:
return GL_BOOL_VEC4_ARB;
case slang_spec_int:
return GL_INT;
case slang_spec_ivec2:
return GL_INT_VEC2_ARB;
case slang_spec_ivec3:
return GL_INT_VEC3_ARB;
case slang_spec_ivec4:
return GL_INT_VEC4_ARB;
case slang_spec_float:
return GL_FLOAT;
case slang_spec_vec2:
return GL_FLOAT_VEC2_ARB;
case slang_spec_vec3:
return GL_FLOAT_VEC3_ARB;
case slang_spec_vec4:
return GL_FLOAT_VEC4_ARB;
case slang_spec_mat2:
return GL_FLOAT_MAT2_ARB;
case slang_spec_mat3:
return GL_FLOAT_MAT3_ARB;
case slang_spec_mat4:
return GL_FLOAT_MAT4_ARB;
case slang_spec_sampler1D:
return GL_SAMPLER_1D_ARB;
case slang_spec_sampler2D:
return GL_SAMPLER_2D_ARB;
case slang_spec_sampler3D:
return GL_SAMPLER_3D_ARB;
case slang_spec_samplerCube:
return GL_SAMPLER_CUBE_ARB;
case slang_spec_sampler1DShadow:
return GL_SAMPLER_1D_SHADOW_ARB;
case slang_spec_sampler2DShadow:
return GL_SAMPLER_2D_SHADOW_ARB;
case slang_spec_array:
return gl_type_from_specifier (type->_array);
default:
return GL_FLOAT;
}
}
static GLboolean build_quant (slang_export_data_quant *q, slang_variable *var)
{
slang_type_specifier *spec = &var->type.specifier;
q->name = var->a_name;
q->size = var->size;
if (spec->type == slang_spec_array)
{
q->array_len = var->array_len;
q->size /= var->array_len;
spec = spec->_array;
}
if (spec->type == slang_spec_struct)
{
GLuint i;
q->u.field_count = spec->_struct->fields->num_variables;
q->structure = (slang_export_data_quant *) slang_alloc_malloc (
q->u.field_count * sizeof (slang_export_data_quant));
if (q->structure == NULL)
return GL_FALSE;
for (i = 0; i < q->u.field_count; i++)
slang_export_data_quant_ctr (&q->structure[i]);
for (i = 0; i < q->u.field_count; i++)
if (!build_quant (&q->structure[i], &spec->_struct->fields->variables[i]))
return GL_FALSE;
}
else
q->u.basic_type = gl_type_from_specifier (spec);
return GL_TRUE;
}
GLboolean _slang_build_export_data_table (slang_export_data_table *tbl, slang_variable_scope *vars)
{
GLuint i;
for (i = 0; i < vars->num_variables; i++)
{
slang_variable *var = &vars->variables[i];
if (var->type.qualifier == slang_qual_uniform)
{
slang_export_data_entry *e = slang_export_data_table_add (tbl);
if (e == NULL)
return GL_FALSE;
if (!build_quant (&e->quant, var))
return GL_FALSE;
e->access = slang_exp_uniform;
e->address = var->address;
}
}
if (vars->outer_scope != NULL)
return _slang_build_export_data_table (tbl, vars->outer_scope);
return GL_TRUE;
}
static GLboolean insert_uniform (slang_active_uniforms *u, slang_export_data_quant *q, char *name,
slang_atom_pool *atoms)
{
slang_string_concat (name, slang_atom_pool_id (atoms, q->name));
if (q->array_len != 0)
slang_string_concat (name, "[0]");
if (q->structure != NULL)
{
GLuint save, i;
slang_string_concat (name, ".");
save = slang_string_length (name);
for (i = 0; i < q->u.field_count; i++)
{
if (!insert_uniform (u, &q->structure[i], name, atoms))
return GL_FALSE;
name[save] = '\0';
}
return GL_TRUE;
}
return slang_active_uniforms_add (u, q, name);
}
GLboolean _slang_gather_active_uniforms (slang_active_uniforms *u, slang_export_data_table *tbl)
{
GLuint i;
for (i = 0; i < tbl->count; i++)
{
char name[1024] = "";
if (!insert_uniform (u, &tbl->entries[i].quant, name, tbl->atoms))
return GL_FALSE;
}
return GL_TRUE;
}

View file

@ -25,6 +25,8 @@
#if !defined SLANG_COMPILE_VARIABLE_H
#define SLANG_COMPILE_VARIABLE_H
#include "slang_export.h"
#if defined __cplusplus
extern "C" {
#endif
@ -110,7 +112,7 @@ typedef struct slang_variable_
{
slang_fully_specified_type type;
slang_atom a_name;
struct slang_operation_ *array_size; /* type: spec_array */
GLuint array_len; /* type: spec_array */
struct slang_operation_ *initializer;
unsigned int address;
unsigned int size;
@ -123,6 +125,27 @@ int slang_variable_copy (slang_variable *, const slang_variable *);
slang_variable *_slang_locate_variable (slang_variable_scope *, slang_atom a_name, GLboolean all);
typedef struct
{
slang_export_data_quant *quant;
char *name;
} slang_active_uniform;
typedef struct
{
slang_active_uniform *table;
GLuint count;
} slang_active_uniforms;
GLvoid slang_active_uniforms_ctr (slang_active_uniforms *);
GLvoid slang_active_uniforms_dtr (slang_active_uniforms *);
GLboolean slang_active_uniforms_add (slang_active_uniforms *, slang_export_data_quant *,
const char *);
GLboolean _slang_build_export_data_table (slang_export_data_table *, slang_variable_scope *);
GLboolean _slang_gather_active_uniforms (slang_active_uniforms *, slang_export_data_table *);
#ifdef __cplusplus
}
#endif

View file

@ -29,6 +29,9 @@
*/
#include "imports.h"
#include "context.h"
#include "swrast/s_context.h"
#include "colormac.h"
#include "slang_utility.h"
#include "slang_assemble.h"
#include "slang_storage.h"
@ -180,6 +183,9 @@ static void dump_instruction (FILE *f, slang_assembly *a, unsigned int i)
case slang_asm_addr_multiply:
fprintf (f, "addr_multiply");
break;
case slang_vec4_tex2d:
fprintf (f, "vec4_tex2d");
break;
case slang_asm_jump:
fprintf (f, "jump\t%u", a->param[0]);
break;
@ -251,6 +257,21 @@ static void dump (const slang_assembly_file *file)
#endif
static void fetch_texel (GLuint sampler, const GLfloat texcoord[4], GLfloat lambda, GLfloat color[4])
{
GET_CURRENT_CONTEXT(ctx);
SWcontext *swrast = SWRAST_CONTEXT(ctx);
GLchan rgba[4];
/* XXX: the function pointer is NULL! */
swrast->TextureSample[sampler] (ctx, ctx->Texture.Unit[sampler]._Current, 1,
(const GLfloat (*)[4]) texcoord, &lambda, &rgba);
color[0] = CHAN_TO_FLOAT(rgba[0]);
color[1] = CHAN_TO_FLOAT(rgba[1]);
color[2] = CHAN_TO_FLOAT(rgba[2]);
color[3] = CHAN_TO_FLOAT(rgba[3]);
}
int _slang_execute2 (const slang_assembly_file *file, slang_machine *mach)
{
slang_machine_slot *stack;
@ -420,6 +441,16 @@ int _slang_execute2 (const slang_assembly_file *file, slang_machine *mach)
stack[mach->sp + 1]._addr *= stack[mach->sp]._addr;
mach->sp++;
break;
case slang_asm_vec4_tex2d:
{
GLfloat st[4] = { stack[mach->sp]._float, stack[mach->sp + 1]._float, 0.0f, 1.0f };
GLuint sampler = (GLuint) stack[mach->sp + 2]._float;
GLfloat *rgba = &mach->mem[stack[mach->sp + 3]._addr / 4]._float;
fetch_texel (sampler, st, 0.0f, rgba);
}
mach->sp += 3;
break;
case slang_asm_jump:
mach->ip = a->param[0];
break;

View file

@ -0,0 +1,292 @@
/*
* 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_utility.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];
}
/*
* 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_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 < q->array_len;
case EXTRACT_STRUCT:
return q->structure != NULL;
case EXTRACT_STRUCT_ARRAY:
return q->structure != NULL && element < q->array_len;
}
return GL_FALSE;
}
static GLuint calculate_offset (slang_export_data_quant *q, GLuint element)
{
if (q->array_len != 0)
return element * q->size;
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;
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 < q->u.field_count; i++)
if (q->structure[i].name == atom)
{
if (!validate_extracted (&q->structure[i], element, result))
return GL_FALSE;
*offset += calculate_offset (&q->structure[i], element);
if (result == EXTRACT_BASIC || result == EXTRACT_ARRAY)
{
if (*end != '\0')
return GL_FALSE;
*quant = &q->structure[i];
return GL_TRUE;
}
return find_exported_data (&q->structure[i], end, quant, offset, atoms);
}
return GL_FALSE;
}
GLboolean _slang_find_exported_data (slang_export_data_table *table, const char *name,
slang_export_data_entry **entry, slang_export_data_quant **quant, GLuint *offset)
{
char parsed[EXTRACT_MAXLEN];
GLuint result, element, i;
const char *end;
slang_atom atom;
result = extract_name (name, parsed, &element, &end);
if (result == EXTRACT_ERROR)
return GL_FALSE;
atom = slang_atom_pool_atom (table->atoms, parsed);
if (atom == SLANG_ATOM_NULL)
return GL_FALSE;
for (i = 0; i < table->count; i++)
if (table->entries[i].quant.name == atom)
{
if (!validate_extracted (&table->entries[i].quant, element, result))
return GL_FALSE;
*entry = &table->entries[i];
*offset = calculate_offset (&table->entries[i].quant, element);
if (result == EXTRACT_BASIC || result == EXTRACT_ARRAY)
{
if (*end != '\0')
return GL_FALSE;
*quant = &table->entries[i].quant;
return GL_TRUE;
}
return find_exported_data (&table->entries[i].quant, end, quant, offset, table->atoms);
}
return GL_FALSE;
}

View file

@ -0,0 +1,114 @@
/*
* 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
#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.
* 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 *);
/*
* 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. Holds <count> elements in <entries> array.
*/
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 *);
/*
* _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

View file

@ -0,0 +1,186 @@
/*
* Mesa 3-D graphics library
* Version: 6.5
*
* Copyright (C) 2006 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/**
* \file slang_link.c
* slang linker
* \author Michal Krol
*/
#include "imports.h"
#include "slang_utility.h"
#include "slang_compile.h"
#include "slang_export.h"
#include "slang_link.h"
/*
* slang_uniform_bindings
*/
static GLvoid slang_uniform_bindings_ctr (slang_uniform_bindings *self)
{
self->table = NULL;
self->count = 0;
}
static GLvoid slang_uniform_bindings_dtr (slang_uniform_bindings *self)
{
GLuint i;
for (i = 0; i < self->count; i++)
slang_alloc_free (self->table[i].name);
slang_alloc_free (self->table);
}
static GLboolean slang_uniform_bindings_add (slang_uniform_bindings *self, slang_export_data_quant *q,
const char *name, GLuint index, GLuint address)
{
const GLuint n = self->count;
GLuint i;
for (i = 0; i < n; i++)
if (slang_string_compare (self->table[i].name, name) == 0)
{
self->table[i].address[index] = address;
return GL_TRUE;
}
self->table = (slang_uniform_binding *) slang_alloc_realloc (self->table,
n * sizeof (slang_uniform_binding), (n + 1) * sizeof (slang_uniform_binding));
if (self->table == NULL)
return GL_FALSE;
self->table[n].quant = q;
self->table[n].name = slang_string_duplicate (name);
for (i = 0; i < SLANG_UNIFORM_BINDING_MAX; i++)
self->table[n].address[i] = ~0;
self->table[n].address[index] = address;
if (self->table[n].name == NULL)
return GL_FALSE;
self->count++;
return GL_TRUE;
}
static GLboolean insert_binding (slang_uniform_bindings *bind, slang_export_data_quant *q,
char *name, slang_atom_pool *atoms, GLuint index, GLuint addr)
{
GLuint count, i;
slang_string_concat (name, slang_atom_pool_id (atoms, q->name));
if (q->array_len == 0)
count = 1;
else
count = q->array_len;
for (i = 0; i < count; i++)
{
GLuint save;
save = slang_string_length (name);
if (q->array_len != 0)
_mesa_sprintf (name + slang_string_length (name), "[%d]", i);
if (q->structure != NULL)
{
GLuint save, i;
slang_string_concat (name, ".");
save = slang_string_length (name);
for (i = 0; i < q->u.field_count; i++)
{
if (!insert_binding (bind, &q->structure[i], name, atoms, index, addr))
return GL_FALSE;
name[save] = '\0';
addr += q->structure[i].size;
}
}
else
{
if (!slang_uniform_bindings_add (bind, q, name, index, addr))
return GL_FALSE;
addr += q->size;
}
name[save] = '\0';
}
return GL_TRUE;
}
static GLboolean gather_uniform_bindings (slang_uniform_bindings *bind, slang_export_data_table *tbl,
GLuint index)
{
GLuint i;
for (i = 0; i < tbl->count; i++)
{
char name[1024] = "";
if (!insert_binding (bind, &tbl->entries[i].quant, name, tbl->atoms, index,
tbl->entries[i].address))
return GL_FALSE;
}
return GL_TRUE;
}
/*
* slang_program
*/
GLvoid slang_program_ctr (slang_program *self)
{
slang_uniform_bindings_ctr (&self->uniforms);
}
GLvoid slang_program_dtr (slang_program *self)
{
slang_uniform_bindings_dtr (&self->uniforms);
}
/*
* _slang_link()
*/
GLboolean _slang_link (slang_program *prog, slang_translation_unit **units, GLuint count)
{
GLuint i;
for (i = 0; i < count; i++)
{
GLuint index;
if (units[i]->type == slang_unit_fragment_shader)
index = SLANG_UNIFORM_BINDING_FRAGMENT;
else
index = SLANG_UNIFORM_BINDING_VERTEX;
if (!gather_uniform_bindings (&prog->uniforms, &units[i]->exp_data, index))
return GL_FALSE;
prog->machines[index] = units[i]->machine;
}
return GL_TRUE;
}

View file

@ -0,0 +1,68 @@
/*
* 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_assemble.h"
#include "slang_execute.h"
#if defined __cplusplus
extern "C" {
#endif
#define SLANG_UNIFORM_BINDING_VERTEX 0
#define SLANG_UNIFORM_BINDING_FRAGMENT 1
#define SLANG_UNIFORM_BINDING_MAX 2
typedef struct
{
slang_export_data_quant *quant;
char *name;
GLuint address[SLANG_UNIFORM_BINDING_MAX];
} slang_uniform_binding;
typedef struct
{
slang_uniform_binding *table;
GLuint count;
} slang_uniform_bindings;
typedef struct
{
slang_uniform_bindings uniforms;
slang_machine *machines[SLANG_UNIFORM_BINDING_MAX];
} slang_program;
GLvoid slang_program_ctr (slang_program *);
GLvoid slang_program_dtr (slang_program *);
GLboolean _slang_link (slang_program *, slang_translation_unit **, GLuint);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -130,13 +130,13 @@ static GLboolean aggregate_variables (slang_storage_aggregate *agg, slang_variab
for (i = 0; i < vars->num_variables; i++)
if (!_slang_aggregate_variable (agg, &vars->variables[i].type.specifier,
vars->variables[i].array_size, funcs, structs, globals, mach, file, atoms))
vars->variables[i].array_len, funcs, structs, globals, mach, file, atoms))
return GL_FALSE;
return GL_TRUE;
}
static GLboolean eval_array_size (slang_assembly_file *file, slang_machine *pmach,
slang_assembly_name_space *space, slang_operation *array_size, GLuint *plength,
GLboolean _slang_evaluate_int (slang_assembly_file *file, slang_machine *pmach,
slang_assembly_name_space *space, slang_operation *array_size, GLuint *pint,
slang_atom_pool *atoms)
{
slang_assembly_file_restore_point point;
@ -166,7 +166,7 @@ static GLboolean eval_array_size (slang_assembly_file *file, slang_machine *pmac
return GL_FALSE;
/* insert the actual expression */
if (!_slang_assemble_operation_ (&A, array_size, slang_ref_forbid))
if (!_slang_assemble_operation (&A, array_size, slang_ref_forbid))
return GL_FALSE;
if (!slang_assembly_file_push (file, slang_asm_exit))
return GL_FALSE;
@ -176,8 +176,7 @@ static GLboolean eval_array_size (slang_assembly_file *file, slang_machine *pmac
return GL_FALSE;
/* the evaluated expression is on top of the stack */
*plength = (GLuint) mach.mem[mach.sp + SLANG_MACHINE_GLOBAL_SIZE]._float;
/* TODO: check if 0 < arr->length <= 65535 */
*pint = (GLuint) mach.mem[mach.sp + SLANG_MACHINE_GLOBAL_SIZE]._float;
/* restore the old assembly */
if (!slang_assembly_file_restore_point_load (file, &point))
@ -187,7 +186,7 @@ static GLboolean eval_array_size (slang_assembly_file *file, slang_machine *pmac
}
GLboolean _slang_aggregate_variable (slang_storage_aggregate *agg, slang_type_specifier *spec,
slang_operation *array_size, slang_function_scope *funcs, slang_struct_scope *structs,
GLuint array_len, slang_function_scope *funcs, slang_struct_scope *structs,
slang_variable_scope *vars, slang_machine *mach, slang_assembly_file *file,
slang_atom_pool *atoms)
{
@ -236,7 +235,6 @@ GLboolean _slang_aggregate_variable (slang_storage_aggregate *agg, slang_type_sp
case slang_spec_array:
{
slang_storage_array *arr;
slang_assembly_name_space space;
arr = slang_storage_aggregate_push_new (agg);
if (arr == NULL)
@ -251,14 +249,11 @@ GLboolean _slang_aggregate_variable (slang_storage_aggregate *agg, slang_type_sp
arr->aggregate = NULL;
return GL_FALSE;
}
if (!_slang_aggregate_variable (arr->aggregate, spec->_array, NULL, funcs, structs,
if (!_slang_aggregate_variable (arr->aggregate, spec->_array, 0, funcs, structs,
vars, mach, file, atoms))
return GL_FALSE;
space.funcs = funcs;
space.structs = structs;
space.vars = vars;
if (!eval_array_size (file, mach, &space, array_size, &arr->length, atoms))
return GL_FALSE;
arr->length = array_len;
/* TODO: check if 0 < arr->length <= 65535 */
}
return GL_TRUE;
default:

View file

@ -85,9 +85,12 @@ GLboolean slang_storage_aggregate_construct (slang_storage_aggregate *);
GLvoid slang_storage_aggregate_destruct (slang_storage_aggregate *);
GLboolean _slang_aggregate_variable (slang_storage_aggregate *, struct slang_type_specifier_ *,
struct slang_operation_ *, struct slang_function_scope_ *, slang_struct_scope *,
GLuint, struct slang_function_scope_ *, slang_struct_scope *,
slang_variable_scope *, struct slang_machine_ *, struct slang_assembly_file_ *,
slang_atom_pool *);
slang_atom_pool *);
GLboolean _slang_evaluate_int (struct slang_assembly_file_ *, struct slang_machine_ *,
struct slang_assembly_name_space_ *, struct slang_operation_ *, GLuint *, slang_atom_pool *);
/*
* Returns total size (in machine units) of the given aggregate.

View file

@ -200,7 +200,9 @@ SLANG_SOURCES = \
shader/slang/slang_compile_struct.c \
shader/slang/slang_compile_variable.c \
shader/slang/slang_execute.c \
shader/slang/slang_export.c \
shader/slang/slang_library_noise.c \
shader/slang/slang_link.c \
shader/slang/slang_preprocess.c \
shader/slang/slang_storage.c \
shader/slang/slang_utility.c

View file

@ -522,10 +522,18 @@ SOURCE=..\..\..\..\src\mesa\shader\slang\slang_execute.c
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_export.c
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_library_noise.c
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_link.c
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_preprocess.c
# End Source File
# Begin Source File
@ -1231,10 +1239,18 @@ SOURCE=..\..\..\..\src\mesa\shader\slang\slang_execute.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_export.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_library_noise.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_link.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\src\mesa\shader\slang\slang_mesa.h
# End Source File
# Begin Source File