nouveau: adapt
authorBen Skeggs <skeggsb@gmail.com>
Wed, 12 Dec 2007 03:19:59 +0000 (14:19 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Wed, 12 Dec 2007 03:20:58 +0000 (14:20 +1100)
Some things that worked before are now broken, there's an "XXX:" around one
of the culprits in the GL state tracker so hopefully it'll get fixed soon!

src/mesa/drivers/dri/nouveau_winsys/nouveau_winsys_pipe.c
src/mesa/pipe/nv40/nv40_context.h
src/mesa/pipe/nv40/nv40_query.c
src/mesa/pipe/nv40/nv40_state.c
src/mesa/pipe/nv40/nv40_surface.c
src/mesa/pipe/nv50/nv50_context.c
src/mesa/pipe/nv50/nv50_query.c
src/mesa/pipe/nv50/nv50_state.c

index fdfad4a5399fa96d719f9871742b1d104c237e5a..1e160f04edd92c5989f21e76b4fa30eb897ffe98 100644 (file)
@@ -34,18 +34,8 @@ nouveau_get_name(struct pipe_winsys *pws)
        return "Nouveau/DRI";
 }
 
-static unsigned
-nouveau_surface_pitch(struct pipe_winsys *ws, unsigned cpp, unsigned width,
-                     unsigned flags)
-{
-       unsigned pitch = width * cpp;
-
-       pitch = (pitch + 63) & ~63;
-       return pitch / cpp;
-}
-
 static struct pipe_surface *
-nouveau_surface_alloc(struct pipe_winsys *ws, unsigned format)
+nouveau_surface_alloc(struct pipe_winsys *ws)
 {
        struct pipe_surface *surf;
        
@@ -53,12 +43,38 @@ nouveau_surface_alloc(struct pipe_winsys *ws, unsigned format)
        if (!surf)
                return NULL;
 
-       surf->format = format;
        surf->refcount = 1;
        surf->winsys = ws;
        return surf;
 }
 
