draw: Add draw_set_index_buffer and others.
This commit adds draw_set_index_buffer, draw_set_mapped_index_buffer, and draw_vbo. The idea behind the new functions is that an index buffer should be a state. draw_arrays and draw_set_mapped_element_buffer are preserved, but the latter will be removed soon.
This commit is contained in:
@@ -496,6 +496,27 @@ void draw_set_render( struct draw_context *draw,
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
draw_set_index_buffer(struct draw_context *draw,
|
||||
const struct pipe_index_buffer *ib)
|
||||
{
|
||||
if (ib)
|
||||
memcpy(&draw->pt.index_buffer, ib, sizeof(draw->pt.index_buffer));
|
||||
else
|
||||
memset(&draw->pt.index_buffer, 0, sizeof(draw->pt.index_buffer));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tell drawing context where to find mapped index/element buffer.
|
||||
*/
|
||||
void
|
||||
draw_set_mapped_index_buffer(struct draw_context *draw,
|
||||
const void *elements)
|
||||
{
|
||||
draw->pt.user.elts = elements;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tell the drawing context about the index/element buffer to use
|
||||
@@ -515,8 +536,13 @@ draw_set_mapped_element_buffer_range( struct draw_context *draw,
|
||||
unsigned max_index,
|
||||
const void *elements )
|
||||
{
|
||||
struct pipe_index_buffer ib;
|
||||
|
||||
memset(&ib, 0, sizeof(ib));
|
||||
ib.index_size = eltSize;
|
||||
draw_set_index_buffer(draw, &ib);
|
||||
|
||||
draw->pt.user.elts = elements;
|
||||
draw->pt.user.eltSize = eltSize;
|
||||
draw->pt.user.eltBias = eltBias;
|
||||
draw->pt.user.min_index = min_index;
|
||||
draw->pt.user.max_index = max_index;
|
||||
@@ -529,11 +555,8 @@ draw_set_mapped_element_buffer( struct draw_context *draw,
|
||||
int eltBias,
|
||||
const void *elements )
|
||||
{
|
||||
draw->pt.user.elts = elements;
|
||||
draw->pt.user.eltSize = eltSize;
|
||||
draw->pt.user.eltBias = eltBias;
|
||||
draw->pt.user.min_index = 0;
|
||||
draw->pt.user.max_index = 0xffffffff;
|
||||
draw_set_mapped_element_buffer_range(draw,
|
||||
eltSize, eltBias, 0, 0xffffffff, elements);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -160,6 +160,12 @@ void draw_set_vertex_elements(struct draw_context *draw,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_element *elements);
|
||||
|
||||
void draw_set_index_buffer(struct draw_context *draw,
|
||||
const struct pipe_index_buffer *ib);
|
||||
|
||||
void draw_set_mapped_index_buffer(struct draw_context *draw,
|
||||
const void *elements);
|
||||
|
||||
void
|
||||
draw_set_mapped_element_buffer_range( struct draw_context *draw,
|
||||
unsigned eltSize,
|
||||
@@ -196,6 +202,9 @@ draw_set_so_state(struct draw_context *draw,
|
||||
* draw_pt.c
|
||||
*/
|
||||
|
||||
void draw_vbo(struct draw_context *draw,
|
||||
const struct pipe_draw_info *info);
|
||||
|
||||
void draw_arrays(struct draw_context *draw, unsigned prim,
|
||||
unsigned start, unsigned count);
|
||||
|
||||
|
||||
@@ -149,6 +149,8 @@ struct draw_context
|
||||
struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
|
||||
unsigned nr_vertex_elements;
|
||||
|
||||
struct pipe_index_buffer index_buffer;
|
||||
|
||||
/* user-space vertex data, buffers */
|
||||
struct {
|
||||
/** vertex element/index buffer (ex: glDrawElements) */
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_prim.h"
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_draw.h"
|
||||
|
||||
|
||||
DEBUG_GET_ONCE_BOOL_OPTION(draw_fse, "DRAW_FSE", FALSE)
|
||||
@@ -189,24 +190,29 @@ draw_print_arrays(struct draw_context *draw, uint prim, int start, uint count)
|
||||
uint ii = 0;
|
||||
uint j;
|
||||
|
||||
if (draw->pt.user.elts) {
|
||||
if (draw->pt.user.eltSize) {
|
||||
const char *elts;
|
||||
|
||||
/* indexed arrays */
|
||||
elts = (const char *) draw->pt.user.elts;
|
||||
elts += draw->pt.index_buffer.offset;
|
||||
|
||||
switch (draw->pt.user.eltSize) {
|
||||
case 1:
|
||||
{
|
||||
const ubyte *elem = (const ubyte *) draw->pt.user.elts;
|
||||
const ubyte *elem = (const ubyte *) elts;
|
||||
ii = elem[start + i];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
const ushort *elem = (const ushort *) draw->pt.user.elts;
|
||||
const ushort *elem = (const ushort *) elts;
|
||||
ii = elem[start + i];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
const uint *elem = (const uint *) draw->pt.user.elts;
|
||||
const uint *elem = (const uint *) elts;
|
||||
ii = elem[start + i];
|
||||
}
|
||||
break;
|
||||
@@ -292,17 +298,9 @@ draw_arrays(struct draw_context *draw, unsigned prim,
|
||||
|
||||
|
||||
/**
|
||||
* Draw vertex arrays.
|
||||
* This is the main entrypoint into the drawing module.
|
||||
* If drawing an indexed primitive, the draw_set_mapped_element_buffer_range()
|
||||
* function should have already been called to specify the element/index buffer
|
||||
* information.
|
||||
*
|
||||
* \param prim one of PIPE_PRIM_x
|
||||
* \param start index of first vertex to draw
|
||||
* \param count number of vertices to draw
|
||||
* \param startInstance number for the first primitive instance (usually 0).
|
||||
* \param instanceCount number of instances to draw (1=non-instanced)
|
||||
* Instanced drawing.
|
||||
* draw_set_mapped_element_buffer must be called before calling this function.
|
||||
* \sa draw_vbo
|
||||
*/
|
||||
void
|
||||
draw_arrays_instanced(struct draw_context *draw,
|
||||
@@ -312,10 +310,49 @@ draw_arrays_instanced(struct draw_context *draw,
|
||||
unsigned startInstance,
|
||||
unsigned instanceCount)
|
||||
{
|
||||
unsigned reduced_prim = u_reduced_prim(mode);
|
||||
struct pipe_draw_info info;
|
||||
|
||||
util_draw_init_info(&info);
|
||||
|
||||
info.mode = mode;
|
||||
info.start = start;
|
||||
info.count = count;
|
||||
info.start_instance = startInstance;
|
||||
info.instance_count = instanceCount;
|
||||
|
||||
info.indexed = (draw->pt.user.elts != NULL);
|
||||
info.index_bias = draw->pt.user.eltBias;
|
||||
info.min_index = draw->pt.user.min_index;
|
||||
info.max_index = draw->pt.user.max_index;
|
||||
|
||||
draw_vbo(draw, &info);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw vertex arrays.
|
||||
* This is the main entrypoint into the drawing module. If drawing an indexed
|
||||
* primitive, the draw_set_index_buffer() and draw_set_mapped_index_buffer()
|
||||
* functions should have already been called to specify the element/index
|
||||
* buffer information.
|
||||
*/
|
||||
void
|
||||
draw_vbo(struct draw_context *draw,
|
||||
const struct pipe_draw_info *info)
|
||||
{
|
||||
unsigned reduced_prim = u_reduced_prim(info->mode);
|
||||
unsigned instance;
|
||||
|
||||
assert(instanceCount > 0);
|
||||
assert(info->instance_count > 0);
|
||||
if (info->indexed)
|
||||
assert(draw->pt.user.elts);
|
||||
|
||||
draw->pt.user.eltSize =
|
||||
(info->indexed) ? draw->pt.index_buffer.index_size : 0;
|
||||
|
||||
draw->pt.user.eltBias = info->index_bias;
|
||||
draw->pt.user.min_index = info->min_index;
|
||||
draw->pt.user.max_index = info->max_index;
|
||||
|
||||
if (reduced_prim != draw->reduced_prim) {
|
||||
draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE);
|
||||
@@ -323,8 +360,8 @@ draw_arrays_instanced(struct draw_context *draw,
|
||||
}
|
||||
|
||||
if (0)
|
||||
debug_printf("draw_arrays(mode=%u start=%u count=%u):\n",
|
||||
mode, start, count);
|
||||
debug_printf("draw_vbo(mode=%u start=%u count=%u):\n",
|
||||
info->mode, info->start, info->count);
|
||||
|
||||
if (0)
|
||||
tgsi_dump(draw->vs.vertex_shader->state.tokens, 0);
|
||||
@@ -352,10 +389,10 @@ draw_arrays_instanced(struct draw_context *draw,
|
||||
}
|
||||
|
||||
if (0)
|
||||
draw_print_arrays(draw, mode, start, MIN2(count, 20));
|
||||
draw_print_arrays(draw, info->mode, info->start, MIN2(info->count, 20));
|
||||
|
||||
for (instance = 0; instance < instanceCount; instance++) {
|
||||
draw->instance_id = instance + startInstance;
|
||||
draw_pt_arrays(draw, mode, start, count);
|
||||
for (instance = 0; instance < info->instance_count; instance++) {
|
||||
draw->instance_id = instance + info->start_instance;
|
||||
draw_pt_arrays(draw, info->mode, info->start, info->count);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,8 @@ CONCAT(vsplit_primitive_, ELT_TYPE)(struct vsplit_frontend *vsplit,
|
||||
unsigned istart, unsigned icount)
|
||||
{
|
||||
struct draw_context *draw = vsplit->draw;
|
||||
const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts;
|
||||
const ELT_TYPE *ib = (const ELT_TYPE *)
|
||||
((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset);
|
||||
const unsigned min_index = draw->pt.user.min_index;
|
||||
const unsigned max_index = draw->pt.user.max_index;
|
||||
const int elt_bias = draw->pt.user.eltBias;
|
||||
@@ -119,7 +120,8 @@ CONCAT(vsplit_segment_cache_, ELT_TYPE)(struct vsplit_frontend *vsplit,
|
||||
boolean close, unsigned iclose)
|
||||
{
|
||||
struct draw_context *draw = vsplit->draw;
|
||||
const ELT_TYPE *ib = (const ELT_TYPE *) draw->pt.user.elts;
|
||||
const ELT_TYPE *ib = (const ELT_TYPE *)
|
||||
((const char *) draw->pt.user.elts + draw->pt.index_buffer.offset);
|
||||
const int ibias = draw->pt.user.eltBias;
|
||||
unsigned i;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user