nvfx: nasty hack to make glFinish() actually finish..
authorBen Skeggs <bskeggs@redhat.com>
Tue, 21 Jun 2011 02:55:01 +0000 (12:55 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 21 Jun 2011 02:59:53 +0000 (12:59 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
src/gallium/drivers/nvfx/nvfx_context.c
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/nvfx/nvfx_screen.h

index 2b1510264a1154388c36f25b64a82e98808bf5c0..98603bedde1d85f639c5e33819b2c50ec2e6d39d 100644 (file)
@@ -24,9 +24,21 @@ nvfx_flush(struct pipe_context *pipe,
                OUT_RING(chan, 1);
         }*/
 
-       FIRE_RING(chan);
-       if (fence)
+       if (fence) {
+               /* horrific hack to make glFinish() work in the absence of
+                * having proper fences in nvfx.  a pending rewrite will
+                * fix this properly, but may be a while off.
+                */
+               MARK_RING(chan, 1, 1);
+               OUT_RELOC(chan, screen->fence, 0, NOUVEAU_BO_WR |
+                               NOUVEAU_BO_DUMMY, 0, 0);
+               FIRE_RING(chan);
+               nouveau_bo_map(screen->fence, NOUVEAU_BO_RDWR);
+               nouveau_bo_unmap(screen->fence);
                *fence = NULL;
+       } else {
+               FIRE_RING(chan);
+       }
 }
 
 static void
index 475138c3c3202cb4ee3e965be5d2e48a432830f4..7a013a916b9c40bf7a00d9f175798ec9a8d3da7c 100644 (file)
@@ -304,6 +304,7 @@ nvfx_screen_destroy(struct pipe_screen *pscreen)
        nouveau_notifier_free(&screen->sync);
        nouveau_grobj_free(&screen->eng3d);
        nvfx_screen_surface_takedown(pscreen);
+       nouveau_bo_ref(NULL, &screen->fence);
 
        nouveau_screen_fini(&screen->base);
 
@@ -468,6 +469,12 @@ nvfx_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
        pscreen->is_format_supported = nvfx_screen_is_format_supported;
        pscreen->context_create = nvfx_create;
 
+       ret = nouveau_bo_new(dev, NOUVEAU_BO_VRAM, 0, 4096, &screen->fence);
+       if (ret) {
+               nvfx_screen_destroy(pscreen);
+               return NULL;
+       }
+
        switch (dev->chipset & 0xf0) {
        case 0x30:
                if (NV30_3D_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
index b1f07187c78c4e28e4547e212eadd14da75ae8e0..02e7c5d1cad5a633bb9d8741b9775ab0af7e670d 100644 (file)
@@ -11,6 +11,7 @@ struct nvfx_screen {
        struct nouveau_screen base;
 
        struct nouveau_winsys *nvws;
+       struct nouveau_bo *fence;
 
        struct nvfx_context *cur_ctx;