summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--screen.c31
-rw-r--r--screen.h4
-rw-r--r--tcl_init.c57
-rw-r--r--tcl_triangle.c37
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 <stdint.h>
#include <nouveau_drm.h>
#include <nouveau_drmif.h>
+#include <nouveau_bo.h>
#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)