+static int
+nouveau_surface_alloc_storage(struct pipe_winsys *ws, struct pipe_surface *surf,
+                             unsigned width, unsigned height,
+                             enum pipe_format format, unsigned flags)
+{
+       unsigned pitch = ((width * pf_get_size(format)) + 63) & ~63;
+       int ret;
+
+       surf->format = format;
+       surf->width = width;
+       surf->height = height;
+       surf->cpp = pf_get_size(format);
+       surf->pitch = pitch / surf->cpp;
+
+       surf->buffer = ws->buffer_create(ws, 256, 0, 0);
+       if (!surf->buffer)
+               return 1;
+
+       ret = ws->buffer_data(ws, surf->buffer, pitch * height, NULL, 0);
+       if (ret) {
+               ws->buffer_reference(ws, &surf->buffer, NULL);
+               return ret;
+       }
+
+       return 0;
+}
+
 static void
 nouveau_surface_release(struct pipe_winsys *ws, struct pipe_surface **s)
 {
@@ -209,8 +225,8 @@ nouveau_create_pipe_winsys(struct nouveau_context *nv)
        pws->flush_frontbuffer = nouveau_flush_frontbuffer;
        pws->printf = nouveau_printf;
 
-       pws->surface_pitch = nouveau_surface_pitch;
        pws->surface_alloc = nouveau_surface_alloc;
+       pws->surface_alloc_storage = nouveau_surface_alloc_storage;
        pws->surface_release = nouveau_surface_release;
 
        pws->buffer_create = nouveau_pipe_bo_create;
index 3a1d3f076c6cb72074e9a5e688aa07c21187fe59..83d3f7b676e0fd820d93001da922c8b20cd7bf8e 100644 (file)
@@ -35,7 +35,7 @@ struct nv40_context {
 
        /* query objects */
        struct nouveau_notifier *query;
-       struct pipe_query_object **query_objects;
+       boolean *query_objects;
        uint num_query_objects;
 
        uint32_t dirty;
@@ -64,7 +64,7 @@ struct nv40_context {
        struct pipe_vertex_buffer  vtxbuf[PIPE_ATTRIB_MAX];
        struct pipe_vertex_element vtxelt[PIPE_ATTRIB_MAX];
 };
-
+#define nv40_context(ctx) ((struct nv40_context *)(ctx))
 
 extern void nv40_init_state_functions(struct nv40_context *nv40);
 extern void nv40_init_surface_functions(struct nv40_context *nv40);
index bcd6fe0cf4980d6bfefdf1d981cdea0c560c4275..f51b34b119d754aa6bc93cff51689e761fbd3839 100644 (file)
@@ -3,33 +3,57 @@
 #include "nv40_context.h"
 #include "nv40_dma.h"
 
-static uint
-nv40_query_object_find(struct nv40_context *nv40, struct pipe_query_object *q)
+/*XXX: Maybe go notifier per-query one day?  not sure if PRAMIN space is
+ *     plentiful enough however.. */
+struct nv40_query {
+       unsigned type;
+       int id;
+};
+#define nv40_query(o) ((struct nv40_query *)(o))
+
+static struct pipe_query *
+nv40_query_create(struct pipe_context *pipe, unsigned query_type)
 {
+       struct nv40_context *nv40 = nv40_context(pipe);
+       struct nv40_query *nv40query;
        int id;
 
        for (id = 0; id < nv40->num_query_objects; id++) {
-               if (nv40->query_objects[id] == q)
-                       return id;
+               if (nv40->query_objects[id] == 0)
+                       break;
        }
+       
+       if (id == nv40->num_query_objects)
+               return NULL;
+       nv40->query_objects[id] = TRUE;
 
-       return -1;
+       nv40query = malloc(sizeof(struct nv40_query));
+       nv40query->type = query_type;
+       nv40query->id = id;
+
+       return (struct pipe_query *)nv40query;
 }
 
 static void
-nv40_query_begin(struct pipe_context *pipe, struct pipe_query_object *q)
+nv40_query_destroy(struct pipe_context *pipe, struct pipe_query *q)
 {
-       struct nv40_context *nv40 = (struct nv40_context *)pipe;
-       int id;
+       struct nv40_context *nv40 = nv40_context(pipe);
+       struct nv40_query *nv40query = nv40_query(q);
 
-       assert(q->type == PIPE_QUERY_OCCLUSION_COUNTER);
+       assert(nv40->query_objects[nv40query->id]);
+       nv40->query_objects[nv40query->id] = FALSE;
+       free(nv40query);
+}
 
-       id = nv40_query_object_find(nv40, NULL);
-       assert(id >= 0);
-       nv40->query_objects[id] = q;
+static void
+nv40_query_begin(struct pipe_context *pipe, struct pipe_query *q)
+{
+       struct nv40_context *nv40 = nv40_context(pipe);
+       struct nv40_query *nv40query = nv40_query(q);
+
+       assert(nv40query->type == PIPE_QUERY_OCCLUSION_COUNTER);
 
-       nv40->nvws->notifier_reset(nv40->query, id);
-       q->ready = 0;
+       nv40->nvws->notifier_reset(nv40->query, nv40query->id);
 
        BEGIN_RING(curie, NV40TCL_QUERY_RESET, 1);
        OUT_RING  (1);
@@ -38,68 +62,44 @@ nv40_query_begin(struct pipe_context *pipe, struct pipe_query_object *q)
 }
 
 static void
-nv40_query_update(struct pipe_context *pipe, struct pipe_query_object *q)
+nv40_query_end(struct pipe_context *pipe, struct pipe_query *q)
 {
        struct nv40_context *nv40 = (struct nv40_context *)pipe;
-       int id;
+       struct nv40_query *nv40query = nv40_query(q);
 
-       id = nv40_query_object_find(nv40, q);
-       assert(id >= 0);
-
-       if (nv40->nvws->notifier_status(nv40->query, id) == 0) {
-               q->ready = 1;
-               q->count = nv40->nvws->notifier_retval(nv40->query, id);
-               nv40->query_objects[id] = NULL;
-       }
-}
-
-static void
-nv40_query_wait(struct pipe_context *pipe, struct pipe_query_object *q)
-{
-       nv40_query_update(pipe, q);
-       if (!q->ready) {
-               struct nv40_context *nv40 = (struct nv40_context *)pipe;
-               int id;
-               
-               id = nv40_query_object_find(nv40, q);
-               assert(id >= 0);
-
-               nv40->nvws->notifier_wait(nv40->query, id, 0, 0);
-               nv40_query_update(pipe, q);
-               assert(q->ready);
-       }
+       BEGIN_RING(curie, NV40TCL_QUERY_GET, 1);
+       OUT_RING  ((0x01 << NV40TCL_QUERY_GET_UNK24_SHIFT) |
+                  ((nv40query->id * 32) << NV40TCL_QUERY_GET_OFFSET_SHIFT));
+       FIRE_RING();
 }
 
-static void
-nv40_query_end(struct pipe_context *pipe, struct pipe_query_object *q)
+static boolean
+nv40_query_result(struct pipe_context *pipe, struct pipe_query *q,
+                 boolean wait, uint64_t *result)
 {
        struct nv40_context *nv40 = (struct nv40_context *)pipe;
-       int id;
-
-       id = nv40_query_object_find(nv40, q);
-       assert(id >= 0);
+       struct nv40_query *nv40query = nv40_query(q);
+       struct nouveau_winsys *nvws = nv40->nvws;
+       boolean status;
+
+       status = nvws->notifier_status(nv40->query, nv40query->id);
+       if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
+               if (wait == FALSE)
+                       return FALSE;
+               nvws->notifier_wait(nv40->query, nv40query->id,
+                                   NV_NOTIFY_STATE_STATUS_COMPLETED, 0);
+       }
 
-       BEGIN_RING(curie, NV40TCL_QUERY_GET, 1);
-       OUT_RING  ((0x01 << NV40TCL_QUERY_GET_UNK24_SHIFT) |
-                  ((id * 32) << NV40TCL_QUERY_GET_OFFSET_SHIFT));
-       FIRE_RING ();
-
-       /*XXX: Some apps spin waiting for GL_QUERY_RESULT_AVAILABLE_ARB.
-        *     Core mesa won't ask the driver to update the query object's
-        *     status in this case, so the app waits forever.. fix this some
-        *     day.
-        */
-#if 0
-       nv40_query_update(pipe, q);
-#else
-       nv40_query_wait(pipe, q);
-#endif
+       *result = nvws->notifier_retval(nv40->query, nv40query->id);
+       return TRUE;
 }
 
 void
 nv40_init_query_functions(struct nv40_context *nv40)
 {
+       nv40->pipe.create_query = nv40_query_create;
+       nv40->pipe.destroy_query = nv40_query_destroy;
        nv40->pipe.begin_query = nv40_query_begin;
        nv40->pipe.end_query = nv40_query_end;
-       nv40->pipe.wait_query = nv40_query_wait;
+       nv40->pipe.get_query_result = nv40_query_result;
 }
index 1d4cbb454d458dc44aca842262bb008a652329f8..5aeba684ee0bfa8afb468ba83fd6d038d9dc0eb1 100644 (file)
@@ -302,6 +302,18 @@ nv40_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
        free(hwcso);
 }
 
