glsl2: Use Mesa's gl_shader_program instead of our own struct glsl_program.

This avoids more allocation and shuffling of data around.
This commit is contained in:
Eric Anholt
2010-06-30 11:49:17 -07:00
parent 0eda9ae0a6
commit 849e18153c
6 changed files with 36 additions and 66 deletions

View File

@@ -116,7 +116,7 @@ private:
void void
linker_error_printf(glsl_program *prog, const char *fmt, ...) linker_error_printf(gl_shader_program *prog, const char *fmt, ...)
{ {
va_list ap; va_list ap;
@@ -186,7 +186,7 @@ count_attribute_slots(const glsl_type *t)
* \param shader Vertex shader executable to be verified * \param shader Vertex shader executable to be verified
*/ */
bool bool
validate_vertex_shader_executable(struct glsl_program *prog, validate_vertex_shader_executable(struct gl_shader_program *prog,
struct gl_shader *shader) struct gl_shader *shader)
{ {
if (shader == NULL) if (shader == NULL)
@@ -215,7 +215,7 @@ validate_vertex_shader_executable(struct glsl_program *prog,
* \param shader Fragment shader executable to be verified * \param shader Fragment shader executable to be verified
*/ */
bool bool
validate_fragment_shader_executable(struct glsl_program *prog, validate_fragment_shader_executable(struct gl_shader_program *prog,
struct gl_shader *shader) struct gl_shader *shader)
{ {
if (shader == NULL) if (shader == NULL)
@@ -252,7 +252,7 @@ validate_fragment_shader_executable(struct glsl_program *prog,
* Perform validation of uniforms used across multiple shader stages * Perform validation of uniforms used across multiple shader stages
*/ */
bool bool
cross_validate_uniforms(struct glsl_program *prog) cross_validate_uniforms(struct gl_shader_program *prog)
{ {
/* Examine all of the uniforms in all of the shaders and cross validate /* Examine all of the uniforms in all of the shaders and cross validate
* them. * them.
@@ -308,7 +308,7 @@ cross_validate_uniforms(struct glsl_program *prog)
* Validate that outputs from one stage match inputs of another * Validate that outputs from one stage match inputs of another
*/ */
bool bool
cross_validate_outputs_to_inputs(struct glsl_program *prog, cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
gl_shader *producer, gl_shader *consumer) gl_shader *producer, gl_shader *consumer)
{ {
glsl_symbol_table parameters; glsl_symbol_table parameters;
@@ -412,7 +412,7 @@ struct uniform_node {
}; };
void void
assign_uniform_locations(struct glsl_program *prog) assign_uniform_locations(struct gl_shader_program *prog)
{ {
/* */ /* */
exec_list uniforms; exec_list uniforms;
@@ -533,7 +533,7 @@ find_available_slots(unsigned used_mask, unsigned needed_count)
bool bool
assign_attribute_locations(glsl_program *prog, unsigned max_attribute_index) assign_attribute_locations(gl_shader_program *prog, unsigned max_attribute_index)
{ {
/* Mark invalid attribute locations as being used. /* Mark invalid attribute locations as being used.
*/ */
@@ -767,7 +767,7 @@ assign_varying_locations(gl_shader *producer, gl_shader *consumer)
void void
link_shaders(struct glsl_program *prog) link_shaders(struct gl_shader_program *prog)
{ {
prog->LinkStatus = false; prog->LinkStatus = false;
prog->Validated = false; prog->Validated = false;

View File

@@ -206,9 +206,9 @@ main(int argc, char **argv)
if (argc <= optind) if (argc <= optind)
usage_fail(argv[0]); usage_fail(argv[0]);
struct glsl_program *whole_program; struct gl_shader_program *whole_program;
whole_program = talloc_zero (NULL, struct glsl_program); whole_program = talloc_zero (NULL, struct gl_shader_program);
assert(whole_program != NULL); assert(whole_program != NULL);
for (/* empty */; argc > optind; optind++) { for (/* empty */; argc > optind; optind++) {

View File

@@ -29,37 +29,5 @@ extern "C" {
#include "shader/prog_uniform.h" #include "shader/prog_uniform.h"
} }
/**
* Based on gl_shader_program in Mesa's mtypes.h.
*/
struct glsl_program {
GLenum Type; /**< Always GL_SHADER_PROGRAM (internal token) */
GLuint Name; /**< aka handle or ID */
GLint RefCount; /**< Reference count */
GLboolean DeletePending;
GLuint NumShaders; /**< number of attached shaders */
struct gl_shader **Shaders; /**< List of attached the shaders */
/**
* Per-stage shaders resulting from the first stage of linking.
*/
/*@{*/
unsigned _NumLinkedShaders;
struct gl_shader **_LinkedShaders;
/*@}*/
/** User-defined attribute bindings (glBindAttribLocation) */
struct gl_program_parameter_list *Attributes;
/* post-link info: */
struct gl_uniform_list *Uniforms;
struct gl_program_parameter_list *Varying;
GLboolean LinkStatus; /**< GL_LINK_STATUS */
GLboolean Validated;
GLboolean _Used; /**< Ever used for drawing? */
GLchar *InfoLog;
};
extern void extern void
link_shaders(struct glsl_program *prog); link_shaders(struct gl_shader_program *prog);

View File

@@ -2005,6 +2005,9 @@ struct gl_shader_program
GLboolean Validated; GLboolean Validated;
GLboolean _Used; /**< Ever used for drawing? */ GLboolean _Used; /**< Ever used for drawing? */
GLchar *InfoLog; GLchar *InfoLog;
GLuint _NumLinkedShaders;
struct gl_shader **_LinkedShaders;
}; };

View File

@@ -1709,48 +1709,49 @@ _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
void void
_mesa_glsl_link_shader(GLcontext *ctx, struct gl_shader_program *prog) _mesa_glsl_link_shader(GLcontext *ctx, struct gl_shader_program *prog)
{ {
struct glsl_program *whole_program;
unsigned int i; unsigned int i;
_mesa_clear_shader_program_data(ctx, prog); _mesa_clear_shader_program_data(ctx, prog);
whole_program = talloc_zero(NULL, struct glsl_program); prog->LinkStatus = GL_TRUE;
whole_program->LinkStatus = GL_TRUE;
whole_program->NumShaders = prog->NumShaders;
whole_program->Shaders = talloc_array(whole_program, struct gl_shader *,
prog->NumShaders);
for (i = 0; i < prog->NumShaders; i++) { for (i = 0; i < prog->NumShaders; i++) {
whole_program->Shaders[i] = prog->Shaders[i]; if (!prog->Shaders[i]->CompileStatus) {
if (!whole_program->Shaders[i]->CompileStatus) { prog->InfoLog =
whole_program->InfoLog = talloc_asprintf_append(prog->InfoLog,
talloc_asprintf_append(whole_program->InfoLog,
"linking with uncompiled shader"); "linking with uncompiled shader");
whole_program->LinkStatus = GL_FALSE; prog->LinkStatus = GL_FALSE;
} }
} }
prog->Uniforms = _mesa_new_uniform_list();
prog->Varying = _mesa_new_parameter_list(); prog->Varying = _mesa_new_parameter_list();
_mesa_reference_vertprog(ctx, &prog->VertexProgram, NULL); _mesa_reference_vertprog(ctx, &prog->VertexProgram, NULL);
_mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL); _mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL);
if (whole_program->LinkStatus) if (prog->LinkStatus) {
link_shaders(whole_program); link_shaders(prog);
prog->LinkStatus = whole_program->LinkStatus; /* We don't use the linker's uniforms list, and cook up our own at
* generate time.
*/
free(prog->Uniforms);
prog->Uniforms = _mesa_new_uniform_list();
}
prog->LinkStatus = prog->LinkStatus;
/* FINISHME: This should use the linker-generated code */ /* FINISHME: This should use the linker-generated code */
if (prog->LinkStatus) { if (prog->LinkStatus) {
for (i = 0; i < prog->NumShaders; i++) { for (i = 0; i < prog->NumShaders; i++) {
struct gl_program *linked_prog; struct gl_program *linked_prog;
linked_prog = get_mesa_program(ctx, whole_program, linked_prog = get_mesa_program(ctx, prog,
whole_program->Shaders[i]); prog->Shaders[i]);
count_resources(linked_prog); count_resources(linked_prog);
link_uniforms_to_shared_uniform_list(prog->Uniforms, linked_prog); link_uniforms_to_shared_uniform_list(prog->Uniforms, linked_prog);
switch (whole_program->Shaders[i]->Type) { switch (prog->Shaders[i]->Type) {
case GL_VERTEX_SHADER: case GL_VERTEX_SHADER:
_mesa_reference_vertprog(ctx, &prog->VertexProgram, _mesa_reference_vertprog(ctx, &prog->VertexProgram,
(struct gl_vertex_program *)linked_prog); (struct gl_vertex_program *)linked_prog);
@@ -1766,8 +1767,6 @@ _mesa_glsl_link_shader(GLcontext *ctx, struct gl_shader_program *prog)
} }
} }
} }
talloc_free(whole_program);
} }
} /* extern "C" */ } /* extern "C" */

View File

@@ -53,7 +53,7 @@ static struct gl_shader_program *
_mesa_new_shader_program(GLcontext *ctx, GLuint name) _mesa_new_shader_program(GLcontext *ctx, GLuint name)
{ {
struct gl_shader_program *shProg; struct gl_shader_program *shProg;
shProg = CALLOC_STRUCT(gl_shader_program); shProg = talloc_zero(NULL, struct gl_shader_program);
if (shProg) { if (shProg) {
shProg->Type = GL_SHADER_PROGRAM_MESA; shProg->Type = GL_SHADER_PROGRAM_MESA;
shProg->Name = name; shProg->Name = name;
@@ -117,7 +117,7 @@ _mesa_free_shader_program_data(GLcontext *ctx,
} }
if (shProg->InfoLog) { if (shProg->InfoLog) {
free(shProg->InfoLog); talloc_free(shProg->InfoLog);
shProg->InfoLog = NULL; shProg->InfoLog = NULL;
} }
@@ -139,7 +139,7 @@ _mesa_free_shader_program(GLcontext *ctx, struct gl_shader_program *shProg)
{ {
_mesa_free_shader_program_data(ctx, shProg); _mesa_free_shader_program_data(ctx, shProg);
free(shProg); talloc_free(shProg);
} }