diff options
Diffstat (limited to 'src/gallium/drivers/nouveau/nv50/nv50_surface.c')
-rw-r--r-- | src/gallium/drivers/nouveau/nv50/nv50_surface.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index a6c0bbc..c0f77dc 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -204,10 +204,13 @@ nv50_resource_copy_region(struct pipe_context *pipe, bool m2mf; unsigned dst_layer = dstz, src_layer = src_box->z; + pipe_mutex_lock(nv50->screen->base.push_mutex); + if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { nouveau_copy_buffer(&nv50->base, nv04_resource(dst), dstx, nv04_resource(src), src_box->x, src_box->width); + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; } @@ -247,6 +250,7 @@ nv50_resource_copy_region(struct pipe_context *pipe, else srect.base += src_mt->layer_stride; } + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; } @@ -270,6 +274,7 @@ nv50_resource_copy_region(struct pipe_context *pipe, break; } nouveau_bufctx_reset(nv50->bufctx, NV50_BIND_2D); + pipe_mutex_unlock(nv50->screen->base.push_mutex); } static void @@ -289,14 +294,18 @@ nv50_clear_render_target(struct pipe_context *pipe, assert(dst->texture->target != PIPE_BUFFER); + pipe_mutex_lock(nv50->screen->base.push_mutex); + BEGIN_NV04(push, NV50_3D(CLEAR_COLOR(0)), 4); PUSH_DATAf(push, color->f[0]); PUSH_DATAf(push, color->f[1]); PUSH_DATAf(push, color->f[2]); PUSH_DATAf(push, color->f[3]); - if (nouveau_pushbuf_space(push, 32 + sf->depth, 1, 0)) + if (nouveau_pushbuf_space(push, 32 + sf->depth, 1, 0)) { + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; + } PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR); @@ -358,6 +367,8 @@ nv50_clear_render_target(struct pipe_context *pipe, PUSH_DATA (push, nv50->cond_condmode); } + pipe_mutex_unlock(nv50->screen->base.push_mutex); + nv50->dirty_3d |= NV50_NEW_3D_FRAMEBUFFER | NV50_NEW_3D_SCISSOR; } @@ -382,6 +393,8 @@ nv50_clear_depth_stencil(struct pipe_context *pipe, assert(dst->texture->target != PIPE_BUFFER); assert(nouveau_bo_memtype(bo)); /* ZETA cannot be linear */ + pipe_mutex_lock(nv50->screen->base.push_mutex); + if (clear_flags & PIPE_CLEAR_DEPTH) { BEGIN_NV04(push, NV50_3D(CLEAR_DEPTH), 1); PUSH_DATAf(push, depth); @@ -394,8 +407,10 @@ nv50_clear_depth_stencil(struct pipe_context *pipe, mode |= NV50_3D_CLEAR_BUFFERS_S; } - if (nouveau_pushbuf_space(push, 32 + sf->depth, 1, 0)) + if (nouveau_pushbuf_space(push, 32 + sf->depth, 1, 0)) { + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; + } PUSH_REFN(push, bo, mt->base.domain | NOUVEAU_BO_WR); @@ -446,6 +461,8 @@ nv50_clear_depth_stencil(struct pipe_context *pipe, PUSH_DATA (push, nv50->cond_condmode); } + pipe_mutex_unlock(nv50->screen->base.push_mutex); + nv50->dirty_3d |= NV50_NEW_3D_FRAMEBUFFER | NV50_NEW_3D_SCISSOR; } @@ -534,9 +551,12 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, unsigned i, j, k; uint32_t mode = 0; + pipe_mutex_lock(nv50->screen->base.push_mutex); /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */ - if (!nv50_state_validate_3d(nv50, NV50_NEW_3D_FRAMEBUFFER)) + if (!nv50_state_validate_3d(nv50, NV50_NEW_3D_FRAMEBUFFER)) { + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; + } /* We have to clear ALL of the layers, not up to the min number of layers * of any attachment. */ @@ -602,6 +622,7 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, /* restore the array mode */ BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1); PUSH_DATA (push, nv50->rt_array_mode); + pipe_mutex_unlock(nv50->screen->base.push_mutex); } static void @@ -729,14 +750,18 @@ nv50_clear_buffer(struct pipe_context *pipe, assert(size % data_size == 0); + pipe_mutex_lock(nv50->screen->base.push_mutex); + if (offset & 0xff) { unsigned fixup_size = MIN2(size, align(offset, 0x100) - offset); assert(fixup_size % data_size == 0); nv50_clear_buffer_push(pipe, res, offset, fixup_size, data, data_size); offset += fixup_size; size -= fixup_size; - if (!size) + if (!size) { + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; + } } elements = size / data_size; @@ -752,8 +777,10 @@ nv50_clear_buffer(struct pipe_context *pipe, PUSH_DATAf(push, color.f[2]); PUSH_DATAf(push, color.f[3]); - if (nouveau_pushbuf_space(push, 32, 1, 0)) + if (nouveau_pushbuf_space(push, 32, 1, 0)) { + pipe_mutex_unlock(nv50->screen->base.push_mutex); return; + } PUSH_REFN(push, buf->bo, buf->domain | NOUVEAU_BO_WR); @@ -808,6 +835,8 @@ nv50_clear_buffer(struct pipe_context *pipe, data, data_size); } + pipe_mutex_unlock(nv50->screen->base.push_mutex); + nv50->dirty_3d |= NV50_NEW_3D_FRAMEBUFFER | NV50_NEW_3D_SCISSOR; } @@ -1724,6 +1753,8 @@ nv50_blit(struct pipe_context *pipe, const struct pipe_blit_info *info) info->src.box.height != -info->dst.box.height)) eng3d = true; + pipe_mutex_lock(nv50->screen->base.push_mutex); + if (nv50->screen->num_occlusion_queries_active) { BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1); PUSH_DATA (push, 0); @@ -1738,6 +1769,8 @@ nv50_blit(struct pipe_context *pipe, const struct pipe_blit_info *info) BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1); PUSH_DATA (push, 1); } + + pipe_mutex_unlock(nv50->screen->base.push_mutex); } static void |