+static void
+nv40_set_sampler_texture(struct pipe_context *pipe, unsigned unit,
+                        struct pipe_texture *miptree)
+{
+       struct nv40_context *nv40 = (struct nv40_context *)pipe;
+
+       nv40->tex_miptree[unit]  = miptree;
+       nv40->tex_dirty         |= unit;
+
+       nv40->dirty |= NV40_NEW_TEXTURE;
+}
+
 static void *
 nv40_rasterizer_state_create(struct pipe_context *pipe,
                             const struct pipe_rasterizer_state *cso)
@@ -546,19 +558,6 @@ nv40_set_clip_state(struct pipe_context *pipe,
        nv40->dirty |= NV40_NEW_VERTPROG;
 }
 
-static void
-nv40_set_clear_color_state(struct pipe_context *pipe,
-                          const struct pipe_clear_color_state *ccol)
-{
-       struct nv40_context *nv40 = (struct nv40_context *)pipe;
-
-       BEGIN_RING(curie, NV40TCL_CLEAR_VALUE_COLOR, 1);
-       OUT_RING  ((float_to_ubyte(ccol->color[3]) << 24) |
-                  (float_to_ubyte(ccol->color[0]) << 16) |
-                  (float_to_ubyte(ccol->color[1]) <<  8) |
-                  (float_to_ubyte(ccol->color[2]) <<  0));
-}
-
 static void
 nv40_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
                         const struct pipe_constant_buffer *buf )
