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 <imirkin@alum.mit.edu> Tested-by: Karol Herbst <kherbst@redhat.com>
This commit is contained in:
parent
bd9672695b
commit
f6e4f95668
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue