Mesa (master): nvfx: support all coord conventions in hardware

Luca Barbieri lb at kemper.freedesktop.org
Sat Sep 4 01:11:18 UTC 2010


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

Author: Luca Barbieri <luca at luca-barbieri.com>
Date:   Sat Sep  4 02:57:14 2010 +0200

nvfx: support all coord conventions in hardware

---

 src/gallium/drivers/nouveau/nouveau_class.h |   10 ++++++++++
 src/gallium/drivers/nvfx/nvfx_fragprog.c    |   10 ++++++++++
 src/gallium/drivers/nvfx/nvfx_screen.c      |    3 +--
 src/gallium/drivers/nvfx/nvfx_state.h       |    1 +
 src/gallium/drivers/nvfx/nvfx_state_emit.c  |   18 ++++++++++++++++++
 src/gallium/drivers/nvfx/nvfx_state_fb.c    |    4 +---
 6 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nouveau_class.h b/src/gallium/drivers/nouveau/nouveau_class.h
index 3c2248b..79681d2 100644
--- a/src/gallium/drivers/nouveau/nouveau_class.h
+++ b/src/gallium/drivers/nouveau/nouveau_class.h
@@ -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
diff --git a/src/gallium/drivers/nvfx/nvfx_fragprog.c b/src/gallium/drivers/nvfx/nvfx_fragprog.c
index 6eb744e..79dd224 100644
--- a/src/gallium/drivers/nvfx/nvfx_fragprog.c
+++ b/src/gallium/drivers/nvfx/nvfx_fragprog.c
@@ -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;
 
diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c b/src/gallium/drivers/nvfx/nvfx_screen.c
index 335c500..2080f44 100644
--- a/src/gallium/drivers/nvfx/nvfx_screen.c
+++ b/src/gallium/drivers/nvfx/nvfx_screen.c
@@ -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:
diff --git a/src/gallium/drivers/nvfx/nvfx_state.h b/src/gallium/drivers/nvfx/nvfx_state.h
index e9c1f2c..9200f78 100644
--- a/src/gallium/drivers/nvfx/nvfx_state.h
+++ b/src/gallium/drivers/nvfx/nvfx_state.h
@@ -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;
diff --git a/src/gallium/drivers/nvfx/nvfx_state_emit.c b/src/gallium/drivers/nvfx/nvfx_state_emit.c
index 128cf2b..c84bf60 100644
--- a/src/gallium/drivers/nvfx/nvfx_state_emit.c
+++ b/src/gallium/drivers/nvfx/nvfx_state_emit.c
@@ -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?
diff --git a/src/gallium/drivers/nvfx/nvfx_state_fb.c b/src/gallium/drivers/nvfx/nvfx_state_fb.c
index 5485529..b9d30c4 100644
--- a/src/gallium/drivers/nvfx/nvfx_state_fb.c
+++ b/src/gallium/drivers/nvfx/nvfx_state_fb.c
@@ -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 */




More information about the mesa-commit mailing list