@@ -732,12 +731,6 @@ nv40_set_polygon_stipple(struct pipe_context *pipe,
        OUT_RINGp ((uint32_t *)stipple->stipple, 32);
 }
 
-static void
-nv40_set_sampler_units(struct pipe_context *pipe,
-                      uint num_samplers, const uint *units)
-{
-}
-
 static void
 nv40_set_scissor_state(struct pipe_context *pipe,
                       const struct pipe_scissor_state *s)
@@ -749,18 +742,6 @@ nv40_set_scissor_state(struct pipe_context *pipe,
        OUT_RING  (((s->maxy - s->miny) << 16) | s->miny);
 }
 
-static void
-nv40_set_texture_state(struct pipe_context *pipe, unsigned unit,
-                      struct pipe_texture *miptree)
-{
-       struct nv40_context *nv40 = (struct nv40_context *)pipe;
-
-       nv40->tex_miptree[unit]  = miptree;
-       nv40->tex_dirty         |= unit;
-
-       nv40->dirty |= NV40_NEW_TEXTURE;
-}
-
 static void
 nv40_set_viewport_state(struct pipe_context *pipe,
                        const struct pipe_viewport_state *vpt)
@@ -814,6 +795,7 @@ nv40_init_state_functions(struct nv40_context *nv40)
        nv40->pipe.create_sampler_state = nv40_sampler_state_create;
        nv40->pipe.bind_sampler_state = nv40_sampler_state_bind;
        nv40->pipe.delete_sampler_state = nv40_sampler_state_delete;
+       nv40->pipe.set_sampler_texture = nv40_set_sampler_texture;
 
        nv40->pipe.create_rasterizer_state = nv40_rasterizer_state_create;
        nv40->pipe.bind_rasterizer_state = nv40_rasterizer_state_bind;
@@ -833,19 +815,13 @@ nv40_init_state_functions(struct nv40_context *nv40)
 
        nv40->pipe.set_blend_color = nv40_set_blend_color;
        nv40->pipe.set_clip_state = nv40_set_clip_state;
-       nv40->pipe.set_clear_color_state = nv40_set_clear_color_state;
        nv40->pipe.set_constant_buffer = nv40_set_constant_buffer;
        nv40->pipe.set_framebuffer_state = nv40_set_framebuffer_state;
        nv40->pipe.set_polygon_stipple = nv40_set_polygon_stipple;
-       nv40->pipe.set_sampler_units = nv40_set_sampler_units;
        nv40->pipe.set_scissor_state = nv40_set_scissor_state;
-       nv40->pipe.set_texture_state = nv40_set_texture_state;
        nv40->pipe.set_viewport_state = nv40_set_viewport_state;
 
        nv40->pipe.set_vertex_buffer = nv40_set_vertex_buffer;
        nv40->pipe.set_vertex_element = nv40_set_vertex_element;
