diff options
author | Patrice Mandin <pmandin@caramail.com> | 2008-08-30 18:27:23 +0200 |
---|---|---|
committer | Patrice Mandin <pmandin@caramail.com> | 2008-08-30 18:27:23 +0200 |
commit | 42a5ec67c93a57d3a65d30e8827b0ddb668d2c8c (patch) | |
tree | e7b296756850e0a5267eb2926f205d8c5787c85f | |
parent | b0cbcc65d9f719b6ecddddf5fbffd7334a5c9792 (diff) |
Got something with test_startup+test_default merged as tcl_init_triangle
-rw-r--r-- | main.c | 16 | ||||
-rw-r--r-- | tcl_init.c | 642 | ||||
-rw-r--r-- | tcl_init.h | 3 |
3 files changed, 640 insertions, 21 deletions
@@ -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"); @@ -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(); @@ -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 |