aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nv04/nv04_screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/nv04/nv04_screen.c')
-rw-r--r--src/gallium/drivers/nv04/nv04_screen.c88
1 files changed, 38 insertions, 50 deletions
diff --git a/src/gallium/drivers/nv04/nv04_screen.c b/src/gallium/drivers/nv04/nv04_screen.c
index f9f6d974264..4bbedfb4d69 100644
--- a/src/gallium/drivers/nv04/nv04_screen.c
+++ b/src/gallium/drivers/nv04/nv04_screen.c
@@ -1,27 +1,9 @@
#include "pipe/p_screen.h"
#include "pipe/p_inlines.h"
-#include "util/u_simple_screen.h"
#include "nv04_context.h"
#include "nv04_screen.h"
-static const char *
-nv04_screen_get_name(struct pipe_screen *screen)
-{
- struct nv04_screen *nv04screen = nv04_screen(screen);
- struct nouveau_device *dev = nv04screen->nvws->channel->device;
- static char buffer[128];
-
- snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset);
- return buffer;
-}
-
-static const char *
-nv04_screen_get_vendor(struct pipe_screen *screen)
-{
- return "nouveau";
-}
-
static int
nv04_screen_get_param(struct pipe_screen *screen, int param)
{
@@ -123,10 +105,9 @@ static void
nv04_screen_destroy(struct pipe_screen *pscreen)
{
struct nv04_screen *screen = nv04_screen(pscreen);
- struct nouveau_winsys *nvws = screen->nvws;
- nvws->notifier_free(&screen->sync);
- nvws->grobj_free(&screen->fahrenheit);
+ nouveau_notifier_free(&screen->sync);
+ nouveau_grobj_free(&screen->fahrenheit);
nv04_surface_2d_takedown(&screen->eng2d);
FREE(pscreen);
@@ -141,21 +122,38 @@ nv04_surface_buffer(struct pipe_surface *surf)
}
struct pipe_screen *
-nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
+nv04_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
{
struct nv04_screen *screen = CALLOC_STRUCT(nv04_screen);
+ struct nouveau_channel *chan;
+ struct pipe_screen *pscreen;
unsigned fahrenheit_class = 0, sub3d_class = 0;
- unsigned chipset = nvws->channel->device->chipset;
int ret;
if (!screen)
return NULL;
- screen->nvws = nvws;
+ pscreen = &screen->base.base;
+
+ ret = nouveau_screen_init(&screen->base, dev);
+ if (ret) {
+ nv04_screen_destroy(pscreen);
+ return NULL;
+ }
+ chan = screen->base.channel;
+
+ pscreen->winsys = ws;
+ pscreen->destroy = nv04_screen_destroy;
+ pscreen->get_param = nv04_screen_get_param;
+ pscreen->get_paramf = nv04_screen_get_paramf;
+ pscreen->is_format_supported = nv04_screen_is_format_supported;
- if (chipset>=0x20) {
+ nv04_screen_init_miptree_functions(pscreen);
+ nv04_screen_init_transfer_functions(pscreen);
+
+ if (dev->chipset >= 0x20) {
fahrenheit_class = 0;
sub3d_class = 0;
- } else if (chipset>=0x10) {
+ } else if (dev->chipset >= 0x10) {
fahrenheit_class = NV10_DX5_TEXTURED_TRIANGLE;
sub3d_class = NV10_CONTEXT_SURFACES_3D;
} else {
@@ -164,50 +162,40 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
if (!fahrenheit_class) {
- NOUVEAU_ERR("Unknown nv04 chipset: nv%02x\n", chipset);
+ NOUVEAU_ERR("Unknown nv04 chipset: nv%02x\n", dev->chipset);
return NULL;
}
- /* 2D engine setup */
- screen->eng2d = nv04_surface_2d_init(nvws);
- screen->eng2d->buf = nv04_surface_buffer;
-
/* 3D object */
- ret = nvws->grobj_alloc(nvws, fahrenheit_class, &screen->fahrenheit);
+ ret = nouveau_grobj_alloc(chan, 0xbeef0001, fahrenheit_class,
+ &screen->fahrenheit);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return NULL;
}
+ BIND_RING(chan, screen->fahrenheit, 7);
/* 3D surface object */
- ret = nvws->grobj_alloc(nvws, sub3d_class, &screen->context_surfaces_3d);
+ ret = nouveau_grobj_alloc(chan, 0xbeef0002, sub3d_class,
+ &screen->context_surfaces_3d);
if (ret) {
NOUVEAU_ERR("Error creating 3D surface object: %d\n", ret);
return NULL;
}
+ BIND_RING(chan, screen->context_surfaces_3d, 6);
+
+ /* 2D engine setup */
+ screen->eng2d = nv04_surface_2d_init(&screen->base);
+ screen->eng2d->buf = nv04_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);
- nv04_screen_destroy(&screen->pipe);
+ nv04_screen_destroy(pscreen);
return NULL;
}
- screen->pipe.winsys = ws;
- screen->pipe.destroy = nv04_screen_destroy;
-
- screen->pipe.get_name = nv04_screen_get_name;
- screen->pipe.get_vendor = nv04_screen_get_vendor;
- screen->pipe.get_param = nv04_screen_get_param;
- screen->pipe.get_paramf = nv04_screen_get_paramf;
-
- screen->pipe.is_format_supported = nv04_screen_is_format_supported;
-
- nv04_screen_init_miptree_functions(&screen->pipe);
- nv04_screen_init_transfer_functions(&screen->pipe);
- u_simple_screen_init(&screen->pipe);
-
- return &screen->pipe;
+ return pscreen;
}