r300g: u_upload optimisation

fix vb/ib uploads
This commit is contained in:
Dave Airlie
2010-07-18 18:47:08 +10:00
committed by Marek Olšák
parent 14e362c79a
commit 4eaf591d15
4 changed files with 15 additions and 7 deletions

View File

@@ -25,6 +25,7 @@
#include "draw/draw_private.h" #include "draw/draw_private.h"
#include "util/u_simple_list.h" #include "util/u_simple_list.h"
#include "util/u_upload_mgr.h"
#include "r300_context.h" #include "r300_context.h"
#include "r300_cs.h" #include "r300_cs.h"
@@ -39,6 +40,9 @@ static void r300_flush(struct pipe_context* pipe,
struct r300_atom *atom; struct r300_atom *atom;
struct r300_fence **rfence = (struct r300_fence**)fence; 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 /* 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. * within Draw. This feels kludgy, but it might be the best thing.
* *

View File

@@ -497,6 +497,7 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
unsigned short_count; unsigned short_count;
int buffer_offset = 0, index_offset = 0; /* for index bias emulation */ int buffer_offset = 0, index_offset = 0; /* for index bias emulation */
boolean translate = FALSE; boolean translate = FALSE;
unsigned new_offset;
if (r300->skip_rendering) { if (r300->skip_rendering) {
return; return;
@@ -526,15 +527,14 @@ static void r300_draw_range_elements(struct pipe_context* pipe,
&start, count); &start, count);
r300_update_derived_state(r300); 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 */ /* 15 dwords for emit_draw_elements */
r300_prepare_for_rendering(r300, r300_prepare_for_rendering(r300,
PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS | PREP_INDEXED, PREP_FIRST_DRAW | PREP_VALIDATE_VBOS | PREP_EMIT_AOS | PREP_INDEXED,
indexBuffer, 15, buffer_offset, indexBias, NULL); indexBuffer, 15, buffer_offset, indexBias, NULL);
u_upload_flush(r300->upload_vb);
u_upload_flush(r300->upload_ib);
if (alt_num_verts || count <= 65535) { if (alt_num_verts || count <= 65535) {
r300_emit_draw_elements(r300, indexBuffer, indexSize, r300_emit_draw_elements(r300, indexBuffer, indexSize,
minIndex, maxIndex, mode, start, count); minIndex, maxIndex, mode, start, count);

View File

@@ -62,7 +62,8 @@ int r300_upload_index_buffer(struct r300_context *r300,
struct pipe_resource **index_buffer, struct pipe_resource **index_buffer,
unsigned index_size, unsigned index_size,
unsigned start, unsigned start,
unsigned count) unsigned count,
unsigned *out_offset)
{ {
struct pipe_resource *upload_buffer = NULL; struct pipe_resource *upload_buffer = NULL;
unsigned index_offset = start * index_size; unsigned index_offset = start * index_size;
@@ -79,7 +80,10 @@ int r300_upload_index_buffer(struct r300_context *r300,
goto done; goto done;
} }
*index_buffer = upload_buffer; *index_buffer = upload_buffer;
} *out_offset = index_offset / index_size;
} else
*out_offset = start;
done: done:
// if (upload_buffer) // if (upload_buffer)
// pipe_resource_reference(&upload_buffer, NULL); // pipe_resource_reference(&upload_buffer, NULL);

View File

@@ -68,7 +68,7 @@ int r300_upload_index_buffer(struct r300_context *r300,
struct pipe_resource **index_buffer, struct pipe_resource **index_buffer,
unsigned index_size, unsigned index_size,
unsigned start, unsigned start,
unsigned count); unsigned count, unsigned *out_offset);
struct pipe_resource *r300_buffer_create(struct pipe_screen *screen, struct pipe_resource *r300_buffer_create(struct pipe_screen *screen,
const struct pipe_resource *templ); const struct pipe_resource *templ);