r300-gallium: r300-fs: Moar.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 25 Mar 2009 14:15:07 +0000 (07:15 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Wed, 25 Mar 2009 14:15:49 +0000 (07:15 -0700)
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_debug.c
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_state_shader.c
src/gallium/drivers/r300/r300_state_shader.h

index 0e5e471d11682d20269dc5150ee690e950d0130b..ed6480bea79e7f607d64a0ee7f5bd9ee2223bdca 100644 (file)
@@ -169,10 +169,7 @@ struct r300_fragment_shader {
     int indirections;
 
     /* Indirection node offsets */
-    int offset0;
-    int offset1;
-    int offset2;
-    int offset3;
+    int alu_offset[4];
 
     /* Machine instructions */
     struct {
index f657588c72064a2bcd75e65983947df0cb133c9c..8d44756c3323504bc83a631d3633dca4ffebfa84 100644 (file)
 
 #include "r300_debug.h"
 
+static void r300_dump_fs(struct r300_fragment_shader* fs)
+{
+    int i;
+
+    for (i = 0; i < fs->alu_instruction_count; i++) {
+    }
+}
+
 static char* r500_fs_swiz[] = {
     " R",
     " G",
index bf190a7dcdc7b3eade8838c5c4917fc7c91580de..16455e48ce87fa3e280172b144b809de5c178854 100644 (file)
@@ -90,12 +90,12 @@ void r300_emit_fragment_shader(struct r300_context* r300,
     OUT_CS_REG(R300_US_CONFIG, fs->indirections);
     OUT_CS_REG(R300_US_PIXSIZE, fs->shader.stack_size);
     /* XXX figure out exactly how big the sizes are on this reg */
-    OUT_CS_REG(R300_US_CODE_OFFSET, 0x0);
+    OUT_CS_REG(R300_US_CODE_OFFSET, 0x40);
     /* XXX figure these ones out a bit better kthnx */
     OUT_CS_REG(R300_US_CODE_ADDR_0, 0x0);
     OUT_CS_REG(R300_US_CODE_ADDR_1, 0x0);
     OUT_CS_REG(R300_US_CODE_ADDR_2, 0x0);
-    OUT_CS_REG(R300_US_CODE_ADDR_3, R300_RGBA_OUT);
+    OUT_CS_REG(R300_US_CODE_ADDR_3, 0x40 | R300_RGBA_OUT);
 
     for (i = 0; i < fs->alu_instruction_count; i++) {
         OUT_CS_REG(R300_US_ALU_RGB_INST_0 + (4 * i),
index 7d81cb87a249e68bcddc54f3fe2cd75e6d28336f..ed9d26f0b9b152dd9f084d633f540e5e0ba4bc3a 100644 (file)
@@ -278,22 +278,20 @@ static INLINE void r300_emit_maths(struct r300_fragment_shader* fs,
 {
     int i = fs->alu_instruction_count;
 
-    fs->instructions[0].alu_rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
-        R300_RGB_SWIZB(R300_ALU_ARGC_ONE) |
+    fs->instructions[i].alu_rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
+        R300_RGB_SWIZB(R300_ALU_ARGC_SRC0C_XYZ) |
         R300_RGB_SWIZC(R300_ALU_ARGC_ZERO) |
-        R300_ALU_OUTC_MAD;
-    fs->instructions[0].alu_rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
+        r300_rgb_op(op);
+    fs->instructions[i].alu_rgb_addr = R300_RGB_ADDR0(0) | R300_RGB_ADDR1(0) |
         R300_RGB_ADDR2(0) | R300_ALU_DSTC_OUTPUT_XYZ;
-    fs->instructions[0].alu_alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
-        R300_ALPHA_SWIZB(R300_ALU_ARGA_ONE) |
+    fs->instructions[i].alu_alpha_inst = R300_ALPHA_SWIZA(R300_ALU_ARGA_SRC0A) |
+        R300_ALPHA_SWIZB(R300_ALU_ARGA_SRC0A) |
         R300_ALPHA_SWIZC(R300_ALU_ARGA_ZERO) |
-        R300_ALU_OUTA_MAD;
-    fs->instructions[0].alu_alpha_addr = R300_ALPHA_ADDR0(0) |
+        r300_alpha_op(op);
+    fs->instructions[i].alu_alpha_addr = R300_ALPHA_ADDR0(0) |
         R300_ALPHA_ADDR1(0) | R300_ALPHA_ADDR2(0) | R300_ALU_DSTA_OUTPUT;
 
     fs->alu_instruction_count++;
-    fs->indirections = 0;
-    fs->shader.stack_size = 2;
 }
 
 /* Setup an ALU operation. */
@@ -554,11 +552,15 @@ static void r500_fs_instruction(struct r500_fragment_shader* fs,
     }
 }
 
-static void r500_fs_finalize(struct r500_fragment_shader* fs,
+static void r300_fs_finalize(struct r3xx_fragment_shader* fs,
                              struct r300_fs_asm* assembler)
 {
-    fs->shader.stack_size = assembler->temp_count + assembler->temp_offset;
+    fs->stack_size = assembler->temp_count + assembler->temp_offset;
+}
 
+static void r500_fs_finalize(struct r500_fragment_shader* fs,
+                             struct r300_fs_asm* assembler)
+{
     /* XXX should this just go with OPCODE_END? */
     fs->instructions[fs->instruction_count - 1].inst0 |=
         R500_INST_LAST;
@@ -627,10 +629,16 @@ void r300_translate_fragment_shader(struct r300_context* r300,
     debug_printf("r300: %d total constants, "
             "%d from user and %d from immediates\n", consts->count,
             consts->user_count, assembler->imm_count);
-    //r500_fs_finalize(fs, assembler);
+    r300_fs_finalize(fs, assembler);
+    if (is_r500) {
+        r500_fs_finalize((struct r500_fragment_shader*)fs, assembler);
+    }
 
     tgsi_dump(fs->state.tokens);
-    //r500_fs_dump(fs);
+    /* XXX finish r300 dumper too */
+    if (is_r500) {
+        r500_fs_dump((struct r500_fragment_shader*)fs);
+    }
 
     tgsi_parse_free(&parser);
     FREE(assembler);
index fdba207e183f686721d1a6c6195afdb449729504..e83d007ba202a82a2d7449b10a9492e0a4e7b2d5 100644 (file)
@@ -115,8 +115,8 @@ static const struct r300_fragment_shader r300_passthrough_fragment_shader = {
 */
     .alu_instruction_count = 1,
     .tex_instruction_count = 0,
-    .indirections = 1,
-    .shader.stack_size = 2,
+    .indirections = 0,
+    .shader.stack_size = 1,
 
     .instructions[0].alu_rgb_inst = R300_RGB_SWIZA(R300_ALU_ARGC_SRC0C_XYZ) |
         R300_RGB_SWIZB(R300_ALU_ARGC_ONE) |