summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrice Mandin <pmandin@caramail.com>2008-08-30 21:54:39 +0200
committerPatrice Mandin <pmandin@caramail.com>2008-08-30 21:54:39 +0200
commit492852e1591dc39756db6a357748f221d1ad0e7b (patch)
tree9a99fcf26516be5469220a409d89d97947003d08
parent69feae16ee95bbe96bd23f1a16fd4203c51778d9 (diff)
add textured triangle
-rw-r--r--main.c4
-rw-r--r--tcl_triangle.c133
-rw-r--r--tcl_triangle.h1
3 files changed, 137 insertions, 1 deletions
diff --git a/main.c b/main.c
index 7a972fb..f373f3d 100644
--- a/main.c
+++ b/main.c
@@ -53,8 +53,10 @@ int main(int argc, char **argv)
/* mandatory, or we get PFIFO_CACHE_ERROR */
tcl_init();
/*tcl_clear();*/
+
/*tcl_triangle_fixed();*/ /* does not work */
- tcl_triangle_vtxattr();
+ /*tcl_triangle_vtxattr();*/
+ tcl_triangle_tx0();
printf("coincoin\n");
diff --git a/tcl_triangle.c b/tcl_triangle.c
index ba10027..7f96ee5 100644
--- a/tcl_triangle.c
+++ b/tcl_triangle.c
@@ -5,6 +5,42 @@
#include "fifo.h"
#include "nouveau_class.h"
+static void tcl_fp_tx0(void)
+{
+ volatile unsigned int *fragprog_map;
+ uint64_t fragprog_offset;
+
+ fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset);
+ if (!fragprog_map) {
+ return;
+ }
+ printf("fragprog alloc'd at 0x%lx mapped at %p\n",
+ fragprog_offset, fragprog_map);
+
+/*
+# 0x18009e82 0x1c9dc901 0x0001c900 0x0001c900
+# INST 0: TXPR R1 (TR0.xyzw), attrib.texcoord[0], abs(texture[0])
+# 0x02803e81 0x1c9dc904 0x0001c901 0x0001c900
+# INST 1: MULX R0 (TR0.xyzw), R1, attrib.color + END
+*/
+ fragprog_map[0] = 0x18009e82;
+ fragprog_map[1] = 0x1c9dc901;
+ fragprog_map[2] = 0x0001c900;
+ fragprog_map[3] = 0x0001c900;
+
+ fragprog_map[4] = 0x02803e81;
+ fragprog_map[5] = 0x1c9dc904;
+ fragprog_map[6] = 0x0001c901;
+ fragprog_map[7] = 0x0001c900;
+
+ BEGIN_RING(NvSub3D, NV34TCL_FP_ACTIVE_PROGRAM, 1);
+ OUT_RING ((uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0);
+ BEGIN_RING(NvSub3D, NV34TCL_FP_CONTROL, 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1);
+ OUT_RING((1<<16)|4);
+}
+
void tcl_triangle_fixed(void)
{
printf("-- TCL triangle, fixed pipe\n");
@@ -78,3 +114,100 @@ void tcl_triangle_vtxattr(void)
FIRE_RING();
}
+
+void tcl_triangle_tx0(void)
+{
+ printf("-- TCL triangle, textured\n");
+
+ SetSubchannel(NvSub3D, Nv3D);
+
+ BEGIN_RING(NvSub3D, NV34TCL_TX_UNITS_ENABLE, 1);
+ OUT_RING(NV34TCL_TX_UNITS_ENABLE_TX0);
+
+ tcl_fp_tx0();
+
+ BEGIN_RING(NvSub3D, NV34TCL_TX_OFFSET(0), 7);
+ OUT_RING(screen_offset);
+ OUT_RING(NV34TCL_TX_FORMAT_DMA0
+ | NV34TCL_TX_FORMAT_NO_BORDER
+ | NV34TCL_TX_FORMAT_DIMS_2D
+ | NV34TCL_TX_FORMAT_FORMAT_A8R8G8B8
+ | (8<<NV34TCL_TX_FORMAT_BASE_SIZE_U_SHIFT)
+ | (8<<NV34TCL_TX_FORMAT_BASE_SIZE_V_SHIFT)
+ | 0x10000
+ );
+ OUT_RING(NV34TCL_TX_WRAP_S_REPEAT
+ | NV34TCL_TX_WRAP_T_REPEAT
+ | NV34TCL_TX_WRAP_R_REPEAT
+ );
+ OUT_RING(NV34TCL_TX_ENABLE_ENABLE
+ | 0x800
+ );
+ OUT_RING((screen_pitch<<16)|0xaae4); /* swizzle */
+ OUT_RING(NV34TCL_TX_FILTER_MINIFY_NEAREST
+ | NV34TCL_TX_FILTER_MAGNIFY_NEAREST
+ | 0x2000
+ );
+ OUT_RING((256<<16)|256); /* rect size */
+
+ BEGIN_RING(NvSub3D, NV34TCL_TX_MATRIX_ENABLE(0), 1);
+ OUT_RING(1);
+ BEGIN_RING(NvSub3D, NV34TCL_TX0_MATRIX(0), 16);
+ OUT_RINGf(1.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.0);
+ OUT_RINGf(0.0);
+
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.0);
+
+ /* set color, then pos */
+ BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1);
+ OUT_RING(NV34TCL_VERTEX_BEGIN_END_TRIANGLES);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_2F_X(8), 2);
+ OUT_RINGf(1.0);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_3F_X(0), 3);
+ OUT_RINGf(1.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_2F_X(8), 2);
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_3F_X(0), 3);
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.0);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_2F_X(8), 2);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_3F_X(0), 3);
+ OUT_RINGf(0.0);
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.0);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1);
+ OUT_RING(NV34TCL_VERTEX_BEGIN_END_STOP);
+
+ BEGIN_RING(NvSub3D, NV34TCL_TX_UNITS_ENABLE, 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_TX_MATRIX_ENABLE(0), 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_TX_ENABLE(0), 1);
+ OUT_RING(0);
+
+ FIRE_RING();
+}
diff --git a/tcl_triangle.h b/tcl_triangle.h
index 3942c57..5e7a6c5 100644
--- a/tcl_triangle.h
+++ b/tcl_triangle.h
@@ -3,5 +3,6 @@
void tcl_triangle_fixed(void);
void tcl_triangle_vtxattr(void);
+void tcl_triangle_tx0(void);
#endif