gallium: fix more missing includes from various places
[mesa.git] / src / gallium / drivers / nouveau / nouveau_screen.c
index e4cf91c005c4d5d9a9ba8ac8d936e097e7e65d10..156cb2d229b8cacddd3748e55d0d988695e3fcad 100644 (file)
@@ -3,7 +3,9 @@
 #include <pipe/p_state.h>
 
 #include <util/u_memory.h>
+#include <util/u_inlines.h>
 
+#include <stdio.h>
 #include <errno.h>
 
 #include "nouveau/nouveau_bo.h"
@@ -31,7 +33,7 @@ nouveau_screen_bo_skel(struct pipe_screen *pscreen, struct nouveau_bo *bo,
                       unsigned alignment, unsigned usage, unsigned size)
 {
        struct pipe_buffer *pb;
-       
+
        pb = CALLOC(1, sizeof(struct pipe_buffer)+sizeof(struct nouveau_bo *));
        if (!pb) {
                nouveau_bo_ref(NULL, &bo);
@@ -127,8 +129,18 @@ nouveau_screen_bo_map(struct pipe_screen *pscreen, struct pipe_buffer *pb,
                      unsigned usage)
 {
        struct nouveau_bo *bo = nouveau_bo(pb);
+       struct nouveau_screen *nscreen = nouveau_screen(pscreen);
        int ret;
 
+       if (nscreen->pre_pipebuffer_map_callback) {
+               ret = nscreen->pre_pipebuffer_map_callback(pscreen, pb, usage);
+               if (ret) {
+                       debug_printf("pre_pipebuffer_map_callback failed %d\n",
+                               ret);
+                       return NULL;
+               }
+       }
+
        ret = nouveau_bo_map(bo, nouveau_screen_map_flags(usage));
        if (ret) {
                debug_printf("map failed: %d\n", ret);
@@ -143,11 +155,22 @@ nouveau_screen_bo_map_range(struct pipe_screen *pscreen, struct pipe_buffer *pb,
                            unsigned offset, unsigned length, unsigned usage)
 {
        struct nouveau_bo *bo = nouveau_bo(pb);
+       struct nouveau_screen *nscreen = nouveau_screen(pscreen);
        uint32_t flags = nouveau_screen_map_flags(usage);
        int ret;
 
+       if (nscreen->pre_pipebuffer_map_callback) {
+               ret = nscreen->pre_pipebuffer_map_callback(pscreen, pb, usage);
+               if (ret) {
+                       debug_printf("pre_pipebuffer_map_callback failed %d\n",
+                               ret);
+                       return NULL;
+               }
+       }
+
        ret = nouveau_bo_map_range(bo, offset, length, flags);
        if (ret) {
+               nouveau_bo_unmap(bo);
                if (!(flags & NOUVEAU_BO_NOWAIT) || ret != -EBUSY)
                        debug_printf("map_range failed: %d\n", ret);
                return NULL;
@@ -239,5 +262,8 @@ nouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev)
 void
 nouveau_screen_fini(struct nouveau_screen *screen)
 {
+       struct pipe_winsys *ws = screen->base.winsys;
+       nouveau_channel_free(&screen->channel);
+       ws->destroy(ws);
 }