summaryrefslogtreecommitdiff
path: root/src/mesa/shader/slang/slang_link2.c
diff options
context:
space:
mode:
authorBrian <brian@yutani.localnet.net>2006-12-18 10:05:24 -0700
committerBrian <brian@yutani.localnet.net>2006-12-18 10:05:24 -0700
commit1aee657b0f0fb34a0d6717e47f3bdfd67de8bfc2 (patch)
treea963e0a23653cb87240994c90cd7500e6e112e73 /src/mesa/shader/slang/slang_link2.c
parent34ae99d6049b10115ca64daecdd1d879d3b5140d (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.c44
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);