gallium: Deprecate PIPE_CAP_S3TC.
[mesa.git] / src / gallium / drivers / nv30 / nv30_screen.c
index d7548922994dd77d53083d37284c8db045f47e40..41af38450b5f5498997496e4a4db9adb346980d0 100644 (file)
@@ -1,4 +1,7 @@
 #include "pipe/p_screen.h"
+#include "pipe/p_state.h"
+
+#include "nouveau/nouveau_screen.h"
 
 #include "nv30_context.h"
 #include "nv30_screen.h"
@@ -7,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)
 {
@@ -36,8 +22,6 @@ nv30_screen_get_param(struct pipe_screen *pscreen, int param)
                return 1;
        case PIPE_CAP_GLSL:
                return 0;
-       case PIPE_CAP_S3TC:
-               return 0;
        case PIPE_CAP_ANISOTROPIC_FILTER:
                return 1;
        case PIPE_CAP_POINT_SPRITE:
@@ -60,6 +44,10 @@ nv30_screen_get_param(struct pipe_screen *pscreen, int param)
                return 1;
        case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
                return 0;
+       case PIPE_CAP_TGSI_CONT_SUPPORTED:
+               return 0;
+       case PIPE_CAP_BLEND_EQUATION_SEPARATE:
+               return 0;
        case NOUVEAU_CAP_HW_VTXBUF:
        case NOUVEAU_CAP_HW_IDXBUF:
                return 1;
@@ -98,8 +86,16 @@ nv30_screen_surface_format_supported(struct pipe_screen *pscreen,
        if (tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET) {
                switch (format) {
                case PIPE_FORMAT_A8R8G8B8_UNORM:
-               case PIPE_FORMAT_R5G6B5_UNORM: 
+               case PIPE_FORMAT_R5G6B5_UNORM:
+                       return TRUE;
+               default:
+                       break;
+               }
+       } else
+       if (tex_usage & PIPE_TEXTURE_USAGE_DEPTH_STENCIL) {
+               switch (format) {
                case PIPE_FORMAT_Z24S8_UNORM:
+               case PIPE_FORMAT_Z24X8_UNORM:
                case PIPE_FORMAT_Z16_UNORM:
                        return TRUE;
                default:
@@ -110,7 +106,7 @@ nv30_screen_surface_format_supported(struct pipe_screen *pscreen,
                case PIPE_FORMAT_A8R8G8B8_UNORM:
                case PIPE_FORMAT_A1R5G5B5_UNORM:
                case PIPE_FORMAT_A4R4G4B4_UNORM:
-               case PIPE_FORMAT_R5G6B5_UNORM: 
+               case PIPE_FORMAT_R5G6B5_UNORM:
                case PIPE_FORMAT_L8_UNORM:
                case PIPE_FORMAT_A8_UNORM:
                case PIPE_FORMAT_I8_UNORM:
@@ -126,118 +122,69 @@ nv30_screen_surface_format_supported(struct pipe_screen *pscreen,
        return FALSE;
 }
 
-static void *
-nv30_surface_map(struct pipe_screen *screen, struct pipe_surface *surface,
-                unsigned flags )
-{
-       struct pipe_winsys      *ws = screen->winsys;
-       struct pipe_surface     *surface_to_map;
-       void                    *map;
-
-       if (!(surface->texture->tex_usage & NOUVEAU_TEXTURE_USAGE_LINEAR)) {
-               struct nv30_miptree *mt = (struct nv30_miptree *)surface->texture;
-
-               if (!mt->shadow_tex) {
-                       unsigned old_tex_usage = surface->texture->tex_usage;
-                       surface->texture->tex_usage = NOUVEAU_TEXTURE_USAGE_LINEAR;
-                       mt->shadow_tex = screen->texture_create(screen, surface->texture);
-                       surface->texture->tex_usage = old_tex_usage;
-
-                       assert(mt->shadow_tex->tex_usage & NOUVEAU_TEXTURE_USAGE_LINEAR);
-                       mt->shadow_surface = screen->get_tex_surface
-                       (
-                               screen, mt->shadow_tex,
-                               surface->face, surface->level, surface->zslice,
-                               surface->usage
-                       );
-               }
-
-               surface_to_map = mt->shadow_surface;
-       }
-       else
-               surface_to_map = surface;
-
-       assert(surface_to_map);
-
-       map = ws->buffer_map(ws, surface_to_map->buffer, flags);
-       if (!map)
-               return NULL;
-
-       return map + surface_to_map->offset;
-}
-
-static void
-nv30_surface_unmap(struct pipe_screen *screen, struct pipe_surface *surface)
+static struct pipe_buffer *
+nv30_surface_buffer(struct pipe_surface *surf)
 {
-       struct pipe_winsys      *ws = screen->winsys;
-       struct pipe_surface     *surface_to_unmap;
-
-       /* TODO: Copy from shadow just before push buffer is flushed instead.
-                There are probably some programs that map/unmap excessively
-                before rendering. */
-       if (!(surface->texture->tex_usage & NOUVEAU_TEXTURE_USAGE_LINEAR)) {
-               struct nv30_miptree *mt = (struct nv30_miptree *)surface->texture;
-
-               assert(mt->shadow_tex);
-
-               surface_to_unmap = mt->shadow_surface;
-       }
-       else
-               surface_to_unmap = surface;
+       struct nv30_miptree *mt = (struct nv30_miptree *)surf->texture;
 
-       assert(surface_to_unmap);
-
-       ws->buffer_unmap(ws, surface_to_unmap->buffer);
-
-       if (surface_to_unmap != surface) {
-               struct nv30_screen *nvscreen = nv30_screen(screen);
-
-               nvscreen->nvws->surface_copy(nvscreen->nvws,
-                                            surface, 0, 0,
-                                            surface_to_unmap, 0, 0,
-                                            surface->width, surface->height);
-       }
+       return mt->buffer;
 }
 
 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;
+
+       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:
@@ -245,43 +192,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;
        }
 
@@ -290,23 +243,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);
@@ -326,7 +279,7 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
        so_data  (so, 3);
        so_method(so, screen->rankine, 0x1450, 1);
        so_data  (so, 0x00030004);
-       
+
        /* NEW */
        so_method(so, screen->rankine, 0x1e98, 1);
        so_data  (so, 0);
@@ -361,25 +314,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);
+       nouveau_pushbuf_flush(chan, 0);
 
-       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;
-
-       screen->pipe.surface_map = nv30_surface_map;
-       screen->pipe.surface_unmap = nv30_surface_unmap;
-
-       nv30_screen_init_miptree_functions(&screen->pipe);
-
-       return &screen->pipe;
+       return pscreen;
 }
-