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:
@@ -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;
|
||||||
|
@@ -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++) {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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" */
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user