summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/nouveau_winsys
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/nouveau_winsys')
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c10
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h3
-rw-r--r--src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c10
3 files changed, 18 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
index 08d38c58af..288674f231 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_bo.c
@@ -348,8 +348,8 @@ nouveau_bo_validate_user(struct nouveau_channel *chan, struct nouveau_bo *bo,
memcpy(nvdev->sa_map + r->start, nvbo->sysmem, bo->size);
- nvbo->base.offset = nvdev->sa.offset + r->start;
- nvbo->base.flags = NOUVEAU_BO_GART;
+ nvbo->offset = nvdev->sa.offset + r->start;
+ nvbo->flags = NOUVEAU_BO_GART;
return 0;
}
@@ -371,11 +371,11 @@ nouveau_bo_validate_bo(struct nouveau_channel *chan, struct nouveau_bo *bo,
nouveau_bo_upload(nvbo);
}
- nvbo->base.offset = nvbo->drm.offset;
+ nvbo->offset = nvbo->drm.offset;
if (nvbo->drm.flags & (NOUVEAU_MEM_AGP | NOUVEAU_MEM_PCI))
- nvbo->base.flags = NOUVEAU_BO_GART;
+ nvbo->flags = NOUVEAU_BO_GART;
else
- nvbo->base.flags = NOUVEAU_BO_VRAM;
+ nvbo->flags = NOUVEAU_BO_VRAM;
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 4b42baf809..3e886869d8 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_drmif.h
@@ -251,6 +251,9 @@ struct nouveau_bo_priv {
int user;
int refcount;
+
+ uint64_t offset;
+ uint64_t flags;
};
#define nouveau_bo(n) ((struct nouveau_bo_priv *)(n))
diff --git a/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c b/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c
index 020b1e0840..a34a5c1866 100644
--- a/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c
+++ b/src/mesa/drivers/dri/nouveau_winsys/nouveau_pushbuf.c
@@ -131,6 +131,16 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min)
ret = nouveau_bo_validate(chan, bo, fence, pbbo->flags);
assert (ret == 0);
+ if (bo->offset == nouveau_bo(bo)->offset &&
+ bo->flags == nouveau_bo(bo)->flags) {
+ /*XXX: could avoid reloc in this case, except with the
+ * current design we'd confuse the GPU quite a bit
+ * if we did this. Will fix soon.
+ */
+ }
+ bo->offset = nouveau_bo(bo)->offset;
+ bo->flags = nouveau_bo(bo)->flags;
+
while ((r = ptr_to_pbrel(pbbo->relocs))) {
uint32_t push;