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 <imir...@alum.mit.edu> Cc: "10.4 10.3" <mesa-sta...@lists.freedesktop.org> --- src/gallium/drivers/nouveau/nv50/nv50_context.c | 14 +++++++------- src/gallium/drivers/nouveau/nvc0/nvc0_context.c | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.c b/src/gallium/drivers/nouveau/nv50/nv50_context.c index 5e907d7..1a53579 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_context.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.c @@ -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))) diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c index 49a46ea..3992460 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c @@ -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))) -- 2.0.4 _______________________________________________ Nouveau mailing list Nouveau@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/nouveau