diff options
Diffstat (limited to 'tcl_init.c')
-rw-r--r-- | tcl_init.c | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/tcl_init.c b/tcl_init.c new file mode 100644 index 0000000..283b166 --- /dev/null +++ b/tcl_init.c @@ -0,0 +1,341 @@ +#include <stdio.h> + +#include "screen.h" +#include "object.h" +#include "nouveau_class.h" + +#define VIEWPORT_WIDTH 512 +#define VIEWPORT_HEIGHT 512 + +void tcl_init(void) +{ + int i; + + printf("--TCL init\n"); + + SetSubchannel(NvSubImageBlit, NvImageBlit); + SetSubchannel(NvSub3D, Nv3D); + + BEGIN_RING(NvSub3D, NV34TCL_DMA_TEXTURE0, 2); + OUT_RING(NvDmaFB); /* beef0201 184 texture0 */ + OUT_RING(NvDmaTT); /* beef0202 188 texture1 */ + BEGIN_RING(NvSub3D, NV34TCL_DMA_COLOR0, 2); + OUT_RING(NvDmaFB); /* beef0201 194 color0 */ + OUT_RING(NvDmaFB); /* beef0201 198 zeta */ + BEGIN_RING(NvSub3D, NV34TCL_DMA_COLOR1, 1); + OUT_RING(NvDmaFB); /* beef0201 18c color1 */ + BEGIN_RING(NvSub3D, NV34TCL_DMA_IN_MEMORY7, 1); + OUT_RING(NvDmaFB); /* beef0201 1ac */ + + BEGIN_RING(NvSub3D, NV34TCL_RT_HORIZ, 2); + OUT_RING(VIEWPORT_WIDTH<<16); + OUT_RING(VIEWPORT_HEIGHT<<16); + + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 1); + OUT_RING((VIEWPORT_WIDTH-1)<<16); + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_VERT(0), 1); + OUT_RING((VIEWPORT_HEIGHT-1)<<16); + for (i=1; i<8; i++) { + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_VERT(i), 1); + OUT_RING(0); + } + BEGIN_RING(NvSub3D, 0x2bc, 1); + OUT_RING(0); + + BEGIN_RING(NvSub3D, NV34TCL_RT_ENABLE, 1); + OUT_RING(NV34TCL_RT_ENABLE_COLOR0); + BEGIN_RING(NvSub3D, 0x3b0, 1); + OUT_RING(0x10<<16); + BEGIN_RING(NvSub3D, 0x1454, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, 0x1d80, 1); + OUT_RING(3); + BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1); + OUT_RING((3<<16)|4); + + BEGIN_RING(NvSub3D, NV34TCL_DMA_IN_MEMORY8, 1); + OUT_RING(NvDmaFB); /* beef0201 1b0 */ + + BEGIN_RING(NvSub3D, 0x1e98, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, 0x17e0, 3); + OUT_RINGf(0.0); + OUT_RINGf(0.0); + OUT_RINGf(1.0); + + BEGIN_RING(NvSub3D, 0x1f80, 16); + for (i=0; i<16; i++) { + OUT_RING((i==8) ? 0xffff : 0); + } + + BEGIN_RING(NvSub3D, 0x120, 3); + OUT_RING(0); + OUT_RING(1); + OUT_RING(2); + + BEGIN_RING(NvSubImageBlit, 0x120, 3); + OUT_RING(0); + OUT_RING(1); + OUT_RING(2); + + BEGIN_RING(NvSub3D, NV34TCL_RT_HORIZ, 2); + OUT_RING(VIEWPORT_WIDTH<<16); + OUT_RING(VIEWPORT_HEIGHT<<16); + BEGIN_RING(NvSub3D, 0x1d88, 1); + OUT_RING(0x1200); + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_HORIZ, 2); + OUT_RING(VIEWPORT_WIDTH<<16); + OUT_RING(VIEWPORT_HEIGHT<<16); + BEGIN_RING(NvSub3D, NV34TCL_SCISSOR_HORIZ, 2); + OUT_RING(VIEWPORT_WIDTH<<16); + OUT_RING(VIEWPORT_HEIGHT<<16); + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4); + OUT_RINGf(0.0); + OUT_RINGf(VIEWPORT_WIDTH * 1.0); + OUT_RINGf(0.0); + OUT_RINGf(0.0); + BEGIN_RING(NvSub3D, NV34TCL_RT_FORMAT, 1); + OUT_RING(NV34TCL_RT_FORMAT_TYPE_LINEAR | NV34TCL_RT_FORMAT_ZETA_Z24S8 | NV34TCL_RT_FORMAT_COLOR_A8R8G8B8); + BEGIN_RING(NvSub3D, 0x1da4, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_COLOR0_PITCH, 5); + OUT_RING((screen_pitch<<16)|screen_pitch); /* zeta_pitch, color0_pitch */ + OUT_RING(screen_offset); /* color0_offset */ + OUT_RING(screen_offset); /* zeta_offset */ + OUT_RING(screen_offset); /* color1_offset */ + OUT_RING(screen_pitch); /* color1_pitch */ + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, 0x1da4, 1); + OUT_RING(0); + + BEGIN_RING(NvSub3D, NV34TCL_ALPHA_FUNC_ENABLE, 3); + OUT_RING(0); + OUT_RING(0x207); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_RC_ENABLE, 1); + OUT_RING(0); + +#if 0 +000428e4 size 1, subchannel 1 (0xbeef3097),offset 0x08e4,increment +# NV30_TCL_PRIMITIVE_3D_ACTIVE_PROGRAM = 0x07bfef01 +# -- program at 0x0xad7e3000 - 0x20D000 +# 0x01803e81 0x1c9dc901 0x0001c900 0x0001c900 +# INST 0: MOVX R0 (TR0.xyzw), attrib.color + END +07bfef01 NV30TCL.FP_ACTIVE_PROGRAM = DMA0=TRUE | DMA1=FALSE | OFFSET=0x07bfef00 +#endif + + BEGIN_RING(NvSub3D, NV34TCL_TX_UNITS_ENABLE, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_FP_CONTROL, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1); + OUT_RING((1<<16)|4); + for (i=0; i<4; i++) { + BEGIN_RING(NvSub3D, NV34TCL_TX_ENABLE(i), 1); + OUT_RING(0); + } + + BEGIN_RING(NvSub3D, NV34TCL_DO_VERTICES, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_MULTISAMPLE_CONTROL, 1); + OUT_RING(0xffff<<16); + + BEGIN_RING(NvSub3D, NV34TCL_BLEND_FUNC_ENABLE, 4); + OUT_RING(0); + OUT_RING((1<<16)|1); + OUT_RING(0); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_STENCIL_BACK_ENABLE, 17); + OUT_RING(0); + OUT_RING(0xff); + OUT_RING(0x207); + OUT_RING(0); + OUT_RING(0xff); + OUT_RING(0x1e00); + OUT_RING(0x1e00); + OUT_RING(0x1e00); + OUT_RING(0); + OUT_RING(0xff); + OUT_RING(0x207); + OUT_RING(0); + OUT_RING(0xff); + OUT_RING(0x1e00); + OUT_RING(0x1e00); + OUT_RING(0x1e00); + OUT_RING(0x1d01); + BEGIN_RING(NvSub3D, NV34TCL_COLOR_LOGIC_OP_ENABLE, 2); + OUT_RING(0); + OUT_RING(0x1503); + BEGIN_RING(NvSub3D, NV34TCL_POLYGON_STIPPLE_ENABLE, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_LINE_STIPPLE_ENABLE, 2); + OUT_RING(0); + OUT_RING(0xffff<<16); + BEGIN_RING(NvSub3D, 0x1d84, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_FOG_ENABLE, 2); + OUT_RING(0); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_NORMALIZE_ENABLE, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, 0x17cc, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_POLYGON_STIPPLE_PATTERN(0), 32); + for (i=0; i<32; i++) { + OUT_RING(0xffffffff); + } + BEGIN_RING(NvSub3D, NV34TCL_POLYGON_OFFSET_POINT_ENABLE, 3); + OUT_RING(0); + OUT_RING(0); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_DEPTH_FUNC, 1); + OUT_RING(0x201); + BEGIN_RING(NvSub3D, NV34TCL_DEPTH_WRITE_ENABLE, 1); + OUT_RING(1); + BEGIN_RING(NvSub3D, NV34TCL_DEPTH_TEST_ENABLE, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_POLYGON_OFFSET_FACTOR, 2); + OUT_RINGf(0.0); + OUT_RINGf(0.0); + BEGIN_RING(NvSub3D, 0x1d78, 1); + OUT_RING(1); + BEGIN_RING(NvSub3D, NV34TCL_LINE_WIDTH, 2); + OUT_RING(8); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_POLYGON_MODE_FRONT, 2); + OUT_RING(0x1b02); + OUT_RING(0x1b02); + BEGIN_RING(NvSub3D, NV34TCL_CULL_FACE, 2); + OUT_RING(0x405); + OUT_RING(0x901); + BEGIN_RING(NvSub3D, NV34TCL_POLYGON_SMOOTH_ENABLE, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_CULL_FACE_ENABLE, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_4F_X(1), 60); + OUT_RINGf(1.0); + OUT_RINGf(0.0); + OUT_RINGf(0.0); + OUT_RINGf(1.0); + OUT_RINGf(0.0); + OUT_RINGf(0.0); + OUT_RINGf(1.0); + OUT_RINGf(1.0); + OUT_RINGf(1.0); + OUT_RINGf(1.0); + OUT_RINGf(1.0); + OUT_RINGf(1.0); + for (i=4; i<16; i++) { + OUT_RINGf(0.0); + OUT_RINGf(0.0); + OUT_RINGf(0.0); + OUT_RINGf(1.0); + } + BEGIN_RING(NvSub3D, 0x145c, 1); + OUT_RING(1); + BEGIN_RING(NvSub3D, NV34TCL_DITHER_ENABLE, 1); + OUT_RING(1); + BEGIN_RING(NvSub3D, NV34TCL_COLOR_MASK, 1); + OUT_RING(0x01010101); + BEGIN_RING(NvSub3D, NV34TCL_BLEND_EQUATION, 1); + OUT_RING(0x8006); + BEGIN_RING(NvSub3D, 0x1458, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, 0x1424, 3); + OUT_RING(2<<16); + OUT_RING(0); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_ENABLED_LIGHTS, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_POINT_SIZE, 3); + OUT_RINGf(1.0); + OUT_RING(0); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_TX_GEN_S(0), 32); + for (i=0; i<32; i++) { + OUT_RING(0); + } + + BEGIN_RING(NvSub3D, NV34TCL_FOG_MODE, 1); + OUT_RING(0x802); + BEGIN_RING(NvSub3D, NV34TCL_FOG_EQUATION_CONSTANT, 3); + OUT_RINGf(1.5); + OUT_RINGf(-0.090168); + OUT_RINGf(0.0); + BEGIN_RING(NvSub3D, NV34TCL_FOG_COORD_DIST, 1); + OUT_RING(2); + BEGIN_RING(NvSub3D, NV34TCL_FOG_ENABLE, 1); + OUT_RING(0); + + BEGIN_RING(NvSub3D, NV34TCL_ENGINE, 1); + OUT_RING(NV34TCL_ENGINE_FIXED); + + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4); + OUT_RINGf(VIEWPORT_WIDTH / 2.0); + OUT_RINGf(VIEWPORT_HEIGHT / 2.0); + OUT_RINGf(0.5); + OUT_RINGf(0.0); + BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_SCALE_X, 4); + OUT_RINGf(VIEWPORT_WIDTH / 2.0); + OUT_RINGf(VIEWPORT_HEIGHT / -2.0); + OUT_RINGf(0.5); + OUT_RINGf(0.0); + + BEGIN_RING(NvSub3D, NV34TCL_VP_CLIP_PLANES_ENABLE, 1); + OUT_RING(0); + + BEGIN_RING(NvSub3D, NV34TCL_PROJECTION_MATRIX(0), 16); + for (i=0; i<16; i++) { + if ((i==0) || (i==5) || (i==10) || (i==15)) { + OUT_RINGf(1.0); + } else { + OUT_RING(0); + } + } + + BEGIN_RING(NvSub3D, NV34TCL_DEPTH_RANGE_NEAR, 2); + OUT_RINGf(0.0); + OUT_RINGf(1.0); + + BEGIN_RING(NvSub3D, NV34TCL_TX_MATRIX_ENABLE(0), 8); + for (i=0; i<8; i++) { + OUT_RING(0); + } + +#if 0 +000428e4 size 1, subchannel 1 (0xbeef3097),offset 0x08e4,increment +# NV30_TCL_PRIMITIVE_3D_ACTIVE_PROGRAM = 0x07bfef41 +# -- program at 0x0xad7e3010 - 0x20D010 +# 0x00000001 0x00000000 0x00000000 0x00000000 +# INST 0: NOP (FL0.xxxx) + END +07bfef41 NV30TCL.FP_ACTIVE_PROGRAM = DMA0=TRUE | DMA1=FALSE | OFFSET=0x07bfef40 +#endif + + BEGIN_RING(NvSub3D, NV34TCL_FP_CONTROL, 1); + OUT_RING(0x40); + BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1); + OUT_RING((1<<16)|4); + + BEGIN_RING(NvSub3D, NV34TCL_CLEAR_DEPTH_VALUE, 2); + OUT_RING(0); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_IDXBUF_ADDRESS, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_CLEAR_BUFFERS, 1); + OUT_RING(0xf0); + +#if 0 +000428e4 size 1, subchannel 1 (0xbeef3097),offset 0x08e4,increment +07bfef01 NV30TCL.FP_ACTIVE_PROGRAM = DMA0=TRUE | DMA1=FALSE | OFFSET=0x07bfef00 +#endif + + BEGIN_RING(NvSub3D, NV34TCL_FP_CONTROL, 1); + OUT_RING(0); + BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1); + OUT_RING((1<<16)|4); + + FIRE_RING(); +} |