r300g: skip buffer validation of upload buffers when appropriate
because the upload buffers are reused for subsequent draw operations.
This commit is contained in:
@@ -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) \
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user