summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/mtypes.h2
-rw-r--r--src/mesa/shader/shader_api.c14
-rw-r--r--src/mesa/shader/slang/slang_emit.c27
3 files changed, 26 insertions, 17 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index bd9198ef12..26b5c91ada 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2104,6 +2104,8 @@ struct gl_shader_program
struct gl_shader_state
{
struct gl_shader_program *CurrentProgram; /**< The user-bound program */
+ GLboolean EmitHighLevelInstructions; /**< Driver-selectable */
+ GLboolean EmitComments; /**< Driver-selectable */
};
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c
index 70ceb70fe7..48ba8b657a 100644
--- a/src/mesa/shader/shader_api.c
+++ b/src/mesa/shader/shader_api.c
@@ -196,16 +196,20 @@ _mesa_lookup_shader(GLcontext *ctx, GLuint name)
}
+/**
+ * Initialize context's shader state.
+ */
void
_mesa_init_shader_state(GLcontext * ctx)
{
- /* no-op */
+ /* Device drivers may override these to control what kind of instructions
+ * are generated by the GLSL compiler.
+ */
+ ctx->Shader.EmitHighLevelInstructions = GL_TRUE;
+ ctx->Shader.EmitComments = GL_FALSE;
}
-
-
-
/**
* Copy string from <src> to <dst>, up to maxLength characters, returning
* length of <dst> in <length>.
@@ -227,8 +231,6 @@ copy_string(GLchar *dst, GLsizei maxLength, GLsizei *length, const GLchar *src)
}
-
-
/**
* Called via ctx->Driver.AttachShader()
*/
diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c
index b0776e9340..9ead896142 100644
--- a/src/mesa/shader/slang/slang_emit.c
+++ b/src/mesa/shader/slang/slang_emit.c
@@ -52,8 +52,6 @@
/* XXX temporarily here */
-static GLboolean EmitHighLevelInstructions = GL_TRUE;
-static GLboolean EmitComments = GL_FALSE;
typedef struct
@@ -61,6 +59,9 @@ typedef struct
slang_info_log *log;
slang_var_table *vt;
struct gl_program *prog;
+ /* code-gen options */
+ GLboolean EmitHighLevelInstructions;
+ GLboolean EmitComments;
} slang_emit_info;
@@ -1111,7 +1112,7 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
emit(emitInfo, n->Children[0]); /* the condition */
ifInstLoc = prog->NumInstructions;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
ifInst = new_instruction(emitInfo, OPCODE_IF);
ifInst->DstReg.CondMask = COND_NE; /* if cond is non-zero */
ifInst->DstReg.CondSwizzle = SWIZZLE_X;
@@ -1130,7 +1131,7 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
if (n->Children[2]) {
/* have else body */
elseInstLoc = prog->NumInstructions;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
(void) new_instruction(emitInfo, OPCODE_ELSE);
}
else {
@@ -1151,7 +1152,7 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
ifInst->BranchTarget = prog->NumInstructions + 1;
}
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
(void) new_instruction(emitInfo, OPCODE_ENDIF);
}
@@ -1174,7 +1175,7 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
/* emit OPCODE_BGNLOOP */
beginInstLoc = prog->NumInstructions;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
(void) new_instruction(emitInfo, OPCODE_BGNLOOP);
}
@@ -1182,7 +1183,7 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
emit(emitInfo, n->Children[0]);
endInstLoc = prog->NumInstructions;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
/* emit OPCODE_ENDLOOP */
endInst = new_instruction(emitInfo, OPCODE_ENDLOOP);
}
@@ -1194,7 +1195,7 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
/* end instruction's BranchTarget points to top of loop */
endInst->BranchTarget = beginInstLoc;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
/* BGNLOOP's BranchTarget points to the ENDLOOP inst */
beginInst = prog->Instructions + beginInstLoc;
beginInst->BranchTarget = prog->NumInstructions - 1;
@@ -1239,7 +1240,7 @@ emit_cont_break(slang_emit_info *emitInfo, slang_ir_node *n)
gl_inst_opcode opcode;
struct prog_instruction *inst;
n->InstLocation = emitInfo->prog->NumInstructions;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
opcode = (n->Opcode == IR_CONT) ? OPCODE_CONT : OPCODE_BRK;
}
else {
@@ -1268,7 +1269,7 @@ emit_cont_break_if(slang_emit_info *emitInfo, slang_ir_node *n,
inst->CondUpdate = GL_TRUE;
n->InstLocation = emitInfo->prog->NumInstructions;
- if (EmitHighLevelInstructions) {
+ if (emitInfo->EmitHighLevelInstructions) {
if (n->Opcode == IR_CONT_IF_TRUE ||
n->Opcode == IR_CONT_IF_FALSE)
opcode = OPCODE_CONT;
@@ -1440,7 +1441,7 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
*/
assert(n->Var->aux == n->Store);
}
- if (EmitComments) {
+ if (emitInfo->EmitComments) {
/* emit NOP with comment describing the variable's storage location */
char s[1000];
sprintf(s, "TEMP[%d]%s = %s (size %d)",
@@ -1599,6 +1600,7 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
struct gl_program *prog, GLboolean withEnd,
slang_info_log *log)
{
+ GET_CURRENT_CONTEXT(ctx);
GLboolean success;
slang_emit_info emitInfo;
@@ -1606,6 +1608,9 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
emitInfo.vt = vt;
emitInfo.prog = prog;
+ emitInfo.EmitHighLevelInstructions = ctx->Shader.EmitHighLevelInstructions;
+ emitInfo.EmitComments = ctx->Shader.EmitComments;
+
(void) emit(&emitInfo, n);
/* finish up by adding the END opcode to program */