diff options
author | Brian <brian@yutani.localnet.net> | 2006-12-18 10:05:24 -0700 |
---|---|---|
committer | Brian <brian@yutani.localnet.net> | 2006-12-18 10:05:24 -0700 |
commit | 1aee657b0f0fb34a0d6717e47f3bdfd67de8bfc2 (patch) | |
tree | a963e0a23653cb87240994c90cd7500e6e112e73 /src/mesa/shader/slang/slang_link2.c | |
parent | 34ae99d6049b10115ca64daecdd1d879d3b5140d (diff) |
Implement if-conditionals and while loops, added temporary resolve-branches function in linker.
Diffstat (limited to 'src/mesa/shader/slang/slang_link2.c')
-rw-r--r-- | src/mesa/shader/slang/slang_link2.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/mesa/shader/slang/slang_link2.c b/src/mesa/shader/slang/slang_link2.c index 6a276d69ac..c170b3e053 100644 --- a/src/mesa/shader/slang/slang_link2.c +++ b/src/mesa/shader/slang/slang_link2.c @@ -230,6 +230,47 @@ link_uniform_vars(struct gl_linked_program *linked, struct gl_program *prog) /** + * XXX Temporary + */ +static void +slang_resolve_branches(struct gl_program *prog) +{ + struct target { + const char *Name; + GLuint Pos; + }; + struct target targets[500]; + GLuint numTargets = 0; + GLuint i, j; + + for (i = 0; i < prog->NumInstructions; i++) { + struct prog_instruction *inst = prog->Instructions + i; + if (inst->Opcode == OPCODE_NOP && inst->Comment) { + targets[numTargets].Name = inst->Comment; + targets[numTargets].Pos = i; + numTargets++; + } + } + + for (i = 0; i < prog->NumInstructions; i++) { + struct prog_instruction *inst = prog->Instructions + i; + if (inst->Opcode == OPCODE_BRA) { + for (j = 0; j < numTargets; j++) { + if (!strcmp(inst->Comment, targets[j].Name)) { + inst->BranchTarget = targets[j].Pos; + break; + } + } + if (j == numTargets) { + abort(); + } + } + } +} + + + +/** * Shader linker. Currently: * * 1. The last attached vertex shader and fragment shader are linked. @@ -298,6 +339,9 @@ _slang_link2(GLcontext *ctx, linked->VertexProgram->Base.Parameters = linked->Uniforms; linked->FragmentProgram->Base.Parameters = linked->Uniforms; + slang_resolve_branches(&linked->VertexProgram->Base); + slang_resolve_branches(&linked->FragmentProgram->Base); + #if 1 printf("************** original fragment program\n"); _mesa_print_program(&fragProg->Base); |