Quite a sneaky little bug, can't hurt to make undefined behavior a bit more defined :-).
Reviewed-by: Roland Scheidegger <[email protected]> Am 10.05.2018 um 00:20 schrieb Dave Airlie: > From: Dave Airlie <[email protected]> > > If you have an indirect access to a constant buffer on r600/eg > use a vertex fetch in the shader. However apps have expected > behaviour on those out of bounds accessess (even if illegal). > > If the constants were being uploaded as part of a larger > upload buffer, we'd set the range of allowed access to a lot > larger than required so apps would get values back from > other parts of the upload buffer instead of the expected out > of bounds access. > > This fixes rendering bugs in Trine and Witcher 1, thanks > to iive for nagging me effectively until I figured it out :-) > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91808 > Cc: <[email protected]> > --- > src/gallium/drivers/r600/evergreen_state.c | 2 +- > src/gallium/drivers/r600/r600_state.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index 48934158bdf..05f4a65059b 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -2202,7 +2202,7 @@ static void evergreen_emit_constant_buffers(struct > r600_context *rctx, > radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 8, 0) | pkt_flags); > radeon_emit(cs, (buffer_id_base + buffer_index) * 8); > radeon_emit(cs, va); /* RESOURCEi_WORD0 */ > - radeon_emit(cs, rbuffer->b.b.width0 - cb->buffer_offset - 1); > /* RESOURCEi_WORD1 */ > + radeon_emit(cs, cb->buffer_size -1); /* RESOURCEi_WORD1 */ > radeon_emit(cs, /* RESOURCEi_WORD2 */ > S_030008_ENDIAN_SWAP(gs_ring_buffer ? ENDIAN_NONE : > r600_endian_swap(32)) | > S_030008_STRIDE(gs_ring_buffer ? 4 : 16) | > diff --git a/src/gallium/drivers/r600/r600_state.c > b/src/gallium/drivers/r600/r600_state.c > index 923817119f7..a37a7018371 100644 > --- a/src/gallium/drivers/r600/r600_state.c > +++ b/src/gallium/drivers/r600/r600_state.c > @@ -1729,7 +1729,7 @@ static void r600_emit_constant_buffers(struct > r600_context *rctx, > radeon_emit(cs, PKT3(PKT3_SET_RESOURCE, 7, 0)); > radeon_emit(cs, (buffer_id_base + buffer_index) * 7); > radeon_emit(cs, offset); /* RESOURCEi_WORD0 */ > - radeon_emit(cs, rbuffer->b.b.width0 - offset - 1); /* > RESOURCEi_WORD1 */ > + radeon_emit(cs, cb->buffer_size - 1); /* RESOURCEi_WORD1 */ > radeon_emit(cs, /* RESOURCEi_WORD2 */ > S_038008_ENDIAN_SWAP(gs_ring_buffer ? ENDIAN_NONE : > r600_endian_swap(32)) | > S_038008_STRIDE(gs_ring_buffer ? 4 : 16)); > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
