nvfx: support all coord conventions in hardware
authorLuca Barbieri <luca@luca-barbieri.com>
Sat, 4 Sep 2010 00:57:14 +0000 (02:57 +0200)
committerLuca Barbieri <luca@luca-barbieri.com>
Sat, 4 Sep 2010 00:57:14 +0000 (02:57 +0200)
src/gallium/drivers/nouveau/nouveau_class.h
src/gallium/drivers/nvfx/nvfx_fragprog.c
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/nvfx/nvfx_state.h
src/gallium/drivers/nvfx/nvfx_state_emit.c
src/gallium/drivers/nvfx/nvfx_state_fb.c

index 3c2248b..79681d2 100644 (file)
@@ -6508,6 +6508,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define   NV34TCL_MULTISAMPLE_CONTROL_SAMPLE_ALPHA_TO_ONE                              (1 <<  8)
 #define   NV34TCL_MULTISAMPLE_CONTROL_SAMPLE_COVERAGE_SHIFT                            16
 #define   NV34TCL_MULTISAMPLE_CONTROL_SAMPLE_COVERAGE_MASK                             0xffff0000
+#define  NV34TCL_COORD_CONVENTIONS                                                     0x00001d88
+#define   NV34TCL_COORD_CONVENTIONS_HEIGHT_SHIFT                                       0
+#define   NV34TCL_COORD_CONVENTIONS_ORIGIN_NORMAL                                      (0 << 12)
+#define   NV34TCL_COORD_CONVENTIONS_ORIGIN_INVERTED                                    (1 << 12)
+#define   NV34TCL_COORD_CONVENTIONS_ORIGIN_SHIFT                                       12
+#define   NV34TCL_COORD_CONVENTIONS_ORIGIN_MASK                                                (1 << 12)
+#define   NV34TCL_COORD_CONVENTIONS_CENTER_HALF_INTEGER                                        (0 << 16)
+#define   NV34TCL_COORD_CONVENTIONS_CENTER_INTEGER                                     (1 << 16)
+#define   NV34TCL_COORD_CONVENTIONS_CENTER_SHIFT                                       16
+#define   NV34TCL_COORD_CONVENTIONS_CENTER_MASK                                                (1 << 16)
 #define  NV34TCL_CLEAR_DEPTH_VALUE                                                     0x00001d8c
 #define  NV34TCL_CLEAR_COLOR_VALUE                                                     0x00001d90
 #define   NV34TCL_CLEAR_COLOR_VALUE_B_SHIFT                                            0
index 6eb744e..79dd224 100644 (file)
@@ -1052,6 +1052,16 @@ nvfx_fragprog_translate(struct nvfx_context *nvfx,
        fpc->fp = fp;
        fpc->num_regs = 2;
 
+       for (unsigned i = 0; i < pfp->info.num_properties; ++i) {
+               if (pfp->info.properties[i].name == TGSI_PROPERTY_FS_COORD_ORIGIN) {
+                       if(pfp->info.properties[i].data[0])
+                               fp->coord_conventions |= NV34TCL_COORD_CONVENTIONS_ORIGIN_INVERTED;
+               } else if (pfp->info.properties[i].name == TGSI_PROPERTY_FS_COORD_PIXEL_CENTER) {
+                       if(pfp->info.properties[i].data[0])
+                               fp->coord_conventions |= NV34TCL_COORD_CONVENTIONS_CENTER_INTEGER;
+               }
+       }
+
        if (!nvfx_fragprog_prepare(nvfx, fpc))
                goto out_err;
 
index 335c500..2080f44 100644 (file)
@@ -74,10 +74,9 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                return 0;
        case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
        case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
-               return 1;
        case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
        case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
-               return 0;
+               return 1;
        case PIPE_CAP_MAX_FS_INSTRUCTIONS:
        case PIPE_CAP_MAX_FS_ALU_INSTRUCTIONS:
        case PIPE_CAP_MAX_FS_TEX_INSTRUCTIONS:
index e9c1f2c..9200f78 100644 (file)
@@ -62,6 +62,7 @@ struct nvfx_fragment_program {
        unsigned samplers;
        unsigned point_sprite_control;
        unsigned or;
+       unsigned coord_conventions;
 
        uint32_t *insn;
        int       insn_len;
index 128cf2b..c84bf60 100644 (file)
@@ -3,6 +3,21 @@
 #include "nvfx_resource.h"
 #include "draw/draw_context.h"
 
+static void
+nvfx_coord_conventions_validate(struct nvfx_context* nvfx)
+{
+       struct nouveau_channel* chan = nvfx->screen->base.channel;
+       unsigned value = 0;
+       if(nvfx->hw_fragprog->coord_conventions & NV34TCL_COORD_CONVENTIONS_ORIGIN_INVERTED)
+               value |= nvfx->framebuffer.height << NV34TCL_COORD_CONVENTIONS_HEIGHT_SHIFT;
+
+       value |= nvfx->hw_fragprog->coord_conventions;
+
+       WAIT_RING(chan, 2);
+       OUT_RING(chan, RING_3D(NV34TCL_COORD_CONVENTIONS, 1));
+       OUT_RING(chan, value);
+}
+
 static boolean
 nvfx_state_validate_common(struct nvfx_context *nvfx)
 {
@@ -212,6 +227,9 @@ nvfx_state_validate_common(struct nvfx_context *nvfx)
                OUT_RING(chan, nvfx->framebuffer.zsbuf && nvfx->zsa->pipe.depth.enabled);
        }
 
+       if((all_swizzled >= 0) || (dirty & NVFX_NEW_FRAGPROG))
+               nvfx_coord_conventions_validate(nvfx);
+
        if(flush_tex_cache)
        {
                // TODO: what about nv30?
index 5485529..b9d30c4 100644 (file)
@@ -167,7 +167,7 @@ nvfx_framebuffer_validate(struct nvfx_context *nvfx, unsigned prepare_result)
        else
                rt_format |= NV34TCL_RT_FORMAT_ZETA_Z24S8;
 
-       MARK_RING(chan, 44, 10);
+       MARK_RING(chan, 42, 10);
 
        if ((rt_enable & NV34TCL_RT_ENABLE_COLOR0) || fb->zsbuf) {
                struct nvfx_render_target *rt0 = &nvfx->hw_rt[0];
@@ -271,8 +271,6 @@ nvfx_framebuffer_validate(struct nvfx_context *nvfx, unsigned prepare_result)
        OUT_RING(chan, RING_3D(NV34TCL_VIEWPORT_CLIP_HORIZ(0), 2));
        OUT_RING(chan, ((w - 1) << 16) | 0);
        OUT_RING(chan, ((h - 1) << 16) | 0);
-       OUT_RING(chan, RING_3D(0x1d88, 1));
-       OUT_RING(chan, (1 << 12) | h);
 
        if(!nvfx->is_nv4x) {
                /* Wonder why this is needed, context should all be set to zero on init */