From: Ilia Mirkin Date: Wed, 21 Feb 2018 04:17:31 +0000 (-0500) Subject: nv50,nvc0: fix clear buffer acceleration X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f6e4f956689719c77e8d22951f4b1f6ed5548da4;p=mesa.git nv50,nvc0: fix clear buffer acceleration Two things were off: - valid range was not updated, which could affect waiting for future maps - fencing was done manually instead of using the *_resource_validate helper, which resulted in a missed dirty buffer flag being set Fixes: KHR-GL45.direct_state_access.buffers_clear Signed-off-by: Ilia Mirkin Tested-by: Karol Herbst --- diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index 908c534b92e..037e14a4d60 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -672,10 +672,7 @@ nv50_clear_buffer_push(struct pipe_context *pipe, count -= nr; } - if (buf->mm) { - nouveau_fence_ref(nv50->screen->base.fence.current, &buf->fence); - nouveau_fence_ref(nv50->screen->base.fence.current, &buf->fence_wr); - } + nv50_resource_validate(buf, NOUVEAU_BO_WR); nouveau_bufctx_reset(nv50->bufctx, 0); } @@ -727,6 +724,8 @@ nv50_clear_buffer(struct pipe_context *pipe, return; } + util_range_add(&buf->valid_buffer_range, offset, offset + size); + assert(size % data_size == 0); if (offset & 0xff) { @@ -747,10 +746,10 @@ nv50_clear_buffer(struct pipe_context *pipe, assert(width > 0); 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]); + PUSH_DATA (push, color.ui[0]); + PUSH_DATA (push, color.ui[1]); + PUSH_DATA (push, color.ui[2]); + PUSH_DATA (push, color.ui[3]); if (nouveau_pushbuf_space(push, 64, 1, 0)) return; @@ -796,10 +795,7 @@ nv50_clear_buffer(struct pipe_context *pipe, BEGIN_NV04(push, NV50_3D(COND_MODE), 1); PUSH_DATA (push, nv50->cond_condmode); - if (buf->mm) { - nouveau_fence_ref(nv50->screen->base.fence.current, &buf->fence); - nouveau_fence_ref(nv50->screen->base.fence.current, &buf->fence_wr); - } + nv50_resource_validate(buf, NOUVEAU_BO_WR); if (width * height != elements) { offset += width * height * data_size; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c index 9445c05f3ab..0f86c11b7f4 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c @@ -403,10 +403,7 @@ nvc0_clear_buffer_push_nvc0(struct pipe_context *pipe, size -= nr * 4; } - if (buf->mm) { - nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence); - nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence_wr); - } + nvc0_resource_validate(buf, NOUVEAU_BO_WR); nouveau_bufctx_reset(nvc0->bufctx, 0); } @@ -453,10 +450,7 @@ nvc0_clear_buffer_push_nve4(struct pipe_context *pipe, size -= nr * 4; } - if (buf->mm) { - nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence); - nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence_wr); - } + nvc0_resource_validate(buf, NOUVEAU_BO_WR); nouveau_bufctx_reset(nvc0->bufctx, 0); } @@ -540,6 +534,8 @@ nvc0_clear_buffer(struct pipe_context *pipe, return; } + util_range_add(&buf->valid_buffer_range, offset, offset + size); + assert(size % data_size == 0); if (data_size == 12) { @@ -570,10 +566,10 @@ nvc0_clear_buffer(struct pipe_context *pipe, PUSH_REFN (push, buf->bo, buf->domain | NOUVEAU_BO_WR); BEGIN_NVC0(push, NVC0_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]); + PUSH_DATA (push, color.ui[0]); + PUSH_DATA (push, color.ui[1]); + PUSH_DATA (push, color.ui[2]); + PUSH_DATA (push, color.ui[3]); BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2); PUSH_DATA (push, width << 16); PUSH_DATA (push, height << 16); @@ -600,10 +596,7 @@ nvc0_clear_buffer(struct pipe_context *pipe, IMMED_NVC0(push, NVC0_3D(COND_MODE), nvc0->cond_condmode); - if (buf->mm) { - nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence); - nouveau_fence_ref(nvc0->screen->base.fence.current, &buf->fence_wr); - } + nvc0_resource_validate(buf, NOUVEAU_BO_WR); if (width * height != elements) { offset += width * height * data_size;