-
-//     nv40->pipe.set_feedback_state = nv40_set_feedback_state;
-//     nv40->pipe.set_feedback_buffer = nv40_set_feedback_buffer;
 }
 
index b4562f26e6547bc718fc2c2e1806bdc61e94adcb..f140b764cac2b2d1465a8d856b4f99caeb18ada7 100644 (file)
@@ -190,10 +190,11 @@ nv40_get_tex_surface(struct pipe_context *pipe,
        struct nv40_miptree *nv40mt = (struct nv40_miptree *)pt;
        struct pipe_surface *ps;
 
-       ps = ws->surface_alloc(ws, pt->format);
+       ps = ws->surface_alloc(ws);
        if (!ps)
                return NULL;
        ws->buffer_reference(ws, &ps->buffer, nv40mt->buffer);
+       ps->format = pt->format;
        ps->cpp = pt->cpp;
        ps->width = pt->width[level];
        ps->height = pt->height[level];
index 25ead1b56464499e1fd729af7bbbb7c53970f082..ed12c6c0d93a4de6d25dd0949d843a592bfb5a32 100644 (file)
@@ -7,16 +7,9 @@
 #include "nv50_dma.h"
 
 static boolean
-nv50_is_format_supported(struct pipe_context *pipe, uint format)
+nv50_is_format_supported(struct pipe_context *pipe, enum pipe_format format,
+                        uint type)
 {
-       switch (format) {
-       case PIPE_FORMAT_A8R8G8B8_UNORM:
-       case PIPE_FORMAT_Z24S8_UNORM:
-               return TRUE;
-       default:
-               break;
-       };
-
        return FALSE;
 }
 
index 51cf6804d7c88b35c2cd75e5496888e9d77331c3..69eb0e700b49ae26eac1e3c189a46f10de567500 100644 (file)
@@ -3,28 +3,46 @@
 #include "nv50_context.h"
 #include "nv50_dma.h"
 
+static struct pipe_query *
+nv50_query_create(struct pipe_context *pipe, unsigned type)
+{
+       NOUVEAU_ERR("unimplemented\n");
+       return NULL;
+}
+
 static void
-nv50_query_begin(struct pipe_context *pipe, struct pipe_query_object *q)
+nv50_query_destroy(struct pipe_context *pipe, struct pipe_query *q)
 {
        NOUVEAU_ERR("unimplemented\n");
 }
 
 static void
-nv50_query_end(struct pipe_context *pipe, struct pipe_query_object *q)
+nv50_query_begin(struct pipe_context *pipe, struct pipe_query *q)
 {
        NOUVEAU_ERR("unimplemented\n");
 }
 
 static void
-nv50_query_wait(struct pipe_context *pipe, struct pipe_query_object *q)
+nv50_query_end(struct pipe_context *pipe, struct pipe_query *q)
+{
+       NOUVEAU_ERR("unimplemented\n");
+}
+
+static boolean
+nv50_query_result(struct pipe_context *pipe, struct pipe_query *q,
+                 boolean wait, uint64_t *result)
 {
        NOUVEAU_ERR("unimplemented\n");
+       *result = 0xdeadcafe;
+       return TRUE;
 }
 
 void
 nv50_init_query_functions(struct nv50_context *nv50)
 {
+       nv50->pipe.create_query = nv50_query_create;
+       nv50->pipe.destroy_query = nv50_query_destroy;
        nv50->pipe.begin_query = nv50_query_begin;
        nv50->pipe.end_query = nv50_query_end;
-       nv50->pipe.wait_query = nv50_query_wait;
+       nv50->pipe.get_query_result = nv50_query_result;
 }
index 778b9f5c9ac0eec58a799876f16f3ab6e028d59a..0a27a4676ebda478062011c47b67725cc10d756a 100644 (file)
@@ -10,6 +10,7 @@ static void *
 nv50_alpha_test_state_create(struct pipe_context *pipe,
                             const struct pipe_alpha_test_state *cso)
 {
+       return NULL;
 }
 
 static void
@@ -26,6 +27,7 @@ static void *
 nv50_blend_state_create(struct pipe_context *pipe,
                        const struct pipe_blend_state *cso)
 {
+       return NULL;
 }
 
 static void
@@ -42,6 +44,7 @@ static void *
 nv50_sampler_state_create(struct pipe_context *pipe,
                          const struct pipe_sampler_state *cso)
 {
+       return NULL;
 }
 
 static void
@@ -55,10 +58,17 @@ nv50_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
 {
 }
 
+static void
+nv50_set_sampler_texture(struct pipe_context *pipe, unsigned unit,
+                        struct pipe_texture *pt)
+{
+}
+
 static void *
 nv50_rasterizer_state_create(struct pipe_context *pipe,
                             const struct pipe_rasterizer_state *cso)
 {
+       return NULL;
 }
 
 static void
@@ -75,6 +85,7 @@ static void *
 nv50_depth_stencil_state_create(struct pipe_context *pipe,
                                const struct pipe_depth_stencil_state *cso)
 {
+       return NULL;
 }
 
 static void
@@ -131,12 +142,6 @@ nv50_set_clip_state(struct pipe_context *pipe,
 {
 }
 
-static void
-nv50_set_clear_color_state(struct pipe_context *pipe,
-                          const struct pipe_clear_color_state *ccol)
-{
-}
-
 static void
 nv50_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
                         const struct pipe_constant_buffer *buf )
@@ -155,24 +160,12 @@ nv50_set_polygon_stipple(struct pipe_context *pipe,
 {
 }
 
-static void
-nv50_set_sampler_units(struct pipe_context *pipe,
-                      uint num_samplers, const uint *units)
-{
-}
-
 static void
 nv50_set_scissor_state(struct pipe_context *pipe,
                       const struct pipe_scissor_state *s)
 {
 }
 
-static void
-nv50_set_texture_state(struct pipe_context *pipe, unsigned unit,
-                      struct pipe_texture *pt)
-{
-}
-
 static void
 nv50_set_viewport_state(struct pipe_context *pipe,
                        const struct pipe_viewport_state *vpt)
@@ -205,6 +198,7 @@ nv50_init_state_functions(struct nv50_context *nv50)
        nv50->pipe.create_sampler_state = nv50_sampler_state_create;
        nv50->pipe.bind_sampler_state = nv50_sampler_state_bind;
        nv50->pipe.delete_sampler_state = nv50_sampler_state_delete;
+       nv50->pipe.set_sampler_texture = nv50_set_sampler_texture;
 
        nv50->pipe.create_rasterizer_state = nv50_rasterizer_state_create;
        nv50->pipe.bind_rasterizer_state = nv50_rasterizer_state_bind;
@@ -224,19 +218,13 @@ nv50_init_state_functions(struct nv50_context *nv50)
 
        nv50->pipe.set_blend_color = nv50_set_blend_color;
        nv50->pipe.set_clip_state = nv50_set_clip_state;
-       nv50->pipe.set_clear_color_state = nv50_set_clear_color_state;
        nv50->pipe.set_constant_buffer = nv50_set_constant_buffer;
        nv50->pipe.set_framebuffer_state = nv50_set_framebuffer_state;
        nv50->pipe.set_polygon_stipple = nv50_set_polygon_stipple;
-       nv50->pipe.set_sampler_units = nv50_set_sampler_units;
        nv50->pipe.set_scissor_state = nv50_set_scissor_state;
-       nv50->pipe.set_texture_state = nv50_set_texture_state;
        nv50->pipe.set_viewport_state = nv50_set_viewport_state;
 
        nv50->pipe.set_vertex_buffer = nv50_set_vertex_buffer;
        nv50->pipe.set_vertex_element = nv50_set_vertex_element;
-
-//     nv50->pipe.set_feedback_state = nv50_set_feedback_state;
-//     nv50->pipe.set_feedback_buffer = nv50_set_feedback_buffer;
 }