X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmesa%2Fvbo%2Fvbo_context.c;h=ed1b6508cdc22523cc8455727c5b3791f37fb8bb;hb=5e8962b58f0d1791f45c0bd16fe87b457399780d;hp=5e1a760eb2caaf4b47a8678f25de1a84ae8aeb96;hpb=a639bbf0987873a0214f0ef562755fa0130b1236;p=mesa.git diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index 5e1a760eb2c..ed1b6508cdc 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -25,21 +25,23 @@ * Keith Whitwell */ -#include "main/imports.h" #include "main/mtypes.h" -#include "main/api_arrayelt.h" #include "main/bufferobj.h" #include "math/m_eval.h" #include "vbo.h" #include "vbo_context.h" -static GLuint check_size( const GLfloat *attr ) +static GLuint +check_size(const GLfloat *attr) { - if (attr[3] != 1.0F) return 4; - if (attr[2] != 0.0F) return 3; - if (attr[1] != 0.0F) return 2; - return 1; + if (attr[3] != 1.0F) + return 4; + if (attr[2] != 0.0F) + return 3; + if (attr[1] != 0.0F) + return 2; + return 1; } @@ -47,7 +49,7 @@ static GLuint check_size( const GLfloat *attr ) * Helper for initializing a vertex array. */ static void -init_array(struct gl_context *ctx, struct gl_client_array *cl, +init_array(struct gl_context *ctx, struct gl_vertex_array *cl, unsigned size, const void *pointer) { memset(cl, 0, sizeof(*cl)); @@ -55,11 +57,9 @@ init_array(struct gl_context *ctx, struct gl_client_array *cl, cl->Size = size; cl->Type = GL_FLOAT; cl->Format = GL_RGBA; - cl->Stride = 0; cl->StrideB = 0; cl->_ElementSize = cl->Size * sizeof(GLfloat); cl->Ptr = pointer; - cl->Enabled = 1; _mesa_reference_buffer_object(ctx, &cl->BufferObj, ctx->Shared->NullBufferObj); @@ -70,7 +70,8 @@ init_array(struct gl_context *ctx, struct gl_client_array *cl, * Set up the vbo->currval arrays to point at the context's current * vertex attributes (with strides = 0). */ -static void init_legacy_currval(struct gl_context *ctx) +static void +init_legacy_currval(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); GLuint i; @@ -79,7 +80,7 @@ static void init_legacy_currval(struct gl_context *ctx) * attribute: */ for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) { - struct gl_client_array *cl = &vbo->currval[VERT_ATTRIB_FF(i)]; + struct gl_vertex_array *cl = &vbo->currval[VERT_ATTRIB_FF(i)]; init_array(ctx, cl, check_size(ctx->Current.Attrib[i]), @@ -88,20 +89,22 @@ static void init_legacy_currval(struct gl_context *ctx) } -static void init_generic_currval(struct gl_context *ctx) +static void +init_generic_currval(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); GLuint i; for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) { - struct gl_client_array *cl = &vbo->currval[VBO_ATTRIB_GENERIC0 + i]; + struct gl_vertex_array *cl = &vbo->currval[VBO_ATTRIB_GENERIC0 + i]; init_array(ctx, cl, 1, ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i]); } } -static void init_mat_currval(struct gl_context *ctx) +static void +init_mat_currval(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); GLuint i; @@ -110,7 +113,7 @@ static void init_mat_currval(struct gl_context *ctx) * attribute: */ for (i = 0; i < MAT_ATTRIB_MAX; i++) { - struct gl_client_array *cl = + struct gl_vertex_array *cl = &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT + i]; unsigned size; @@ -135,8 +138,51 @@ static void init_mat_currval(struct gl_context *ctx) } } +static void +vbo_draw_indirect_prims(struct gl_context *ctx, + GLuint mode, + struct gl_buffer_object *indirect_data, + GLsizeiptr indirect_offset, + unsigned draw_count, + unsigned stride, + struct gl_buffer_object *indirect_params, + GLsizeiptr indirect_params_offset, + const struct _mesa_index_buffer *ib) +{ + struct vbo_context *vbo = vbo_context(ctx); + struct _mesa_prim *prim; + GLsizei i; + + prim = calloc(draw_count, sizeof(*prim)); + if (prim == NULL) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "gl%sDraw%sIndirect%s", + (draw_count > 1) ? "Multi" : "", + ib ? "Elements" : "Arrays", + indirect_params ? "CountARB" : ""); + return; + } + + prim[0].begin = 1; + prim[draw_count - 1].end = 1; + for (i = 0; i < draw_count; ++i, indirect_offset += stride) { + prim[i].mode = mode; + prim[i].indexed = !!ib; + prim[i].indirect_offset = indirect_offset; + prim[i].is_indirect = 1; + prim[i].draw_id = i; + } + + vbo->draw_prims(ctx, prim, draw_count, + ib, false, 0, ~0, + NULL, 0, + ctx->DrawIndirectBuffer); + + free(prim); +} + -GLboolean _vbo_CreateContext( struct gl_context *ctx ) +GLboolean +_vbo_CreateContext(struct gl_context *ctx) { struct vbo_context *vbo = CALLOC_STRUCT(vbo_context); @@ -145,13 +191,14 @@ GLboolean _vbo_CreateContext( struct gl_context *ctx ) /* Initialize the arrayelt helper */ if (!ctx->aelt_context && - !_ae_create_context( ctx )) { + !_ae_create_context(ctx)) { return GL_FALSE; } - init_legacy_currval( ctx ); - init_generic_currval( ctx ); - init_mat_currval( ctx ); + init_legacy_currval(ctx); + init_generic_currval(ctx); + init_mat_currval(ctx); + vbo_set_indirect_draw_func(ctx, vbo_draw_indirect_prims); /* Build mappings from VERT_ATTRIB -> VBO_ATTRIB depending on type * of vertex program active. @@ -159,16 +206,19 @@ GLboolean _vbo_CreateContext( struct gl_context *ctx ) { GLuint i; + /* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */ + STATIC_ASSERT(VBO_ATTRIB_MAX <= 255); + /* identity mapping */ - for (i = 0; i < ARRAY_SIZE(vbo->map_vp_none); i++) - vbo->map_vp_none[i] = i; + for (i = 0; i < ARRAY_SIZE(vbo->map_vp_none); i++) + vbo->map_vp_none[i] = i; /* map material attribs to generic slots */ for (i = 0; i < MAT_ATTRIB_MAX; i++) - vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] + vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] = VBO_ATTRIB_MAT_FRONT_AMBIENT + i; for (i = 0; i < ARRAY_SIZE(vbo->map_vp_arb); i++) - vbo->map_vp_arb[i] = i; + vbo->map_vp_arb[i] = i; } @@ -176,9 +226,9 @@ GLboolean _vbo_CreateContext( struct gl_context *ctx ) * will pretty much be permanently installed, which means that the * vtxfmt mechanism can be removed now. */ - vbo_exec_init( ctx ); + vbo_exec_init(ctx); if (ctx->API == API_OPENGL_COMPAT) - vbo_save_init( ctx ); + vbo_save_init(ctx); _math_init_eval(); @@ -186,18 +236,13 @@ GLboolean _vbo_CreateContext( struct gl_context *ctx ) } -void _vbo_InvalidateState( struct gl_context *ctx, GLuint new_state ) -{ - vbo_exec_invalidate_state(ctx, new_state); -} - - -void _vbo_DestroyContext( struct gl_context *ctx ) +void +_vbo_DestroyContext(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); if (ctx->aelt_context) { - _ae_destroy_context( ctx ); + _ae_destroy_context(ctx); ctx->aelt_context = NULL; } @@ -217,9 +262,18 @@ void _vbo_DestroyContext( struct gl_context *ctx ) } -void vbo_set_draw_func(struct gl_context *ctx, vbo_draw_func func) +void +vbo_set_draw_func(struct gl_context *ctx, vbo_draw_func func) { struct vbo_context *vbo = vbo_context(ctx); vbo->draw_prims = func; } + +void +vbo_set_indirect_draw_func(struct gl_context *ctx, + vbo_indirect_draw_func func) +{ + struct vbo_context *vbo = vbo_context(ctx); + vbo->draw_indirect_prims = func; +}