summaryrefslogtreecommitdiffstats
path: root/src/mesa/shader/slang/slang_link.c
diff options
context:
space:
mode:
authorMichal Krol <[email protected]>2006-10-13 08:44:32 +0000
committerMichal Krol <[email protected]>2006-10-13 08:44:32 +0000
commit201e6b9b753ea9cc5432c1d577231223ded7951c (patch)
tree3ff45adc2287f1e5d406ce23a5ecbf45db18e0d8 /src/mesa/shader/slang/slang_link.c
parente5a6fcc345867b550a159a7d94912a81e618279c (diff)
Indent and cosmetic changes.
Diffstat (limited to 'src/mesa/shader/slang/slang_link.c')
-rw-r--r--src/mesa/shader/slang/slang_link.c1178
1 files changed, 623 insertions, 555 deletions
diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c
index 66202edf8d0..6114b7c2520 100644
--- a/src/mesa/shader/slang/slang_link.c
+++ b/src/mesa/shader/slang/slang_link.c
@@ -1,6 +1,6 @@
/*
* Mesa 3-D graphics library
- * Version: 6.5
+ * Version: 6.6
*
* Copyright (C) 2006 Brian Paul All Rights Reserved.
*
@@ -32,774 +32,842 @@
#include "slang_link.h"
#include "slang_analyse.h"
-static GLboolean entry_has_gl_prefix (slang_atom name, slang_atom_pool *atoms)
+#define TABLE_GROW(PTR,TYPE,N) \
+ (PTR = (TYPE *) (slang_alloc_realloc (PTR, N * sizeof (TYPE), (N + 1) * sizeof (TYPE))))
+
+/*
+ * Check if a given name starts with "gl_". Globals with this prefix are
+ * treated differently, as they are built-in variables.
+ */
+static GLboolean
+entry_has_gl_prefix (slang_atom name, slang_atom_pool *atoms)
{
- const char *str = slang_atom_pool_id (atoms, name);
- return str[0] == 'g' && str[1] == 'l' && str[2] == '_';
+ const GLchar *str;
+
+ str = slang_atom_pool_id (atoms, name);
+ return str[0] == 'g' && str[1] == 'l' && str[2] == '_';
}
/*
* slang_active_variables
*/
-static GLvoid slang_active_variables_ctr (slang_active_variables *self)
+static GLvoid
+slang_active_variables_ctr (slang_active_variables *self)
{
- self->table = NULL;
- self->count = 0;
+ self->table = NULL;
+ self->count = 0;
}
-static GLvoid slang_active_variables_dtr (slang_active_variables *self)
+static GLvoid
+slang_active_variables_dtr (slang_active_variables *self)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < self->count; i++)
- slang_alloc_free (self->table[i].name);
- slang_alloc_free (self->table);
+ for (i = 0; i < self->count; i++)
+ slang_alloc_free (self->table[i].name);
+ slang_alloc_free (self->table);
}
-static GLboolean add_simple_variable (slang_active_variables *self, slang_export_data_quant *q,
- const char *name)
+/*
+ * Active variable queried by the application cannot be a structure. Queriable globals
+ * (uniforms and attributes) are decomposited into "simple" variables if they are
+ * "complex".
+ */
+
+static GLboolean
+add_simple_variable (slang_active_variables *self, slang_export_data_quant *q, const GLchar *name)
{
- const GLuint n = self->count;
+ GLuint n;
+ slang_active_variable *var;
- self->table = (slang_active_variable *) slang_alloc_realloc (self->table,
- n * sizeof (slang_active_variable), (n + 1) * sizeof (slang_active_variable));
- if (self->table == NULL)
- return GL_FALSE;
+ n = self->count;
+ if (!TABLE_GROW(self->table, slang_active_variable, n))
+ 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++;
+ /* Initialize the new element. Increment table size only when it is fully initilized. */
+ var = &self->table[n];
+ var->quant = q;
+ var->name = slang_string_duplicate (name);
+ if (var->name == NULL)
+ return GL_FALSE;
+ self->count++;
- return GL_TRUE;
+ return GL_TRUE;
}
-static GLboolean add_complex_variable (slang_active_variables *self, slang_export_data_quant *q,
- char *name, slang_atom_pool *atoms)
+static GLboolean
+add_complex_variable (slang_active_variables *self, slang_export_data_quant *q, GLchar *name,
+ slang_atom_pool *atoms)
{
- slang_string_concat (name, slang_atom_pool_id (atoms, q->name));
- if (slang_export_data_quant_array (q))
- slang_string_concat (name, "[0]");
+ slang_string_concat (name, slang_atom_pool_id (atoms, q->name));
- if (slang_export_data_quant_struct (q))
- {
- GLuint dot_pos, i;
- const GLuint fields = slang_export_data_quant_fields (q);
+ /* If array, add only first element. */
+ if (slang_export_data_quant_array (q))
+ slang_string_concat (name, "[0]");
- slang_string_concat (name, ".");
- dot_pos = slang_string_length (name);
+ if (slang_export_data_quant_struct (q)) {
+ GLuint field_pos, fields, i;
- for (i = 0; i < fields; i++)
- {
- if (!add_complex_variable (self, &q->structure[i], name, atoms))
- return GL_FALSE;
+ slang_string_concat (name, ".");
+ field_pos = slang_string_length (name);
- name[dot_pos] = '\0';
- }
+ /* Break it down into individual fields. */
+ fields = slang_export_data_quant_fields (q);
+ for (i = 0; i < fields; i++) {
+ if (!add_complex_variable (self, &q->structure[i], name, atoms))
+ return GL_FALSE;
+ name[field_pos] = '\0';
+ }
- return GL_TRUE;
- }
+ return GL_TRUE;
+ }
- return add_simple_variable (self, q, name);
+ return add_simple_variable (self, q, name);
}
-static GLboolean gather_active_variables (slang_active_variables *self,
- slang_export_data_table *tbl, slang_export_data_access access)
+/*
+ * Search a list of global variables with a given access (either attribute or uniform)
+ * and add it to the list of active variables.
+ */
+static GLboolean
+gather_active_variables (slang_active_variables *self, slang_export_data_table *tbl,
+ slang_export_data_access access)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < tbl->count; i++)
- if (tbl->entries[i].access == access)
- {
- char name[1024] = "";
+ for (i = 0; i < tbl->count; i++) {
+ if (tbl->entries[i].access == access) {
+ GLchar name[1024] = "";
- if (!add_complex_variable (self, &tbl->entries[i].quant, name, tbl->atoms))
- return GL_FALSE;
- }
+ if (!add_complex_variable (self, &tbl->entries[i].quant, name, tbl->atoms))
+ return GL_FALSE;
+ }
+ }
- return GL_TRUE;
+ return GL_TRUE;
}
/*
* slang_attrib_overrides
*/
-static GLvoid slang_attrib_overrides_ctr (slang_attrib_overrides *self)
+static GLvoid
+slang_attrib_overrides_ctr (slang_attrib_overrides *self)
{
- self->table = NULL;
- self->count = 0;
+ self->table = NULL;
+ self->count = 0;
}
-static GLvoid slang_attrib_overrides_dtr (slang_attrib_overrides *self)
+static GLvoid
+slang_attrib_overrides_dtr (slang_attrib_overrides *self)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < self->count; i++)
- slang_alloc_free (self->table[i].name);
- slang_alloc_free (self->table);
+ for (i = 0; i < self->count; i++)
+ slang_alloc_free (self->table[i].name);
+ slang_alloc_free (self->table);
}
-GLboolean slang_attrib_overrides_add (slang_attrib_overrides *self, GLuint index, const GLchar *name)
+static slang_attrib_override *
+lookup_attrib_override (slang_attrib_overrides *self, const GLchar *name)
{
- const GLuint n = self->count;
- GLuint i;
+ GLuint n, i;
- for (i = 0; i < n; i++)
- if (slang_string_compare (name, self->table[i].name) == 0)
- {
- self->table[i].index = index;
- return GL_TRUE;
- }
+ n = self->count;
+ for (i = 0; i < n; i++) {
+ if (slang_string_compare (name, self->table[i].name) == 0)
+ return &self->table[i];
+ }
+ return NULL;
+}
- self->table = (slang_attrib_override *) slang_alloc_realloc (self->table,
- n * sizeof (slang_attrib_override), (n + 1) * sizeof (slang_attrib_override));
- if (self->table == NULL)
- return GL_FALSE;
+GLboolean
+_slang_attrib_overrides_add (slang_attrib_overrides *self, GLuint index, const GLchar *name)
+{
+ slang_attrib_override *ovr;
+ GLuint n;
- self->table[n].index = index;
- self->table[n].name = slang_string_duplicate (name);
- if (self->table[n].name == NULL)
- return GL_FALSE;
- self->count++;
+ /* Attribs can be overriden multiple times. Look-up the table and replace
+ * its index if it is found. */
+ ovr = lookup_attrib_override (self, name);
+ if (ovr != NULL) {
+ ovr->index = index;
+ return GL_TRUE;
+ }
- return GL_TRUE;
-}
+ n = self->count;
+ if (!TABLE_GROW(self->table, slang_attrib_override, n))
+ return GL_FALSE;
-static GLuint lookup_attrib_override (slang_attrib_overrides *self, const GLchar *name)
-{
- GLuint i;
+ /* Initialize the new element. Increment table size only when it is fully initilized. */
+ ovr = &self->table[n];
+ ovr->index = index;
+ ovr->name = slang_string_duplicate (name);
+ if (ovr->name == NULL)
+ return GL_FALSE;
+ self->count++;
- for (i = 0; i < self->count; i++)
- if (slang_string_compare (name, self->table[i].name) == 0)
- return self->table[i].index;
- return MAX_VERTEX_ATTRIBS;
+ return GL_TRUE;
}
/*
* slang_uniform_bindings
*/
-static GLvoid slang_uniform_bindings_ctr (slang_uniform_bindings *self)
+static GLvoid
+slang_uniform_bindings_ctr (slang_uniform_bindings *self)
{
- self->table = NULL;
- self->count = 0;
+ self->table = NULL;
+ self->count = 0;
}
-static GLvoid slang_uniform_bindings_dtr (slang_uniform_bindings *self)
+static GLvoid
+slang_uniform_bindings_dtr (slang_uniform_bindings *self)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < self->count; i++)
- slang_alloc_free (self->table[i].name);
- slang_alloc_free (self->table);
+ for (i = 0; i < self->count; i++)
+ slang_alloc_free (self->table[i].name);
+ slang_alloc_free (self->table);
}
-static GLboolean add_simple_uniform_binding (slang_uniform_bindings *self,
- slang_export_data_quant *q, const char *name, GLuint index, GLuint addr)
-{
- const GLuint n = self->count;
- GLuint i;
-
- for (i = 0; i < n; i++)
- if (slang_string_compare (self->table[i].name, name) == 0)
- {
- self->table[i].address[index] = addr;
- return GL_TRUE;
- }
+static GLboolean
+add_simple_uniform_binding (slang_uniform_bindings *self, slang_export_data_quant *q,
+ const GLchar *name, GLuint index, GLuint addr)
+{
+ GLuint n, i;
+ slang_uniform_binding *bind;
+
+ /* Uniform binding table is shared between vertex and fragment shaders. If the same uniform
+ * is declared both in a vertex and fragment shader, only one uniform entry is maintained.
+ * When add a uniform binding there can be an entry already allocated for it by the other
+ * shader. */
+ n = self->count;
+ for (i = 0; i < n; i++) {
+ if (slang_string_compare (self->table[i].name, name) == 0) {
+ self->table[i].address[index] = addr;
+ return GL_TRUE;
+ }
+ }
- self->table = (slang_uniform_binding *) slang_alloc_realloc (self->table,
- n * sizeof (slang_uniform_binding), (n + 1) * sizeof (slang_uniform_binding));
- if (self->table == NULL)
- return GL_FALSE;
+ if (!TABLE_GROW(self->table, slang_uniform_binding, n))
+ return GL_FALSE;
- self->table[n].quant = q;
- self->table[n].name = slang_string_duplicate (name);
- if (self->table[n].name == NULL)
- return GL_FALSE;
- for (i = 0; i < SLANG_SHADER_MAX; i++)
- self->table[n].address[i] = ~0;
- self->table[n].address[index] = addr;
- self->count++;
+ /* Initialize the new element. Increment table size only when it is fully initilized. */
+ bind = &self->table[n];
+ bind->quant = q;
+ bind->name = slang_string_duplicate (name);
+ if (bind->name == NULL)
+ return GL_FALSE;
+ for (i = 0; i < SLANG_SHADER_MAX; i++)
+ bind->address[i] = ~0;
+ bind->address[index] = addr;
+ self->count++;
- return GL_TRUE;
+ return GL_TRUE;
}
-static GLboolean add_complex_uniform_binding (slang_uniform_bindings *self,
- slang_export_data_quant *q, char *name, slang_atom_pool *atoms, GLuint index, GLuint addr)
+static GLboolean
+add_complex_uniform_binding (slang_uniform_bindings *self, slang_export_data_quant *q,
+ GLchar *name, slang_atom_pool *atoms, GLuint index, GLuint addr)
{
- GLuint count, i;
+ GLuint count, i;
+
+ slang_string_concat (name, slang_atom_pool_id (atoms, q->name));
+ count = slang_export_data_quant_elements (q);
- slang_string_concat (name, slang_atom_pool_id (atoms, q->name));
- count = slang_export_data_quant_elements (q);
- for (i = 0; i < count; i++)
- {
- GLuint bracket_pos;
+ /* If array, add binding for every array element. */
+ for (i = 0; i < count; i++) {
+ GLuint bracket_pos;
- bracket_pos = slang_string_length (name);
- if (slang_export_data_quant_array (q))
- _mesa_sprintf (name + slang_string_length (name), "[%d]", i);
+ bracket_pos = slang_string_length (name);
+ if (slang_export_data_quant_array (q))
+ _mesa_sprintf (&name[slang_string_length (name)], "[%d]", i);
- if (slang_export_data_quant_struct (q))
- {
- GLuint dot_pos, i;
- const GLuint fields = slang_export_data_quant_fields (q);
+ if (slang_export_data_quant_struct (q)) {
+ GLuint field_pos, fields, i;
- slang_string_concat (name, ".");
- dot_pos = slang_string_length (name);
+ slang_string_concat (name, ".");
+ field_pos = slang_string_length (name);
- for (i = 0; i < fields; i++)
- {
- if (!add_complex_uniform_binding (self, &q->structure[i], name, atoms, index, addr))
- return GL_FALSE;
+ /* Break it down into individual fields. */
+ fields = slang_export_data_quant_fields (q);
+ for (i = 0; i < fields; i++) {
+ if (!add_complex_uniform_binding (self, &q->structure[i], name, atoms, index, addr))
+ return GL_FALSE;
- name[dot_pos] = '\0';
- addr += slang_export_data_quant_size (&q->structure[i]);
- }
- }
- else
- {
- if (!add_simple_uniform_binding (self, q, name, index, addr))
- return GL_FALSE;
+ name[field_pos] = '\0';
+ addr += slang_export_data_quant_size (&q->structure[i]);
+ }
+ }
+ else {
+ if (!add_simple_uniform_binding (self, q, name, index, addr))
+ return GL_FALSE;
- addr += slang_export_data_quant_size (q);
- }
+ addr += slang_export_data_quant_size (q);
+ }
- name[bracket_pos] = '\0';
- }
+ name[bracket_pos] = '\0';
+ }
- return GL_TRUE;
+ return GL_TRUE;
}
-static GLboolean gather_uniform_bindings (slang_uniform_bindings *self,
- slang_export_data_table *tbl, GLuint index)
+static GLboolean
+gather_uniform_bindings (slang_uniform_bindings *self, slang_export_data_table *tbl, GLuint index)
{
- GLuint i;
+ GLuint n, i;
- for (i = 0; i < tbl->count; i++)
- if (tbl->entries[i].access == slang_exp_uniform)
- {
- char name[1024] = "";
+ n = tbl->count;
+ for (i = 0; i < n; i++) {
+ if (tbl->entries[i].access == slang_exp_uniform) {
+ GLchar name[1024] = "";
- if (!add_complex_uniform_binding (self, &tbl->entries[i].quant, name, tbl->atoms, index,
- tbl->entries[i].address))
- return GL_FALSE;
- }
+ if (!add_complex_uniform_binding (self, &tbl->entries[i].quant, name, tbl->atoms, index,
+ tbl->entries[i].address))
+ return GL_FALSE;
+ }
+ }
- return GL_TRUE;
+ return GL_TRUE;
}
/*
* slang_attrib_bindings
*/
-static GLvoid slang_attrib_bindings_ctr (slang_attrib_bindings *self)
+static GLvoid
+slang_attrib_bindings_ctr (slang_attrib_bindings *self)
{
- GLuint i;
+ GLuint i;
- self->binding_count = 0;
- for (i = 0; i < MAX_VERTEX_ATTRIBS; i++)
- self->slots[i].addr = ~0;
+ self->binding_count = 0;
+ for (i = 0; i < MAX_VERTEX_ATTRIBS; i++)
+ self->slots[i].addr = ~0;
}
-static GLvoid slang_attrib_bindings_dtr (slang_attrib_bindings *self)
+static GLvoid
+slang_attrib_bindings_dtr (slang_attrib_bindings *self)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < self->binding_count; i++)
- slang_alloc_free (self->bindings[i].name);
+ for (i = 0; i < self->binding_count; i++)
+ slang_alloc_free (self->bindings[i].name);
}
/*
* NOTE: If conventional vertex attribute gl_Vertex is used, application cannot use
* vertex attrib index 0 for binding override. Currently this is not checked.
- * Although attrib index 0 is not used when not explicitly asked.
+ * Anyways, attrib index 0 is not used when not explicitly asked.
*/
-static GLuint can_allocate_attrib_slots (slang_attrib_bindings *self, GLuint index, GLuint count)
+static GLuint
+can_allocate_attrib_slots (slang_attrib_bindings *self, GLuint index, GLuint count)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < count; i++)
- if (self->slots[index + i].addr != ~0)
- break;
- return i;
+ for (i = 0; i < count; i++) {
+ if (self->slots[index + i].addr != ~0)
+ break;
+ }
+ return i;
}
-static GLuint allocate_attrib_slots (slang_attrib_bindings *self, GLuint count)
+static GLuint
+allocate_attrib_slots (slang_attrib_bindings *self, GLuint count)
{
- GLuint i;
+ GLuint i;
+
+ /* Start with attrib index 1. Index 0 will be used when explicitly
+ * asked by application binding. */
+ for (i = 1; i <= MAX_VERTEX_ATTRIBS - count; i++) {
+ GLuint size;
- for (i = 1; i <= MAX_VERTEX_ATTRIBS - count; i++)
- {
- GLuint size;
-
- size = can_allocate_attrib_slots (self, i, count);
- if (size == count)
- return i;
+ size = can_allocate_attrib_slots (self, i, count);
+ if (size == count)
+ return i;
- /* speed-up the search a bit */
+ /* Speed-up the search a bit. */
i += size;
- }
- return MAX_VERTEX_ATTRIBS;
+ }
+
+ return MAX_VERTEX_ATTRIBS;
}
static GLboolean
-add_attrib_binding (slang_attrib_bindings *self, slang_export_data_quant *q, const char *name,
+add_attrib_binding (slang_attrib_bindings *self, slang_export_data_quant *q, const GLchar *name,
GLuint addr, GLuint index_override)
{
- const GLuint n = self->binding_count;
- GLuint slot_span, slot_fill, slot_index;
- GLuint i;
+ GLuint slot_span, slot_fill, slot_index, i;
+ slang_attrib_binding *bind;
- assert (slang_export_data_quant_simple (q));
+ assert (slang_export_data_quant_simple (q));
- switch (slang_export_data_quant_type (q))
- {
- case GL_FLOAT:
+ switch (slang_export_data_quant_type (q)) {
+ case GL_FLOAT:
slot_span = 1;
slot_fill = 1;
break;
- case GL_FLOAT_VEC2:
+ case GL_FLOAT_VEC2:
slot_span = 1;
slot_fill = 2;
break;
- case GL_FLOAT_VEC3:
+ case GL_FLOAT_VEC3:
slot_span = 1;
slot_fill = 3;
break;
- case GL_FLOAT_VEC4:
- slot_span = 1;
+ case GL_FLOAT_VEC4:
+ slot_span = 1;
slot_fill = 4;
- break;
- case GL_FLOAT_MAT2:
- slot_span = 2;
+ break;
+ case GL_FLOAT_MAT2:
+ slot_span = 2;
slot_fill = 2;
- break;
- case GL_FLOAT_MAT3:
- slot_span = 3;
+ break;
+ case GL_FLOAT_MAT3:
+ slot_span = 3;
slot_fill = 3;
- break;
- case GL_FLOAT_MAT4:
- slot_span = 4;
+ break;
+ case GL_FLOAT_MAT4:
+ slot_span = 4;
slot_fill = 4;
- break;
- default:
- assert (0);
- }
-
- if (index_override == MAX_VERTEX_ATTRIBS)
- slot_index = allocate_attrib_slots (self, slot_span);
- else if (can_allocate_attrib_slots (self, index_override, slot_span) == slot_span)
- slot_index = index_override;
- else
- slot_index = MAX_VERTEX_ATTRIBS;
-
- if (slot_index == MAX_VERTEX_ATTRIBS)
- {
- /* TODO: info log: error: MAX_VERTEX_ATTRIBS exceeded */
- return GL_FALSE;
- }
-
- self->bindings[n].quant = q;
- self->bindings[n].name = slang_string_duplicate (name);
- if (self->bindings[n].name == NULL)
- return GL_FALSE;
- self->bindings[n].first_slot_index = slot_index;
- self->binding_count++;
+ break;
+ default:
+ assert (0);
+ }
+
+ if (index_override == MAX_VERTEX_ATTRIBS)
+ slot_index = allocate_attrib_slots (self, slot_span);
+ else if (can_allocate_attrib_slots (self, index_override, slot_span) == slot_span)
+ slot_index = index_override;
+ else
+ slot_index = MAX_VERTEX_ATTRIBS;
+
+ if (slot_index == MAX_VERTEX_ATTRIBS) {
+ /* TODO: info log: error: MAX_VERTEX_ATTRIBS exceeded */
+ return GL_FALSE;
+ }
+
+ /* Initialize the new element. Increment table size only when it is fully initilized. */
+ bind = &self->bindings[self->binding_count];
+ bind->quant = q;
+ bind->name = slang_string_duplicate (name);
+ if (bind->name == NULL)
+ return GL_FALSE;
+ bind->first_slot_index = slot_index;
+ self->binding_count++;
for (i = 0; i < slot_span; i++) {
- slang_attrib_slot *slot = &self->slots[self->bindings[n].first_slot_index + i];
+ slang_attrib_slot *slot;
+
+ slot = &self->slots[bind->first_slot_index + i];
slot->addr = addr + i * slot_fill * 4;
slot->fill = slot_fill;
}
- return GL_TRUE;
+ return GL_TRUE;
}
-static GLboolean gather_attrib_bindings (slang_attrib_bindings *self, slang_export_data_table *tbl,
- slang_attrib_overrides *ovr)
-{
- GLuint i;
-
- /* First pass. Gather attribs that have overriden index slots. */
- for (i = 0; i < tbl->count; i++)
- if (tbl->entries[i].access == slang_exp_attribute &&
- !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms))
- {
- slang_export_data_quant *quant = &tbl->entries[i].quant;
- const GLchar *id = slang_atom_pool_id (tbl->atoms, quant->name);
- GLuint index = lookup_attrib_override (ovr, id);
-
- if (index != MAX_VERTEX_ATTRIBS)
- {
- if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, index))
- return GL_FALSE;
- }
- }
-
- /* Second pass. Gather attribs that have *NOT* overriden index slots. */
- for (i = 0; i < tbl->count; i++)
- if (tbl->entries[i].access == slang_exp_attribute &&
- !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms))
- {
- slang_export_data_quant *quant = &tbl->entries[i].quant;
- const GLchar *id = slang_atom_pool_id (tbl->atoms, quant->name);
- GLuint index = lookup_attrib_override (ovr, id);
+static GLboolean
+gather_attrib_bindings (slang_attrib_bindings *self, slang_export_data_table *tbl,
+ slang_attrib_overrides *ovr)
+{
+ GLuint i;
+
+ /* First pass. Gather attribs that have overriden index slots. */
+ for (i = 0; i < tbl->count; i++) {
+ if (tbl->entries[i].access == slang_exp_attribute &&
+ !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) {
+ slang_export_data_quant *quant;
+ const GLchar *id;
+ slang_attrib_override *ao;
+
+ quant = &tbl->entries[i].quant;
+ id = slang_atom_pool_id (tbl->atoms, quant->name);
+ ao = lookup_attrib_override (ovr, id);
+ if (ao != NULL) {
+ if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, ao->index))
+ return GL_FALSE;
+ }
+ }
+ }
- if (index == MAX_VERTEX_ATTRIBS)
- {
- if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, index))
- return GL_FALSE;
- }
- }
+ /* Second pass. Gather attribs that have not overriden index slots. */
+ for (i = 0; i < tbl->count; i++) {
+ if (tbl->entries[i].access == slang_exp_attribute &&
+ !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) {
+ slang_export_data_quant *quant;
+ const GLchar *id;
+ slang_attrib_override *ao;
+
+ quant = &tbl->entries[i].quant;
+ id = slang_atom_pool_id (tbl->atoms, quant->name);
+ ao = lookup_attrib_override (ovr, id);
+ if (ao == NULL) {
+ if (!add_attrib_binding (self, quant, id, tbl->entries[i].address, ao->index))
+ return GL_FALSE;
+ }
+ }
+ }
- return GL_TRUE;
+ return GL_TRUE;
}
/*
* slang_varying_bindings
*/
-static GLvoid slang_varying_bindings_ctr (slang_varying_bindings *self)
+static GLvoid
+slang_varying_bindings_ctr (slang_varying_bindings *self)
{
- self->binding_count = 0;
- self->slot_count = 0;
+ self->binding_count = 0;
+ self->slot_count = 0;
}
-static GLvoid slang_varying_bindings_dtr (slang_varying_bindings *self)
+static GLvoid
+slang_varying_bindings_dtr (slang_varying_bindings *self)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < self->binding_count; i++)
- slang_alloc_free (self->bindings[i].name);
+ for (i = 0; i < self->binding_count; i++)
+ slang_alloc_free (self->bindings[i].name);
}
-static GLvoid update_varying_slots (slang_varying_slot *slots, GLuint count, GLboolean is_vert,
- GLuint addr, GLuint do_offset)
+static GLvoid
+update_varying_slots (slang_varying_slot *slots, GLuint count, GLboolean is_vert, GLuint addr,
+ GLuint do_offset)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < count; i++)
- *(is_vert ? &slots[i].vert_addr : &slots[i].frag_addr) = addr + i * 4 * do_offset;
+ for (i = 0; i < count; i++) {
+ if (is_vert)
+ slots[i].vert_addr = addr + i * 4 * do_offset;
+ else
+ slots[i].frag_addr = addr + i * 4 * do_offset;
+ }
}
-static GLboolean add_varying_binding (slang_varying_bindings *self,
- slang_export_data_quant *q, const char *name, GLboolean is_vert, GLuint addr)
-{
- const GLuint n = self->binding_count;
- const GLuint slot_span =
- slang_export_data_quant_components (q) * slang_export_data_quant_elements (q);
- GLuint i;
-
- for (i = 0; i < n; i++)
- if (slang_string_compare (self->bindings[i].name, name) == 0)
- {
- /* TODO: data quantities must match, or else link fails */
- update_varying_slots (&self->slots[self->bindings[i].first_slot_index], slot_span,
- is_vert, addr, 1);
- return GL_TRUE;
- }
+static GLboolean
+add_varying_binding (slang_varying_bindings *self, slang_export_data_quant *q, const GLchar *name,
+ GLboolean is_vert, GLuint addr)
+{
+ GLuint n, slot_span, i;
+ slang_varying_binding *bind;
+
+ n = self->binding_count;
+ slot_span = slang_export_data_quant_components (q) * slang_export_data_quant_elements (q);
+ for (i = 0; i < n; i++) {
+ if (slang_string_compare (self->bindings[i].name, name) == 0) {
+ /* TODO: data quantities must match, or else link fails */
+ update_varying_slots (&self->slots[self->bindings[i].first_slot_index], slot_span,
+ is_vert, addr, 1);
+ return GL_TRUE;
+ }
+ }
- if (self->slot_count + slot_span > MAX_VARYING_FLOATS)
- {
- /* TODO: info log: error: MAX_VARYING_FLOATS exceeded */
- return GL_FALSE;
- }
+ if (self->slot_count + slot_span > MAX_VARYING_FLOATS) {
+ /* TODO: info log: error: MAX_VARYING_FLOATS exceeded */
+ return GL_FALSE;
+ }
- self->bindings[n].quant = q;
- self->bindings[n].name = slang_string_duplicate (name);
- if (self->bindings[n].name == NULL)
- return GL_FALSE;
- self->bindings[n].first_slot_index = self->slot_count;
- self->binding_count++;
+ /* Initialize the new element. Increment table size only when it is fully initilized. */
+ bind = &self->bindings[n];
+ bind->quant = q;
+ bind->name = slang_string_duplicate (name);
+ if (bind->name == NULL)
+ return GL_FALSE;
+ bind->first_slot_index = self->slot_count;
+ self->binding_count++;
- update_varying_slots (&self->slots[self->bindings[n].first_slot_index], slot_span, is_vert,
- addr, 1);
- update_varying_slots (&self->slots[self->bindings[n].first_slot_index], slot_span, !is_vert,
- ~0, 0);
- self->slot_count += slot_span;
+ update_varying_slots (&self->slots[bind->first_slot_index], slot_span, is_vert, addr, 1);
+ update_varying_slots (&self->slots[bind->first_slot_index], slot_span, !is_vert, ~0, 0);
+ self->slot_count += slot_span;
- return GL_TRUE;
+ return GL_TRUE;
}
-static GLboolean gather_varying_bindings (slang_varying_bindings *self,
- slang_export_data_table *tbl, GLboolean is_vert)
-{
- GLuint i;
-
- for (i = 0; i < tbl->count; i++)
- if (tbl->entries[i].access == slang_exp_varying &&
- !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms))
- {
- if (!add_varying_binding (self, &tbl->entries[i].quant, slang_atom_pool_id (tbl->atoms,
- tbl->entries[i].quant.name), is_vert, tbl->entries[i].address))
- return GL_FALSE;
- }
+static GLboolean
+gather_varying_bindings (slang_varying_bindings *self, slang_export_data_table *tbl,
+ GLboolean is_vert)
+{
+ GLuint i;
+
+ for (i = 0; i < tbl->count; i++) {
+ if (tbl->entries[i].access == slang_exp_varying &&
+ !entry_has_gl_prefix (tbl->entries[i].quant.name, tbl->atoms)) {
+ if (!add_varying_binding (self, &tbl->entries[i].quant,
+ slang_atom_pool_id (tbl->atoms, tbl->entries[i].quant.name),
+ is_vert, tbl->entries[i].address))
+ return GL_FALSE;
+ }
+ }
- return GL_TRUE;
+ return GL_TRUE;
}
/*
* slang_texture_bindings
*/
-GLvoid slang_texture_usages_ctr (slang_texture_usages *self)
+GLvoid
+_slang_texture_usages_ctr (slang_texture_usages *self)
{
- self->table = NULL;
- self->count = 0;
+ self->table = NULL;
+ self->count = 0;
}
-GLvoid slang_texture_usages_dtr (slang_texture_usages *self)
+GLvoid
+_slang_texture_usages_dtr (slang_texture_usages *self)
{
- slang_alloc_free (self->table);
+ slang_alloc_free (self->table);
}
/*
* slang_program
*/
-GLvoid slang_program_ctr (slang_program *self)
-{
- GLuint i;
-
- slang_active_variables_ctr (&self->active_uniforms);
- slang_active_variables_ctr (&self->active_attribs);
- slang_attrib_overrides_ctr (&self->attrib_overrides);
- slang_uniform_bindings_ctr (&self->uniforms);
- slang_attrib_bindings_ctr (&self->attribs);
- slang_varying_bindings_ctr (&self->varyings);
- slang_texture_usages_ctr (&self->texture_usage);
- for (i = 0; i < SLANG_SHADER_MAX; i++)
- {
- GLuint j;
-
- for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++)
- self->common_fixed_entries[i][j] = ~0;
- for (j = 0; j < SLANG_COMMON_CODE_MAX; j++)
- self->code[i][j] = ~0;
- self->machines[i] = NULL;
- self->assemblies[i] = NULL;
- }
- for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++)
- self->vertex_fixed_entries[i] = ~0;
- for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++)
- self->fragment_fixed_entries[i] = ~0;
-}
-
-GLvoid slang_program_dtr (slang_program *self)
-{
- slang_active_variables_dtr (&self->active_uniforms);
- slang_active_variables_dtr (&self->active_attribs);
- slang_attrib_overrides_dtr (&self->attrib_overrides);
- slang_uniform_bindings_dtr (&self->uniforms);
- slang_attrib_bindings_dtr (&self->attribs);
- slang_varying_bindings_dtr (&self->varyings);
- slang_texture_usages_dtr (&self->texture_usage);
-}
-
-GLvoid slang_program_rst (slang_program *self)
-{
- GLuint i;
-
- slang_active_variables_dtr (&self->active_uniforms);
- slang_active_variables_dtr (&self->active_attribs);
- slang_uniform_bindings_dtr (&self->uniforms);
- slang_attrib_bindings_dtr (&self->attribs);
- slang_varying_bindings_dtr (&self->varyings);
- slang_texture_usages_dtr (&self->texture_usage);
-
- slang_active_variables_ctr (&self->active_uniforms);
- slang_active_variables_ctr (&self->active_attribs);
- slang_uniform_bindings_ctr (&self->uniforms);
- slang_attrib_bindings_ctr (&self->attribs);
- slang_varying_bindings_ctr (&self->varyings);
- slang_texture_usages_ctr (&self->texture_usage);
- for (i = 0; i < SLANG_SHADER_MAX; i++)
- {
- GLuint j;
-
- for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++)
- self->common_fixed_entries[i][j] = ~0;
- for (j = 0; j < SLANG_COMMON_CODE_MAX; j++)
- self->code[i][j] = ~0;
- }
- for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++)
- self->vertex_fixed_entries[i] = ~0;
- for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++)
- self->fragment_fixed_entries[i] = ~0;
+GLvoid
+_slang_program_ctr (slang_program *self)
+{
+ GLuint i;
+
+ slang_active_variables_ctr (&self->active_uniforms);
+ slang_active_variables_ctr (&self->active_attribs);
+ slang_attrib_overrides_ctr (&self->attrib_overrides);
+ slang_uniform_bindings_ctr (&self->uniforms);
+ slang_attrib_bindings_ctr (&self->attribs);
+ slang_varying_bindings_ctr (&self->varyings);
+ _slang_texture_usages_ctr (&self->texture_usage);
+ for (i = 0; i < SLANG_SHADER_MAX; i++) {
+ GLuint j;
+
+ for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++)
+ self->common_fixed_entries[i][j] = ~0;
+ for (j = 0; j < SLANG_COMMON_CODE_MAX; j++)
+ self->code[i][j] = ~0;
+ self->machines[i] = NULL;
+ self->assemblies[i] = NULL;
+ }
+ for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++)
+ self->vertex_fixed_entries[i] = ~0;
+ for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++)
+ self->fragment_fixed_entries[i] = ~0;
+}
+
+GLvoid
+_slang_program_dtr (slang_program *self)
+{
+ slang_active_variables_dtr (&self->active_uniforms);
+ slang_active_variables_dtr (&self->active_attribs);
+ slang_attrib_overrides_dtr (&self->attrib_overrides);
+ slang_uniform_bindings_dtr (&self->uniforms);
+ slang_attrib_bindings_dtr (&self->attribs);
+ slang_varying_bindings_dtr (&self->varyings);
+ _slang_texture_usages_dtr (&self->texture_usage);
+}
+
+GLvoid
+_slang_program_rst (slang_program *self)
+{
+ GLuint i;
+
+ slang_active_variables_dtr (&self->active_uniforms);
+ slang_active_variables_dtr (&self->active_attribs);
+ slang_uniform_bindings_dtr (&self->uniforms);
+ slang_attrib_bindings_dtr (&self->attribs);
+ slang_varying_bindings_dtr (&self->varyings);
+ _slang_texture_usages_dtr (&self->texture_usage);
+
+ slang_active_variables_ctr (&self->active_uniforms);
+ slang_active_variables_ctr (&self->active_attribs);
+ slang_uniform_bindings_ctr (&self->uniforms);
+ slang_attrib_bindings_ctr (&self->attribs);
+ slang_varying_bindings_ctr (&self->varyings);
+ _slang_texture_usages_ctr (&self->texture_usage);
+ for (i = 0; i < SLANG_SHADER_MAX; i++) {
+ GLuint j;
+
+ for (j = 0; j < SLANG_COMMON_FIXED_MAX; j++)
+ self->common_fixed_entries[i][j] = ~0;
+ for (j = 0; j < SLANG_COMMON_CODE_MAX; j++)
+ self->code[i][j] = ~0;
+ }
+ for (i = 0; i < SLANG_VERTEX_FIXED_MAX; i++)
+ self->vertex_fixed_entries[i] = ~0;
+ for (i = 0; i < SLANG_FRAGMENT_FIXED_MAX; i++)
+ self->fragment_fixed_entries[i] = ~0;
}
/*
* _slang_link()
*/
-static GLuint gd (slang_export_data_table *tbl, const char *name)
-{
- slang_atom atom;
- GLuint i;
-
- atom = slang_atom_pool_atom (tbl->atoms, name);
- if (atom == SLANG_ATOM_NULL)
- return ~0;
-
- for (i = 0; i < tbl->count; i++)
- if (atom == tbl->entries[i].quant.name)
- return tbl->entries[i].address;
- return ~0;
-}
-
-static GLvoid resolve_common_fixed (GLuint e[], slang_export_data_table *tbl)
-{
- e[SLANG_COMMON_FIXED_MODELVIEWMATRIX] = gd (tbl, "gl_ModelViewMatrix");
- e[SLANG_COMMON_FIXED_PROJECTIONMATRIX] = gd (tbl, "gl_ProjectionMatrix");
- e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIX] = gd (tbl, "gl_ModelViewProjectionMatrix");
- e[SLANG_COMMON_FIXED_TEXTUREMATRIX] = gd (tbl, "gl_TextureMatrix");
- e[SLANG_COMMON_FIXED_NORMALMATRIX] = gd (tbl, "gl_NormalMatrix");
- e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSE] = gd (tbl, "gl_ModelViewMatrixInverse");
- e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSE] = gd (tbl, "gl_ProjectionMatrixInverse");
- e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSE] =
- gd (tbl, "gl_ModelViewProjectionMatrixInverse");
- e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSE] = gd (tbl, "gl_TextureMatrixInverse");
- e[SLANG_COMMON_FIXED_MODELVIEWMATRIXTRANSPOSE] = gd (tbl, "gl_ModelViewMatrixTranspose");
- e[SLANG_COMMON_FIXED_PROJECTIONMATRIXTRANSPOSE] = gd (tbl, "gl_ProjectionMatrixTranspose");
- e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXTRANSPOSE] =
- gd (tbl, "gl_ModelViewProjectionMatrixTranspose");
- e[SLANG_COMMON_FIXED_TEXTUREMATRIXTRANSPOSE] = gd (tbl, "gl_TextureMatrixTranspose");
- e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSETRANSPOSE] =
- gd (tbl, "gl_ModelViewMatrixInverseTranspose");
- e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSETRANSPOSE] =
- gd (tbl, "gl_ProjectionMatrixInverseTranspose");
- e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSETRANSPOSE] =
- gd (tbl, "gl_ModelViewProjectionMatrixInverseTranspose");
- e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSETRANSPOSE] =
- gd (tbl, "gl_TextureMatrixInverseTranspose");
- e[SLANG_COMMON_FIXED_NORMALSCALE] = gd (tbl, "gl_NormalScale");
- e[SLANG_COMMON_FIXED_DEPTHRANGE] = gd (tbl, "gl_DepthRange");
- e[SLANG_COMMON_FIXED_CLIPPLANE] = gd (tbl, "gl_ClipPlane");
- e[SLANG_COMMON_FIXED_POINT] = gd (tbl, "gl_Point");
- e[SLANG_COMMON_FIXED_FRONTMATERIAL] = gd (tbl, "gl_FrontMaterial");
- e[SLANG_COMMON_FIXED_BACKMATERIAL] = gd (tbl, "gl_BackMaterial");
- e[SLANG_COMMON_FIXED_LIGHTSOURCE] = gd (tbl, "gl_LightSource");
- e[SLANG_COMMON_FIXED_LIGHTMODEL] = gd (tbl, "gl_LightModel");
- e[SLANG_COMMON_FIXED_FRONTLIGHTMODELPRODUCT] = gd (tbl, "gl_FrontLightModelProduct");
- e[SLANG_COMMON_FIXED_BACKLIGHTMODELPRODUCT] = gd (tbl, "gl_BackLightModelProduct");
- e[SLANG_COMMON_FIXED_FRONTLIGHTPRODUCT] = gd (tbl, "gl_FrontLightProduct");
- e[SLANG_COMMON_FIXED_BACKLIGHTPRODUCT] = gd (tbl, "gl_BackLightProduct");
- e[SLANG_COMMON_FIXED_TEXTUREENVCOLOR] = gd (tbl, "gl_TextureEnvColor");
- e[SLANG_COMMON_FIXED_EYEPLANES] = gd (tbl, "gl_EyePlaneS");
- e[SLANG_COMMON_FIXED_EYEPLANET] = gd (tbl, "gl_EyePlaneT");
- e[SLANG_COMMON_FIXED_EYEPLANER] = gd (tbl, "gl_EyePlaneR");
- e[SLANG_COMMON_FIXED_EYEPLANEQ] = gd (tbl, "gl_EyePlaneQ");
- e[SLANG_COMMON_FIXED_OBJECTPLANES] = gd (tbl, "gl_ObjectPlaneS");
- e[SLANG_COMMON_FIXED_OBJECTPLANET] = gd (tbl, "gl_ObjectPlaneT");
- e[SLANG_COMMON_FIXED_OBJECTPLANER] = gd (tbl, "gl_ObjectPlaneR");
- e[SLANG_COMMON_FIXED_OBJECTPLANEQ] = gd (tbl, "gl_ObjectPlaneQ");
- e[SLANG_COMMON_FIXED_FOG] = gd (tbl, "gl_Fog");
-}
-
-static GLvoid resolve_vertex_fixed (GLuint e[], slang_export_data_table *tbl)
-{
- e[SLANG_VERTEX_FIXED_POSITION] = gd (tbl, "gl_Position");
- e[SLANG_VERTEX_FIXED_POINTSIZE] = gd (tbl, "gl_PointSize");
- e[SLANG_VERTEX_FIXED_CLIPVERTEX] = gd (tbl, "gl_ClipVertex");
- e[SLANG_VERTEX_FIXED_COLOR] = gd (tbl, "gl_Color");
- e[SLANG_VERTEX_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor");
- e[SLANG_VERTEX_FIXED_NORMAL] = gd (tbl, "gl_Normal");
- e[SLANG_VERTEX_FIXED_VERTEX] = gd (tbl, "gl_Vertex");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD0] = gd (tbl, "gl_MultiTexCoord0");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD1] = gd (tbl, "gl_MultiTexCoord1");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD2] = gd (tbl, "gl_MultiTexCoord2");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD3] = gd (tbl, "gl_MultiTexCoord3");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD4] = gd (tbl, "gl_MultiTexCoord4");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD5] = gd (tbl, "gl_MultiTexCoord5");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD6] = gd (tbl, "gl_MultiTexCoord6");
- e[SLANG_VERTEX_FIXED_MULTITEXCOORD7] = gd (tbl, "gl_MultiTexCoord7");
- e[SLANG_VERTEX_FIXED_FOGCOORD] = gd (tbl, "gl_FogCoord");
- e[SLANG_VERTEX_FIXED_FRONTCOLOR] = gd (tbl, "gl_FrontColor");
- e[SLANG_VERTEX_FIXED_BACKCOLOR] = gd (tbl, "gl_BackColor");
- e[SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR] = gd (tbl, "gl_FrontSecondaryColor");
- e[SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR] = gd (tbl, "gl_BackSecondaryColor");
- e[SLANG_VERTEX_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord");
- e[SLANG_VERTEX_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord");
-}
-
-static GLvoid resolve_fragment_fixed (GLuint e[], slang_export_data_table *tbl)
-{
- e[SLANG_FRAGMENT_FIXED_FRAGCOORD] = gd (tbl, "gl_FragCoord");
- e[SLANG_FRAGMENT_FIXED_FRONTFACING] = gd (tbl, "gl_FrontFacing");
- e[SLANG_FRAGMENT_FIXED_FRAGCOLOR] = gd (tbl, "gl_FragColor");
- e[SLANG_FRAGMENT_FIXED_FRAGDATA] = gd (tbl, "gl_FragData");
- e[SLANG_FRAGMENT_FIXED_FRAGDEPTH] = gd (tbl, "gl_FragDepth");
- e[SLANG_FRAGMENT_FIXED_COLOR] = gd (tbl, "gl_Color");
- e[SLANG_FRAGMENT_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor");
- e[SLANG_FRAGMENT_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord");
- e[SLANG_FRAGMENT_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord");
-}
-
-static GLuint gc (slang_export_code_table *tbl, const char *name)
-{
- slang_atom atom;
- GLuint i;
-
- atom = slang_atom_pool_atom (tbl->atoms, name);
- if (atom == SLANG_ATOM_NULL)
- return ~0;
-
- for (i = 0; i < tbl->count; i++)
- if (atom == tbl->entries[i].name)
- return tbl->entries[i].address;
- return ~0;
-}
-
-static GLvoid resolve_common_code (GLuint code[], slang_export_code_table *tbl)
-{
- code[SLANG_COMMON_CODE_MAIN] = gc (tbl, "@main");
+static GLuint
+gd (slang_export_data_table *tbl, const GLchar *name)
+{
+ slang_atom atom;
+ GLuint i;
+
+ atom = slang_atom_pool_atom (tbl->atoms, name);
+ if (atom == SLANG_ATOM_NULL)
+ return ~0;
+
+ for (i = 0; i < tbl->count; i++) {
+ if (atom == tbl->entries[i].quant.name)
+ return tbl->entries[i].address;
+ }
+ return ~0;
+}
+
+static GLvoid
+resolve_common_fixed (GLuint e[], slang_export_data_table *tbl)
+{
+ e[SLANG_COMMON_FIXED_MODELVIEWMATRIX] = gd (tbl, "gl_ModelViewMatrix");
+ e[SLANG_COMMON_FIXED_PROJECTIONMATRIX] = gd (tbl, "gl_ProjectionMatrix");
+ e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIX] = gd (tbl, "gl_ModelViewProjectionMatrix");
+ e[SLANG_COMMON_FIXED_TEXTUREMATRIX] = gd (tbl, "gl_TextureMatrix");
+ e[SLANG_COMMON_FIXED_NORMALMATRIX] = gd (tbl, "gl_NormalMatrix");
+ e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSE] = gd (tbl, "gl_ModelViewMatrixInverse");
+ e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSE] = gd (tbl, "gl_ProjectionMatrixInverse");
+ e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSE] = gd (tbl, "gl_ModelViewProjectionMatrixInverse");
+ e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSE] = gd (tbl, "gl_TextureMatrixInverse");
+ e[SLANG_COMMON_FIXED_MODELVIEWMATRIXTRANSPOSE] = gd (tbl, "gl_ModelViewMatrixTranspose");
+ e[SLANG_COMMON_FIXED_PROJECTIONMATRIXTRANSPOSE] = gd (tbl, "gl_ProjectionMatrixTranspose");
+ e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXTRANSPOSE] = gd (tbl, "gl_ModelViewProjectionMatrixTranspose");
+ e[SLANG_COMMON_FIXED_TEXTUREMATRIXTRANSPOSE] = gd (tbl, "gl_TextureMatrixTranspose");
+ e[SLANG_COMMON_FIXED_MODELVIEWMATRIXINVERSETRANSPOSE] = gd (tbl, "gl_ModelViewMatrixInverseTranspose");
+ e[SLANG_COMMON_FIXED_PROJECTIONMATRIXINVERSETRANSPOSE] = gd (tbl, "gl_ProjectionMatrixInverseTranspose");
+ e[SLANG_COMMON_FIXED_MODELVIEWPROJECTIONMATRIXINVERSETRANSPOSE] = gd (tbl, "gl_ModelViewProjectionMatrixInverseTranspose");
+ e[SLANG_COMMON_FIXED_TEXTUREMATRIXINVERSETRANSPOSE] = gd (tbl, "gl_TextureMatrixInverseTranspose");
+ e[SLANG_COMMON_FIXED_NORMALSCALE] = gd (tbl, "gl_NormalScale");
+ e[SLANG_COMMON_FIXED_DEPTHRANGE] = gd (tbl, "gl_DepthRange");
+ e[SLANG_COMMON_FIXED_CLIPPLANE] = gd (tbl, "gl_ClipPlane");
+ e[SLANG_COMMON_FIXED_POINT] = gd (tbl, "gl_Point");
+ e[SLANG_COMMON_FIXED_FRONTMATERIAL] = gd (tbl, "gl_FrontMaterial");
+ e[SLANG_COMMON_FIXED_BACKMATERIAL] = gd (tbl, "gl_BackMaterial");
+ e[SLANG_COMMON_FIXED_LIGHTSOURCE] = gd (tbl, "gl_LightSource");
+ e[SLANG_COMMON_FIXED_LIGHTMODEL] = gd (tbl, "gl_LightModel");
+ e[SLANG_COMMON_FIXED_FRONTLIGHTMODELPRODUCT] = gd (tbl, "gl_FrontLightModelProduct");
+ e[SLANG_COMMON_FIXED_BACKLIGHTMODELPRODUCT] = gd (tbl, "gl_BackLightModelProduct");
+ e[SLANG_COMMON_FIXED_FRONTLIGHTPRODUCT] = gd (tbl, "gl_FrontLightProduct");
+ e[SLANG_COMMON_FIXED_BACKLIGHTPRODUCT] = gd (tbl, "gl_BackLightProduct");
+ e[SLANG_COMMON_FIXED_TEXTUREENVCOLOR] = gd (tbl, "gl_TextureEnvColor");
+ e[SLANG_COMMON_FIXED_EYEPLANES] = gd (tbl, "gl_EyePlaneS");
+ e[SLANG_COMMON_FIXED_EYEPLANET] = gd (tbl, "gl_EyePlaneT");
+ e[SLANG_COMMON_FIXED_EYEPLANER] = gd (tbl, "gl_EyePlaneR");
+ e[SLANG_COMMON_FIXED_EYEPLANEQ] = gd (tbl, "gl_EyePlaneQ");
+ e[SLANG_COMMON_FIXED_OBJECTPLANES] = gd (tbl, "gl_ObjectPlaneS");
+ e[SLANG_COMMON_FIXED_OBJECTPLANET] = gd (tbl, "gl_ObjectPlaneT");
+ e[SLANG_COMMON_FIXED_OBJECTPLANER] = gd (tbl, "gl_ObjectPlaneR");
+ e[SLANG_COMMON_FIXED_OBJECTPLANEQ] = gd (tbl, "gl_ObjectPlaneQ");
+ e[SLANG_COMMON_FIXED_FOG] = gd (tbl, "gl_Fog");
+}
+
+static GLvoid
+resolve_vertex_fixed (GLuint e[], slang_export_data_table *tbl)
+{
+ e[SLANG_VERTEX_FIXED_POSITION] = gd (tbl, "gl_Position");
+ e[SLANG_VERTEX_FIXED_POINTSIZE] = gd (tbl, "gl_PointSize");
+ e[SLANG_VERTEX_FIXED_CLIPVERTEX] = gd (tbl, "gl_ClipVertex");
+ e[SLANG_VERTEX_FIXED_COLOR] = gd (tbl, "gl_Color");
+ e[SLANG_VERTEX_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor");
+ e[SLANG_VERTEX_FIXED_NORMAL] = gd (tbl, "gl_Normal");
+ e[SLANG_VERTEX_FIXED_VERTEX] = gd (tbl, "gl_Vertex");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD0] = gd (tbl, "gl_MultiTexCoord0");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD1] = gd (tbl, "gl_MultiTexCoord1");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD2] = gd (tbl, "gl_MultiTexCoord2");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD3] = gd (tbl, "gl_MultiTexCoord3");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD4] = gd (tbl, "gl_MultiTexCoord4");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD5] = gd (tbl, "gl_MultiTexCoord5");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD6] = gd (tbl, "gl_MultiTexCoord6");
+ e[SLANG_VERTEX_FIXED_MULTITEXCOORD7] = gd (tbl, "gl_MultiTexCoord7");
+ e[SLANG_VERTEX_FIXED_FOGCOORD] = gd (tbl, "gl_FogCoord");
+ e[SLANG_VERTEX_FIXED_FRONTCOLOR] = gd (tbl, "gl_FrontColor");
+ e[SLANG_VERTEX_FIXED_BACKCOLOR] = gd (tbl, "gl_BackColor");
+ e[SLANG_VERTEX_FIXED_FRONTSECONDARYCOLOR] = gd (tbl, "gl_FrontSecondaryColor");
+ e[SLANG_VERTEX_FIXED_BACKSECONDARYCOLOR] = gd (tbl, "gl_BackSecondaryColor");
+ e[SLANG_VERTEX_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord");
+ e[SLANG_VERTEX_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord");
+}
+
+static GLvoid
+resolve_fragment_fixed (GLuint e[], slang_export_data_table *tbl)
+{
+ e[SLANG_FRAGMENT_FIXED_FRAGCOORD] = gd (tbl, "gl_FragCoord");
+ e[SLANG_FRAGMENT_FIXED_FRONTFACING] = gd (tbl, "gl_FrontFacing");
+ e[SLANG_FRAGMENT_FIXED_FRAGCOLOR] = gd (tbl, "gl_FragColor");
+ e[SLANG_FRAGMENT_FIXED_FRAGDATA] = gd (tbl, "gl_FragData");
+ e[SLANG_FRAGMENT_FIXED_FRAGDEPTH] = gd (tbl, "gl_FragDepth");
+ e[SLANG_FRAGMENT_FIXED_COLOR] = gd (tbl, "gl_Color");
+ e[SLANG_FRAGMENT_FIXED_SECONDARYCOLOR] = gd (tbl, "gl_SecondaryColor");
+ e[SLANG_FRAGMENT_FIXED_TEXCOORD] = gd (tbl, "gl_TexCoord");
+ e[SLANG_FRAGMENT_FIXED_FOGFRAGCOORD] = gd (tbl, "gl_FogFragCoord");
+}
+
+static GLuint
+gc (slang_export_code_table *tbl, const GLchar *name)
+{
+ slang_atom atom;
+ GLuint i;
+
+ atom = slang_atom_pool_atom (tbl->atoms, name);
+ if (atom == SLANG_ATOM_NULL)
+ return ~0;
+
+ for (i = 0; i < tbl->count; i++) {
+ if (atom == tbl->entries[i].name)
+ return tbl->entries[i].address;
+ }
+ return ~0;
+}
+
+static GLvoid
+resolve_common_code (GLuint code[], slang_export_code_table *tbl)
+{
+ code[SLANG_COMMON_CODE_MAIN] = gc (tbl, "@main");
}
GLboolean
_slang_link (slang_program *prog, slang_code_object **objects, GLuint count)
{
- GLuint i;
+ GLuint i;
- for (i = 0; i < count; i++)
- {
- GLuint index;
+ for (i = 0; i < count; i++) {
+ GLuint index;
if (objects[i]->unit.type == slang_unit_fragment_shader) {
- index = SLANG_SHADER_FRAGMENT;
+ index = SLANG_SHADER_FRAGMENT;
resolve_fragment_fixed (prog->fragment_fixed_entries, &objects[i]->expdata);
- }
- else
- {
- index = SLANG_SHADER_VERTEX;
+ }
+ else {
+ index = SLANG_SHADER_VERTEX;
resolve_vertex_fixed (prog->vertex_fixed_entries, &objects[i]->expdata);
if (!gather_attrib_bindings (&prog->attribs, &objects[i]->expdata,
&prog->attrib_overrides))
- return GL_FALSE;
- }
+ return GL_FALSE;
+ }
if (!gather_active_variables (&prog->active_uniforms, &objects[i]->expdata, slang_exp_uniform))
- return GL_FALSE;
+ return GL_FALSE;
if (!gather_active_variables (&prog->active_attribs, &objects[i]->expdata, slang_exp_attribute))
- return GL_FALSE;
+ return GL_FALSE;
if (!gather_uniform_bindings (&prog->uniforms, &objects[i]->expdata, index))
- return GL_FALSE;
+ return GL_FALSE;
if (!gather_varying_bindings (&prog->varyings, &objects[i]->expdata,
index == SLANG_SHADER_VERTEX))
- return GL_FALSE;
+ return GL_FALSE;
resolve_common_fixed (prog->common_fixed_entries[index], &objects[i]->expdata);
resolve_common_code (prog->code[index], &objects[i]->expcode);
prog->machines[index] = &objects[i]->machine;
prog->assemblies[index] = &objects[i]->assembly;
- }
+ }
- /* TODO: all varyings read by fragment shader must be written by vertex shader */
+ /* TODO: all varyings read by fragment shader must be written by vertex shader */
- if (!_slang_analyse_texture_usage (prog))
- return GL_FALSE;
+ if (!_slang_analyse_texture_usage (prog))
+ return GL_FALSE;
- return GL_TRUE;
+ return GL_TRUE;
}