[Mesa-dev] [PATCH 11/15] mesa: Make _mesa_GetActiveAttribARB use the attributes in the shader IR
Ian Romanick
idr at freedesktop.org
Thu Sep 29 10:52:01 PDT 2011
From: Ian Romanick <ian.d.romanick at intel.com>
Instead of relying on the mirror in the Mesa IR assembly shader, just
use the variables actually stored in the GLSL IR. This will be a bit
slower, but nobody cares about the performance of glGetActiveAttrib.
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/glsl/program.h | 3 ++
src/mesa/main/shader_query.cpp | 49 ++++++++++++++++++++++++++++++---------
2 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/src/glsl/program.h b/src/glsl/program.h
index 437ca14..5a68d66 100644
--- a/src/glsl/program.h
+++ b/src/glsl/program.h
@@ -26,6 +26,9 @@
extern void
link_shaders(struct gl_context *ctx, struct gl_shader_program *prog);
+extern unsigned
+count_attribute_slots(const glsl_type *t);
+
extern void
linker_error(gl_shader_program *prog, const char *fmt, ...)
PRINTFLIKE(2, 3);
diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp
index 7959201..84b25cd 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -33,6 +33,7 @@
#include "ir.h"
#include "shaderobj.h"
#include "program/hash_table.h"
+#include "../glsl/program.h"
extern "C" {
#include "shaderapi.h"
@@ -94,30 +95,54 @@ _mesa_GetActiveAttribARB(GLhandleARB program, GLuint index,
GLenum * type, GLcharARB * name)
{
GET_CURRENT_CONTEXT(ctx);
- const struct gl_program_parameter_list *attribs = NULL;
struct gl_shader_program *shProg;
shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveAttrib");
if (!shProg)
return;
- if (shProg->VertexProgram)
- attribs = shProg->VertexProgram->Base.Attributes;
+ if (!shProg->LinkStatus) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glGetActiveAttrib(program not linked)");
+ return;
+ }
- if (!attribs || index >= attribs->NumParameters) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
+ if (shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(no vertex shader)");
return;
}
- _mesa_copy_string(name, maxLength, length,
- attribs->Parameters[index].Name);
+ exec_list *const ir = shProg->_LinkedShaders[MESA_SHADER_VERTEX]->ir;
+ unsigned i = 0;
+
+ foreach_list(node, ir) {
+ const ir_variable *const var = ((ir_instruction *) node)->as_variable();
+
+ if (var == NULL
+ || var->mode != ir_var_in
+ || var->location == -1
+ || var->location < VERT_ATTRIB_GENERIC0)
+ continue;
+
+ if (i == index) {
+ _mesa_copy_string(name, maxLength, length, var->name);
- if (size)
- *size = attribs->Parameters[index].Size
- / _mesa_sizeof_glsl_type(attribs->Parameters[index].DataType);
+ if (size)
+ *size = (var->type->is_array()) ? var->type->length : 1;
- if (type)
- *type = attribs->Parameters[index].DataType;
+ if (type)
+ *type = var->type->gl_type;
+
+ return;
+ }
+
+ i++;
+ }
+
+ /* If the loop did not return early, the caller must have asked for
+ * an index that did not exit. Set an error.
+ */
+ _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
}
--
1.7.6
More information about the mesa-dev
mailing list