diff options
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_flush.c | 2 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_render.c | 6 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_screen_buffer.c | 13 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state.c | 20 | 
5 files changed, 36 insertions, 8 deletions
| diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index f3a3df08bc..52556ec2a6 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -619,6 +619,9 @@ struct r300_context {      /* Whether any buffer (FB, textures, VBOs) has been set, but buffers       * haven't been validated yet. */      boolean validate_buffers; +    /* Whether user buffers have been validated. */ +    boolean upload_vb_validated; +    boolean upload_ib_validated;  };  #define foreach_atom(r300, atom) \ diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c index 451fe525b4..7a26a86a91 100644 --- a/src/gallium/drivers/r300/r300_flush.c +++ b/src/gallium/drivers/r300/r300_flush.c @@ -70,6 +70,8 @@ static void r300_flush(struct pipe_context* pipe,          }          r300->validate_buffers = TRUE; +        r300->upload_vb_validated = FALSE; +        r300->upload_ib_validated = FALSE;      }      /* reset flushed query */ diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c index dd3b3c430a..89f7892875 100644 --- a/src/gallium/drivers/r300/r300_render.c +++ b/src/gallium/drivers/r300/r300_render.c @@ -253,6 +253,12 @@ static boolean r300_emit_states(struct r300_context *r300,              /* Consider the validation done only if everything was validated. */              if (validate_vbos) {                  r300->validate_buffers = FALSE; +                if (r300->any_user_vbs) +                    r300->upload_vb_validated = TRUE; +                if (r300->index_buffer.buffer && +                    r300_buffer_is_user_buffer(r300->index_buffer.buffer)) { +                    r300->upload_ib_validated = TRUE; +                }              }          } diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c index 11ad87ed89..d9c491f1e6 100644 --- a/src/gallium/drivers/r300/r300_screen_buffer.c +++ b/src/gallium/drivers/r300/r300_screen_buffer.c @@ -62,8 +62,8 @@ void r300_upload_index_buffer(struct r300_context *r300,  			      unsigned count)  {      unsigned index_offset; -    boolean flushed;      uint8_t *ptr = r300_buffer(*index_buffer)->user_buffer; +    boolean flushed;      *index_buffer = NULL; @@ -74,6 +74,11 @@ void r300_upload_index_buffer(struct r300_context *r300,                    index_buffer, &flushed);      *start = index_offset / index_size; + +    if (flushed || !r300->upload_ib_validated) { +        r300->upload_ib_validated = FALSE; +        r300->validate_buffers = TRUE; +    }  }  void r300_upload_user_buffers(struct r300_context *r300) @@ -91,8 +96,12 @@ void r300_upload_user_buffers(struct r300_context *r300)                            r300_buffer(vb->buffer)->user_buffer,                            &vb->buffer_offset, &vb->buffer, &flushed); -            r300->validate_buffers = TRUE;              r300->vertex_arrays_dirty = TRUE; + +            if (flushed || !r300->upload_vb_validated) { +                r300->upload_vb_validated = FALSE; +                r300->validate_buffers = TRUE; +            }          }      }  } diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index f748fe5997..01af633622 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -1468,6 +1468,7 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,      struct pipe_vertex_buffer *vbo;      unsigned i, max_index = (1 << 24) - 1;      boolean any_user_buffer = FALSE; +    boolean any_nonuser_buffer = FALSE;      struct pipe_vertex_buffer dummy_vb = {0};      /* There must be at least one vertex buffer set, otherwise it locks up. */ @@ -1511,6 +1512,7 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,              if (r300_buffer_is_user_buffer(vbo->buffer)) {                  any_user_buffer = TRUE;              } +            any_nonuser_buffer = TRUE;              /* The stride of zero means we will be fetching only the first               * vertex, so don't care about max_index. */ @@ -1528,7 +1530,10 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,          r300->any_user_vbs = any_user_buffer;          r300->vertex_buffer_max_index = max_index;          r300->vertex_arrays_dirty = TRUE; -        r300->validate_buffers = TRUE; +        if (any_nonuser_buffer) +            r300->validate_buffers = TRUE; +        if (!any_user_buffer) +            r300->upload_vb_validated = FALSE;      } else {          /* SW TCL. */          draw_set_vertex_buffers(r300->draw, count, buffers); @@ -1554,19 +1559,22 @@ static void r300_set_index_buffer(struct pipe_context* pipe,  {      struct r300_context* r300 = r300_context(pipe); -    if (ib) { +    if (ib && ib->buffer) {          pipe_resource_reference(&r300->index_buffer.buffer, ib->buffer);          memcpy(&r300->index_buffer, ib, sizeof(r300->index_buffer)); + +        if (r300->screen->caps.has_tcl && +            !r300_buffer_is_user_buffer(ib->buffer)) { +            r300->validate_buffers = TRUE; +            r300->upload_ib_validated = FALSE; +        }      }      else {          pipe_resource_reference(&r300->index_buffer.buffer, NULL);          memset(&r300->index_buffer, 0, sizeof(r300->index_buffer));      } -    if (r300->screen->caps.has_tcl) { -        r300->validate_buffers = TRUE; -    } -    else { +    if (!r300->screen->caps.has_tcl) {          draw_set_index_buffer(r300->draw, ib);      }  } | 
