summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_scan.c72
1 files changed, 43 insertions, 29 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
index d7f7a172ee1..bfb415e439a 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
@@ -1029,11 +1029,12 @@ get_block_tessfactor_writemask(const struct tgsi_shader_info *info,
struct tgsi_full_instruction *inst;
unsigned writemask = 0;
- do {
- tgsi_parse_token(parse);
- assert(parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_INSTRUCTION);
- inst = &parse->FullToken.FullInstruction;
- check_no_subroutines(inst);
+ tgsi_parse_token(parse);
+ assert(parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_INSTRUCTION);
+ inst = &parse->FullToken.FullInstruction;
+ check_no_subroutines(inst);
+
+ while (inst->Instruction.Opcode != end_opcode) {
/* Recursively process nested blocks. */
switch (inst->Instruction.Opcode) {
@@ -1041,20 +1042,26 @@ get_block_tessfactor_writemask(const struct tgsi_shader_info *info,
case TGSI_OPCODE_UIF:
writemask |=
get_block_tessfactor_writemask(info, parse, TGSI_OPCODE_ENDIF);
- continue;
+ break;
case TGSI_OPCODE_BGNLOOP:
writemask |=
get_block_tessfactor_writemask(info, parse, TGSI_OPCODE_ENDLOOP);
- continue;
+ break;
case TGSI_OPCODE_BARRIER:
unreachable("nested BARRIER is illegal");
- continue;
+ break;
+
+ default:
+ writemask |= get_inst_tessfactor_writemask(info, inst);
}
- writemask |= get_inst_tessfactor_writemask(info, inst);
- } while (inst->Instruction.Opcode != end_opcode);
+ tgsi_parse_token(parse);
+ assert(parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_INSTRUCTION);
+ inst = &parse->FullToken.FullInstruction;
+ check_no_subroutines(inst);
+ }
return writemask;
}
@@ -1068,18 +1075,20 @@ get_if_block_tessfactor_writemask(const struct tgsi_shader_info *info,
struct tgsi_full_instruction *inst;
unsigned then_tessfactor_writemask = 0;
unsigned else_tessfactor_writemask = 0;
+ unsigned writemask;
bool is_then = true;
- do {
- tgsi_parse_token(parse);
- assert(parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_INSTRUCTION);
- inst = &parse->FullToken.FullInstruction;
- check_no_subroutines(inst);
+ tgsi_parse_token(parse);
+ assert(parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_INSTRUCTION);
+ inst = &parse->FullToken.FullInstruction;
+ check_no_subroutines(inst);
+
+ while (inst->Instruction.Opcode != TGSI_OPCODE_ENDIF) {
switch (inst->Instruction.Opcode) {
case TGSI_OPCODE_ELSE:
is_then = false;
- continue;
+ break;
/* Recursively process nested blocks. */
case TGSI_OPCODE_IF:
@@ -1088,28 +1097,33 @@ get_if_block_tessfactor_writemask(const struct tgsi_shader_info *info,
is_then ? &then_tessfactor_writemask :
&else_tessfactor_writemask,
cond_block_tf_writemask);
- continue;
+ break;
case TGSI_OPCODE_BGNLOOP:
*cond_block_tf_writemask |=
get_block_tessfactor_writemask(info, parse, TGSI_OPCODE_ENDLOOP);
- continue;
+ break;
case TGSI_OPCODE_BARRIER:
unreachable("nested BARRIER is illegal");
- continue;
- }
-
- /* Process an instruction in the current block. */
- unsigned writemask = get_inst_tessfactor_writemask(info, inst);
+ break;
+ default:
+ /* Process an instruction in the current block. */
+ writemask = get_inst_tessfactor_writemask(info, inst);
- if (writemask) {
- if (is_then)
- then_tessfactor_writemask |= writemask;
- else
- else_tessfactor_writemask |= writemask;
+ if (writemask) {
+ if (is_then)
+ then_tessfactor_writemask |= writemask;
+ else
+ else_tessfactor_writemask |= writemask;
+ }
}
- } while (inst->Instruction.Opcode != TGSI_OPCODE_ENDIF);
+
+ tgsi_parse_token(parse);
+ assert(parse->FullToken.Token.Type == TGSI_TOKEN_TYPE_INSTRUCTION);
+ inst = &parse->FullToken.FullInstruction;
+ check_no_subroutines(inst);
+ }
if (then_tessfactor_writemask || else_tessfactor_writemask) {
/* If both statements write the same tess factor channels,