summaryrefslogtreecommitdiff
path: root/tcl_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'tcl_init.c')
-rw-r--r--tcl_init.c341
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();
+}