nvfx: nasty hack to make glFinish() actually finish..
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
@@ -24,9 +24,21 @@ nvfx_flush(struct pipe_context *pipe,
|
|||||||
OUT_RING(chan, 1);
|
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;
|
*fence = NULL;
|
||||||
|
} else {
|
||||||
|
FIRE_RING(chan);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -304,6 +304,7 @@ nvfx_screen_destroy(struct pipe_screen *pscreen)
|
|||||||
nouveau_notifier_free(&screen->sync);
|
nouveau_notifier_free(&screen->sync);
|
||||||
nouveau_grobj_free(&screen->eng3d);
|
nouveau_grobj_free(&screen->eng3d);
|
||||||
nvfx_screen_surface_takedown(pscreen);
|
nvfx_screen_surface_takedown(pscreen);
|
||||||
|
nouveau_bo_ref(NULL, &screen->fence);
|
||||||
|
|
||||||
nouveau_screen_fini(&screen->base);
|
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->is_format_supported = nvfx_screen_is_format_supported;
|
||||||
pscreen->context_create = nvfx_create;
|
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) {
|
switch (dev->chipset & 0xf0) {
|
||||||
case 0x30:
|
case 0x30:
|
||||||
if (NV30_3D_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
|
if (NV30_3D_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
|
||||||
|
@@ -11,6 +11,7 @@ struct nvfx_screen {
|
|||||||
struct nouveau_screen base;
|
struct nouveau_screen base;
|
||||||
|
|
||||||
struct nouveau_winsys *nvws;
|
struct nouveau_winsys *nvws;
|
||||||
|
struct nouveau_bo *fence;
|
||||||
|
|
||||||
struct nvfx_context *cur_ctx;
|
struct nvfx_context *cur_ctx;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user