diff options
author | Patrice Mandin <patmandin@gmail.com> | 2009-11-28 23:10:49 +0100 |
---|---|---|
committer | Patrice Mandin <patmandin@gmail.com> | 2009-11-28 23:10:49 +0100 |
commit | 5442962d2bd3344035ab3b27716eaf02e9468f3b (patch) | |
tree | 6bc3f4cf34b97e860952ab93237acb4275513623 | |
parent | d530595cd82eae088667655f49affc771a572ca5 (diff) |
Start adapting nv30_demo to libdrm nouveau
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | clip_rectangle.c | 21 | ||||
-rw-r--r-- | context_surface_2d.c | 28 | ||||
-rw-r--r-- | fifo.c | 109 | ||||
-rw-r--r-- | fifo.h | 10 | ||||
-rw-r--r-- | image_pattern.c | 36 | ||||
-rw-r--r-- | imageblit.c | 48 | ||||
-rw-r--r-- | main.c | 47 | ||||
-rw-r--r-- | object.c | 67 | ||||
-rw-r--r-- | object.h | 10 | ||||
-rw-r--r-- | raster_op.c | 18 | ||||
-rw-r--r-- | screen.c | 55 | ||||
-rw-r--r-- | screen.h | 9 | ||||
-rw-r--r-- | tcl_init.c | 572 | ||||
-rw-r--r-- | tcl_triangle.c | 277 | ||||
-rw-r--r-- | test_nops.c | 18 | ||||
-rw-r--r-- | test_nops.h | 6 |
17 files changed, 633 insertions, 710 deletions
@@ -1,14 +1,14 @@ -SOURCES = main.c screen.c fifo.c object.c test_nops.c \ - tcl_init.c tcl_triangle.c imageblit.c context_surface_2d.c \ +SOURCES = main.c screen.c fifo.c object.c context_surface_2d.c \ + tcl_init.c tcl_triangle.c imageblit.c \ clip_rectangle.c image_pattern.c raster_op.c -HEADERS = screen.h fifo.h object.h test_nops.h \ +HEADERS = screen.h fifo.h object.h \ tcl_init.h tcl_triangle.h imageblit.h context_surface_2d.h \ clip_rectangle.h image_pattern.h raster_op.h nv30_fpinst.h OBJECTS = $(SOURCES:%.c=%.o) -LIBDRM_CFLAGS = $(shell pkg-config --cflags libdrm) -LIBDRM_LIBS = $(shell pkg-config --libs libdrm) +LIBDRM_CFLAGS = $(shell pkg-config --cflags libdrm_nouveau) +LIBDRM_LIBS = $(shell pkg-config --libs libdrm_nouveau) CFLAGS = -Wall $(LIBDRM_CFLAGS) LDFLAGS = $(LIBDRM_LIBS) @@ -19,7 +19,7 @@ DEPEND_FILE = .depend all: $(PROGRAM) clean: - rm $(PROGRAM) $(OBJECTS) $(DEPEND_FILE) + rm -f $(PROGRAM) $(OBJECTS) $(DEPEND_FILE) .c.o: $(CC) $(CFLAGS) -c $< -o $@ diff --git a/clip_rectangle.c b/clip_rectangle.c index 0671ce5..0c51ced 100644 --- a/clip_rectangle.c +++ b/clip_rectangle.c @@ -1,22 +1,25 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_device.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" void clip_rectangle_init(void) { - printf("-- Clip rectangle, init\n"); + struct nouveau_grobj *subchClipRect = grobj[NvSubClipRect]; - SetSubchannel(NvSubClipRect, NvClipRect); + printf("-- Clip rectangle, init\n"); - BEGIN_RING(NvSubClipRect, NV01_CONTEXT_CLIP_RECTANGLE_DMA_NOTIFY, 1); - OUT_RING(NvSyncNotify); + BEGIN_RING(chan, subchClipRect, NV01_CONTEXT_CLIP_RECTANGLE_DMA_NOTIFY, 1); + OUT_RING (chan, NvSyncNotify); - BEGIN_RING(NvSubClipRect, NV01_CONTEXT_CLIP_RECTANGLE_POINT, 2); - OUT_RING ((viewport_y<<16) | viewport_x); - OUT_RING ((viewport_h<<16) | viewport_w); + BEGIN_RING(chan, subchClipRect, NV01_CONTEXT_CLIP_RECTANGLE_POINT, 2); + OUT_RING (chan, (viewport_y<<16) | viewport_x); + OUT_RING (chan, (viewport_h<<16) | viewport_w); - FIRE_RING(); + FIRE_RING(chan); } diff --git a/context_surface_2d.c b/context_surface_2d.c index accc6f1..2689ee5 100644 --- a/context_surface_2d.c +++ b/context_surface_2d.c @@ -1,31 +1,31 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" void context_surface_2d_init(void) { printf("-- Context surface 2D, init\n"); - SetSubchannel(NvSubCtxSurf2D, NvCtxSurf2D); + BEGIN_RING(chan, grobj[NvSubCtxSurf2D], NV04_CONTEXT_SURFACES_2D_DMA_NOTIFY, 1); + OUT_RING (chan, NvSyncNotify); - BEGIN_RING(NvSubCtxSurf2D, NV04_CONTEXT_SURFACES_2D_DMA_NOTIFY, 1); - OUT_RING (NvSyncNotify); + BEGIN_RING(chan, grobj[NvSubCtxSurf2D], NV04_CONTEXT_SURFACES_2D_DMA_IMAGE_SOURCE, 2); + OUT_RING (chan, NvDmaFB); + OUT_RING (chan, NvDmaFB); - BEGIN_RING(NvSubCtxSurf2D, NV04_CONTEXT_SURFACES_2D_DMA_IMAGE_SOURCE, 2); - OUT_RING (NvDmaFB); - OUT_RING (NvDmaFB); - - BEGIN_RING(NvSubCtxSurf2D, NV04_CONTEXT_SURFACES_2D_FORMAT, 4); - OUT_RING( (screen_bpp==32) + BEGIN_RING(chan, grobj[NvSubCtxSurf2D], NV04_CONTEXT_SURFACES_2D_FORMAT, 4); + OUT_RING (chan, (screen_bpp==32) ? NV04_CONTEXT_SURFACES_2D_FORMAT_A8R8G8B8 : NV04_CONTEXT_SURFACES_2D_FORMAT_R5G6B5 ); - OUT_RING ((screen_pitch<<16)|screen_pitch); - OUT_RING (screen_offset); /* src */ - OUT_RING (screen_offset); /* dst */ + OUT_RING (chan, (screen_pitch<<16)|screen_pitch); + OUT_RING (chan, screen_offset); /* src */ + OUT_RING (chan, screen_offset); /* dst */ - FIRE_RING(); + FIRE_RING(chan); } @@ -4,122 +4,25 @@ #include <stdint.h> #include <xf86drm.h> #include <nouveau_drm.h> +#include <nouveau_channel.h> #include "screen.h" #include "object.h" -#define DEBUG 0 - /* Global variables */ -struct drm_nouveau_channel_alloc init; - -/* Local variables */ - -static uint32_t *fifo = NULL; -static uint32_t *fifo_regs = NULL; -static uint32_t *notifier_block = NULL; - -static uint32_t fifo_current, fifo_free; +struct nouveau_channel *chan = NULL; /* Functions */ int fifo_open(void) { - int ret; - - init.fb_ctxdma_handle = NvDmaFB; - init.tt_ctxdma_handle = NvDmaTT; - ret = drmCommandWriteRead(drm_fd, DRM_NOUVEAU_CHANNEL_ALLOC, &init, sizeof(init)); - if (ret) { - fprintf(stderr,"Failed to create GPU channel: %d\n", ret); - return 1; - } - - printf("Fifo %d: cb_handle=0x%08x, cb_size=0x%08x\n", - init.channel, init.cmdbuf, init.cmdbuf_size); - - ret = drmMap(drm_fd, init.cmdbuf, init.cmdbuf_size, (void*)&fifo); - if (ret) { - fprintf(stderr, "Mapping DMA push buffer returned %d\n", ret); - return 1; - } - - ret = drmMap(drm_fd, init.ctrl, init.ctrl_size, (void*)&fifo_regs); - if (ret) { - fprintf(stderr, "Mapping FIFO regs returned %d\n", ret); - return 1; - } - - ret = drmMap(drm_fd, init.notifier, init.notifier_size, (void*)¬ifier_block); - if (ret) { - fprintf(stderr, "Mapping notifier block returned %d\n", ret); - return 1; - } - - printf("FIFO:\t%p (0x%08x)\n", fifo, init.cmdbuf); - printf("FIFO regs:\t%p (0x%08x)\n", fifo_regs, init.ctrl); - printf("Notifiers:\t%p (0x%08x)\n", notifier_block, init.notifier); - printf("PUT base:\t0x%08x\n", init.put_base); - - fifo_current = 0; - fifo_free = (init.cmdbuf_size>>2) - 1; - printf("FIFO current:\t0x%x free=0x%x\n", fifo_current, fifo_free); - return 0; -} - -void fifo_print_getput(void) -{ - printf("FIFO put=0x%08x, get=0x%08x, current=0x%08x\n", - fifo_regs[0x40/4], - fifo_regs[0x44/4], - fifo_current - ); -} - -void OUT_RING(uint32_t data) -{ -#if DEBUG - printf("out_ring(0x%08x)\n", data); -#else - fifo[fifo_current++] = data; -#endif + return nouveau_channel_alloc(dev, NvDmaFB, NvDmaTT, &chan); } -void OUT_RINGf(float data) +void fifo_close(void) { - uint32_t v = *(uint32_t*) &data; -#if DEBUG - printf("out_ringf(0x%08x) = %f\n", v, data); -#else - fifo[fifo_current++] = v; -#endif -} - -void FIRE_RING(void) -{ -#if DEBUG - printf("fire_ring()\n"); -#else - fifo_regs[0x40/4] = (fifo_current<<2) + init.put_base; -#endif -} - -void BEGIN_RING(int subchannel, int method, int size) -{ - size &= (1<<11)-1; - subchannel &= (1<<3)-1; - method &= 0x40001ffc; - if (fifo_free<=size) { - fprintf(stderr,"FIFO full\n"); - return; + if (chan) { + nouveau_channel_free(&chan); } - OUT_RING(method|(size<<18)|(subchannel<<13)); - fifo_free -= size; -} - -void SetSubchannel(int subchannel, int obj) -{ - BEGIN_RING(subchannel, 0, 1); - OUT_RING(obj); } @@ -11,17 +11,11 @@ /* Global variables */ -struct drm_nouveau_channel_alloc init; +extern struct nouveau_channel *chan; /* Functions */ int fifo_open(void); -void fifo_print_getput(void); - -void OUT_RING(uint32_t data); -void OUT_RINGf(float data); -void FIRE_RING(void); -void BEGIN_RING(int subchannel, int method, int size); -void SetSubchannel(int subchannel, int obj); +void fifo_close(void); #endif diff --git a/image_pattern.c b/image_pattern.c index ce59639..a98f7a2 100644 --- a/image_pattern.c +++ b/image_pattern.c @@ -1,35 +1,37 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" void image_pattern_init(void) { - printf("-- Image pattern, init\n"); + struct nouveau_grobj *subchImagePattern = grobj[NvSubImagePattern]; - SetSubchannel(NvSubImagePattern, NvImagePattern); + printf("-- Image pattern, init\n"); - BEGIN_RING(NvSubImagePattern, NV04_IMAGE_PATTERN_DMA_NOTIFY, 1); - OUT_RING(NvSyncNotify); + BEGIN_RING(chan, subchImagePattern, NV04_IMAGE_PATTERN_DMA_NOTIFY, 1); + OUT_RING (chan, NvSyncNotify); - BEGIN_RING(NvSubImagePattern, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT, 3); - OUT_RING(NV04_IMAGE_PATTERN_MONOCHROME_FORMAT_CGA6); - OUT_RING(NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8); - OUT_RING(NV04_IMAGE_PATTERN_PATTERN_SELECT_MONO); + BEGIN_RING(chan, subchImagePattern, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT, 3); + OUT_RING (chan, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT_CGA6); + OUT_RING (chan, NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8); + OUT_RING (chan, NV04_IMAGE_PATTERN_PATTERN_SELECT_MONO); - BEGIN_RING(NvSubImagePattern, NV04_IMAGE_PATTERN_COLOR_FORMAT, 1); - OUT_RING( (screen_bpp == 32) + BEGIN_RING(chan, subchImagePattern, NV04_IMAGE_PATTERN_COLOR_FORMAT, 1); + OUT_RING (chan, (screen_bpp == 32) ? NV04_IMAGE_PATTERN_COLOR_FORMAT_A8R8G8B8 : NV04_IMAGE_PATTERN_COLOR_FORMAT_A16R5G6B5 ); - BEGIN_RING(NvSubImagePattern, NV04_IMAGE_PATTERN_MONOCHROME_COLOR0, 4); - OUT_RING(0x5a6b7d8d); /* color for bit=0 */ - OUT_RING(0xf9e8d7c6); /* color for bit=1 */ - OUT_RING(0x5a5a5a5a); /* pattern */ - OUT_RING(0xaa55aa55); + BEGIN_RING(chan, subchImagePattern, NV04_IMAGE_PATTERN_MONOCHROME_COLOR0, 4); + OUT_RING (chan, 0x5a6b7d8d); /* color for bit=0 */ + OUT_RING (chan, 0xf9e8d7c6); /* color for bit=1 */ + OUT_RING (chan, 0x5a5a5a5a); /* pattern */ + OUT_RING (chan, 0xaa55aa55); - FIRE_RING(); + FIRE_RING(chan); } diff --git a/imageblit.c b/imageblit.c index 8537d8a..bb0fbb3 100644 --- a/imageblit.c +++ b/imageblit.c @@ -1,44 +1,46 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" void imageblit_init(void) { - printf("-- ImageBlit, init\n"); + struct nouveau_grobj *subchImageBlit = grobj[NvSubImageBlit]; - SetSubchannel(NvSubImageBlit, NvImageBlit); + printf("-- ImageBlit, init\n"); - BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_DMA_NOTIFY, 1); - OUT_RING(NvSyncNotify); + BEGIN_RING(chan, subchImageBlit, NV04_IMAGE_BLIT_DMA_NOTIFY, 1); + OUT_RING (chan, NvSyncNotify); - BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_SURFACE, 1); - OUT_RING(NvCtxSurf2D); - BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_CLIP_RECTANGLE, 1); - OUT_RING(NvClipRect); - BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_PATTERN, 1); - OUT_RING(NvImagePattern); - BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_ROP, 1); - OUT_RING(NvRasterOp); + BEGIN_RING(chan, subchImageBlit, NV04_IMAGE_BLIT_SURFACE, 1); + OUT_RING (chan, NvCtxSurf2D); + BEGIN_RING(chan, subchImageBlit, NV04_IMAGE_BLIT_CLIP_RECTANGLE, 1); + OUT_RING (chan, NvClipRect); + BEGIN_RING(chan, subchImageBlit, NV04_IMAGE_BLIT_PATTERN, 1); + OUT_RING (chan, NvImagePattern); + BEGIN_RING(chan, subchImageBlit, NV04_IMAGE_BLIT_ROP, 1); + OUT_RING (chan, NvRasterOp); - FIRE_RING(); + FIRE_RING(chan); } void imageblit_copy(int sx,int sy, int dx,int dy, int w,int h) { - printf("-- ImageBlit, copy\n"); + struct nouveau_grobj *subchImageBlit = grobj[NvSubImageBlit]; - SetSubchannel(NvSubImageBlit, NvImageBlit); + printf("-- ImageBlit, copy\n"); - BEGIN_RING(NvSubImageBlit, NV04_IMAGE_BLIT_OPERATION, 1); - OUT_RING (NV04_IMAGE_BLIT_OPERATION_SRCCOPY); + BEGIN_RING(chan, subchImageBlit, NV04_IMAGE_BLIT_OPERATION, 1); + OUT_RING (chan, NV04_IMAGE_BLIT_OPERATION_SRCCOPY); - BEGIN_RING(NvSubImageBlit, NV01_IMAGE_BLIT_POINT_IN, 3); - OUT_RING ((sy<<16)|sx); - OUT_RING ((dy<<16)|dx); - OUT_RING ((h<<16)|w); + BEGIN_RING(chan, subchImageBlit, NV01_IMAGE_BLIT_POINT_IN, 3); + OUT_RING (chan, (sy<<16)|sx); + OUT_RING (chan, (dy<<16)|dx); + OUT_RING (chan, (h<<16)|w); - FIRE_RING(); + FIRE_RING(chan); } @@ -1,12 +1,13 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_notifier.h> +#include <nouveau_device.h> #include "screen.h" #include "fifo.h" #include "object.h" -#include "nouveau_class.h" - -#include "test_nops.h" #include "context_surface_2d.h" #include "imageblit.h" #include "image_pattern.h" @@ -15,29 +16,52 @@ #include "tcl_init.h" #include "tcl_triangle.h" -/* Choose your NV3X TCL engine */ -#define CLASS_3D NV30TCL -/*#define CLASS_3D NV34TCL -#define CLASS_3D NV35TCL*/ +#define NV30TCL_CHIPSET_3X_MASK 0x00000003 +#define NV34TCL_CHIPSET_3X_MASK 0x00000010 +#define NV35TCL_CHIPSET_3X_MASK 0x000001e0 int main(int argc, char **argv) { + unsigned int rankine_class = 0; + if (screen_open(2960, 1050, 32)!=0) { return -1; } - /*screen_offset = 0; */ + + switch (dev->chipset & 0xf0) { + case 0x30: + if (NV30TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f))) + rankine_class = NV30TCL; + else + if (NV34TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f))) + rankine_class = NV34TCL; + else + if (NV35TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f))) + rankine_class = NV35TCL; + break; + default: + break; + } + + if (rankine_class == 0) { + printf("Unsupported chipset NV%02x\n", dev->chipset & 0xff); + screen_close(); + return -1; + } if (fifo_open()!=0) { screen_close(); return -1; } - if (object_list_create(CLASS_3D)!=0) { + if (object_list_create(rankine_class)!=0) { + fifo_close(); screen_close(); return -1; } - /*test_nops();*/ +#if 0 + /*screen_offset = 0; */ context_surface_2d_init(); image_pattern_init(); @@ -59,7 +83,10 @@ int main(int argc, char **argv) tcl_triangle_tx0(); printf("coincoin\n"); +#endif + object_list_close(); + fifo_close(); screen_close(); return 0; } @@ -1,67 +1,60 @@ #include <stdio.h> #include <xf86drm.h> #include <nouveau_drm.h> +#include <nouveau_class.h> +#include <nouveau_notifier.h> +#include <nouveau_grobj.h> #include "screen.h" #include "fifo.h" #include "object.h" -#include "nouveau_class.h" -struct drm_nouveau_notifierobj_alloc o_nvsyncnotify; +struct nouveau_notifier *notifier = NULL; -static int object_create(int handle, int num_class) -{ - int ret; - struct drm_nouveau_grobj_alloc o_ctx; - - o_ctx.channel = init.channel; - o_ctx.handle = handle; - o_ctx.class = num_class; - ret = drmCommandWrite(drm_fd, DRM_NOUVEAU_GROBJ_ALLOC, &o_ctx, sizeof(o_ctx)); - if (ret) { - fprintf(stderr, "Failed to create object, handle 0x%08x, class 0x%08x\n", handle, num_class); - } - return ret; -} - -static int notifier_obj_create(struct drm_nouveau_notifierobj_alloc *o_ctx, int handle, int count) -{ - int ret; - - o_ctx->channel = init.channel; - o_ctx->handle = handle; - o_ctx->count = count; - ret = drmCommandWriteRead(drm_fd, DRM_NOUVEAU_NOTIFIEROBJ_ALLOC, o_ctx, sizeof(*o_ctx)); - if (ret) { - fprintf(stderr, "failed to create handle=0x%08x, class 0x%08x\n", handle, count); - } - return ret; -} +struct nouveau_grobj *grobj[6]={ + NULL, NULL, NULL, + NULL, NULL, NULL +}; int object_list_create(int class_3d) { - if (object_create(Nv3D, class_3d)!=0) { + if (nouveau_grobj_alloc(chan, Nv3D, class_3d, &grobj[NvSub3D])) { return 1; } - if (object_create(NvCtxSurf2D, NV30_CONTEXT_SURFACES_2D)!=0) { + if (nouveau_grobj_alloc(chan, NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D, &grobj[NvSubCtxSurf2D])) { return 1; } - if (object_create(NvImageBlit, NV12_IMAGE_BLIT)!=0) { + if (nouveau_grobj_alloc(chan, NvImageBlit, NV12_IMAGE_BLIT, &grobj[NvSubImageBlit])) { return 1; } - if (object_create(NvImagePattern, NV04_IMAGE_PATTERN)!=0) { + if (nouveau_grobj_alloc(chan, NvImagePattern, NV04_IMAGE_PATTERN, &grobj[NvSubImagePattern])) { return 1; } - if (object_create(NvRasterOp, NV03_CONTEXT_ROP)!=0) { + if (nouveau_grobj_alloc(chan, NvRasterOp, NV03_CONTEXT_ROP, &grobj[NvSubRasterOp])) { return 1; } - if (object_create(NvClipRect, NV01_CONTEXT_CLIP_RECTANGLE)!=0) { + if (nouveau_grobj_alloc(chan, NvClipRect, NV01_CONTEXT_CLIP_RECTANGLE, &grobj[NvSubClipRect])) { return 1; } - if (notifier_obj_create(&o_nvsyncnotify, NvSyncNotify, 1)!=0) { + if (nouveau_notifier_alloc(chan, NvSyncNotify, 1, ¬ifier)!=0) { return 1; } return 0; } + +void object_list_close(void) +{ + int i; + + for (i=0; i<6; i++) { + if (grobj[i]) { + nouveau_grobj_free(&grobj[i]); + } + } + + if (notifier) { + nouveau_notifier_free(¬ifier); + } +} @@ -5,8 +5,8 @@ enum Objects { NvSyncNotify = 0xD0000001, - NvDmaFB = 0xD0FB0001, - NvDmaTT = 0xD0AA0001, + NvDmaFB = 0xbeef0201, + NvDmaTT = 0xbeef0202, Nv3D = 0x80970001, NvImageBlit = 0x809F0001, NvCtxSurf2D = 0x80620001, @@ -24,8 +24,14 @@ enum Subchannels { NvSubImagePattern }; +/* Variables */ + +extern struct nouveau_notifier *notifier; +extern struct nouveau_grobj *grobj[6]; + /* Functions */ int object_list_create(int class_3d); +void object_list_close(void); #endif diff --git a/raster_op.c b/raster_op.c index 2d0b10b..1170f24 100644 --- a/raster_op.c +++ b/raster_op.c @@ -1,24 +1,26 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" void raster_op_init(void) { - printf("-- Raster operation, init\n"); + struct nouveau_grobj *subchRasterOp = grobj[NvSubRasterOp]; - SetSubchannel(NvSubRasterOp, NvRasterOp); + printf("-- Raster operation, init\n"); - BEGIN_RING(NvSubRasterOp, NV03_CONTEXT_ROP_DMA_NOTIFY, 1); - OUT_RING (NvSyncNotify); + BEGIN_RING(chan, subchRasterOp, NV03_CONTEXT_ROP_DMA_NOTIFY, 1); + OUT_RING (chan, NvSyncNotify); - BEGIN_RING(NvSubRasterOp, NV03_CONTEXT_ROP_ROP, 1); - OUT_RING ( + BEGIN_RING(chan, subchRasterOp, NV03_CONTEXT_ROP_ROP, 1); + OUT_RING (chan, NV03_CONTEXT_ROP_ROP_DST_LOGIC_OP_OR | NV03_CONTEXT_ROP_ROP_SRC_LOGIC_OP_OR ); - FIRE_RING(); + FIRE_RING(chan); } @@ -3,12 +3,16 @@ #include <stdio.h> #include <stdint.h> #include <xf86drm.h> + #include <nouveau_drm.h> +#include <nouveau_drmif.h> + +#include "object.h" /* Global variables */ int screen_width; -int screen_height; +int screen_height; int screen_bpp; int screen_offset; @@ -17,21 +21,13 @@ int screen_pitch; int viewport_x=32, viewport_y=32; int viewport_w=512, viewport_h=512; -uint32_t vram_base_phys = 0; -uint32_t vram_size = 0; -uint32_t tt_base_phys = 0; -uint32_t tt_size = 0; - int drm_fd = -1; +struct nouveau_device *dev = NULL; /* Local variables */ static int drm_ready = 0; -static drm_context_t drm_context; - -/* Local functions */ - -static uint64_t get_param(unsigned int param); +/*static drm_context_t drm_context;*/ /* Functions */ @@ -46,6 +42,25 @@ int screen_open(int width, int height, int bpp) return 1; } + ret = nouveau_device_open_existing(&dev, 0, drm_fd, 0); + if (ret) + return 1; + + printf("screen: chipset: 0x%08x\n", dev->chipset); + printf("screen: vm_vram_base: 0x%lx\n", dev->vm_vram_base); + printf("screen: vm_vram_size: %d MB\n", (int) (dev->vm_vram_size >> 20)); + printf("screen: vm_gart_size: %d MB\n", (int) (dev->vm_gart_size >> 20)); + +#if 0 + int ret; + + drm_fd = drmOpen("nouveau", 0); + if (drm_fd < 0) { + drmError(drm_fd, __func__); + fprintf(stderr, "failed to open drm\n"); + return 1; + } + ret=drmCreateContext(drm_fd, &drm_context); if (ret) { drmError(ret, __func__); @@ -74,32 +89,25 @@ int screen_open(int width, int height, int bpp) tt_base_phys = (uint32_t) get_param(NOUVEAU_GETPARAM_AGP_PHYSICAL); tt_size = (uint32_t) get_param(NOUVEAU_GETPARAM_AGP_SIZE); printf("TT:\t%p 0x%08x\n", tt_base_phys, tt_size); - +#endif drm_ready=1; return 0; } void screen_close(void) { - if (drm_ready) { - drmDestroyContext(drm_fd, drm_context); + if (dev) { + nouveau_device_close(&dev); } if (drm_fd>=0) { drmClose(drm_fd); } } -static uint64_t get_param(unsigned int param) -{ - struct drm_nouveau_getparam getp; - - getp.param = param; - drmCommandWriteRead(drm_fd, DRM_NOUVEAU_GETPARAM, &getp, sizeof(getp)); - return getp.value; -} - void *screen_allocmem(int agp, int size, uint64_t *ofs) { + return NULL; +#if 0 struct drm_nouveau_mem_alloc mema; void *map; int ret; @@ -123,4 +131,5 @@ void *screen_allocmem(int agp, int size, uint64_t *ofs) } return map; +#endif } @@ -3,10 +3,8 @@ #ifndef SCREEN_H #define SCREEN_H -#include <stdint.h> - extern int screen_width; -extern int screen_height; +extern int screen_height; extern int screen_bpp; extern int screen_offset; @@ -15,12 +13,13 @@ extern int screen_pitch; extern int viewport_x, viewport_y; extern int viewport_w, viewport_h; -extern uint32_t vram_base_phys; +/*extern uint32_t vram_base_phys; extern uint32_t vram_size; extern uint32_t tt_base_phys; -extern uint32_t tt_size; +extern uint32_t tt_size;*/ extern int drm_fd; +extern struct nouveau_device *dev; /* Open DRM device, setup using given dimensions */ int screen_open(int width, int height, int bpp); @@ -1,9 +1,12 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" + #include "nv30_fpinst.h" static void tcl_fp_color(void) @@ -12,13 +15,14 @@ static void tcl_fp_color(void) 000428e4 size 1, subchannel 1 (0xbeef3097),offset 0x08e4,increment # NV30_TCL_PRIMITIVE_3D_ACTIVE_PROGRAM = 0x07bfef01 # -- program at 0x0xad7e3000 - 0x20D000 -# 0x01803e81 0x1c9dc901 0x0001c900 0x0001c900 +# 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 volatile unsigned int *fragprog_map; uint64_t fragprog_offset; + struct nouveau_grobj *subch3D = grobj[NvSub3D]; fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset); if (!fragprog_map) { @@ -42,12 +46,12 @@ static void tcl_fp_color(void) NV30FP_LAST_INST; */ - BEGIN_RING(NvSub3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); - OUT_RING ((uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); - BEGIN_RING(NvSub3D, NV34TCL_FP_CONTROL, 1); - OUT_RING(0); - BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1); - OUT_RING((1<<16)|4); + BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); + OUT_RING (chan, (uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); + 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); } static void tcl_fp_nop(void) @@ -56,13 +60,14 @@ 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 +# 0x00000001 0x00000000 0x00000000 0x00000000 # INST 0: NOP (FL0.xxxx) + END 07bfef41 NV30TCL.FP_ACTIVE_PROGRAM = DMA0=TRUE | DMA1=FALSE | OFFSET=0x07bfef40 #endif volatile unsigned int *fragprog_map; uint64_t fragprog_offset; + struct nouveau_grobj *subch3D = grobj[NvSub3D]; fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset); if (!fragprog_map) { @@ -74,312 +79,311 @@ static void tcl_fp_nop(void) * NOP */ fragprog_map[0] = 1; - fragprog_map[1] = + fragprog_map[1] = fragprog_map[2] = fragprog_map[3] = 0; - BEGIN_RING(NvSub3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); - OUT_RING ((uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); - 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(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); + OUT_RING (chan, (uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); + 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); } void tcl_init(void) { int i; + struct nouveau_grobj *subch3D = grobj[NvSub3D]; + struct nouveau_grobj *subchImageBlit = grobj[NvSubImageBlit]; printf("-- TCL init\n"); - SetSubchannel(NvSubImageBlit, NvImageBlit); - SetSubchannel(NvSub3D, Nv3D); - - BEGIN_RING(NvSub3D, NV34TCL_DMA_NOTIFY, 1); - OUT_RING(NvSyncNotify); - - BEGIN_RING(NvSub3D, NV34TCL_DMA_TEXTURE0, 3); - OUT_RING(NvDmaFB); /* beef0201 184 texture0 */ - OUT_RING(NvDmaTT); /* beef0202 188 texture1 */ - OUT_RING(NvDmaFB); /* beef0201 18c color1 */ - 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, 2); - OUT_RING(NvDmaFB); /* beef0201 1ac */ - OUT_RING(NvDmaFB); /* beef0201 1b0 */ + BEGIN_RING(chan, subch3D, NV34TCL_DMA_NOTIFY, 1); + OUT_RING (chan, NvSyncNotify); + + BEGIN_RING(chan, subch3D, NV34TCL_DMA_TEXTURE0, 3); + OUT_RING (chan, NvDmaFB); /* beef0201 184 texture0 */ + OUT_RING (chan, NvDmaTT); /* beef0202 188 texture1 */ + OUT_RING (chan, NvDmaFB); /* beef0201 18c color1 */ + BEGIN_RING(chan, subch3D, NV34TCL_DMA_COLOR0, 2); + OUT_RING (chan, NvDmaFB); /* beef0201 194 color0 */ + OUT_RING (chan, NvDmaFB); /* beef0201 198 zeta */ + BEGIN_RING(chan, subch3D, NV34TCL_DMA_IN_MEMORY7, 2); + OUT_RING (chan, NvDmaFB); /* beef0201 1ac */ + OUT_RING (chan, NvDmaFB); /* beef0201 1b0 */ #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(NvSub3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1); - OUT_RING(0); + BEGIN_RING(chan, subch3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1); + OUT_RING (chan, 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(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(NvSub3D, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1); - OUT_RING(0); - BEGIN_RING(NvSub3D, NV34TCL_VIEWPORT_CLIP_VERT(i), 1); - OUT_RING(0); + 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(NvSub3D, 0x2bc /* NV34TCL_VIEWPORT_CLIP_MODE */, 1); - OUT_RING(0); - - 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, 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); + 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((i==8) ? 0xffff : 0); + OUT_RING(chan, (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, 0x1d88, 1); - OUT_RING(0x1200); - - 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(viewport_w<<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_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, 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 + viewport_w*(screen_bpp/8)); /* zeta_offset, on the right of color buffer */ - 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_h * screen_pitch); /* lma below color buffer */ - - 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); + 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(NvSub3D, NV34TCL_TX_ENABLE(i), 1); - OUT_RING(0); + BEGIN_RING(chan, subch3D, NV34TCL_TX_ENABLE(i), 1); + OUT_RING (chan, 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); + 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_BACK_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(0xffffffff); + OUT_RING (chan, 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); + 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(0.0); - OUT_RINGf(0.0); - OUT_RINGf(0.0); - OUT_RINGf(1.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 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, NV34TCL_TX_GEN_S(0), 32); + 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(0); + OUT_RING (chan, 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_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); + 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(1.0); + OUT_RINGf (chan, 1.0); } else { - OUT_RING(0); + OUT_RING (chan, 0); } } - BEGIN_RING(NvSub3D, NV34TCL_DEPTH_RANGE_NEAR, 2); - OUT_RINGf(0.0); - OUT_RINGf(1.0); + BEGIN_RING(chan, subch3D, NV34TCL_DEPTH_RANGE_NEAR, 2); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); - BEGIN_RING(NvSub3D, NV34TCL_TX_UNITS_ENABLE, 1); - OUT_RING(0); - BEGIN_RING(NvSub3D, NV34TCL_TX_MATRIX_ENABLE(0), 8); + 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(0); + OUT_RING (chan, 0); } tcl_fp_color(); @@ -406,22 +410,22 @@ beef0351 NV30TCL.DMA_QUERY = NV01_MEMORY_LOCAL_BANKED BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1); OUT_RING(NV34TCL_VERTEX_BEGIN_END_STOP);*/ - FIRE_RING(); + FIRE_RING(chan); } void tcl_clear(void) { - printf("-- TCL clear buffers\n"); + struct nouveau_grobj *subch3D = grobj[NvSub3D]; - SetSubchannel(NvSub3D, Nv3D); + printf("-- TCL clear buffers\n"); - 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); + 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(); + FIRE_RING(chan); } diff --git a/tcl_triangle.c b/tcl_triangle.c index 7f96ee5..ac0cde8 100644 --- a/tcl_triangle.c +++ b/tcl_triangle.c @@ -1,14 +1,17 @@ #include <stdio.h> +#include <stdint.h> +#include <nouveau_class.h> +#include <nouveau_pushbuf.h> #include "screen.h" #include "object.h" #include "fifo.h" -#include "nouveau_class.h" static void tcl_fp_tx0(void) { volatile unsigned int *fragprog_map; uint64_t fragprog_offset; + struct nouveau_grobj *subch3D = grobj[NvSub3D]; fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset); if (!fragprog_map) { @@ -18,9 +21,9 @@ static void tcl_fp_tx0(void) fragprog_offset, fragprog_map); /* -# 0x18009e82 0x1c9dc901 0x0001c900 0x0001c900 +# 0x18009e82 0x1c9dc901 0x0001c900 0x0001c900 # INST 0: TXPR R1 (TR0.xyzw), attrib.texcoord[0], abs(texture[0]) -# 0x02803e81 0x1c9dc904 0x0001c901 0x0001c900 +# 0x02803e81 0x1c9dc904 0x0001c901 0x0001c900 # INST 1: MULX R0 (TR0.xyzw), R1, attrib.color + END */ fragprog_map[0] = 0x18009e82; @@ -33,102 +36,102 @@ static void tcl_fp_tx0(void) fragprog_map[6] = 0x0001c901; fragprog_map[7] = 0x0001c900; - BEGIN_RING(NvSub3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); - OUT_RING ((uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); - BEGIN_RING(NvSub3D, NV34TCL_FP_CONTROL, 1); - OUT_RING(0); - BEGIN_RING(NvSub3D, NV34TCL_FP_REG_CONTROL, 1); - OUT_RING((1<<16)|4); + BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); + OUT_RING (chan, (uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); + 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); } void tcl_triangle_fixed(void) { - printf("-- TCL triangle, fixed pipe\n"); + struct nouveau_grobj *subch3D = grobj[NvSub3D]; - SetSubchannel(NvSub3D, Nv3D); + printf("-- TCL triangle, fixed pipe\n"); /* 3 for pos 4 for color0 */ - BEGIN_RING(NvSub3D, NV34TCL_VTXFMT(0), 4); - OUT_RING((3<<NV34TCL_VTXFMT_SIZE_SHIFT)|NV34TCL_VTXFMT_TYPE_FLOAT); - OUT_RING(NV34TCL_VTXFMT_TYPE_FLOAT); - OUT_RING(NV34TCL_VTXFMT_TYPE_FLOAT); - OUT_RING((4<<NV34TCL_VTXFMT_SIZE_SHIFT)|NV34TCL_VTXFMT_TYPE_FLOAT); - - BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1); - OUT_RING(NV34TCL_VERTEX_BEGIN_END_TRIANGLES); - - BEGIN_RING(NvSub3D, NV34TCL_VERTEX_DATA|METHOD_CONSTANT, 3*(4+3)); - OUT_RINGf(1.0); 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(0.0); - OUT_RINGf(0.0); OUT_RINGf(1.0); OUT_RINGf(0.0); - 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); - - BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1); - OUT_RING(NV34TCL_VERTEX_BEGIN_END_STOP); - - FIRE_RING(); + BEGIN_RING(chan, subch3D, NV34TCL_VTXFMT(0), 4); + OUT_RING (chan, (3<<NV34TCL_VTXFMT_SIZE_SHIFT)|NV34TCL_VTXFMT_TYPE_FLOAT); + OUT_RING (chan, NV34TCL_VTXFMT_TYPE_FLOAT); + OUT_RING (chan, NV34TCL_VTXFMT_TYPE_FLOAT); + OUT_RING (chan, (4<<NV34TCL_VTXFMT_SIZE_SHIFT)|NV34TCL_VTXFMT_TYPE_FLOAT); + + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_BEGIN_END, 1); + OUT_RING (chan, NV34TCL_VERTEX_BEGIN_END_TRIANGLES); + + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_DATA|METHOD_CONSTANT, 3*(4+3)); + OUT_RINGf (chan, 1.0); 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, 0.0); + OUT_RINGf (chan, 0.0); OUT_RINGf(chan, 1.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, 0.0); OUT_RINGf(chan, 0.0); OUT_RINGf(chan, 1.0); + + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_BEGIN_END, 1); + OUT_RING (chan, NV34TCL_VERTEX_BEGIN_END_STOP); + + FIRE_RING(chan); } void tcl_triangle_vtxattr(void) { - printf("-- TCL triangle, vertex attribs\n"); + struct nouveau_grobj *subch3D = grobj[NvSub3D]; - SetSubchannel(NvSub3D, Nv3D); + printf("-- TCL triangle, vertex attribs\n"); /* set color, then pos */ - BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1); - OUT_RING(NV34TCL_VERTEX_BEGIN_END_TRIANGLES); - - BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_3F_X(3), 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(1.0); - OUT_RINGf(0.0); - OUT_RINGf(0.0); - BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_3F_X(3), 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(1.0); - OUT_RINGf(0.0); - BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_3F_X(3), 3); - OUT_RINGf(0.0); - OUT_RINGf(0.0); - OUT_RINGf(1.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(); + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_BEGIN_END, 1); + OUT_RING (chan, NV34TCL_VERTEX_BEGIN_END_TRIANGLES); + + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(3), 3); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf( chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(0), 3); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(3), 3); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(0), 3); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(3), 3); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(0), 3); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_BEGIN_END, 1); + OUT_RING (chan, NV34TCL_VERTEX_BEGIN_END_STOP); + + FIRE_RING(chan); } void tcl_triangle_tx0(void) { - printf("-- TCL triangle, textured\n"); + struct nouveau_grobj *subch3D = grobj[NvSub3D]; - SetSubchannel(NvSub3D, Nv3D); + printf("-- TCL triangle, textured\n"); - BEGIN_RING(NvSub3D, NV34TCL_TX_UNITS_ENABLE, 1); - OUT_RING(NV34TCL_TX_UNITS_ENABLE_TX0); + BEGIN_RING(chan, subch3D, NV34TCL_TX_UNITS_ENABLE, 1); + OUT_RING (chan, NV34TCL_TX_UNITS_ENABLE_TX0); tcl_fp_tx0(); - BEGIN_RING(NvSub3D, NV34TCL_TX_OFFSET(0), 7); - OUT_RING(screen_offset); - OUT_RING(NV34TCL_TX_FORMAT_DMA0 + BEGIN_RING(chan, subch3D, NV34TCL_TX_OFFSET(0), 7); + OUT_RING (chan, screen_offset); + OUT_RING (chan, NV34TCL_TX_FORMAT_DMA0 | NV34TCL_TX_FORMAT_NO_BORDER | NV34TCL_TX_FORMAT_DIMS_2D | NV34TCL_TX_FORMAT_FORMAT_A8R8G8B8 @@ -136,78 +139,78 @@ void tcl_triangle_tx0(void) | (8<<NV34TCL_TX_FORMAT_BASE_SIZE_V_SHIFT) | 0x10000 ); - OUT_RING(NV34TCL_TX_WRAP_S_REPEAT + OUT_RING (chan, NV34TCL_TX_WRAP_S_REPEAT | NV34TCL_TX_WRAP_T_REPEAT | NV34TCL_TX_WRAP_R_REPEAT ); - OUT_RING(NV34TCL_TX_ENABLE_ENABLE + OUT_RING (chan, NV34TCL_TX_ENABLE_ENABLE | 0x800 ); - OUT_RING((screen_pitch<<16)|0xaae4); /* swizzle */ - OUT_RING(NV34TCL_TX_FILTER_MINIFY_NEAREST + OUT_RING (chan, (screen_pitch<<16)|0xaae4); /* swizzle */ + OUT_RING (chan, NV34TCL_TX_FILTER_MINIFY_NEAREST | NV34TCL_TX_FILTER_MAGNIFY_NEAREST | 0x2000 ); - OUT_RING((256<<16)|256); /* rect size */ - - BEGIN_RING(NvSub3D, NV34TCL_TX_MATRIX_ENABLE(0), 1); - OUT_RING(1); - BEGIN_RING(NvSub3D, NV34TCL_TX0_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); + OUT_RING (chan, (256<<16)|256); /* rect size */ + + BEGIN_RING(chan, subch3D, NV34TCL_TX_MATRIX_ENABLE(0), 1); + OUT_RING (chan, 1); + BEGIN_RING(chan, subch3D, NV34TCL_TX0_MATRIX(0), 16); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.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, 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, 0.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); /* set color, then pos */ - BEGIN_RING(NvSub3D, NV34TCL_VERTEX_BEGIN_END, 1); - OUT_RING(NV34TCL_VERTEX_BEGIN_END_TRIANGLES); - - BEGIN_RING(NvSub3D, NV34TCL_VTX_ATTR_2F_X(8), 2); - OUT_RINGf(1.0); - OUT_RINGf(0.0); - 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_2F_X(8), 2); - OUT_RINGf(0.0); - OUT_RINGf(1.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_2F_X(8), 2); - OUT_RINGf(0.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); - - BEGIN_RING(NvSub3D, NV34TCL_TX_UNITS_ENABLE, 1); - OUT_RING(0); - BEGIN_RING(NvSub3D, NV34TCL_TX_MATRIX_ENABLE(0), 1); - OUT_RING(0); - BEGIN_RING(NvSub3D, NV34TCL_TX_ENABLE(0), 1); - OUT_RING(0); - - FIRE_RING(); + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_BEGIN_END, 1); + OUT_RING (chan, NV34TCL_VERTEX_BEGIN_END_TRIANGLES); + + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_2F_X(8), 2); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(0), 3); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_2F_X(8), 2); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(0), 3); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_2F_X(8), 2); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + BEGIN_RING(chan, subch3D, NV34TCL_VTX_ATTR_3F_X(0), 3); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 0.0); + OUT_RINGf (chan, 1.0); + + BEGIN_RING(chan, subch3D, NV34TCL_VERTEX_BEGIN_END, 1); + OUT_RING (chan, NV34TCL_VERTEX_BEGIN_END_STOP); + + BEGIN_RING(chan, subch3D, NV34TCL_TX_UNITS_ENABLE, 1); + OUT_RING (chan, 0); + BEGIN_RING(chan, subch3D, NV34TCL_TX_MATRIX_ENABLE(0), 1); + OUT_RING (chan, 0); + BEGIN_RING(chan, subch3D, NV34TCL_TX_ENABLE(0), 1); + OUT_RING (chan, 0); + + FIRE_RING(chan); } diff --git a/test_nops.c b/test_nops.c deleted file mode 100644 index d7d4ab7..0000000 --- a/test_nops.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> - -#include "fifo.h" - -test_nops(void) -{ - int i; - - printf("--Test nops\n"); - - for (i=0; i<0x300; i++) { - OUT_RING(0); - } - - fifo_print_getput(); - FIRE_RING(); - fifo_print_getput(); -} diff --git a/test_nops.h b/test_nops.h deleted file mode 100644 index 7e14fb7..0000000 --- a/test_nops.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TEST_NOPS_H -#define TEST_NOPS_H - -void test_nops(void); - -#endif |