@@ -16,6 +16,7 @@ default: $(TOP)/configs/current | |||
doxygen: | |||
cd doxygen && $(MAKE) | |||
clean: | |||
-@touch $(TOP)/configs/current | |||
-@for dir in $(SUBDIRS) ; do \ |
@@ -164,9 +164,7 @@ static void add_debug_flags( const char *debug ) | |||
{ "api", VERBOSE_API }, | |||
{ "list", VERBOSE_DISPLAY_LIST }, | |||
{ "lighting", VERBOSE_LIGHTING }, | |||
{ "disassem", VERBOSE_DISASSEM }, | |||
{ "glsl", VERBOSE_GLSL }, /* report GLSL compile/link errors */ | |||
{ "glsl_dump", VERBOSE_GLSL_DUMP } /* print shader GPU instructions */ | |||
{ "disassem", VERBOSE_DISASSEM } | |||
}; | |||
GLuint i; | |||
@@ -2162,6 +2162,13 @@ struct gl_shader_program | |||
}; | |||
#define GLSL_DUMP 0x1 /**< Dump shaders to stdout */ | |||
#define GLSL_LOG 0x2 /**< Write shaders to files */ | |||
#define GLSL_OPT 0x4 /**< Force optimizations (override pragmas) */ | |||
#define GLSL_NO_OPT 0x8 /**< Force no optimizations (override pragmas) */ | |||
#define GLSL_UNIFORMS 0x10 /**< Print glUniform calls */ | |||
/** | |||
* Context state for GLSL vertex/fragment shaders. | |||
*/ | |||
@@ -2173,6 +2180,7 @@ struct gl_shader_state | |||
GLboolean EmitCondCodes; /**< Use condition codes? */ | |||
GLboolean EmitComments; /**< Annotated instructions */ | |||
void *MemPool; | |||
GLbitfield Flags; /**< Mask of GLSL_x flags */ | |||
}; | |||
@@ -3163,8 +3171,6 @@ enum _verbose | |||
VERBOSE_PRIMS = 0x0400, | |||
VERBOSE_VERTS = 0x0800, | |||
VERBOSE_DISASSEM = 0x1000, | |||
VERBOSE_GLSL = 0x2000, | |||
VERBOSE_GLSL_DUMP = 0x4000 | |||
}; | |||
@@ -370,6 +370,31 @@ _mesa_lookup_shader_err(GLcontext *ctx, GLuint name, const char *caller) | |||
} | |||
/** | |||
* Return mask of GLSL_x flags by examining the MESA_GLSL env var. | |||
*/ | |||
static GLbitfield | |||
get_shader_flags(void) | |||
{ | |||
GLbitfield flags = 0x0; | |||
const char *env = _mesa_getenv("MESA_GLSL"); | |||
if (env) { | |||
if (_mesa_strstr(env, "dump")) | |||
flags |= GLSL_DUMP; | |||
if (_mesa_strstr(env, "log")) | |||
flags |= GLSL_LOG; | |||
if (_mesa_strstr(env, "nopt")) | |||
flags |= GLSL_NO_OPT; | |||
else if (_mesa_strstr(env, "opt")) | |||
flags |= GLSL_OPT; | |||
if (_mesa_strstr(env, "uniform")) | |||
flags |= GLSL_UNIFORMS; | |||
} | |||
return flags; | |||
} | |||
/** | |||
* Initialize context's shader state. | |||
@@ -383,6 +408,7 @@ _mesa_init_shader_state(GLcontext * ctx) | |||
ctx->Shader.EmitHighLevelInstructions = GL_TRUE; | |||
ctx->Shader.EmitCondCodes = GL_TRUE; /* XXX probably want GL_FALSE... */ | |||
ctx->Shader.EmitComments = GL_FALSE; | |||
ctx->Shader.Flags = get_shader_flags(); | |||
} | |||
@@ -1613,6 +1639,7 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, | |||
struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; | |||
struct gl_uniform *uniform; | |||
GLint elems, offset; | |||
GLenum basicType; | |||
if (!shProg || !shProg->LinkStatus) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)"); | |||
@@ -1636,19 +1663,35 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, | |||
switch (type) { | |||
case GL_FLOAT: | |||
basicType = GL_FLOAT; | |||
elems = 1; | |||
break; | |||
case GL_INT: | |||
basicType = GL_INT; | |||
elems = 1; | |||
break; | |||
case GL_FLOAT_VEC2: | |||
basicType = GL_FLOAT; | |||
elems = 2; | |||
break; | |||
case GL_INT_VEC2: | |||
basicType = GL_INT; | |||
elems = 2; | |||
break; | |||
case GL_FLOAT_VEC3: | |||
basicType = GL_FLOAT; | |||
elems = 3; | |||
break; | |||
case GL_INT_VEC3: | |||
basicType = GL_INT; | |||
elems = 3; | |||
break; | |||
case GL_FLOAT_VEC4: | |||
basicType = GL_FLOAT; | |||
elems = 4; | |||
break; | |||
case GL_INT_VEC4: | |||
basicType = GL_INT; | |||
elems = 4; | |||
break; | |||
default: | |||
@@ -1660,6 +1703,25 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, | |||
uniform = &shProg->Uniforms->Uniforms[location]; | |||
if (ctx->Shader.Flags & GLSL_UNIFORMS) { | |||
GLint i; | |||
_mesa_printf("Mesa: set program %u uniform %s (loc %d) to: ", | |||
shProg->Name, uniform->Name, location); | |||
if (basicType == GL_INT) { | |||
const GLint *v = (const GLint *) values; | |||
for (i = 0; i < count * elems; i++) { | |||
_mesa_printf("%d ", v[i]); | |||
} | |||
} | |||
else { | |||
const GLfloat *v = (const GLfloat *) values; | |||
for (i = 0; i < count * elems; i++) { | |||
_mesa_printf("%g ", v[i]); | |||
} | |||
} | |||
_mesa_printf("\n"); | |||
} | |||
/* A uniform var may be used by both a vertex shader and a fragment | |||
* shader. We may need to update one or both shader's uniform here: | |||
*/ |
@@ -32,6 +32,7 @@ | |||
#include "main/context.h" | |||
#include "shader/program.h" | |||
#include "shader/programopt.h" | |||
#include "shader/prog_optimize.h" | |||
#include "shader/prog_print.h" | |||
#include "shader/prog_parameter.h" | |||
#include "shader/grammar/grammar_mesa.h" | |||
@@ -2794,11 +2795,22 @@ _slang_compile(GLcontext *ctx, struct gl_shader *shader) | |||
_mesa_print_program(shader->Program); | |||
#endif | |||
if (success) { | |||
if ((ctx->Shader.Flags & GLSL_NO_OPT) == 0) { | |||
if ((ctx->Shader.Flags & GLSL_OPT) || shader->Pragmas.Optimize) { | |||
/* apply program optimizations */ | |||
_mesa_remove_extra_moves(shader->Program); | |||
_mesa_remove_dead_code(shader->Program); | |||
_mesa_consolidate_registers(shader->Program); | |||
} | |||
} | |||
} | |||
shader->CompileStatus = success; | |||
#if 0 | |||
_mesa_write_shader_to_file(shader); | |||
#endif | |||
if (ctx->Shader.Flags & GLSL_LOG) { | |||
_mesa_write_shader_to_file(shader); | |||
} | |||
return success; | |||
} |
@@ -675,12 +675,12 @@ _slang_link(GLcontext *ctx, | |||
/* notify driver that a new fragment program has been compiled/linked */ | |||
ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_PROGRAM_ARB, | |||
&shProg->FragmentProgram->Base); | |||
if (MESA_VERBOSE & VERBOSE_GLSL_DUMP) { | |||
printf("Mesa original fragment program:\n"); | |||
if (ctx->Shader.Flags & GLSL_DUMP) { | |||
_mesa_printf("Mesa original fragment program:\n"); | |||
_mesa_print_program(&fragProg->Base); | |||
_mesa_print_program_parameters(ctx, &fragProg->Base); | |||
printf("Mesa post-link fragment program:\n"); | |||
_mesa_printf("Mesa post-link fragment program:\n"); | |||
_mesa_print_program(&shProg->FragmentProgram->Base); | |||
_mesa_print_program_parameters(ctx, &shProg->FragmentProgram->Base); | |||
} | |||
@@ -693,22 +693,26 @@ _slang_link(GLcontext *ctx, | |||
/* notify driver that a new vertex program has been compiled/linked */ | |||
ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB, | |||
&shProg->VertexProgram->Base); | |||
if (MESA_VERBOSE & VERBOSE_GLSL_DUMP) { | |||
printf("Mesa original vertex program:\n"); | |||
if (ctx->Shader.Flags & GLSL_DUMP) { | |||
_mesa_printf("Mesa original vertex program:\n"); | |||
_mesa_print_program(&vertProg->Base); | |||
_mesa_print_program_parameters(ctx, &vertProg->Base); | |||
printf("Mesa post-link vertex program:\n"); | |||
_mesa_printf("Mesa post-link vertex program:\n"); | |||
_mesa_print_program(&shProg->VertexProgram->Base); | |||
_mesa_print_program_parameters(ctx, &shProg->VertexProgram->Base); | |||
} | |||
} | |||
if (MESA_VERBOSE & VERBOSE_GLSL_DUMP) { | |||
printf("Varying vars:\n"); | |||
if (ctx->Shader.Flags & GLSL_DUMP) { | |||
_mesa_printf("Varying vars:\n"); | |||
_mesa_print_parameter_list(shProg->Varying); | |||
if (shProg->InfoLog) { | |||
_mesa_printf("Info Log: %s\n", shProg->InfoLog); | |||
} | |||
} | |||
shProg->LinkStatus = (shProg->VertexProgram || shProg->FragmentProgram); | |||
} | |||
@@ -77,13 +77,11 @@ slang_info_log_message(slang_info_log * log, const char *prefix, | |||
slang_string_concat(log->text, msg); | |||
slang_string_concat(log->text, "\n"); | |||
if (MESA_VERBOSE & VERBOSE_GLSL) { | |||
_mesa_printf("Mesa: GLSL %s", log->text); | |||
} | |||
return 1; | |||
} | |||
#define EXIT_SUCCESS 13 | |||
int | |||
slang_info_log_print(slang_info_log * log, const char *msg, ...) | |||
{ |
@@ -177,6 +177,7 @@ SHADER_SOURCES = \ | |||
shader/prog_execute.c \ | |||
shader/prog_instruction.c \ | |||
shader/prog_noise.c \ | |||
shader/prog_optimize.c \ | |||
shader/prog_parameter.c \ | |||
shader/prog_print.c \ | |||
shader/prog_statevars.c \ |