nouveau: match gallium changes
authorBen Skeggs <skeggsb@gmail.com>
Sun, 23 Dec 2007 05:05:02 +0000 (16:05 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Sun, 23 Dec 2007 05:05:02 +0000 (16:05 +1100)
src/mesa/drivers/dri/nouveau_winsys/nouveau_screen.c
src/mesa/pipe/nv40/nv40_fragprog.c
src/mesa/pipe/nv40/nv40_vertprog.c

index 6324a59..784dfdd 100644 (file)
@@ -141,8 +141,9 @@ nouveau_create_buffer(__DRIscreenPrivate * driScrnPriv,
        else
                stencil = PIPE_FORMAT_NONE;
 
-       nvfb->stfb = st_create_framebuffer(glVis, GL_TRUE, colour, depth,
-                                          stencil, (void*)nvfb);
+       nvfb->stfb = st_create_framebuffer(glVis, colour, depth, stencil,
+                                          driDrawPriv->w, driDrawPriv->h,
+                                          (void*)nvfb);
        if (!nvfb->stfb) {
                free(nvfb);
                return  GL_FALSE;
index c95f31e..480c4c9 100644 (file)
@@ -378,7 +378,7 @@ nv40_fragprog_parse_instruction(struct nv40_fpc *fpc,
        int ai = -1, ci = -1;
        int i;
 
-       if (finst->Instruction.Opcode == TGSI_OPCODE_RET)
+       if (finst->Instruction.Opcode == TGSI_OPCODE_END)
                return TRUE;
 
        fpc->temp_temp_count = 0;
@@ -537,6 +537,9 @@ nv40_fragprog_parse_instruction(struct nv40_fpc *fpc,
        case TGSI_OPCODE_RCP:
                arith(fpc, sat, RCP, dst, mask, src[0], none, none);
                break;
+       case TGSI_OPCODE_RET:
+               assert(0);
+               break;
        case TGSI_OPCODE_RFL:
                tmp = temp(fpc);
                arith(fpc, 0, DP3, tmp, MASK_X, src[0], src[0], none);
index 981d70e..84618c1 100644 (file)
@@ -47,9 +47,12 @@ struct nv40_vpc {
 
        int high_temp;
        int temp_temp_count;
+
+       struct nv40_sreg *imm;
+       unsigned nr_imm;
 };
 
-static INLINE struct nv40_sreg
+static struct nv40_sreg
 temp(struct nv40_vpc *vpc)
 {
        int idx;
@@ -59,7 +62,7 @@ temp(struct nv40_vpc *vpc)
        return nv40_sr(NV40SR_TEMP, idx);
 }
 
-static INLINE struct nv40_sreg
+static struct nv40_sreg
 constant(struct nv40_vpc *vpc, int pipe, float x, float y, float z, float w)
 {
        struct nv40_vertex_program *vp = vpc->vp;
@@ -251,6 +254,9 @@ tgsi_src(struct nv40_vpc *vpc, const struct tgsi_full_src_register *fsrc) {
        case TGSI_FILE_CONSTANT:
                src = constant(vpc, fsrc->SrcRegister.Index, 0, 0, 0, 0);
                break;
+       case TGSI_FILE_IMMEDIATE:
+               src = vpc->imm[fsrc->SrcRegister.Index];
+               break;
        case TGSI_FILE_TEMPORARY:
                if (vpc->high_temp < fsrc->SrcRegister.Index)
                        vpc->high_temp = fsrc->SrcRegister.Index;
@@ -315,7 +321,7 @@ nv40_vertprog_parse_instruction(struct nv40_vpc *vpc,
        int ai = -1, ci = -1;
        int i;
 
-       if (finst->Instruction.Opcode == TGSI_OPCODE_RET)
+       if (finst->Instruction.Opcode == TGSI_OPCODE_END)
                return TRUE;
 
        vpc->temp_temp_count = 0;
@@ -343,7 +349,11 @@ nv40_vertprog_parse_instruction(struct nv40_vpc *vpc,
                                      tgsi_src(vpc, fsrc), none, none);
                        }
                        break;
+               /*XXX: index comparison is broken now that consts come from
+                *     two different register files.
+                */
                case TGSI_FILE_CONSTANT:
+               case TGSI_FILE_IMMEDIATE:
                        if (ci == -1 || ci == fsrc->SrcRegister.Index) {
                                ci = fsrc->SrcRegister.Index;
                                src[i] = tgsi_src(vpc, fsrc);
@@ -435,6 +445,8 @@ nv40_vertprog_parse_instruction(struct nv40_vpc *vpc,
        case TGSI_OPCODE_RCP:
                arith(vpc, 1, OP_RCP, dst, mask, none, none, src[0]);
                break;
+       case TGSI_OPCODE_RET:
+               break;
        case TGSI_OPCODE_RSQ:
                arith(vpc, 1, OP_RSQ, dst, mask, none, none, src[0]);
                break;
@@ -518,6 +530,35 @@ nv40_vertprog_parse_decl_output(struct nv40_vpc *vpc,
        return TRUE;
 }
 
+static boolean
+nv40_vertprog_prepare(struct nv40_vpc *vpc)
+{
+       struct tgsi_parse_context p;
+       int nr_imm = 0;
+
+       tgsi_parse_init(&p, vpc->vp->pipe->tokens);
+       while (!tgsi_parse_end_of_tokens(&p)) {
+               const union tgsi_full_token *tok = &p.FullToken;
+
+               tgsi_parse_token(&p);
+               switch(tok->Token.Type) {
+               case TGSI_TOKEN_TYPE_IMMEDIATE:
+                       nr_imm++;
+                       break;
+               default:
+                       break;
+               }
+       }
+       tgsi_parse_free(&p);
+
+       if (nr_imm) {
+               vpc->imm = calloc(nr_imm, sizeof(struct nv40_sreg));
+               assert(vpc->imm);
+       }
+
+       return TRUE;
+}
+
 void
 nv40_vertprog_translate(struct nv40_context *nv40,
                        struct nv40_vertex_program *vp)
@@ -531,6 +572,11 @@ nv40_vertprog_translate(struct nv40_context *nv40,
        vpc->vp = vp;
        vpc->high_temp = -1;
 
+       if (!nv40_vertprog_prepare(vpc)) {
+               free(vpc);
+               return;
+       }
+
        tgsi_parse_init(&parse, vp->pipe->tokens);
 
        while (!tgsi_parse_end_of_tokens(&parse)) {
@@ -552,6 +598,19 @@ nv40_vertprog_translate(struct nv40_context *nv40,
                }
                        break;
                case TGSI_TOKEN_TYPE_IMMEDIATE:
+               {
+                       const struct tgsi_full_immediate *imm;
+
+                       imm = &parse.FullToken.FullImmediate;
+                       assert(imm->Immediate.DataType == TGSI_IMM_FLOAT32);
+//                     assert(imm->Immediate.Size == 4);
+                       vpc->imm[vpc->nr_imm++] =
+                               constant(vpc, -1,
+                                        imm->u.ImmediateFloat32[0].Float,
+                                        imm->u.ImmediateFloat32[1].Float,
+                                        imm->u.ImmediateFloat32[2].Float,
+                                        imm->u.ImmediateFloat32[3].Float);
+               }
                        break;
                case TGSI_TOKEN_TYPE_INSTRUCTION:
                {