nv50,nvc0: buffer resources can be bound as other things down the line
res->bind is not an indicator of how the resource is currently bound. buffers can be rebound across different binding points without changing underlying storage. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: "10.4 10.3" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
e80a0a7d9a
commit
fecae4625c
|
@ -180,7 +180,12 @@ nv50_invalidate_resource_storage(struct nouveau_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
if (res->bind & PIPE_BIND_VERTEX_BUFFER) {
|
||||
if (res->bind & (PIPE_BIND_VERTEX_BUFFER |
|
||||
PIPE_BIND_INDEX_BUFFER |
|
||||
PIPE_BIND_CONSTANT_BUFFER |
|
||||
PIPE_BIND_STREAM_OUTPUT |
|
||||
PIPE_BIND_SAMPLER_VIEW)) {
|
||||
|
||||
assert(nv50->num_vtxbufs <= PIPE_MAX_ATTRIBS);
|
||||
for (i = 0; i < nv50->num_vtxbufs; ++i) {
|
||||
if (nv50->vtxbuf[i].buffer == res) {
|
||||
|
@ -190,14 +195,11 @@ nv50_invalidate_resource_storage(struct nouveau_context *ctx,
|
|||
return ref;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (res->bind & PIPE_BIND_INDEX_BUFFER) {
|
||||
|
||||
if (nv50->idxbuf.buffer == res)
|
||||
if (!--ref)
|
||||
return ref;
|
||||
}
|
||||
|
||||
if (res->bind & PIPE_BIND_SAMPLER_VIEW) {
|
||||
for (s = 0; s < 3; ++s) {
|
||||
assert(nv50->num_textures[s] <= PIPE_MAX_SAMPLERS);
|
||||
for (i = 0; i < nv50->num_textures[s]; ++i) {
|
||||
|
@ -210,9 +212,7 @@ nv50_invalidate_resource_storage(struct nouveau_context *ctx,
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (res->bind & PIPE_BIND_CONSTANT_BUFFER) {
|
||||
for (s = 0; s < 3; ++s) {
|
||||
for (i = 0; i < NV50_MAX_PIPE_CONSTBUFS; ++i) {
|
||||
if (!(nv50->constbuf_valid[s] & (1 << i)))
|
||||
|
|
|
@ -196,7 +196,12 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
if (res->bind & PIPE_BIND_VERTEX_BUFFER) {
|
||||
if (res->bind & (PIPE_BIND_VERTEX_BUFFER |
|
||||
PIPE_BIND_INDEX_BUFFER |
|
||||
PIPE_BIND_CONSTANT_BUFFER |
|
||||
PIPE_BIND_STREAM_OUTPUT |
|
||||
PIPE_BIND_COMMAND_ARGS_BUFFER |
|
||||
PIPE_BIND_SAMPLER_VIEW)) {
|
||||
for (i = 0; i < nvc0->num_vtxbufs; ++i) {
|
||||
if (nvc0->vtxbuf[i].buffer == res) {
|
||||
nvc0->dirty |= NVC0_NEW_ARRAYS;
|
||||
|
@ -205,17 +210,14 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx,
|
|||
return ref;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (res->bind & PIPE_BIND_INDEX_BUFFER) {
|
||||
|
||||
if (nvc0->idxbuf.buffer == res) {
|
||||
nvc0->dirty |= NVC0_NEW_IDXBUF;
|
||||
nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_IDX);
|
||||
if (!--ref)
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
|
||||
if (res->bind & PIPE_BIND_SAMPLER_VIEW) {
|
||||
for (s = 0; s < 5; ++s) {
|
||||
for (i = 0; i < nvc0->num_textures[s]; ++i) {
|
||||
if (nvc0->textures[s][i] &&
|
||||
|
@ -228,9 +230,7 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx,
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (res->bind & PIPE_BIND_CONSTANT_BUFFER) {
|
||||
for (s = 0; s < 5; ++s) {
|
||||
for (i = 0; i < NVC0_MAX_PIPE_CONSTBUFS; ++i) {
|
||||
if (!(nvc0->constbuf_valid[s] & (1 << i)))
|
||||
|
|
Loading…
Reference in New Issue