r300-gallium: Stubs for vertex shaders.
[mesa.git] / src / gallium / drivers / nv40 / nv40_screen.c
index 25c786829614e46b99c30798dccfad7f67cf8950..0d4baefaea3dc2194c160aaa51caab00b44094df 100644 (file)
@@ -1,4 +1,5 @@
 #include "pipe/p_screen.h"
+#include "util/u_simple_screen.h"
 
 #include "nv40_context.h"
 #include "nv40_screen.h"
@@ -59,6 +60,8 @@ nv40_screen_get_param(struct pipe_screen *pscreen, int param)
        case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
        case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
                return 1;
+       case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
+               return 0; /* We have 4 - but unsupported currently */
        case NOUVEAU_CAP_HW_VTXBUF:
                return 1;
        case NOUVEAU_CAP_HW_IDXBUF:
@@ -133,77 +136,12 @@ nv40_screen_surface_format_supported(struct pipe_screen *pscreen,
        return FALSE;
 }
 
-static void *
-nv40_surface_map(struct pipe_screen *screen, struct pipe_surface *surface,
-                unsigned flags )
+static struct pipe_buffer *
+nv40_surface_buffer(struct pipe_surface *surf)
 {
-       struct pipe_winsys      *ws = screen->winsys;
-       struct pipe_surface     *surface_to_map;
-       void                    *map;
-
-       if (!(surface->texture->tex_usage & NOUVEAU_TEXTURE_USAGE_LINEAR)) {
-               struct nv40_miptree *mt = (struct nv40_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;
+       struct nv40_miptree *mt = (struct nv40_miptree *)surf->texture;
 
-       return map + surface_to_map->offset;
-}
-
-static void
-nv40_surface_unmap(struct pipe_screen *screen, struct pipe_surface *surface)
-{
-       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 nv40_miptree *mt = (struct nv40_miptree *)surface->texture;
-
-               assert(mt->shadow_tex);
-
-               surface_to_unmap = mt->shadow_surface;
-       }
-       else
-               surface_to_unmap = surface;
-
-       assert(surface_to_unmap);
-
-       ws->buffer_unmap(ws, surface_to_unmap->buffer);
-
-       if (surface_to_unmap != surface) {
-               struct nv40_screen *nvscreen = nv40_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
@@ -227,7 +165,7 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 {
        struct nv40_screen *screen = CALLOC_STRUCT(nv40_screen);
        struct nouveau_stateobj *so;
-       unsigned curie_class;
+       unsigned curie_class = 0;
        unsigned chipset = nvws->channel->device->chipset;
        int ret;
 
@@ -235,6 +173,10 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                return NULL;
        screen->nvws = nvws;
 
+       /* 2D engine setup */
+       screen->eng2d = nv04_surface_2d_init(nvws);
+       screen->eng2d->buf = nv40_surface_buffer;
+
        /* 3D object */
        switch (chipset & 0xf0) {
        case 0x40:
@@ -248,8 +190,6 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
                if (NV6X_GRCLASS4497_CHIPSETS & (1 << (chipset & 0x0f)))
                        curie_class = NV44TCL;
                break;
-       default:
-               break;
        }
 
        if (!curie_class) {
@@ -355,10 +295,9 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
 
        screen->pipe.is_format_supported = nv40_screen_surface_format_supported;
 
-       screen->pipe.surface_map = nv40_surface_map;
-       screen->pipe.surface_unmap = nv40_surface_unmap;
-
        nv40_screen_init_miptree_functions(&screen->pipe);
+       nv40_screen_init_transfer_functions(&screen->pipe);
+       u_simple_screen_init(&screen->pipe);
 
        return &screen->pipe;
 }