diff options
author | Patrice Mandin <pmandin@caramail.com> | 2008-08-30 21:54:39 +0200 |
---|---|---|
committer | Patrice Mandin <pmandin@caramail.com> | 2008-08-30 21:54:39 +0200 |
commit | 492852e1591dc39756db6a357748f221d1ad0e7b (patch) | |
tree | 9a99fcf26516be5469220a409d89d97947003d08 | |
parent | 69feae16ee95bbe96bd23f1a16fd4203c51778d9 (diff) |
add textured triangle
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | tcl_triangle.c | 133 | ||||
-rw-r--r-- | tcl_triangle.h | 1 |
3 files changed, 137 insertions, 1 deletions
@@ -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 |