summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nv30/nv30_screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/nv30/nv30_screen.c')
-rw-r--r--src/gallium/drivers/nv30/nv30_screen.c133
1 files changed, 61 insertions, 72 deletions
diff --git a/src/gallium/drivers/nv30/nv30_screen.c b/src/gallium/drivers/nv30/nv30_screen.c
index d395c5e1b7f..31bc1f31734 100644
--- a/src/gallium/drivers/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nv30/nv30_screen.c
@@ -1,5 +1,7 @@
#include "pipe/p_screen.h"
-#include "util/u_simple_screen.h"
+#include "pipe/p_state.h"
+
+#include "nouveau/nouveau_screen.h"
#include "nv30_context.h"
#include "nv30_screen.h"
@@ -8,23 +10,6 @@
#define NV34TCL_CHIPSET_3X_MASK 0x00000010
#define NV35TCL_CHIPSET_3X_MASK 0x000001e0
-static const char *
-nv30_screen_get_name(struct pipe_screen *pscreen)
-{
- struct nv30_screen *screen = nv30_screen(pscreen);
- struct nouveau_device *dev = screen->nvws->channel->device;
- static char buffer[128];
-
- snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset);
- return buffer;
-}
-
-static const char *
-nv30_screen_get_vendor(struct pipe_screen *pscreen)
-{
- return "nouveau";
-}
-
static int
nv30_screen_get_param(struct pipe_screen *pscreen, int param)
{
@@ -139,45 +124,57 @@ static void
nv30_screen_destroy(struct pipe_screen *pscreen)
{
struct nv30_screen *screen = nv30_screen(pscreen);
- struct nouveau_winsys *nvws = screen->nvws;
- nvws->res_free(&screen->vp_exec_heap);
- nvws->res_free(&screen->vp_data_heap);
- nvws->res_free(&screen->query_heap);
- nvws->notifier_free(&screen->query);
- nvws->notifier_free(&screen->sync);
- nvws->grobj_free(&screen->rankine);
+ nouveau_resource_free(&screen->vp_exec_heap);
+ nouveau_resource_free(&screen->vp_data_heap);
+ nouveau_resource_free(&screen->query_heap);
+ nouveau_notifier_free(&screen->query);
+ nouveau_notifier_free(&screen->sync);
+ nouveau_grobj_free(&screen->rankine);
FREE(pscreen);
}
struct pipe_screen *
-nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
+nv30_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
{
struct nv30_screen *screen = CALLOC_STRUCT(nv30_screen);
+ struct nouveau_channel *chan;
+ struct pipe_screen *pscreen;
struct nouveau_stateobj *so;
unsigned rankine_class = 0;
- unsigned chipset = nvws->channel->device->chipset;
int ret, i;
if (!screen)
return NULL;
- screen->nvws = nvws;
+ pscreen = &screen->base.base;
- /* 2D engine setup */
- screen->eng2d = nv04_surface_2d_init(nvws);
- screen->eng2d->buf = nv30_surface_buffer;
+ ret = nouveau_screen_init(&screen->base, dev);
+ if (ret) {
+ nv30_screen_destroy(pscreen);
+ return NULL;
+ }
+ chan = screen->base.channel;
+
+ pscreen->winsys = ws;
+ pscreen->destroy = nv30_screen_destroy;
+ pscreen->get_param = nv30_screen_get_param;
+ pscreen->get_paramf = nv30_screen_get_paramf;
+ pscreen->is_format_supported = nv30_screen_surface_format_supported;
+
+ nv30_screen_init_miptree_functions(pscreen);
+ nv30_screen_init_transfer_functions(pscreen);
/* 3D object */
- switch (chipset & 0xf0) {
+ switch (dev->chipset & 0xf0) {
case 0x30:
- if (NV30TCL_CHIPSET_3X_MASK & (1 << (chipset & 0x0f)))
+ if (NV30TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
rankine_class = 0x0397;
else
- if (NV34TCL_CHIPSET_3X_MASK & (1 << (chipset & 0x0f)))
+ if (NV34TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
rankine_class = 0x0697;
else
- if (NV35TCL_CHIPSET_3X_MASK & (1 << (chipset & 0x0f)))
+ if (NV35TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
rankine_class = 0x0497;
break;
default:
@@ -185,43 +182,49 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
if (!rankine_class) {
- NOUVEAU_ERR("Unknown nv3x chipset: nv%02x\n", chipset);
+ NOUVEAU_ERR("Unknown nv3x chipset: nv%02x\n", dev->chipset);
return NULL;
}
- ret = nvws->grobj_alloc(nvws, rankine_class, &screen->rankine);
+ ret = nouveau_grobj_alloc(chan, 0xbeef3097, rankine_class,
+ &screen->rankine);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return FALSE;
}
+ BIND_RING(chan, screen->rankine, 7);
+
+ /* 2D engine setup */
+ screen->eng2d = nv04_surface_2d_init(&screen->base);
+ screen->eng2d->buf = nv30_surface_buffer;
/* Notifier for sync purposes */
- ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
+ ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
- nv30_screen_destroy(&screen->pipe);
+ nv30_screen_destroy(pscreen);
return NULL;
}
/* Query objects */
- ret = nvws->notifier_alloc(nvws, 32, &screen->query);
+ ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
if (ret) {
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
- nv30_screen_destroy(&screen->pipe);
+ nv30_screen_destroy(pscreen);
return NULL;
}
- ret = nvws->res_init(&screen->query_heap, 0, 32);
+ ret = nouveau_resource_init(&screen->query_heap, 0, 32);
if (ret) {
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
- nv30_screen_destroy(&screen->pipe);
+ nv30_screen_destroy(pscreen);
return NULL;
}
/* Vtxprog resources */
- if (nvws->res_init(&screen->vp_exec_heap, 0, 256) ||
- nvws->res_init(&screen->vp_data_heap, 0, 256)) {
- nv30_screen_destroy(&screen->pipe);
+ if (nouveau_resource_init(&screen->vp_exec_heap, 0, 256) ||
+ nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
+ nv30_screen_destroy(pscreen);
return NULL;
}
@@ -230,23 +233,23 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so_method(so, screen->rankine, NV34TCL_DMA_NOTIFY, 1);
so_data (so, screen->sync->handle);
so_method(so, screen->rankine, NV34TCL_DMA_TEXTURE0, 2);
- so_data (so, nvws->channel->vram->handle);
- so_data (so, nvws->channel->gart->handle);
+ so_data (so, chan->vram->handle);
+ so_data (so, chan->gart->handle);
so_method(so, screen->rankine, NV34TCL_DMA_COLOR1, 1);
- so_data (so, nvws->channel->vram->handle);
+ so_data (so, chan->vram->handle);
so_method(so, screen->rankine, NV34TCL_DMA_COLOR0, 2);
- so_data (so, nvws->channel->vram->handle);
- so_data (so, nvws->channel->vram->handle);
+ so_data (so, chan->vram->handle);
+ so_data (so, chan->vram->handle);
so_method(so, screen->rankine, NV34TCL_DMA_VTXBUF0, 2);
- so_data (so, nvws->channel->vram->handle);
- so_data (so, nvws->channel->gart->handle);
+ so_data (so, chan->vram->handle);
+ so_data (so, chan->gart->handle);
/* so_method(so, screen->rankine, NV34TCL_DMA_FENCE, 2);
so_data (so, 0);
so_data (so, screen->query->handle);*/
so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY7, 1);
- so_data (so, nvws->channel->vram->handle);
+ so_data (so, chan->vram->handle);
so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY8, 1);
- so_data (so, nvws->channel->vram->handle);
+ so_data (so, chan->vram->handle);
for (i=1; i<8; i++) {
so_method(so, screen->rankine, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1);
@@ -301,23 +304,9 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so_method(so, screen->rankine, 0x1e94, 1);
so_data (so, 0x13);
- so_emit(nvws, so);
+ so_emit(chan, so);
so_ref(NULL, &so);
- nvws->push_flush(nvws, 0, NULL);
-
- screen->pipe.winsys = ws;
- screen->pipe.destroy = nv30_screen_destroy;
-
- screen->pipe.get_name = nv30_screen_get_name;
- screen->pipe.get_vendor = nv30_screen_get_vendor;
- screen->pipe.get_param = nv30_screen_get_param;
- screen->pipe.get_paramf = nv30_screen_get_paramf;
-
- screen->pipe.is_format_supported = nv30_screen_surface_format_supported;
-
- nv30_screen_init_miptree_functions(&screen->pipe);
- nv30_screen_init_transfer_functions(&screen->pipe);
- u_simple_screen_init(&screen->pipe);
+ nouveau_pushbuf_flush(chan, 0);
- return &screen->pipe;
+ return pscreen;
}