@@ -32,7 +32,6 @@ def setup():
|
|||||||
--enable-gles2 \
|
--enable-gles2 \
|
||||||
--enable-vdpau \
|
--enable-vdpau \
|
||||||
--enable-osmesa \
|
--enable-osmesa \
|
||||||
--enable-sysfs \
|
|
||||||
--enable-xvmc \
|
--enable-xvmc \
|
||||||
--enable-glx-tls \
|
--enable-glx-tls \
|
||||||
--enable-gallium-llvm \
|
--enable-gallium-llvm \
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c
|
||||||
|
index 58fa453..a006e9f 100644
|
||||||
|
--- a/src/gallium/drivers/nouveau/nouveau_buffer.c
|
||||||
|
+++ b/src/gallium/drivers/nouveau/nouveau_buffer.c
|
||||||
|
@@ -80,6 +80,8 @@ release_allocation(struct nouveau_mm_allocation **mm,
|
||||||
|
inline void
|
||||||
|
nouveau_buffer_release_gpu_storage(struct nv04_resource *buf)
|
||||||
|
{
|
||||||
|
+ if (buf->fence)
|
||||||
|
+ pipe_mutex_lock(buf->fence->screen->push_mutex);
|
||||||
|
if (buf->fence && buf->fence->state < NOUVEAU_FENCE_STATE_FLUSHED) {
|
||||||
|
nouveau_fence_work(buf->fence, nouveau_fence_unref_bo, buf->bo);
|
||||||
|
buf->bo = NULL;
|
||||||
|
@@ -89,6 +91,8 @@ nouveau_buffer_release_gpu_storage(struct nv04_resource *buf)
|
||||||
|
|
||||||
|
if (buf->mm)
|
||||||
|
release_allocation(&buf->mm, buf->fence);
|
||||||
|
+ if (buf->fence)
|
||||||
|
+ pipe_mutex_unlock(buf->fence->screen->push_mutex);
|
||||||
|
|
||||||
|
if (buf->domain == NOUVEAU_BO_VRAM)
|
||||||
|
NOUVEAU_DRV_STAT_RES(buf, buf_obj_current_bytes_vid, -(uint64_t)buf->base.width0);
|
||||||
|
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_miptree.c b/src/gallium/drivers/nouveau/nv50/nv50_miptree.c
|
||||||
|
index 7450119..38e4faf 100644
|
||||||
|
--- a/src/gallium/drivers/nouveau/nv50/nv50_miptree.c
|
||||||
|
+++ b/src/gallium/drivers/nouveau/nv50/nv50_miptree.c
|
||||||
|
@@ -163,10 +163,13 @@ nv50_miptree_destroy(struct pipe_screen *pscreen, struct pipe_resource *pt)
|
||||||
|
{
|
||||||
|
struct nv50_miptree *mt = nv50_miptree(pt);
|
||||||
|
|
||||||
|
- if (mt->base.fence && mt->base.fence->state < NOUVEAU_FENCE_STATE_FLUSHED)
|
||||||
|
+ if (mt->base.fence && mt->base.fence->state < NOUVEAU_FENCE_STATE_FLUSHED) {
|
||||||
|
+ pipe_mutex_lock(nouveau_screen(pscreen)->push_mutex);
|
||||||
|
nouveau_fence_work(mt->base.fence, nouveau_fence_unref_bo, mt->base.bo);
|
||||||
|
- else
|
||||||
|
+ pipe_mutex_unlock(nouveau_screen(pscreen)->push_mutex);
|
||||||
|
+ } else {
|
||||||
|
nouveau_bo_ref(NULL, &mt->base.bo);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
nouveau_fence_ref(NULL, &mt->base.fence);
|
||||||
|
nouveau_fence_ref(NULL, &mt->base.fence_wr);
|
||||||
|
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c b/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c
|
||||||
|
index 9067bcc..d2ad72e 100644
|
||||||
|
--- a/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c
|
||||||
|
+++ b/src/gallium/drivers/nouveau/nv50/nv50_query_hw.c
|
||||||
|
@@ -56,9 +56,12 @@ nv50_hw_query_allocate(struct nv50_context *nv50, struct nv50_query *q,
|
||||||
|
if (hq->mm) {
|
||||||
|
if (hq->state == NV50_HW_QUERY_STATE_READY)
|
||||||
|
nouveau_mm_free(hq->mm);
|
||||||
|
- else
|
||||||
|
+ else {
|
||||||
|
+ pipe_mutex_lock(screen->base.push_mutex);
|
||||||
|
nouveau_fence_work(screen->base.fence.current,
|
||||||
|
nouveau_mm_free_work, hq->mm);
|
||||||
|
+ pipe_mutex_unlock(screen->base.push_mutex);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
|
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
|
||||||
|
index f2584cb..4b51a67 100644
|
||||||
|
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
|
||||||
|
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
|
||||||
|
@@ -48,9 +48,12 @@ nvc0_hw_query_allocate(struct nvc0_context *nvc0, struct nvc0_query *q,
|
||||||
|
if (hq->mm) {
|
||||||
|
if (hq->state == NVC0_HW_QUERY_STATE_READY)
|
||||||
|
nouveau_mm_free(hq->mm);
|
||||||
|
- else
|
||||||
|
+ else {
|
||||||
|
+ pipe_mutex_lock(screen->base.push_mutex);
|
||||||
|
nouveau_fence_work(screen->base.fence.current,
|
||||||
|
nouveau_mm_free_work, hq->mm);
|
||||||
|
+ pipe_mutex_unlock(screen->base.push_mutex);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (size) {
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,104 @@
|
|||||||
|
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_draw.c b/src/gallium/drivers/nouveau/nv30/nv30_draw.c
|
||||||
|
index 10c9f56..c5761a3 100644
|
||||||
|
--- a/src/gallium/drivers/nouveau/nv30/nv30_draw.c
|
||||||
|
+++ b/src/gallium/drivers/nouveau/nv30/nv30_draw.c
|
||||||
|
@@ -127,6 +127,8 @@ nv30_render_draw_elements(struct vbuf_render *render,
|
||||||
|
struct nouveau_pushbuf *push = nv30->screen->base.pushbuf;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
+ pipe_mutex_lock(nv30->screen->base.push_mutex);
|
||||||
|
+
|
||||||
|
BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs);
|
||||||
|
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
||||||
|
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
||||||
|
@@ -134,8 +136,10 @@ nv30_render_draw_elements(struct vbuf_render *render,
|
||||||
|
NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!nv30_state_validate(nv30, ~0, false))
|
||||||
|
+ if (!nv30_state_validate(nv30, ~0, false)) {
|
||||||
|
+ pipe_mutex_unlock(nv30->screen->base.push_mutex);
|
||||||
|
return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
||||||
|
PUSH_DATA (push, r->prim);
|
||||||
|
@@ -160,6 +164,8 @@ nv30_render_draw_elements(struct vbuf_render *render,
|
||||||
|
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
||||||
|
PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP);
|
||||||
|
PUSH_RESET(push, BUFCTX_VTXTMP);
|
||||||
|
+
|
||||||
|
+ pipe_mutex_unlock(nv30->screen->base.push_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -172,6 +178,8 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
|
||||||
|
unsigned ps = fn + (pn ? 1 : 0);
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
+ pipe_mutex_lock(nv30->screen->base.push_mutex);
|
||||||
|
+
|
||||||
|
BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs);
|
||||||
|
for (i = 0; i < r->vertex_info.num_attribs; i++) {
|
||||||
|
PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
|
||||||
|
@@ -179,8 +187,10 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
|
||||||
|
NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!nv30_state_validate(nv30, ~0, false))
|
||||||
|
+ if (!nv30_state_validate(nv30, ~0, false)) {
|
||||||
|
+ pipe_mutex_unlock(nv30->screen->base.push_mutex);
|
||||||
|
return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
||||||
|
PUSH_DATA (push, r->prim);
|
||||||
|
@@ -197,6 +207,8 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
|
||||||
|
BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
|
||||||
|
PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP);
|
||||||
|
PUSH_RESET(push, BUFCTX_VTXTMP);
|
||||||
|
+
|
||||||
|
+ pipe_mutex_unlock(nv30->screen->base.push_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -386,6 +398,8 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||||
|
|
||||||
|
nv30_render_validate(nv30);
|
||||||
|
|
||||||
|
+ pipe_mutex_unlock(nv30->screen->base.push_mutex);
|
||||||
|
+
|
||||||
|
if (nv30->draw_dirty & NV30_NEW_VIEWPORT)
|
||||||
|
draw_set_viewport_states(draw, 0, 1, &nv30->viewport);
|
||||||
|
if (nv30->draw_dirty & NV30_NEW_RASTERIZER)
|
||||||
|
@@ -451,6 +465,8 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||||
|
if (transfer[i])
|
||||||
|
pipe_buffer_unmap(pipe, transfer[i]);
|
||||||
|
|
||||||
|
+ pipe_mutex_lock(nv30->screen->base.push_mutex);
|
||||||
|
+
|
||||||
|
nv30->draw_dirty = 0;
|
||||||
|
nv30_state_release(nv30);
|
||||||
|
}
|
||||||
|
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c b/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c
|
||||||
|
index 6de61bc..fd21f99 100644
|
||||||
|
--- a/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c
|
||||||
|
+++ b/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c
|
||||||
|
@@ -38,6 +38,8 @@ nv30_fragprog_upload(struct nv30_context *nv30)
|
||||||
|
struct nv30_fragprog *fp = nv30->fragprog.program;
|
||||||
|
struct pipe_context *pipe = &nv30->base.pipe;
|
||||||
|
|
||||||
|
+ pipe_mutex_unlock(nv->screen->push_mutex);
|
||||||
|
+
|
||||||
|
if (unlikely(!fp->buffer))
|
||||||
|
fp->buffer = pipe_buffer_create(pipe->screen, 0, 0, fp->insn_len * 4);
|
||||||
|
|
||||||
|
@@ -60,6 +62,8 @@ nv30_fragprog_upload(struct nv30_context *nv30)
|
||||||
|
|
||||||
|
if (nv04_resource(fp->buffer)->domain != NOUVEAU_BO_VRAM)
|
||||||
|
nouveau_buffer_migrate(nv, nv04_resource(fp->buffer), NOUVEAU_BO_VRAM);
|
||||||
|
+
|
||||||
|
+ pipe_mutex_lock(nv->screen->push_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
@@ -39,6 +39,11 @@
|
|||||||
<Dependency versionFrom="3.9.1">llvm-clang-devel</Dependency>
|
<Dependency versionFrom="3.9.1">llvm-clang-devel</Dependency>
|
||||||
<Dependency versionFrom="1.2">libxshmfence-devel</Dependency>
|
<Dependency versionFrom="1.2">libxshmfence-devel</Dependency>
|
||||||
</BuildDependencies>
|
</BuildDependencies>
|
||||||
|
<Patches>
|
||||||
|
<!-- <Patch level="1">2e6b0e24cfb0f467e8b6d6f394730442a72dcdaf.diff</Patch> -->
|
||||||
|
<Patch level="1">2733e5483e1c2b80e4b0ae21187ec5e3e1579397.diff</Patch>
|
||||||
|
<Patch level="1">940b3a773f264f3f52574160f0d06c48f8e8aeb2.diff</Patch>
|
||||||
|
</Patches>
|
||||||
</Source>
|
</Source>
|
||||||
|
|
||||||
<Package>
|
<Package>
|
||||||
|
|||||||
Reference in New Issue
Block a user