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

Reply via email to