diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/mtypes.h | 2 | ||||
-rw-r--r-- | src/mesa/shader/shader_api.c | 14 | ||||
-rw-r--r-- | src/mesa/shader/slang/slang_emit.c | 27 |
3 files changed, 26 insertions, 17 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index bd9198ef12f..26b5c91adae 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 70ceb70fe74..48ba8b657a0 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 b0776e93407..9ead8961425 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 */ |