diff options
-rw-r--r-- | src/mesa/shader/slang/slang_link.c | 77 | ||||
-rw-r--r-- | src/mesa/shader/slang/slang_link.h | 7 |
2 files changed, 53 insertions, 31 deletions
diff --git a/src/mesa/shader/slang/slang_link.c b/src/mesa/shader/slang/slang_link.c index 95e390020e4..66202edf8d0 100644 --- a/src/mesa/shader/slang/slang_link.c +++ b/src/mesa/shader/slang/slang_link.c @@ -171,7 +171,7 @@ static GLuint lookup_attrib_override (slang_attrib_overrides *self, const GLchar { GLuint i; - for (i = 0; self->count; i++) + 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; @@ -311,6 +311,12 @@ static GLvoid slang_attrib_bindings_dtr (slang_attrib_bindings *self) 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. + */ + static GLuint can_allocate_attrib_slots (slang_attrib_bindings *self, GLuint index, GLuint count) { GLuint i; @@ -325,7 +331,7 @@ static GLuint allocate_attrib_slots (slang_attrib_bindings *self, GLuint count) { GLuint i; - for (i = 0; i <= MAX_VERTEX_ATTRIBS - count; i++) + for (i = 1; i <= MAX_VERTEX_ATTRIBS - count; i++) { GLuint size; @@ -334,16 +340,17 @@ static GLuint allocate_attrib_slots (slang_attrib_bindings *self, GLuint count) return i; /* speed-up the search a bit */ - i += count; + i += size; } return MAX_VERTEX_ATTRIBS; } -static GLboolean add_attrib_binding (slang_attrib_bindings *self, slang_export_data_quant *q, - const char *name, GLuint addr, GLuint index_override) +static GLboolean +add_attrib_binding (slang_attrib_bindings *self, slang_export_data_quant *q, const char *name, + GLuint addr, GLuint index_override) { const GLuint n = self->binding_count; - GLuint slot_span, slot_index; + GLuint slot_span, slot_fill, slot_index; GLuint i; assert (slang_export_data_quant_simple (q)); @@ -351,19 +358,32 @@ static GLboolean add_attrib_binding (slang_attrib_bindings *self, slang_export_d switch (slang_export_data_quant_type (q)) { case GL_FLOAT: + slot_span = 1; + slot_fill = 1; + break; case GL_FLOAT_VEC2: + slot_span = 1; + slot_fill = 2; + break; case GL_FLOAT_VEC3: + slot_span = 1; + slot_fill = 3; + break; case GL_FLOAT_VEC4: slot_span = 1; + slot_fill = 4; break; case GL_FLOAT_MAT2: slot_span = 2; + slot_fill = 2; break; case GL_FLOAT_MAT3: slot_span = 3; + slot_fill = 3; break; case GL_FLOAT_MAT4: slot_span = 4; + slot_fill = 4; break; default: assert (0); @@ -389,8 +409,11 @@ static GLboolean add_attrib_binding (slang_attrib_bindings *self, slang_export_d self->bindings[n].first_slot_index = slot_index; self->binding_count++; - for (i = 0; i < slot_span; i++) - self->slots[self->bindings[n].first_slot_index + i].addr = addr + i * 4; + for (i = 0; i < slot_span; i++) { + slang_attrib_slot *slot = &self->slots[self->bindings[n].first_slot_index + i]; + slot->addr = addr + i * slot_fill * 4; + slot->fill = slot_fill; + } return GL_TRUE; } @@ -576,7 +599,7 @@ GLvoid slang_program_dtr (slang_program *self) slang_texture_usages_dtr (&self->texture_usage); } -static GLvoid slang_program_rst (slang_program *self) +GLvoid slang_program_rst (slang_program *self) { GLuint i; @@ -735,45 +758,41 @@ static GLvoid resolve_common_code (GLuint code[], slang_export_code_table *tbl) code[SLANG_COMMON_CODE_MAIN] = gc (tbl, "@main"); } -GLboolean _slang_link (slang_program *prog, slang_translation_unit **units, GLuint count) +GLboolean +_slang_link (slang_program *prog, slang_code_object **objects, GLuint count) { GLuint i; - slang_program_rst (prog); - for (i = 0; i < count; i++) { GLuint index; - if (units[i]->type == slang_unit_fragment_shader) - { + if (objects[i]->unit.type == slang_unit_fragment_shader) { index = SLANG_SHADER_FRAGMENT; - resolve_fragment_fixed (prog->fragment_fixed_entries, &units[i]->exp_data); + resolve_fragment_fixed (prog->fragment_fixed_entries, &objects[i]->expdata); } else { index = SLANG_SHADER_VERTEX; - resolve_vertex_fixed (prog->vertex_fixed_entries, &units[i]->exp_data); - if (!gather_attrib_bindings (&prog->attribs, &units[i]->exp_data, - &prog->attrib_overrides)) + 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; } - if (!gather_active_variables (&prog->active_uniforms, &units[i]->exp_data, - slang_exp_uniform)) + if (!gather_active_variables (&prog->active_uniforms, &objects[i]->expdata, slang_exp_uniform)) return GL_FALSE; - if (!gather_active_variables (&prog->active_attribs, &units[i]->exp_data, - slang_exp_attribute)) + if (!gather_active_variables (&prog->active_attribs, &objects[i]->expdata, slang_exp_attribute)) return GL_FALSE; - if (!gather_uniform_bindings (&prog->uniforms, &units[i]->exp_data, index)) + if (!gather_uniform_bindings (&prog->uniforms, &objects[i]->expdata, index)) return GL_FALSE; - if (!gather_varying_bindings (&prog->varyings, &units[i]->exp_data, - index == SLANG_SHADER_VERTEX)) + if (!gather_varying_bindings (&prog->varyings, &objects[i]->expdata, + index == SLANG_SHADER_VERTEX)) return GL_FALSE; - resolve_common_fixed (prog->common_fixed_entries[index], &units[i]->exp_data); - resolve_common_code (prog->code[index], &units[i]->exp_code); - prog->machines[index] = units[i]->machine; - prog->assemblies[index] = units[i]->assembly; + 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 */ diff --git a/src/mesa/shader/slang/slang_link.h b/src/mesa/shader/slang/slang_link.h index c5691300866..a7898530318 100644 --- a/src/mesa/shader/slang/slang_link.h +++ b/src/mesa/shader/slang/slang_link.h @@ -124,7 +124,8 @@ typedef struct typedef struct { - GLuint addr; + GLuint addr; /* memory location */ + GLuint fill; /* 1..4, number of components used */ } slang_attrib_slot; typedef struct @@ -302,8 +303,10 @@ typedef struct GLvoid slang_program_ctr (slang_program *); GLvoid slang_program_dtr (slang_program *); +GLvoid slang_program_rst (slang_program *); -GLboolean _slang_link (slang_program *, slang_translation_unit **, GLuint); +extern GLboolean +_slang_link (slang_program *, slang_code_object **, GLuint); #ifdef __cplusplus } |