summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorBen Skeggs <[email protected]>2007-12-27 06:10:49 +1100
committerBen Skeggs <[email protected]>2007-12-27 06:10:49 +1100
commit3b8efe1dfedec0b6598dc9cc3d6897fe2b3b788d (patch)
tree971d2d50eaabe45c7910fb7e2e6e067f5f1351ad /src/mesa/drivers
parenta794fcfbdbc0417ed9960bd92e0ac49367660635 (diff)
nouveau: allow unfenced read of buffers in a few situations
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c8
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h1
2 files changed, 8 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
index ca1e89e959d..08d38c58af3 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
@@ -299,8 +299,10 @@ nouveau_bo_map(struct nouveau_bo *bo, uint32_t flags)
if (!nvbo)
return -EINVAL;
- if (nvbo->fence)
+ if (flags & NOUVEAU_BO_WR)
nouveau_fence_wait(&nvbo->fence);
+ else
+ nouveau_fence_wait(&nvbo->wr_fence);
if (nvbo->sysmem)
bo->map = nvbo->sysmem;
@@ -385,6 +387,8 @@ nouveau_bo_validate(struct nouveau_channel *chan, struct nouveau_bo *bo,
struct nouveau_bo_priv *nvbo = nouveau_bo(bo);
int ret;
+ assert(bo->map == NULL);
+
if (nvbo->user) {
ret = nouveau_bo_validate_user(chan, bo, fence, flags);
if (ret) {
@@ -398,6 +402,8 @@ nouveau_bo_validate(struct nouveau_channel *chan, struct nouveau_bo *bo,
return ret;
}
+ if (flags & NOUVEAU_BO_WR)
+ nouveau_fence_ref(fence, &nvbo->wr_fence);
nouveau_fence_ref(fence, &nvbo->fence);
return 0;
}
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
index 1ce7174e758..4b42baf809a 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
@@ -242,6 +242,7 @@ struct nouveau_bo_priv {
struct nouveau_bo base;
struct nouveau_fence *fence;
+ struct nouveau_fence *wr_fence;
struct drm_nouveau_mem_alloc drm;
void *map;