From 0e27e1306a7012153242320a8726078188eed27c Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Thu, 3 Dec 2009 22:09:29 +0100 Subject: Use buffer objects for fragment programs --- screen.c | 31 +++++++++++-------------------- screen.h | 4 ++-- tcl_init.c | 57 ++++++++++++++++++++++++++++++++++++--------------------- tcl_triangle.c | 37 ++++++++++++++++++++++--------------- 4 files changed, 71 insertions(+), 58 deletions(-) diff --git a/screen.c b/screen.c index 036c409..524c7fd 100644 --- a/screen.c +++ b/screen.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "screen.h" #include "object.h" @@ -82,32 +83,22 @@ void screen_close(void) } } -void *screen_allocmem(int agp, int size, uint64_t *ofs) +struct nouveau_bo *screen_allocmem(int size) { - return NULL; -#if 0 - struct drm_nouveau_mem_alloc mema; - void *map; + struct nouveau_bo *bo = NULL; + uint32_t flags = NOUVEAU_BO_MAP; int ret; - mema.flags = NOUVEAU_MEM_MAPPED; - mema.flags |= (agp ? NOUVEAU_MEM_AGP : NOUVEAU_MEM_FB); - - mema.alignment = 0x1000; - mema.size = size; - ret = drmCommandWriteRead(drm_fd, DRM_NOUVEAU_MEM_ALLOC, &mema, sizeof(mema)); - if (ret) { - fprintf(stderr, "Failed to alloc memory\n"); + ret = nouveau_bo_new(dev, flags, 0x100, size, &bo); + if (ret) return NULL; - } - *ofs = mema.offset; - /* instead of mema.map_handle, originally we were passing in ofs */ - if (drmMap(drm_fd, mema.map_handle, mema.size, &map)) { - fprintf(stderr, "Failed to map memory\n"); + ret = nouveau_bo_map(bo, NOUVEAU_BO_WR); + if (ret) { + printf("screen: map failed: %d\n", ret); + nouveau_bo_ref(NULL, &bo); return NULL; } - return map; -#endif + return bo; } diff --git a/screen.h b/screen.h index 7813a02..cfcae30 100644 --- a/screen.h +++ b/screen.h @@ -22,7 +22,7 @@ int screen_open(int width, int height, int bpp); /* Close DRM device */ void screen_close(void); -/* Allocate some VRAM */ -void *screen_allocmem(int agp, int size, uint64_t *ofs); +/* Allocate some VRAM, map to CPU write */ +struct nouveau_bo *screen_allocmem(int size); #endif diff --git a/tcl_init.c b/tcl_init.c index 0713e44..4de43d9 100644 --- a/tcl_init.c +++ b/tcl_init.c @@ -21,22 +21,23 @@ static void tcl_fp_color(void) 07bfef01 NV30TCL.FP_ACTIVE_PROGRAM = DMA0=TRUE | DMA1=FALSE | OFFSET=0x07bfef00 #endif - volatile unsigned int *fragprog_map; - uint64_t fragprog_offset; + uint32_t *map; + struct nouveau_bo *bo; struct nouveau_grobj *subch3D = grobj[NvSub3D]; - fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset); - if (!fragprog_map) { + bo = screen_allocmem(0x1000); + if (!bo) { return; } - printf("fragprog alloc'd at 0x%lx mapped at %p\n", - fragprog_offset, fragprog_map); + map = bo->map; + + printf("fragprog mapped at %p\n", map); /* * MOV result.color, fragment.color */ - fragprog_map[0] = 0x01803e81; - fragprog_map[1] = 0x1c9dc901; - fragprog_map[2] = fragprog_map[3] = 0x0001c900; + map[0] = 0x01803e81; + map[1] = 0x1c9dc901; + map[2] = map[3] = 0x0001c900; /* NV30FP_LOCALS; @@ -47,12 +48,18 @@ static void tcl_fp_color(void) NV30FP_LAST_INST; */ + nouveau_bo_unmap(bo); + BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); - OUT_RING (chan, (uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); + OUT_RELOC (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); } static void tcl_fp_nop(void) @@ -66,30 +73,38 @@ static void tcl_fp_nop(void) 07bfef41 NV30TCL.FP_ACTIVE_PROGRAM = DMA0=TRUE | DMA1=FALSE | OFFSET=0x07bfef40 #endif - volatile unsigned int *fragprog_map; - uint64_t fragprog_offset; + uint32_t *map; + struct nouveau_bo *bo; struct nouveau_grobj *subch3D = grobj[NvSub3D]; - fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset); - if (!fragprog_map) { + bo = screen_allocmem(0x1000); + if (!bo) { return; } - printf("fragprog alloc'd at 0x%lx mapped at %p\n", - fragprog_offset, fragprog_map); + map = bo->map; + + printf("fragprog mapped at %p\n", map); + /* * NOP */ - fragprog_map[0] = 1; - fragprog_map[1] = - fragprog_map[2] = - fragprog_map[3] = 0; + map[0] = 1; + map[1] = + map[2] = + map[3] = 0; + + nouveau_bo_unmap(bo); BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); - OUT_RING (chan, (uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); + 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); } void tcl_init(void) diff --git a/tcl_triangle.c b/tcl_triangle.c index ac0cde8..32b8f1a 100644 --- a/tcl_triangle.c +++ b/tcl_triangle.c @@ -9,16 +9,17 @@ static void tcl_fp_tx0(void) { - volatile unsigned int *fragprog_map; - uint64_t fragprog_offset; + uint32_t *map; + struct nouveau_bo *bo; struct nouveau_grobj *subch3D = grobj[NvSub3D]; - fragprog_map = screen_allocmem(0, 0x1000, &fragprog_offset); - if (!fragprog_map) { + bo = screen_allocmem(0x1000); + if (!bo) { return; } - printf("fragprog alloc'd at 0x%lx mapped at %p\n", - fragprog_offset, fragprog_map); + map = bo->map; + + printf("fragprog mapped at %p\n", map); /* # 0x18009e82 0x1c9dc901 0x0001c900 0x0001c900 @@ -26,22 +27,28 @@ static void tcl_fp_tx0(void) # 0x02803e81 0x1c9dc904 0x0001c901 0x0001c900 # INST 1: MULX R0 (TR0.xyzw), R1, attrib.color + END */ - fragprog_map[0] = 0x18009e82; - fragprog_map[1] = 0x1c9dc901; - fragprog_map[2] = 0x0001c900; - fragprog_map[3] = 0x0001c900; + map[0] = 0x18009e82; + map[1] = 0x1c9dc901; + map[2] = 0x0001c900; + map[3] = 0x0001c900; + + map[4] = 0x02803e81; + map[5] = 0x1c9dc904; + map[6] = 0x0001c901; + map[7] = 0x0001c900; - fragprog_map[4] = 0x02803e81; - fragprog_map[5] = 0x1c9dc904; - fragprog_map[6] = 0x0001c901; - fragprog_map[7] = 0x0001c900; + nouveau_bo_unmap(bo); BEGIN_RING(chan, subch3D, NV34TCL_FP_ACTIVE_PROGRAM, 1); - OUT_RING (chan, (uint32_t)fragprog_offset| NV34TCL_FP_ACTIVE_PROGRAM_DMA0); + 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); } void tcl_triangle_fixed(void) -- cgit v1.2.3