r600g: modify index buffers for sizes the hw can't deal with.

this just uses the common code from r300g now in util to do translations on r600g.
This commit is contained in:
Dave Airlie 2010-09-20 09:57:47 +10:00
parent 91b70d8408
commit f59fe9671f
1 changed files with 37 additions and 2 deletions

View File

@ -31,12 +31,41 @@
#include <util/u_math.h>
#include <util/u_inlines.h>
#include <util/u_memory.h>
#include <util/u_index_modify.h>
#include "radeon.h"
#include "r600_screen.h"
#include "r600_context.h"
#include "r600_resource.h"
#include "r600_state_inlines.h"
static void r600_translate_index_buffer(struct r600_context *r600,
struct pipe_resource **index_buffer,
unsigned *index_size, unsigned index_offset,
unsigned *start, unsigned count)
{
switch (*index_size) {
case 1:
util_shorten_ubyte_elts(&r600->context, index_buffer, index_offset, *start, count);
*index_size = 2;
*start = 0;
break;
case 2:
if (*start % 2 != 0 || index_offset) {
util_rebuild_ushort_elts(&r600->context, index_buffer, index_offset, *start, count);
*start = 0;
}
break;
case 4:
if (index_offset) {
util_rebuild_uint_elts(&r600->context, index_buffer, index_offset, *start, count);
*start = 0;
}
break;
}
}
static int r600_draw_common(struct r600_draw *draw)
{
struct r600_context *rctx = r600_context(draw->ctx);
@ -135,14 +164,20 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
draw.start = info->start;
draw.count = info->count;
if (info->indexed && rctx->index_buffer.buffer) {
draw.start += rctx->index_buffer.offset / rctx->index_buffer.index_size;
draw.min_index = info->min_index;
draw.max_index = info->max_index;
r600_translate_index_buffer(rctx, &rctx->index_buffer.buffer,
&rctx->index_buffer.index_size,
rctx->index_buffer.offset, &draw.start,
info->count);
fprintf(stderr,"draw start is %d\n", draw.start);
draw.index_size = rctx->index_buffer.index_size;
draw.index_buffer = rctx->index_buffer.buffer;
draw.index_buffer_offset = rctx->index_buffer.offset;
assert(rctx->index_buffer.offset %
rctx->index_buffer.index_size == 0);
r600_upload_index_buffer(rctx, &draw);
}
else {