diff options
author | Corbin Simpson <[email protected]> | 2009-03-12 12:13:53 -0700 |
---|---|---|
committer | Corbin Simpson <[email protected]> | 2009-03-15 23:07:30 -0700 |
commit | 61c65a6c7e809e61bfaf5f84240bfc62d5adcf52 (patch) | |
tree | c6387adb38f7d0d4baca2c8822e5fb13387d0971 /src/gallium/drivers/r300 | |
parent | c5742cab195a77b2a075950f9d7812faeacb6621 (diff) |
r300-gallium: r500-fs: Add writemasks and some flexibility for MOV/SWZ.
Diffstat (limited to 'src/gallium/drivers/r300')
-rw-r--r-- | src/gallium/drivers/r300/r300_state_shader.c | 28 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_state_shader.h | 2 |
2 files changed, 25 insertions, 5 deletions
diff --git a/src/gallium/drivers/r300/r300_state_shader.c b/src/gallium/drivers/r300/r300_state_shader.c index db84dbdc4ea..06dd6842ed8 100644 --- a/src/gallium/drivers/r300/r300_state_shader.c +++ b/src/gallium/drivers/r300/r300_state_shader.c @@ -160,10 +160,18 @@ static INLINE void r500_emit_mov(struct r500_fragment_shader* fs, { int i = fs->instruction_count; - fs->instructions[i].inst0 = R500_INST_TYPE_OUT | - R500_INST_TEX_SEM_WAIT | R500_INST_LAST | - R500_INST_RGB_OMASK_RGB | R500_INST_ALPHA_OMASK | + if (dst->DstRegister.File == TGSI_FILE_OUTPUT) { + fs->instructions[i].inst0 = R500_INST_TYPE_OUT | + R500_ALU_OMASK(dst->DstRegister.WriteMask); + } else { + fs->instructions[i].inst0 = R500_INST_TYPE_ALU | + R500_ALU_WMASK(dst->DstRegister.WriteMask); + } + + fs->instructions[i].inst0 |= + R500_INST_TEX_SEM_WAIT | R500_INST_RGB_CLAMP | R500_INST_ALPHA_CLAMP; + fs->instructions[i].inst1 = R500_RGB_ADDR0(r300_fs_src(assembler, &src->SrcRegister)); fs->instructions[i].inst2 = @@ -233,6 +241,17 @@ static void r500_fs_instruction(struct r500_fragment_shader* fs, } } +static void r500_fs_finalize(struct r500_fragment_shader* fs, + struct r300_fs_asm* assembler) +{ + /* XXX subtly wrong */ + fs->shader.stack_size = assembler->temp_offset; + + /* XXX should this just go with OPCODE_END? */ + fs->instructions[fs->instruction_count - 1].inst0 |= + R500_INST_LAST; +} + void r300_translate_fragment_shader(struct r300_context* r300, struct r300_fragment_shader* fs) { @@ -280,8 +299,7 @@ void r500_translate_fragment_shader(struct r300_context* r300, assembler->tex_count, assembler->color_count, assembler->tex_count + assembler->color_count); - /* XXX subtly wrong */ - fs->shader.stack_size = assembler->temp_offset; + r500_fs_finalize(fs, assembler); tgsi_dump(fs->shader.state.tokens); r500_fs_dump(fs); diff --git a/src/gallium/drivers/r300/r300_state_shader.h b/src/gallium/drivers/r300/r300_state_shader.h index 5dd35844591..87a5c99648e 100644 --- a/src/gallium/drivers/r300/r300_state_shader.h +++ b/src/gallium/drivers/r300/r300_state_shader.h @@ -54,6 +54,8 @@ #define R500_SWIZ_ALPHA_C(x) ((x) << 27) /* Writemasks */ #define R500_TEX_WMASK(x) ((x) << 11) +#define R500_ALU_WMASK(x) ((x) << 11) +#define R500_ALU_OMASK(x) ((x) << 15) /* Temporary struct used to hold assembly state while putting together * fragment programs. */ |