X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fvbo%2Fvbo_context.c;h=ac8f9973f98f19b33b6749d38c5d1e7755510b4c;hb=a7d03103f30bfff532a0c6d6e22fa5e7a24cad27;hp=7b1ebc68f16dd0e9be3eba0cd298177ec4dd9d76;hpb=6002ab564bfb643d5e9fd1b8c3c7c45384de570a;p=mesa.git diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index 7b1ebc68f16..ac8f9973f98 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -25,11 +25,13 @@ * Keith Whitwell */ -#include "main/mtypes.h" +#include "main/errors.h" #include "main/bufferobj.h" #include "math/m_eval.h" #include "main/vtxfmt.h" #include "main/api_arrayelt.h" +#include "main/arrayobj.h" +#include "main/varray.h" #include "vbo.h" #include "vbo_private.h" @@ -51,20 +53,14 @@ check_size(const GLfloat *attr) * Helper for initializing a vertex array. */ static void -init_array(struct gl_context *ctx, struct gl_vertex_array *array, +init_array(struct gl_context *ctx, struct gl_array_attributes *attrib, unsigned size, const void *pointer) { - memset(array, 0, sizeof(*array)); + memset(attrib, 0, sizeof(*attrib)); - array->Size = size; - array->Type = GL_FLOAT; - array->Format = GL_RGBA; - array->StrideB = 0; - array->_ElementSize = array->Size * sizeof(GLfloat); - array->Ptr = pointer; - - _mesa_reference_buffer_object(ctx, &array->BufferObj, - ctx->Shared->NullBufferObj); + vbo_set_vertex_format(&attrib->Format, size, GL_FLOAT); + attrib->Stride = 0; + attrib->Ptr = pointer; } @@ -78,15 +74,15 @@ init_legacy_currval(struct gl_context *ctx) struct vbo_context *vbo = vbo_context(ctx); GLuint i; - /* Set up a constant (StrideB == 0) array for each current + /* Set up a constant (Stride == 0) array for each current * attribute: */ for (i = 0; i < VERT_ATTRIB_FF_MAX; i++) { - struct gl_vertex_array *array = &vbo->currval[VERT_ATTRIB_FF(i)]; + const unsigned attr = VERT_ATTRIB_FF(i); + struct gl_array_attributes *attrib = &vbo->current[attr]; - init_array(ctx, array, - check_size(ctx->Current.Attrib[i]), - ctx->Current.Attrib[i]); + init_array(ctx, attrib, check_size(ctx->Current.Attrib[attr]), + ctx->Current.Attrib[attr]); } } @@ -98,9 +94,10 @@ init_generic_currval(struct gl_context *ctx) GLuint i; for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) { - struct gl_vertex_array *array = &vbo->currval[VBO_ATTRIB_GENERIC0 + i]; + const unsigned attr = VBO_ATTRIB_GENERIC0 + i; + struct gl_array_attributes *attrib = &vbo->current[attr]; - init_array(ctx, array, 1, ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i]); + init_array(ctx, attrib, 1, ctx->Current.Attrib[attr]); } } @@ -115,8 +112,8 @@ init_mat_currval(struct gl_context *ctx) * attribute: */ for (i = 0; i < MAT_ATTRIB_MAX; i++) { - struct gl_vertex_array *array = - &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT + i]; + const unsigned attr = VBO_ATTRIB_MAT_FRONT_AMBIENT + i; + struct gl_array_attributes *attrib = &vbo->current[attr]; unsigned size; /* Size is fixed for the material attributes, for others will @@ -136,57 +133,8 @@ init_mat_currval(struct gl_context *ctx) break; } - init_array(ctx, array, size, ctx->Light.Material.Attrib[i]); - } -} - - -/** - * Fallback for when a driver does not call vbo_set_indirect_draw_func(). - */ -static void -vbo_draw_indirect_prims(struct gl_context *ctx, - GLuint mode, - struct gl_buffer_object *indirect_buffer, - GLsizeiptr indirect_offset, - unsigned draw_count, - unsigned stride, - struct gl_buffer_object *indirect_draw_count_buffer, - GLsizeiptr indirect_draw_count_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_buffer ? "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; + init_array(ctx, attrib, size, ctx->Light.Material.Attrib[i]); } - - /* This should always be true at this time */ - assert(indirect_buffer == ctx->DrawIndirectBuffer); - - vbo->draw_prims(ctx, prim, draw_count, - ib, false, 0, ~0, - NULL, 0, - indirect_buffer); - - free(prim); } @@ -205,37 +153,26 @@ vbo_exec_invalidate_state(struct gl_context *ctx) struct vbo_context *vbo = vbo_context(ctx); struct vbo_exec_context *exec = &vbo->exec; - if (ctx->NewState & (_NEW_PROGRAM | _NEW_ARRAY)) { - if (!exec->validating) - exec->array.recalculate_inputs = GL_TRUE; - - _ae_invalidate_state(ctx); - } - if (ctx->NewState & _NEW_EVAL) exec->eval.recalculate_maps = GL_TRUE; } GLboolean -_vbo_CreateContext(struct gl_context *ctx) +_vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects) { struct vbo_context *vbo = CALLOC_STRUCT(vbo_context); ctx->vbo_context = vbo; - /* Initialize the arrayelt helper - */ - if (!ctx->aelt_context && - !_ae_create_context(ctx)) { - return GL_FALSE; - } - + vbo->binding.Offset = 0; + vbo->binding.Stride = 0; + vbo->binding.InstanceDivisor = 0; + _mesa_reference_buffer_object(ctx, &vbo->binding.BufferObj, + ctx->Shared->NullBufferObj); init_legacy_currval(ctx); init_generic_currval(ctx); init_mat_currval(ctx); - _vbo_init_inputs(&vbo->draw_arrays); - vbo_set_indirect_draw_func(ctx, vbo_draw_indirect_prims); /* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */ STATIC_ASSERT(VBO_ATTRIB_MAX <= 255); @@ -244,10 +181,15 @@ _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, use_buffer_objects); if (ctx->API == API_OPENGL_COMPAT) vbo_save_init(ctx); + vbo->VAO = _mesa_new_vao(ctx, ~((GLuint)0)); + /* The exec VAO assumes to have all arributes bound to binding 0 */ + for (unsigned i = 0; i < VERT_ATTRIB_MAX; ++i) + _mesa_vertex_attrib_binding(ctx, vbo->VAO, i, 0); + _math_init_eval(); return GL_TRUE; @@ -259,39 +201,32 @@ _vbo_DestroyContext(struct gl_context *ctx) { struct vbo_context *vbo = vbo_context(ctx); - if (ctx->aelt_context) { - _ae_destroy_context(ctx); - ctx->aelt_context = NULL; - } - if (vbo) { - GLuint i; - for (i = 0; i < VBO_ATTRIB_MAX; i++) { - _mesa_reference_buffer_object(ctx, &vbo->currval[i].BufferObj, NULL); - } + _mesa_reference_buffer_object(ctx, &vbo->binding.BufferObj, NULL); vbo_exec_destroy(ctx); if (ctx->API == API_OPENGL_COMPAT) vbo_save_destroy(ctx); + _mesa_reference_vao(ctx, &vbo->VAO, NULL); free(vbo); ctx->vbo_context = NULL; } } -void -vbo_set_draw_func(struct gl_context *ctx, vbo_draw_func func) +const struct gl_array_attributes * +_vbo_current_attrib(const struct gl_context *ctx, gl_vert_attrib attr) { - struct vbo_context *vbo = vbo_context(ctx); - vbo->draw_prims = func; + const struct vbo_context *vbo = vbo_context_const(ctx); + const gl_vertex_processing_mode vmp = ctx->VertexProgram._VPMode; + return &vbo->current[_vbo_attribute_alias_map[vmp][attr]]; } -void -vbo_set_indirect_draw_func(struct gl_context *ctx, - vbo_indirect_draw_func func) +const struct gl_vertex_buffer_binding * +_vbo_current_binding(const struct gl_context *ctx) { - struct vbo_context *vbo = vbo_context(ctx); - vbo->draw_indirect_prims = func; + const struct vbo_context *vbo = vbo_context_const(ctx); + return &vbo->binding; }