diff options
Diffstat (limited to 'contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch')
-rw-r--r-- | contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch new file mode 100644 index 00000000..fe414f75 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch @@ -0,0 +1,103 @@ +diff --git a/libdrm/nouveau/nouveau_private.h b/libdrm/nouveau/nouveau_private.h +index 67144e3..9ce87fb 100644 +--- a/libdrm/nouveau/nouveau_private.h ++++ b/libdrm/nouveau/nouveau_private.h +@@ -41,6 +41,7 @@ + struct nouveau_pushbuf_priv { + struct nouveau_pushbuf base; + ++ int no_aper_update; + int use_cal; + uint32_t cal_suffix0; + uint32_t cal_suffix1; +diff --git a/libdrm/nouveau/nouveau_pushbuf.c b/libdrm/nouveau/nouveau_pushbuf.c +index fbcddd7..d434a5f 100644 +--- a/libdrm/nouveau/nouveau_pushbuf.c ++++ b/libdrm/nouveau/nouveau_pushbuf.c +@@ -202,10 +202,17 @@ nouveau_pushbuf_init_call(struct nouveau_channel *chan) + req.channel = chan->id; + req.handle = 0; + ret = drmCommandWriteRead(nouveau_device(dev)->fd, +- DRM_NOUVEAU_GEM_PUSHBUF_CALL, ++ DRM_NOUVEAU_GEM_PUSHBUF_CALL2, + &req, sizeof(req)); +- if (ret) +- return; ++ if (ret) { ++ ret = drmCommandWriteRead(nouveau_device(dev)->fd, ++ DRM_NOUVEAU_GEM_PUSHBUF_CALL2, ++ &req, sizeof(req)); ++ if (ret) ++ return; ++ ++ nvpb->no_aper_update = 1; ++ } + + for (i = 0; i < CALPB_BUFFERS; i++) { + ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, +@@ -282,14 +289,18 @@ restart_cal: + nvpb->current_offset; + req.suffix0 = nvpb->cal_suffix0; + req.suffix1 = nvpb->cal_suffix1; +- ret = drmCommandWriteRead(nvdev->fd, +- DRM_NOUVEAU_GEM_PUSHBUF_CALL, ++ ret = drmCommandWriteRead(nvdev->fd, nvpb->no_aper_update ? ++ DRM_NOUVEAU_GEM_PUSHBUF_CALL : ++ DRM_NOUVEAU_GEM_PUSHBUF_CALL2, + &req, sizeof(req)); + if (ret == -EAGAIN) + goto restart_cal; + nvpb->cal_suffix0 = req.suffix0; + nvpb->cal_suffix1 = req.suffix1; +- assert(ret == 0); ++ if (!nvpb->no_aper_update) { ++ nvdev->base.vm_vram_size = req.vram_available; ++ nvdev->base.vm_gart_size = req.gart_available; ++ } + } else { + struct drm_nouveau_gem_pushbuf req; + +@@ -305,7 +316,6 @@ restart_push: + &req, sizeof(req)); + if (ret == -EAGAIN) + goto restart_push; +- assert(ret == 0); + } + + +@@ -328,12 +338,11 @@ restart_push: + nvpb->nr_relocs = 0; + + /* Allocate space for next push buffer */ +- ret = nouveau_pushbuf_space(chan, min); +- assert(!ret); ++ assert(!nouveau_pushbuf_space(chan, min)); + + if (chan->flush_notify) + chan->flush_notify(chan); + +- return 0; ++ return ret; + } + +diff --git a/shared-core/nouveau_drm.h b/shared-core/nouveau_drm.h +index 2050357..1e67c44 100644 +--- a/shared-core/nouveau_drm.h ++++ b/shared-core/nouveau_drm.h +@@ -155,6 +155,9 @@ struct drm_nouveau_gem_pushbuf_call { + uint64_t relocs; + uint32_t suffix0; + uint32_t suffix1; ++ /* below only accessed for CALL2 */ ++ uint64_t vram_available; ++ uint64_t gart_available; + }; + + struct drm_nouveau_gem_pin { +@@ -212,5 +215,6 @@ struct drm_nouveau_sarea { + #define DRM_NOUVEAU_GEM_CPU_PREP 0x45 + #define DRM_NOUVEAU_GEM_CPU_FINI 0x46 + #define DRM_NOUVEAU_GEM_INFO 0x47 ++#define DRM_NOUVEAU_GEM_PUSHBUF_CALL2 0x48 + + #endif /* __NOUVEAU_DRM_H__ */ |