Mesa (staging/19.2): iris: Fix iris_rebind_buffer() for VBOs with non-zero offsets.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Oct 1 22:31:05 UTC 2019


Module: Mesa
Branch: staging/19.2
Commit: 4169d86913d633ebcf4e4a4c35c7e9afabd598f9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4169d86913d633ebcf4e4a4c35c7e9afabd598f9

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Mon Sep 23 20:37:39 2019 -0700

iris: Fix iris_rebind_buffer() for VBOs with non-zero offsets.

We can't just check for the BO base address, we need to check for the
full address including any offset we may have applied.  When updating
the address, we need to include the offset again.

Fixes: 5ad0c88dbe3 ("iris: Replace buffer backing storage and rebind to update addresses.")
(cherry picked from commit 309924c3c927b6f167d9306ecd7270076c7dc3ea)

---

 src/gallium/drivers/iris/iris_state.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c
index 4c219c5247f..d1de2552280 100644
--- a/src/gallium/drivers/iris/iris_state.c
+++ b/src/gallium/drivers/iris/iris_state.c
@@ -845,6 +845,8 @@ struct iris_vertex_buffer_state {
 
    /** The resource to source vertex data from. */
    struct pipe_resource *resource;
+
+   int offset;
 };
 
 struct iris_depth_buffer_state {
@@ -2866,6 +2868,8 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
       pipe_resource_reference(&state->resource, buffer->buffer.resource);
       struct iris_resource *res = (void *) state->resource;
 
+      state->offset = (int) buffer->buffer_offset;
+
       if (res) {
          ice->state.bound_vertex_buffers |= 1ull << (start_slot + i);
          res->bind_history |= PIPE_BIND_VERTEX_BUFFER;
@@ -5929,8 +5933,8 @@ iris_rebind_buffer(struct iris_context *ice,
          STATIC_ASSERT(GENX(VERTEX_BUFFER_STATE_BufferStartingAddress_bits) == 64);
          uint64_t *addr = (uint64_t *) &state->state[1];
 
-         if (*addr == old_address) {
-            *addr = res->bo->gtt_offset;
+         if (*addr == old_address + state->offset) {
+            *addr = res->bo->gtt_offset + state->offset;
             ice->state.dirty |= IRIS_DIRTY_VERTEX_BUFFERS;
          }
       }




More information about the mesa-commit mailing list