|
|
|
@@ -146,23 +146,15 @@ retry: |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
svga_draw_range_elements( struct pipe_context *pipe, |
|
|
|
struct pipe_resource *index_buffer, |
|
|
|
unsigned index_size, |
|
|
|
int index_bias, |
|
|
|
unsigned min_index, |
|
|
|
unsigned max_index, |
|
|
|
unsigned prim, unsigned start, unsigned count) |
|
|
|
svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) |
|
|
|
{ |
|
|
|
struct svga_context *svga = svga_context( pipe ); |
|
|
|
unsigned reduced_prim = u_reduced_prim(prim); |
|
|
|
unsigned reduced_prim = u_reduced_prim( info->mode ); |
|
|
|
unsigned count = info->count; |
|
|
|
enum pipe_error ret = 0; |
|
|
|
|
|
|
|
if (!u_trim_pipe_prim( prim, &count )) |
|
|
|
if (!u_trim_pipe_prim( info->mode, &count )) |
|
|
|
return; |
|
|
|
|
|
|
|
/* |
|
|
|
@@ -187,34 +179,32 @@ svga_draw_range_elements( struct pipe_context *pipe, |
|
|
|
return; |
|
|
|
#endif |
|
|
|
|
|
|
|
if (svga->state.sw.need_swtnl) |
|
|
|
{ |
|
|
|
ret = svga_swtnl_draw_range_elements( svga, |
|
|
|
index_buffer, |
|
|
|
index_size, |
|
|
|
index_bias, |
|
|
|
min_index, max_index, |
|
|
|
prim, |
|
|
|
start, count ); |
|
|
|
if (svga->state.sw.need_swtnl) { |
|
|
|
ret = svga_swtnl_draw_vbo( svga, info ); |
|
|
|
} |
|
|
|
else { |
|
|
|
if (index_buffer) { |
|
|
|
if (info->indexed && svga->curr.ib.buffer) { |
|
|
|
unsigned offset; |
|
|
|
|
|
|
|
assert(svga->curr.ib.offset % svga->curr.ib.index_size == 0); |
|
|
|
offset = svga->curr.ib.offset / svga->curr.ib.index_size; |
|
|
|
|
|
|
|
ret = retry_draw_range_elements( svga, |
|
|
|
index_buffer, |
|
|
|
index_size, |
|
|
|
index_bias, |
|
|
|
min_index, |
|
|
|
max_index, |
|
|
|
prim, |
|
|
|
start, |
|
|
|
count, |
|
|
|
svga->curr.ib.buffer, |
|
|
|
svga->curr.ib.index_size, |
|
|
|
info->index_bias, |
|
|
|
info->min_index, |
|
|
|
info->max_index, |
|
|
|
info->mode, |
|
|
|
info->start + offset, |
|
|
|
info->count, |
|
|
|
TRUE ); |
|
|
|
} |
|
|
|
else { |
|
|
|
ret = retry_draw_arrays( svga, |
|
|
|
prim, |
|
|
|
start, |
|
|
|
count, |
|
|
|
ret = retry_draw_arrays( svga, |
|
|
|
info->mode, |
|
|
|
info->start, |
|
|
|
info->count, |
|
|
|
TRUE ); |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -226,30 +216,6 @@ svga_draw_range_elements( struct pipe_context *pipe, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void |
|
|
|
svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) |
|
|
|
{ |
|
|
|
struct svga_context *svga = svga_context(pipe); |
|
|
|
|
|
|
|
if (info->indexed && svga->curr.ib.buffer) { |
|
|
|
unsigned offset; |
|
|
|
|
|
|
|
assert(svga->curr.ib.offset % svga->curr.ib.index_size == 0); |
|
|
|
offset = svga->curr.ib.offset / svga->curr.ib.index_size; |
|
|
|
|
|
|
|
svga_draw_range_elements(pipe, svga->curr.ib.buffer, |
|
|
|
svga->curr.ib.index_size, info->index_bias, |
|
|
|
info->min_index, info->max_index, |
|
|
|
info->mode, info->start + offset, info->count); |
|
|
|
} |
|
|
|
else { |
|
|
|
svga_draw_range_elements(pipe, NULL, 0, 0, |
|
|
|
info->min_index, info->max_index, |
|
|
|
info->mode, info->start, info->count); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void svga_init_draw_functions( struct svga_context *svga ) |
|
|
|
{ |
|
|
|
svga->pipe.draw_vbo = svga_draw_vbo; |