summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrice Mandin <pmandin@caramail.com>2008-08-30 18:27:23 +0200
committerPatrice Mandin <pmandin@caramail.com>2008-08-30 18:27:23 +0200
commit42a5ec67c93a57d3a65d30e8827b0ddb668d2c8c (patch)
treee7b296756850e0a5267eb2926f205d8c5787c85f
parentb0cbcc65d9f719b6ecddddf5fbffd7334a5c9792 (diff)
Got something with test_startup+test_default merged as tcl_init_triangle
-rw-r--r--main.c16
-rw-r--r--tcl_init.c642
-rw-r--r--tcl_init.h3
3 files changed, 640 insertions, 21 deletions
diff --git a/main.c b/main.c
index adcee02..0fd4a7a 100644
--- a/main.c
+++ b/main.c
@@ -9,6 +9,9 @@
#include "test_nops.h"
#include "context_surface_2d.h"
#include "imageblit.h"
+#include "image_pattern.h"
+#include "raster_op.h"
+#include "clip_rectangle.h"
#include "tcl_init.h"
#include "tcl_triangle.h"
@@ -22,6 +25,7 @@ int main(int argc, char **argv)
if (screen_open(2960, 1050, 32)!=0) {
return -1;
}
+ /*screen_offset = 0; */
if (fifo_open()!=0) {
screen_close();
@@ -41,18 +45,20 @@ int main(int argc, char **argv)
raster_op_init();
imageblit_init();
- imageblit_copy(viewport_x,viewport_y,
+ /*imageblit_copy(viewport_x,viewport_y,
viewport_x+(viewport_w>>2),viewport_y+(viewport_h>>2),
viewport_w>>2, viewport_h>>2
- );
+ );*/
/* mandatory, or we get PFIFO_CACHE_ERROR */
- tcl_init();
+ /*tcl_init();*/
+ /*tcl_init_ddx();*/
+ tcl_init_triangle();
/*tcl_clear();*/
/* FIXME: none work atm */
- tcl_triangle_fixed();
- tcl_triangle_vtxattr();
+ /*tcl_triangle_fixed();*/
+ /*tcl_triangle_vtxattr();*/
printf("coincoin\n");
diff --git a/tcl_init.c b/tcl_init.c
index fde1609..0305cf4 100644
--- a/tcl_init.c
+++ b/tcl_init.c
@@ -2,6 +2,7 @@
#include "screen.h"
#include "object.h"
+#include "fifo.h"
#include "nouveau_class.h"
#include "nv30_fpinst.h"
@@ -23,7 +24,7 @@ static void tcl_fp_color(void)
if (!fragprog_map) {
return;
}
- printf("fragprog alloc'd at 0x%08x mapped at %p\n",
+ printf("fragprog alloc'd at 0x%lx mapped at %p\n",
fragprog_offset, fragprog_map);
/*
* MOV result.color, fragment.color
@@ -43,6 +44,8 @@ static void tcl_fp_color(void)
BEGIN_RING(NvSub3D, NV34TCL_FP_ACTIVE_PROGRAM, 1);
OUT_RING ((uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0);
+ 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);
@@ -67,7 +70,7 @@ static void tcl_fp_nop(void)
if (!fragprog_map) {
return;
}
- printf("fragprog alloc'd at 0x%08x mapped at %p\n",
+ printf("fragprog alloc'd at 0x%lx mapped at %p\n",
fragprog_offset, fragprog_map);
/*
* NOP
@@ -104,8 +107,9 @@ void tcl_init(void)
BEGIN_RING(NvSub3D, NV34TCL_DMA_COLOR0, 2);
OUT_RING(NvDmaFB); /* beef0201 194 color0 */
OUT_RING(NvDmaFB); /* beef0201 198 zeta */
- BEGIN_RING(NvSub3D, NV34TCL_DMA_IN_MEMORY7, 1);
+ BEGIN_RING(NvSub3D, NV34TCL_DMA_IN_MEMORY7, 2);
OUT_RING(NvDmaFB); /* beef0201 1ac */
+ OUT_RING(NvDmaFB); /* beef0201 1b0 */
BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 1);
OUT_RING((viewport_w-1)<<16);
@@ -131,9 +135,6 @@ void tcl_init(void)
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);
@@ -168,7 +169,7 @@ void tcl_init(void)
OUT_RING(viewport_w<<16);
OUT_RING(viewport_h<<16);
BEGIN_RING(NvSub3D, NV34TCL_RT_FORMAT, 1);
- OUT_RING(NV34TCL_RT_FORMAT_TYPE_LINEAR | NV34TCL_RT_FORMAT_ZETA_Z24S8 | NV34TCL_RT_FORMAT_COLOR_A8R8G8B8);
+ OUT_RING(NV34TCL_RT_FORMAT_TYPE_LINEAR | NV34TCL_RT_FORMAT_ZETA_Z24S8 | NV34TCL_RT_FORMAT_COLOR_X8R8G8B8);
BEGIN_RING(NvSub3D, 0x1da4, 1);
OUT_RING(0);
BEGIN_RING(NvSub3D, NV34TCL_COLOR0_PITCH, 5);
@@ -177,6 +178,9 @@ void tcl_init(void)
OUT_RING(screen_offset); /* zeta_offset */
OUT_RING(screen_offset); /* color1_offset */
OUT_RING(screen_pitch); /* color1_pitch */
+ BEGIN_RING(NvSub3D, NV34TCL_LMA_DEPTH_PITCH, 2);
+ OUT_RING(screen_pitch);
+ OUT_RING(screen_offset + viewport_w);
BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1);
OUT_RING(0);
BEGIN_RING(NvSub3D, 0x1da4, 1);
@@ -335,29 +339,409 @@ void tcl_init(void)
BEGIN_RING(NvSub3D, NV34TCL_ENGINE, 1);
OUT_RING(0x13 /*NV34TCL_ENGINE_FIXED*/);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4);
+ OUT_RINGf(viewport_w * 0.5);
+ OUT_RINGf(viewport_h * 0.5);
+ OUT_RINGf(0.5);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_SCALE_X, 4);
+ OUT_RINGf(viewport_w * 0.5);
+ OUT_RINGf(viewport_h * -0.5);
+ 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_MODELVIEW_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);
+ }
+
+ /*tcl_fp_nop();*/
+ tcl_fp_color();
+
+ FIRE_RING();
+}
+
+void tcl_init_triangle(void)
+{
+ int i;
+
+ printf("-- TCL init, triangle\n");
+
+ SetSubchannel(NvSubImageBlit, NvImageBlit);
+ SetSubchannel(NvSub3D, Nv3D);
+
+ BEGIN_RING(NvSub3D, NV34TCL_DMA_NOTIFY, 1);
+ OUT_RING(NvSyncNotify);
+
+ BEGIN_RING(NvSub3D, NV34TCL_DMA_TEXTURE0, 2);
+ OUT_RING(NvDmaFB); /* beef0201 184 texture0 */
+ OUT_RING(NvDmaTT); /* beef0202 188 texture1 */
+ BEGIN_RING(NvSub3D, NV34TCL_DMA_IN_MEMORY7, 1);
+ OUT_RING(NvDmaFB); /* beef0201 1ac */
+ 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 */
+#if 0
+000421a8 size 1, subchannel 1 (0xbeef3097),offset 0x01a8,increment
+beef0351 NV30TCL.DMA_QUERY = NV01_MEMORY_LOCAL_BANKED
+#endif
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_RT_HORIZ, 2);
+ OUT_RING(0);
+ OUT_RING(0);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 1);
+ OUT_RING(4095<<16);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_VERT(0), 1);
+ OUT_RING(4095<<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);
#if 0
+000421a4 size 1, subchannel 1 (0xbeef3097),offset 0x01a4,increment
+beef1e00 NV30TCL.DMA_FENCE = NV01_MEMORY_LOCAL_BANKED
+#endif
+ 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);
+ }
+#if 0
+00042104 size 1, subchannel 1 (0xbeef3097),offset 0x0104,increment
+00000000 NV30TCL.NOTIFY
+00042100 size 1, subchannel 1 (0xbeef3097),offset 0x0100,increment
+00000000 NV30TCL.NOP
+00042110 size 1, subchannel 1 (0xbeef3097),offset 0x0110,increment
+00000000 NV30TCL[0x0110/4]
+#endif
+ 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_w<<16);
+ OUT_RING(viewport_h<<16);
+ BEGIN_RING(NvSub3D, 0x1d88, 1);
+ OUT_RING(0x1200);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_HORIZ, 2);
+ OUT_RING(4095);
+ OUT_RING(4095);
+ BEGIN_RING(NvSub3D, NV34TCL_SCISSOR_HORIZ, 2);
+ OUT_RING(4095);
+ OUT_RING(4095);
BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4);
- OUT_RINGf(viewport_w * 1.0);
+ OUT_RINGf(0.0);
OUT_RINGf(viewport_h * 1.0);
OUT_RINGf(0.0);
OUT_RINGf(0.0);
- BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_SCALE_X, 4);
- OUT_RINGf(viewport_w / 2.0);
- OUT_RINGf(viewport_h / -2.0);
- OUT_RINGf(0.5);
+
+ BEGIN_RING(NvSub3D, NV34TCL_RT_FORMAT, 1);
+ OUT_RING(NV34TCL_RT_FORMAT_TYPE_LINEAR | NV34TCL_RT_FORMAT_ZETA_Z24S8 | NV34TCL_RT_FORMAT_COLOR_X8R8G8B8);
+ BEGIN_RING(NvSub3D, NV34TCL_RT_ENABLE, 1);
+ OUT_RING(0);
+
+ BEGIN_RING(NvSub3D, 0x2bc, 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 1);
+ OUT_RING((viewport_w-1)<<16);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_VERT(0), 1);
+ OUT_RING((viewport_h-1)<<16);
+ 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_LMA_DEPTH_PITCH, 2);
+ OUT_RING(screen_pitch);
+ OUT_RING(screen_offset + viewport_w);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_HORIZ, 2);
+ OUT_RING(viewport_w<<16);
+ OUT_RING(viewport_h<<16);
+ BEGIN_RING(NvSub3D, NV34TCL_SCISSOR_HORIZ, 2);
+ OUT_RING(4096<<16);
+ OUT_RING(viewport_h<<16);
+ BEGIN_RING(NvSub3D, NV34TCL_RT_HORIZ, 2);
+ OUT_RING(viewport_w<<16);
+ OUT_RING(viewport_h<<16);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4);
OUT_RINGf(0.0);
-#else
- BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 8);
+ OUT_RINGf(viewport_h * 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_X8R8G8B8);
+ BEGIN_RING(NvSub3D, NV34TCL_RT_ENABLE, 1);
+ OUT_RING(NV34TCL_RT_ENABLE_COLOR0);
+
+ BEGIN_RING(NvSub3D, 0x2bc, 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 1);
+ OUT_RING((viewport_w-1)<<16);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_VERT(0), 1);
+ OUT_RING((viewport_h-1)<<16);
+ 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_LMA_DEPTH_PITCH, 2);
+ OUT_RING(screen_pitch);
+ OUT_RING(screen_offset + viewport_w);
+
+ BEGIN_RING(NvSub3D, 0x234, 1);
+ OUT_RING(3);
+
+ 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);
+
+ tcl_fp_color();
+
+ for (i=0; i<4; i++) {
+ BEGIN_RING(NvSub3D, NV34TCL_TX_ENABLE(i), 1);
+ OUT_RING(0);
+ }
+ BEGIN_RING(NvSub3D, NV34TCL_MULTISAMPLE_CONTROL, 1);
+ OUT_RING(0xffff<<16);
+
+ BEGIN_RING(NvSub3D, NV34TCL_BLEND_FUNC_ENABLE, 5);
+ OUT_RING(0);
+ OUT_RING((1<<16)|1);
+ OUT_RING(0);
+ OUT_RING(0);
+ OUT_RING(0x8006);
+ 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(1);
+ 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_DITHER_ENABLE, 1);
+ OUT_RING(1);
+ 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(1);
+ 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_LINE_STIPPLE_ENABLE, 2);
+ OUT_RING(0);
+ OUT_RING(0xffff<<16);
+ 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_SHADE_MODEL, 1);
+ OUT_RING(0x1d01);
+ BEGIN_RING(NvSub3D, NV34TCL_POLYGON_STIPPLE_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_COLOR_MASK, 1);
+ OUT_RING(0x01010101);
+ 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_NORMALIZE_ENABLE, 1);
+ OUT_RING(0);
+ BEGIN_RING(NvSub3D, NV34TCL_POINT_SIZE, 3);
+ OUT_RINGf(1.0);
+ OUT_RING(0);
+ OUT_RING(0);
+
+ BEGIN_RING(NvSub3D, 0x3b0, 1);
+ OUT_RING(0x10<<16);
+
+ 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_FOG_COLOR, 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_w * 0.5);
+ OUT_RINGf(viewport_h * 0.5);
+ OUT_RINGf(0.5);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4);
+ OUT_RINGf(viewport_w * 0.5);
+ OUT_RINGf(viewport_h * 0.5);
+ OUT_RINGf(0.5);
+ OUT_RINGf(0.0);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_SCALE_X, 4);
+ OUT_RINGf(viewport_w * 0.5);
+ OUT_RINGf(viewport_h * -0.5);
+ OUT_RINGf(0.5);
+ OUT_RINGf(0.0);
+ BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_SCALE_X, 4);
+ OUT_RINGf(viewport_w * 0.5);
+ OUT_RINGf(viewport_h * -0.5);
+ OUT_RINGf(0.5);
OUT_RINGf(0.0);
-#endif
BEGIN_RING(NvSub3D, NV34TCL_VP_CLIP_PLANES_ENABLE, 1);
OUT_RING(0);
@@ -380,7 +764,233 @@ void tcl_init(void)
OUT_RING(0);
}
- /*tcl_fp_nop();*/
+ BEGIN_RING(NvSub3D, 0x1dac, 1);
+ OUT_RING(0);
+
+ BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1);
+ OUT_RING(NV34TCL_VERTEX_BEGIN_END_TRIANGLES);
+
+ 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_3F_X(0), 3);
+ OUT_RINGf(0.0);
+ OUT_RINGf(1.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);
+
+ FIRE_RING();
+}
+
+void tcl_init_ddx(void)
+{
+ int i;
+
+ printf("-- TCL init, from ddx\n");
+
+ SetSubchannel(NvSub3D, Nv3D);
+ SetSubchannel(NvSubImageBlit, NvImageBlit);
+
+ BEGIN_RING( NvSub3D, NV34TCL_DMA_TEXTURE0, 3);
+ OUT_RING ( NvDmaFB);
+ OUT_RING ( NvDmaTT);
+ OUT_RING ( NvDmaFB);
+ BEGIN_RING( NvSub3D, NV34TCL_DMA_IN_MEMORY7, 1);
+ OUT_RING ( NvDmaFB);
+ BEGIN_RING( NvSub3D, NV34TCL_DMA_COLOR0, 2);
+ OUT_RING ( NvDmaFB);
+ OUT_RING ( NvDmaFB);
+ BEGIN_RING( NvSub3D, NV34TCL_DMA_IN_MEMORY8, 1);
+ OUT_RING ( NvDmaFB);
+
+ for (i=1; i<8; i++) {
+ BEGIN_RING( NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 2);
+ OUT_RING ( 0);
+ OUT_RING ( 0);
+ }
+
+ BEGIN_RING( NvSub3D, 0x220, 1);
+ OUT_RING ( 1);
+
+ BEGIN_RING( NvSub3D, 0x03b0, 1);
+ OUT_RING ( 0x00100000);
+ BEGIN_RING( NvSub3D, 0x1454, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, 0x1d80, 1);
+ OUT_RING ( 3);
+ BEGIN_RING( NvSub3D, 0x1450, 1);
+ OUT_RING ( 0x00030004);
+
+ /* NEW */
+ BEGIN_RING( NvSub3D, 0x1e98, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, 0x17e0, 3);
+ OUT_RING ( 0);
+ OUT_RING ( 0);
+ OUT_RING ( 0x3f800000);
+ BEGIN_RING( NvSub3D, 0x1f80, 16);
+ OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 0);
+ OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 0);
+ OUT_RING ( 0x0000ffff);
+ OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 0);
+ OUT_RING ( 0); OUT_RING ( 0); OUT_RING ( 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, 0x1d88, 1);
+ OUT_RING ( 0x00001200);
+
+ BEGIN_RING( NvSub3D, NV34TCL_RC_ENABLE, 1);
+ OUT_RING ( 0);
+
+ /* Attempt to setup a known state.. Probably missing a heap of
+ * stuff here..
+ */
+ BEGIN_RING( NvSub3D, NV34TCL_STENCIL_FRONT_ENABLE, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, NV34TCL_STENCIL_BACK_ENABLE, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, NV34TCL_ALPHA_FUNC_ENABLE, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, NV34TCL_DEPTH_WRITE_ENABLE, 2);
+ OUT_RING ( 0); /* wr disable */
+ OUT_RING ( 0); /* test disable */
+ BEGIN_RING( NvSub3D, NV34TCL_COLOR_MASK, 1);
+ OUT_RING ( 0x01010101); /* TR,TR,TR,TR */
+ BEGIN_RING( NvSub3D, NV34TCL_CULL_FACE_ENABLE, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, NV34TCL_BLEND_FUNC_ENABLE, 5);
+ OUT_RING ( 0); /* Blend enable */
+ OUT_RING ( 0); /* Blend src */
+ OUT_RING ( 0); /* Blend dst */
+ OUT_RING ( 0x00000000); /* Blend colour */
+ OUT_RING ( 0x8006); /* FUNC_ADD */
+ BEGIN_RING( NvSub3D, NV34TCL_COLOR_LOGIC_OP_ENABLE, 2);
+ OUT_RING ( 0);
+ OUT_RING ( 0x1503 /*GL_COPY*/);
+ BEGIN_RING( NvSub3D, NV34TCL_DITHER_ENABLE, 1);
+ OUT_RING ( 1);
+ BEGIN_RING( NvSub3D, NV34TCL_SHADE_MODEL, 1);
+ OUT_RING ( 0x1d01 /*GL_SMOOTH*/);
+ BEGIN_RING( NvSub3D, NV34TCL_POLYGON_OFFSET_FACTOR,2);
+ OUT_RINGf ( 0.0);
+ OUT_RINGf ( 0.0);
+ BEGIN_RING( NvSub3D, NV34TCL_POLYGON_MODE_FRONT, 2);
+ OUT_RING ( 0x1b02 /*GL_FILL*/);
+ OUT_RING ( 0x1b02 /*GL_FILL*/);
+ /* - Disable texture units
+ * - Set fragprog to MOVR result.color, fragment.color */
+ for (i=0;i<4;i++) {
+ BEGIN_RING( NvSub3D, NV34TCL_TX_ENABLE(i), 1);
+ OUT_RING ( 0);
+ }
+ /* Polygon stipple */
+ BEGIN_RING( NvSub3D, NV34TCL_POLYGON_STIPPLE_PATTERN(0), 0x20);
+ for (i=0;i<0x20;i++)
+ OUT_RING ( 0xFFFFFFFF);
+
+ BEGIN_RING( NvSub3D, NV34TCL_DEPTH_RANGE_NEAR, 2);
+ OUT_RINGf ( 0.0);
+ OUT_RINGf ( 1.0);
+
+ /* Ok. If you start X with the nvidia driver, kill it, and then
+ * start X with nouveau you will get black rendering instead of
+ * what you'd expect. This fixes the problem, and it seems that
+ * it's not needed between nouveau restarts - which suggests that
+ * the 3D context (wherever it's stored?) survives somehow.
+ */
+ //BEGIN_RING( NvSub3D, 0x1d60,1);
+ //OUT_RING ( 0x03008000);
+
+ int w=viewport_w;
+ int h=viewport_h;
+ int pitch=screen_pitch;
+ BEGIN_RING( NvSub3D, NV34TCL_RT_HORIZ, 5);
+ OUT_RING ( w<<16);
+ OUT_RING ( h<<16);
+ OUT_RING ( 0x148); /* format */
+ OUT_RING ( pitch << 16 | pitch);
+ OUT_RING ( 0x0);
+ BEGIN_RING( NvSub3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1);
+ OUT_RING ( 0);
+ BEGIN_RING( NvSub3D, 0x0a00, 2);
+ OUT_RING ((w<<16) | 0);
+ OUT_RING ((h<<16) | 0);
+ BEGIN_RING( NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 2);
+ OUT_RING ((w-1)<<16);
+ OUT_RING ((h-1)<<16);
+ BEGIN_RING( NvSub3D, NV34TCL_SCISSOR_HORIZ, 2);
+ OUT_RING ( w<<16);
+ OUT_RING ( h<<16);
+ BEGIN_RING( NvSub3D, NV34TCL_VIEWPORT_HORIZ, 2);
+ OUT_RING ( w<<16);
+ OUT_RING ( h<<16);
+
+ BEGIN_RING( NvSub3D, NV34TCL_VIEWPORT_TRANSLATE_X, 8);
+ OUT_RINGf ( 0.0);
+ OUT_RINGf ( 0.0);
+ OUT_RINGf ( 0.0);
+ OUT_RINGf ( 0.0);
+ OUT_RINGf ( 1.0);
+ OUT_RINGf ( 1.0);
+ OUT_RINGf ( 1.0);
+ OUT_RINGf ( 0.0);
+
+ BEGIN_RING( NvSub3D, NV34TCL_MODELVIEW_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);
+
+ BEGIN_RING( NvSub3D, NV34TCL_PROJECTION_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);
+
+ BEGIN_RING( NvSub3D, NV34TCL_SCISSOR_HORIZ, 2);
+ OUT_RING ( 4096<<16);
+ OUT_RING ( 4096<<16);
+
tcl_fp_color();
FIRE_RING();
diff --git a/tcl_init.h b/tcl_init.h
index 9c051b8..eebfc84 100644
--- a/tcl_init.h
+++ b/tcl_init.h
@@ -2,6 +2,9 @@
#define TCL_INIT_H
void tcl_init(void);
+void tcl_init_triangle(void);
+void tcl_init_ddx(void);
+
void tcl_clear(void);
#endif