Module: Mesa
Branch: master
Commit: dc7f309f9c4562e367bb18a2eb3d1dcf67003cad
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc7f309f9c4562e367bb18a2eb3d1dcf67003cad

Author: Marek Olšák <[email protected]>
Date:   Thu Dec 24 13:31:27 2009 +0100

r300/compiler: add full viewport transformation support in WPOS codegen

---

 src/mesa/drivers/dri/r300/compiler/radeon_code.h   |    4 +++-
 .../drivers/dri/r300/compiler/radeon_compiler.c    |   13 ++++++++++---
 .../drivers/dri/r300/compiler/radeon_compiler.h    |    3 ++-
 src/mesa/drivers/dri/r300/r300_fragprog_common.c   |    2 +-
 4 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_code.h 
b/src/mesa/drivers/dri/r300/compiler/radeon_code.h
index 902b7cf..6d979bb 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_code.h
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_code.h
@@ -59,7 +59,9 @@ enum {
        RC_STATE_SHADOW_AMBIENT = 0,
 
        RC_STATE_R300_WINDOW_DIMENSION,
-       RC_STATE_R300_TEXRECT_FACTOR
+       RC_STATE_R300_TEXRECT_FACTOR,
+       RC_STATE_R300_VIEWPORT_SCALE,
+       RC_STATE_R300_VIEWPORT_OFFSET
 };
 
 struct rc_constant {
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c 
b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c
index 41ea23e..272f907 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.c
@@ -229,7 +229,8 @@ void rc_copy_output(struct radeon_compiler * c, unsigned 
output, unsigned dup_ou
 /**
  * Introduce standard code fragment to deal with fragment.position.
  */
-void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, 
unsigned new_input)
+void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, 
unsigned new_input,
+                                int full_vtransform)
 {
        unsigned tempregi = rc_find_free_temporary(c);
        struct rc_instruction * inst_rcp;
@@ -279,13 +280,19 @@ void rc_transform_fragment_wpos(struct radeon_compiler * 
c, unsigned wpos, unsig
        inst_mad->U.I.SrcReg[0].Swizzle = RC_MAKE_SWIZZLE(RC_SWIZZLE_X, 
RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_ZERO);
 
        inst_mad->U.I.SrcReg[1].File = RC_FILE_CONSTANT;
-       inst_mad->U.I.SrcReg[1].Index = 
rc_constants_add_state(&c->Program.Constants, RC_STATE_R300_WINDOW_DIMENSION, 
0);
        inst_mad->U.I.SrcReg[1].Swizzle = RC_MAKE_SWIZZLE(RC_SWIZZLE_X, 
RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_ZERO);
 
        inst_mad->U.I.SrcReg[2].File = RC_FILE_CONSTANT;
-       inst_mad->U.I.SrcReg[2].Index = inst_mad->U.I.SrcReg[1].Index;
        inst_mad->U.I.SrcReg[2].Swizzle = RC_MAKE_SWIZZLE(RC_SWIZZLE_X, 
RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_ZERO);
 
+       if (full_vtransform) {
+               inst_mad->U.I.SrcReg[1].Index = 
rc_constants_add_state(&c->Program.Constants, RC_STATE_R300_VIEWPORT_SCALE, 0);
+               inst_mad->U.I.SrcReg[2].Index = 
rc_constants_add_state(&c->Program.Constants, RC_STATE_R300_VIEWPORT_OFFSET, 0);
+       } else {
+               inst_mad->U.I.SrcReg[1].Index =
+               inst_mad->U.I.SrcReg[2].Index = 
rc_constants_add_state(&c->Program.Constants, RC_STATE_R300_WINDOW_DIMENSION, 
0);
+       }
+
        for (inst = inst_mad->Next; inst != &c->Program.Instructions; inst = 
inst->Next) {
                const struct rc_opcode_info * opcode = 
rc_get_opcode_info(inst->U.I.Opcode);
                unsigned i;
diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h 
b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h
index 87a732c..731adc1 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_compiler.h
@@ -73,7 +73,8 @@ void rc_calculate_inputs_outputs(struct radeon_compiler * c);
 void rc_move_input(struct radeon_compiler * c, unsigned input, struct 
rc_src_register new_input);
 void rc_move_output(struct radeon_compiler * c, unsigned output, unsigned 
new_output, unsigned writemask);
 void rc_copy_output(struct radeon_compiler * c, unsigned output, unsigned 
dup_output);
-void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, 
unsigned new_input);
+void rc_transform_fragment_wpos(struct radeon_compiler * c, unsigned wpos, 
unsigned new_input,
+                                int full_vtransform);
 
 struct r300_fragment_program_compiler {
        struct radeon_compiler Base;
diff --git a/src/mesa/drivers/dri/r300/r300_fragprog_common.c 
b/src/mesa/drivers/dri/r300/r300_fragprog_common.c
index 267ee81..2933d31 100644
--- a/src/mesa/drivers/dri/r300/r300_fragprog_common.c
+++ b/src/mesa/drivers/dri/r300/r300_fragprog_common.c
@@ -120,7 +120,7 @@ static void insert_WPOS_trailer(struct 
r300_fragment_program_compiler *compiler,
                return;
        }
 
-       rc_transform_fragment_wpos(&compiler->Base, FRAG_ATTRIB_WPOS, 
fp->wpos_attr);
+       rc_transform_fragment_wpos(&compiler->Base, FRAG_ATTRIB_WPOS, 
fp->wpos_attr, GL_FALSE);
 }
 
 /**

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to