mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
slang: Handle OOM condition in new_instruction().
This commit is contained in:
parent
031fbb9681
commit
83760d961f
1 changed files with 81 additions and 20 deletions
|
|
@ -431,6 +431,9 @@ new_instruction(slang_emit_info *emitInfo, gl_inst_opcode opcode)
|
|||
_mesa_realloc_instructions(prog->Instructions,
|
||||
prog->NumInstructions,
|
||||
emitInfo->MaxInstructions);
|
||||
if (!prog->Instructions) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
inst = prog->Instructions + prog->NumInstructions;
|
||||
|
|
@ -451,12 +454,14 @@ emit_arl_load(slang_emit_info *emitInfo,
|
|||
gl_register_file file, GLint index, GLuint swizzle)
|
||||
{
|
||||
struct prog_instruction *inst = new_instruction(emitInfo, OPCODE_ARL);
|
||||
inst->SrcReg[0].File = file;
|
||||
inst->SrcReg[0].Index = index;
|
||||
inst->SrcReg[0].Swizzle = fix_swizzle(swizzle);
|
||||
inst->DstReg.File = PROGRAM_ADDRESS;
|
||||
inst->DstReg.Index = 0;
|
||||
inst->DstReg.WriteMask = WRITEMASK_X;
|
||||
if (inst) {
|
||||
inst->SrcReg[0].File = file;
|
||||
inst->SrcReg[0].Index = index;
|
||||
inst->SrcReg[0].Swizzle = fix_swizzle(swizzle);
|
||||
inst->DstReg.File = PROGRAM_ADDRESS;
|
||||
inst->DstReg.Index = 0;
|
||||
inst->DstReg.WriteMask = WRITEMASK_X;
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
|
@ -765,7 +770,9 @@ static struct prog_instruction *
|
|||
emit_comment(slang_emit_info *emitInfo, const char *comment)
|
||||
{
|
||||
struct prog_instruction *inst = new_instruction(emitInfo, OPCODE_NOP);
|
||||
inst_comment(inst, comment);
|
||||
if (inst) {
|
||||
inst_comment(inst, comment);
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
|
@ -1191,6 +1198,9 @@ emit_fcall(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
* really just a NOP to attach the label to.
|
||||
*/
|
||||
inst = new_instruction(emitInfo, OPCODE_BGNSUB);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
inst_comment(inst, n->Label->Name);
|
||||
}
|
||||
|
||||
|
|
@ -1202,10 +1212,16 @@ emit_fcall(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
inst = prev_instruction(emitInfo);
|
||||
if (inst && inst->Opcode != OPCODE_RET) {
|
||||
inst = new_instruction(emitInfo, OPCODE_RET);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (emitInfo->EmitBeginEndSub) {
|
||||
inst = new_instruction(emitInfo, OPCODE_ENDSUB);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
inst_comment(inst, n->Label->Name);
|
||||
}
|
||||
|
||||
|
|
@ -1215,6 +1231,9 @@ emit_fcall(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
|
||||
/* emit the function call */
|
||||
inst = new_instruction(emitInfo, OPCODE_CAL);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
/* The branch target is just the subroutine number (changed later) */
|
||||
inst->BranchTarget = subroutineId;
|
||||
inst_comment(inst, n->Label->Name);
|
||||
|
|
@ -1249,6 +1268,9 @@ emit_kill(slang_emit_info *emitInfo)
|
|||
* Note that ARB-KILL depends on sign of vector operand.
|
||||
*/
|
||||
inst = new_instruction(emitInfo, OPCODE_KIL_NV);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
inst->DstReg.CondMask = COND_TR; /* always kill */
|
||||
|
||||
assert(emitInfo->prog->Target == GL_FRAGMENT_PROGRAM_ARB);
|
||||
|
|
@ -1600,8 +1622,10 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
if (emitInfo->EmitCondCodes) {
|
||||
/* IF condcode THEN ... */
|
||||
struct prog_instruction *ifInst;
|
||||
ifInst = new_instruction(emitInfo, OPCODE_IF);
|
||||
struct prog_instruction *ifInst = new_instruction(emitInfo, OPCODE_IF);
|
||||
if (!ifInst) {
|
||||
return NULL;
|
||||
}
|
||||
ifInst->DstReg.CondMask = COND_NE; /* if cond is non-zero */
|
||||
/* only test the cond code (1 of 4) that was updated by the
|
||||
* previous instruction.
|
||||
|
|
@ -1620,6 +1644,9 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
else {
|
||||
/* conditional jump to else, or endif */
|
||||
struct prog_instruction *ifInst = new_instruction(emitInfo, OPCODE_BRA);
|
||||
if (!ifInst) {
|
||||
return NULL;
|
||||
}
|
||||
ifInst->DstReg.CondMask = COND_EQ; /* BRA if cond is zero */
|
||||
inst_comment(ifInst, "if zero");
|
||||
ifInst->DstReg.CondSwizzle = writemask_to_swizzle(condWritemask);
|
||||
|
|
@ -1632,12 +1659,17 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
/* have else body */
|
||||
elseInstLoc = prog->NumInstructions;
|
||||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
(void) new_instruction(emitInfo, OPCODE_ELSE);
|
||||
struct prog_instruction *inst = new_instruction(emitInfo, OPCODE_ELSE);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* jump to endif instruction */
|
||||
struct prog_instruction *inst;
|
||||
inst = new_instruction(emitInfo, OPCODE_BRA);
|
||||
struct prog_instruction *inst = new_instruction(emitInfo, OPCODE_BRA);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
inst_comment(inst, "else");
|
||||
inst->DstReg.CondMask = COND_TR; /* always branch */
|
||||
}
|
||||
|
|
@ -1650,7 +1682,10 @@ emit_if(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
}
|
||||
|
||||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
(void) new_instruction(emitInfo, OPCODE_ENDIF);
|
||||
struct prog_instruction *inst = new_instruction(emitInfo, OPCODE_ENDIF);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (n->Children[2]) {
|
||||
|
|
@ -1671,7 +1706,10 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
/* emit OPCODE_BGNLOOP */
|
||||
beginInstLoc = prog->NumInstructions;
|
||||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
(void) new_instruction(emitInfo, OPCODE_BGNLOOP);
|
||||
struct prog_instruction *inst = new_instruction(emitInfo, OPCODE_BGNLOOP);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* body */
|
||||
|
|
@ -1689,10 +1727,16 @@ emit_loop(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
if (emitInfo->EmitHighLevelInstructions) {
|
||||
/* emit OPCODE_ENDLOOP */
|
||||
endInst = new_instruction(emitInfo, OPCODE_ENDLOOP);
|
||||
if (!endInst) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* emit unconditional BRA-nch */
|
||||
endInst = new_instruction(emitInfo, OPCODE_BRA);
|
||||
if (!endInst) {
|
||||
return NULL;
|
||||
}
|
||||
endInst->DstReg.CondMask = COND_TR; /* always true */
|
||||
}
|
||||
/* ENDLOOP's BranchTarget points to the BGNLOOP inst */
|
||||
|
|
@ -1762,7 +1806,9 @@ emit_cont_break(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
}
|
||||
n->InstLocation = emitInfo->prog->NumInstructions;
|
||||
inst = new_instruction(emitInfo, opcode);
|
||||
inst->DstReg.CondMask = COND_TR; /* always true */
|
||||
if (inst) {
|
||||
inst->DstReg.CondMask = COND_TR; /* always true */
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
|
||||
|
|
@ -1798,8 +1844,10 @@ emit_cont_break_if_true(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
*/
|
||||
const GLuint condWritemask = inst->DstReg.WriteMask;
|
||||
inst = new_instruction(emitInfo, opcode);
|
||||
inst->DstReg.CondMask = COND_NE;
|
||||
inst->DstReg.CondSwizzle = writemask_to_swizzle(condWritemask);
|
||||
if (inst) {
|
||||
inst->DstReg.CondMask = COND_NE;
|
||||
inst->DstReg.CondSwizzle = writemask_to_swizzle(condWritemask);
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
else {
|
||||
|
|
@ -1817,7 +1865,13 @@ emit_cont_break_if_true(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
n->InstLocation = emitInfo->prog->NumInstructions;
|
||||
|
||||
inst = new_instruction(emitInfo, opcode);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
inst = new_instruction(emitInfo, OPCODE_ENDIF);
|
||||
if (!inst) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
emitInfo->prog->Instructions[ifInstLoc].BranchTarget
|
||||
= emitInfo->prog->NumInstructions;
|
||||
|
|
@ -1828,8 +1882,10 @@ emit_cont_break_if_true(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
const GLuint condWritemask = inst->DstReg.WriteMask;
|
||||
assert(emitInfo->EmitCondCodes);
|
||||
inst = new_instruction(emitInfo, OPCODE_BRA);
|
||||
inst->DstReg.CondMask = COND_NE;
|
||||
inst->DstReg.CondSwizzle = writemask_to_swizzle(condWritemask);
|
||||
if (inst) {
|
||||
inst->DstReg.CondMask = COND_NE;
|
||||
inst->DstReg.CondSwizzle = writemask_to_swizzle(condWritemask);
|
||||
}
|
||||
return inst;
|
||||
}
|
||||
}
|
||||
|
|
@ -2201,7 +2257,9 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
|
|||
|
||||
if (n->Comment) {
|
||||
inst = new_instruction(emitInfo, OPCODE_NOP);
|
||||
inst->Comment = _mesa_strdup(n->Comment);
|
||||
if (inst) {
|
||||
inst->Comment = _mesa_strdup(n->Comment);
|
||||
}
|
||||
inst = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -2503,6 +2561,9 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
|
|||
if (withEnd) {
|
||||
struct prog_instruction *inst;
|
||||
inst = new_instruction(&emitInfo, OPCODE_END);
|
||||
if (!inst) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
_slang_resolve_subroutines(&emitInfo);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue