#include #include #include "nouveau_class.h" #include #include #include "screen.h" #include "object.h" #include "fifo.h" #include "nv30_fpinst.h" static void tcl_fp_color(void) { #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 uint32_t *map; struct nouveau_bo *bo; struct nouveau_grobj *subch3D = grobj[NvSub3D]; bo = screen_allocmem(0x1000); if (!bo) { return; } map = bo->map; printf("fragprog mapped at %p\n", map); /* * MOV result.color, fragment.color */ map[0] = 0x01803e81; map[1] = 0x1c9dc901; map[2] = map[3] = 0x0001c900; /* NV30FP_LOCALS; NV30FP_SETBUF(fragprog_map); NV30FP_ARITH_INST_SET_DEFAULTS; NV30FP_ARITH(MOV, RESULT, 0, 1, 1, 1, 1); NV30FP_SOURCE_INPUT(0, NV30_FP_OP_INPUT_SRC_COL0, X, Y, Z, W, 0, 0, 0); NV30FP_LAST_INST; */ nouveau_bo_unmap(bo); BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); OUT_RELOCd(chan, bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD | NOUVEAU_BO_LOW, NV34TCL_FP_ACTIVE_PROGRAM_DMA0, 0); BEGIN_RING(chan, subch3D, NV34TCL_FP_CONTROL, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_FP_REG_CONTROL, 1); OUT_RING (chan, (1<<16)|4); nouveau_bo_ref(NULL, &bo); } #if 0 static void tcl_fp_nop(void) { /* 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 */ uint32_t *map; struct nouveau_bo *bo; struct nouveau_grobj *subch3D = grobj[NvSub3D]; bo = screen_allocmem(0x1000); if (!bo) { return; } map = bo->map; printf("fragprog mapped at %p\n", map); /* * NOP */ map[0] = 1; map[1] = map[2] = map[3] = 0; nouveau_bo_unmap(bo); BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); OUT_RELOCd(chan, bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD | NOUVEAU_BO_LOW, NV34TCL_FP_ACTIVE_PROGRAM_DMA0, 0); BEGIN_RING(chan, subch3D, NV34TCL_FP_CONTROL, 1); OUT_RING (chan, 0x40); BEGIN_RING(chan, subch3D, NV34TCL_FP_REG_CONTROL, 1); OUT_RING (chan, (1<<16)|4); nouveau_bo_ref(NULL, &bo); } #endif void tcl_init(void) { int i; struct nouveau_grobj *subch3D = grobj[NvSub3D]; struct nouveau_grobj *subchImageBlit = grobj[NvSubImageBlit]; printf("-- TCL init\n"); BEGIN_RING(chan, subch3D, NV34TCL_DMA_NOTIFY, 1); OUT_RING (chan, notifier->handle); BEGIN_RING(chan, subch3D, NV34TCL_DMA_TEXTURE0, 3); OUT_RING (chan, chan->vram->handle); OUT_RING (chan, chan->gart->handle); OUT_RING (chan, chan->vram->handle); BEGIN_RING(chan, subch3D, NV34TCL_DMA_COLOR0, 2); OUT_RING (chan, chan->vram->handle); OUT_RING (chan, chan->vram->handle); BEGIN_RING(chan, subch3D, NV34TCL_DMA_IN_MEMORY7, 2); OUT_RING (chan, chan->vram->handle); OUT_RING (chan, chan->vram->handle); #if 0 000421a4 size 1, subchannel 1 (0xbeef3097),offset 0x01a4,increment beef1e00 NV30TCL.DMA_FENCE = NV01_MEMORY_LOCAL_BANKED 000421a8 size 1, subchannel 1 (0xbeef3097),offset 0x01a8,increment beef0351 NV30TCL.DMA_QUERY = NV01_MEMORY_LOCAL_BANKED #endif BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 1); OUT_RING (chan, (viewport_w-1)<<16); BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_CLIP_VERT(0), 1); OUT_RING (chan, (viewport_h-1)<<16); for (i=1; i<8; i++) { BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_CLIP_VERT(i), 1); OUT_RING (chan, 0); } BEGIN_RING(chan, subch3D, 0x2bc /* NV34TCL_VIEWPORT_CLIP_MODE */, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, 0x3b0, 1); OUT_RING (chan, 0x10<<16); BEGIN_RING(chan, subch3D, 0x1454, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, 0x1d80, 1); OUT_RING (chan, 3); BEGIN_RING(chan, subch3D, 0x1e98, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, 0x17e0, 3); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 1.0); BEGIN_RING(chan, subch3D, 0x1f80, 16); for (i=0; i<16; i++) { OUT_RING(chan, (i==8) ? 0xffff : 0); } BEGIN_RING(chan, subch3D, 0x120, 3); OUT_RING (chan, 0); OUT_RING (chan, 1); OUT_RING (chan, 2); BEGIN_RING(chan, subchImageBlit, 0x120, 3); OUT_RING (chan, 0); OUT_RING (chan, 1); OUT_RING (chan, 2); BEGIN_RING(chan, subch3D, 0x1d88, 1); OUT_RING (chan, 0x1200); BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_HORIZ, 2); OUT_RING (chan, viewport_w<<16); OUT_RING (chan, viewport_h<<16); BEGIN_RING(chan, subch3D, NV34TCL_SCISSOR_HORIZ, 2); OUT_RING (chan, viewport_w<<16); OUT_RING (chan, viewport_h<<16); BEGIN_RING(chan, subch3D, NV34TCL_RT_HORIZ, 2); OUT_RING (chan, viewport_w<<16); OUT_RING (chan, viewport_h<<16); BEGIN_RING(chan, subch3D, NV34TCL_RT_FORMAT, 1); OUT_RING (chan, NV34TCL_RT_FORMAT_TYPE_LINEAR | NV34TCL_RT_FORMAT_ZETA_Z24S8 | NV34TCL_RT_FORMAT_COLOR_X8R8G8B8); BEGIN_RING(chan, subch3D, NV34TCL_RT_ENABLE, 1); OUT_RING (chan, NV34TCL_RT_ENABLE_COLOR0); BEGIN_RING(chan, subch3D, 0x1da4, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_COLOR0_PITCH, 5); OUT_RING (chan, (screen_pitch<<16)|screen_pitch); /* zeta_pitch, color0_pitch */ OUT_RING (chan, screen_offset); /* color0_offset */ OUT_RING (chan, screen_offset + viewport_w*(screen_bpp/8)); /* zeta_offset, on the right of color buffer */ OUT_RING (chan, screen_offset); /* color1_offset */ OUT_RING (chan, screen_pitch); /* color1_pitch */ BEGIN_RING(chan, subch3D, NV34TCL_LMA_DEPTH_PITCH, 2); OUT_RING (chan, screen_pitch); OUT_RING (chan, screen_offset + viewport_h * screen_pitch); /* lma below color buffer */ BEGIN_RING(chan, subch3D, 0x234, 1); OUT_RING (chan, 3); BEGIN_RING(chan, subch3D, NV34TCL_ALPHA_FUNC_ENABLE, 3); OUT_RING (chan, 0); OUT_RING (chan, 0x207); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_RC_ENABLE, 1); OUT_RING (chan, 0); for (i=0; i<4; i++) { BEGIN_RING(chan, subch3D, NV34TCL_TX_ENABLE(i), 1); OUT_RING (chan, 0); } BEGIN_RING(chan, subch3D, NV34TCL_MULTISAMPLE_CONTROL, 1); OUT_RING (chan, 0xffff<<16); BEGIN_RING(chan, subch3D, NV34TCL_BLEND_FUNC_ENABLE, 5); OUT_RING (chan, 0); OUT_RING( chan, (1<<16)|1); OUT_RING (chan, 0); OUT_RING (chan, 0); OUT_RING (chan, 0x8006); BEGIN_RING(chan, subch3D, NV34TCL_STENCIL_FRONT_ENABLE, 17); OUT_RING (chan, 0); OUT_RING (chan, 0xff); OUT_RING (chan, 0x207); OUT_RING (chan, 0); OUT_RING (chan, 0xff); OUT_RING (chan, 0x1e00); OUT_RING (chan, 0x1e00); OUT_RING (chan, 0x1e00); OUT_RING (chan, 1); OUT_RING (chan, 0xff); OUT_RING (chan, 0x207); OUT_RING (chan, 0); OUT_RING (chan, 0xff); OUT_RING (chan, 0x1e00); OUT_RING (chan, 0x1e00); OUT_RING (chan, 0x1e00); OUT_RING (chan, 0x1d01); BEGIN_RING(chan, subch3D, NV34TCL_COLOR_LOGIC_OP_ENABLE, 2); OUT_RING (chan, 0); OUT_RING (chan, 0x1503); BEGIN_RING(chan, subch3D, NV34TCL_DITHER_ENABLE, 1); OUT_RING (chan, 1); BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_STIPPLE_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_LINE_STIPPLE_ENABLE, 2); OUT_RING (chan, 0); OUT_RING (chan, 0xffff<<16); BEGIN_RING(chan, subch3D, 0x1d84, 1); OUT_RING (chan, 1); BEGIN_RING(chan, subch3D, 0x17cc, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_STIPPLE_PATTERN(0), 32); for (i=0; i<32; i++) { OUT_RING (chan, 0xffffffff); } BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_OFFSET_POINT_ENABLE, 3); OUT_RING (chan, 0); OUT_RING (chan, 0); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_DEPTH_FUNC, 1); OUT_RING (chan, 0x201); BEGIN_RING(chan, subch3D, NV34TCL_DEPTH_WRITE_ENABLE, 1); OUT_RING (chan, 1); BEGIN_RING(chan, subch3D, NV34TCL_DEPTH_TEST_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_OFFSET_FACTOR, 2); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 0.0); BEGIN_RING(chan, subch3D, 0x1d78, 1); OUT_RING (chan, 1); BEGIN_RING(chan, subch3D, NV34TCL_LINE_WIDTH, 2); OUT_RING (chan, 8); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_LINE_STIPPLE_ENABLE, 2); OUT_RING (chan, 0); OUT_RING (chan, 0xffff<<16); BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_MODE_FRONT, 2); OUT_RING (chan, 0x1b02); OUT_RING (chan, 0x1b02); BEGIN_RING(chan, subch3D, NV34TCL_CULL_FACE, 2); OUT_RING (chan, 0x405); OUT_RING (chan, 0x901); BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_SMOOTH_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_CULL_FACE_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_SHADE_MODEL, 1); OUT_RING (chan, 0x1d01); BEGIN_RING(chan, subch3D, NV34TCL_POLYGON_STIPPLE_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_4F_X(1), 60); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 1.0); OUT_RINGf (chan, 1.0); for (i=4; i<16; i++) { OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 1.0); } BEGIN_RING(chan, subch3D, 0x145c, 1); OUT_RING (chan, 1); BEGIN_RING(chan, subch3D, NV34TCL_COLOR_MASK, 1); OUT_RING (chan, 0x01010101); BEGIN_RING(chan, subch3D, 0x1458, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, 0x1424, 3); OUT_RING (chan, 2<<16); OUT_RING (chan, 0); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_ENABLED_LIGHTS, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_NORMALIZE_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_POINT_SIZE, 3); OUT_RINGf (chan, 1.0); OUT_RING (chan, 0); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_TX_GEN_S(0), 32); for (i=0; i<32; i++) { OUT_RING (chan, 0); } BEGIN_RING(chan, subch3D, NV34TCL_FOG_MODE, 1); OUT_RING (chan, 0x802); BEGIN_RING(chan, subch3D, NV34TCL_FOG_EQUATION_CONSTANT, 3); OUT_RINGf (chan, 1.5); OUT_RINGf (chan, -0.090168); OUT_RINGf(chan, 0.0); BEGIN_RING(chan, subch3D, NV34TCL_FOG_COORD_DIST, 1); OUT_RING (chan, 2); BEGIN_RING(chan, subch3D, NV34TCL_FOG_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_FOG_COLOR, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_ENGINE, 1); OUT_RING (chan, NV34TCL_ENGINE_FIXED); BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_TRANSLATE_X, 4); OUT_RINGf (chan, viewport_w * 0.5); OUT_RINGf (chan, viewport_h * 0.5); OUT_RINGf (chan, 0.5); OUT_RINGf (chan, 0.0); BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_SCALE_X, 4); OUT_RINGf (chan, viewport_w * 0.5); OUT_RINGf (chan, viewport_h * -0.5); OUT_RINGf (chan, 0.5); OUT_RINGf (chan, 0.0); BEGIN_RING(chan, subch3D, NV34TCL_VP_CLIP_PLANES_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_PROJECTION_MATRIX(0), 16); for (i=0; i<16; i++) { if ((i==0) || (i==5) || (i==10) || (i==15)) { OUT_RINGf (chan, 1.0); } else { OUT_RING (chan, 0); } } BEGIN_RING(chan, subch3D, NV34TCL_DEPTH_RANGE_NEAR, 2); OUT_RINGf (chan, 0.0); OUT_RINGf (chan, 1.0); BEGIN_RING(chan, subch3D, NV34TCL_TX_UNITS_ENABLE, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_TX_MATRIX_ENABLE(0), 8); for (i=0; i<8; i++) { OUT_RING (chan, 0); } tcl_fp_color(); /*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(chan); } void tcl_clear(void) { struct nouveau_grobj *subch3D = grobj[NvSub3D]; printf("-- TCL clear buffers\n"); BEGIN_RING(chan, subch3D, NV34TCL_CLEAR_DEPTH_VALUE, 2); OUT_RING (chan, 0); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_IDXBUF_ADDRESS, 1); OUT_RING (chan, 0); BEGIN_RING(chan, subch3D, NV34TCL_CLEAR_BUFFERS, 1); OUT_RING (chan, 0xf0); FIRE_RING(chan); }