r300g: u_upload optimisation
fix vb/ib uploads
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "draw/draw_private.h"
|
||||
|
||||
#include "util/u_simple_list.h"
|
||||
#include "util/u_upload_mgr.h"
|
||||
|
||||
#include "r300_context.h"
|
||||
#include "r300_cs.h"
|
||||
@@ -39,6 +40,9 @@ static void r300_flush(struct pipe_context* pipe,
|
||||
struct r300_atom *atom;
|
||||
struct r300_fence **rfence = (struct r300_fence**)fence;
|
||||
|
||||
u_upload_flush(r300->upload_vb);
|
||||
u_upload_flush(r300->upload_ib);
|
||||
|
||||
/* We probably need to flush Draw, but we may have been called from
|
||||
* within Draw. This feels kludgy, but it might be the best thing.
|
||||
*
|
||||
|
@@ -497,6 +497,7 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
|
||||
unsigned short_count;
|
||||
int buffer_offset = 0, index_offset = 0; /* for index bias emulation */
|
||||
boolean translate = FALSE;
|
||||
unsigned new_offset;
|
||||
|
||||
if (r300->skip_rendering) {
|
||||
return;
|
||||
@@ -526,18 +527,17 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
|
||||
&start, count);
|
||||
|
||||
r300_update_derived_state(r300);
|
||||
r300_upload_index_buffer(r300, &indexBuffer, indexSize, start, count);
|
||||
r300_upload_index_buffer(r300, &indexBuffer, indexSize, start, count, &new_offset);
|
||||
|
||||
start = new_offset;
|
||||
/* 15 dwords for emit_draw_elements */
|
||||
r300_prepare_for_rendering(r300,
|
||||
PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS | PREP_INDEXED,
|
||||
indexBuffer, 15, buffer_offset, indexBias, NULL);
|
||||
|
||||
u_upload_flush(r300->upload_vb);
|
||||
u_upload_flush(r300->upload_ib);
|
||||
if (alt_num_verts || count <= 65535) {
|
||||
r300_emit_draw_elements(r300, indexBuffer, indexSize,
|
||||
minIndex, maxIndex, mode, start, count);
|
||||
minIndex, maxIndex, mode, start, count);
|
||||
} else {
|
||||
do {
|
||||
short_count = MIN2(count, 65534);
|
||||
|
@@ -62,7 +62,8 @@ int r300_upload_index_buffer(struct r300_context *r300,
|
||||
struct pipe_resource **index_buffer,
|
||||
unsigned index_size,
|
||||
unsigned start,
|
||||
unsigned count)
|
||||
unsigned count,
|
||||
unsigned *out_offset)
|
||||
{
|
||||
struct pipe_resource *upload_buffer = NULL;
|
||||
unsigned index_offset = start * index_size;
|
||||
@@ -79,7 +80,10 @@ int r300_upload_index_buffer(struct r300_context *r300,
|
||||
goto done;
|
||||
}
|
||||
*index_buffer = upload_buffer;
|
||||
}
|
||||
*out_offset = index_offset / index_size;
|
||||
} else
|
||||
*out_offset = start;
|
||||
|
||||
done:
|
||||
// if (upload_buffer)
|
||||
// pipe_resource_reference(&upload_buffer, NULL);
|
||||
|
@@ -68,7 +68,7 @@ int r300_upload_index_buffer(struct r300_context *r300,
|
||||
struct pipe_resource **index_buffer,
|
||||
unsigned index_size,
|
||||
unsigned start,
|
||||
unsigned count);
|
||||
unsigned count, unsigned *out_offset);
|
||||
|
||||
struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
|
||||
const struct pipe_resource *templ);
|
||||
|
Reference in New Issue
Block a user