X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fvbo%2Fvbo_context.c;h=9cef64018ef3ebc578504f7de2b21af31b211446;hb=3aacfaf87eccee657ab9a5acc7bfe83b226f120b;hp=696a6fa1f177e210741a08de52f781563a73a3a4;hpb=bfcdb843830bba0190e00e35e3c5c18c4bdb5de1;p=mesa.git diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index 696a6fa1f17..9cef64018ef 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -25,172 +25,168 @@ * Keith Whitwell */ -#include "main/imports.h" -#include "main/mtypes.h" -#include "main/api_arrayelt.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 "util/u_memory.h" #include "vbo.h" -#include "vbo_context.h" +#include "vbo_private.h" -#define NR_MAT_ATTRIBS 12 -static GLuint check_size( const GLfloat *attr ) +static GLuint +check_size(const GLfloat *attr) { - if (attr[3] != 1.0) return 4; - if (attr[2] != 0.0) return 3; - if (attr[1] != 0.0) 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; } -static void init_legacy_currval(struct gl_context *ctx) +/** + * Helper for initializing a vertex array. + */ +static void +init_array(struct gl_context *ctx, struct gl_array_attributes *attrib, + unsigned size, const void *pointer) +{ + memset(attrib, 0, sizeof(*attrib)); + + vbo_set_vertex_format(&attrib->Format, size, GL_FLOAT); + attrib->Stride = 0; + attrib->Ptr = pointer; +} + + +/** + * 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) { struct vbo_context *vbo = vbo_context(ctx); - struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_POS]; GLuint i; - memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_FF_MAX); - - /* 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_client_array *cl = &arrays[i]; + const unsigned attr = VERT_ATTRIB_FF(i); + struct gl_array_attributes *attrib = &vbo->current[attr]; - /* Size will have to be determined at runtime: - */ - cl->Size = check_size(ctx->Current.Attrib[i]); - cl->Stride = 0; - cl->StrideB = 0; - cl->Enabled = 1; - cl->Type = GL_FLOAT; - cl->Format = GL_RGBA; - cl->Ptr = (const void *)ctx->Current.Attrib[i]; - cl->_ElementSize = cl->Size * sizeof(GLfloat); - _mesa_reference_buffer_object(ctx, &cl->BufferObj, - ctx->Shared->NullBufferObj); + init_array(ctx, attrib, check_size(ctx->Current.Attrib[attr]), + ctx->Current.Attrib[attr]); } } -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); - struct gl_client_array *arrays = &vbo->currval[VBO_ATTRIB_GENERIC0]; GLuint i; - memset(arrays, 0, sizeof(*arrays) * VERT_ATTRIB_GENERIC_MAX); - for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) { - struct gl_client_array *cl = &arrays[i]; + const unsigned attr = VBO_ATTRIB_GENERIC0 + i; + struct gl_array_attributes *attrib = &vbo->current[attr]; - /* This will have to be determined at runtime: - */ - cl->Size = 1; - cl->Type = GL_FLOAT; - cl->Format = GL_RGBA; - cl->Ptr = (const void *)ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + i]; - cl->Stride = 0; - cl->StrideB = 0; - cl->Enabled = 1; - cl->_ElementSize = cl->Size * sizeof(GLfloat); - _mesa_reference_buffer_object(ctx, &cl->BufferObj, - ctx->Shared->NullBufferObj); + init_array(ctx, attrib, 1, ctx->Current.Attrib[attr]); } } -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); - struct gl_client_array *arrays = - &vbo->currval[VBO_ATTRIB_MAT_FRONT_AMBIENT]; GLuint i; - assert(NR_MAT_ATTRIBS == MAT_ATTRIB_MAX); - - memset(arrays, 0, sizeof(*arrays) * NR_MAT_ATTRIBS); - /* Set up a constant (StrideB == 0) array for each current * attribute: */ - for (i = 0; i < NR_MAT_ATTRIBS; i++) { - struct gl_client_array *cl = &arrays[i]; + for (i = 0; i < MAT_ATTRIB_MAX; 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 * be determined at runtime: */ - switch (i - VERT_ATTRIB_GENERIC0) { + switch (i) { case MAT_ATTRIB_FRONT_SHININESS: case MAT_ATTRIB_BACK_SHININESS: - cl->Size = 1; - break; + size = 1; + break; case MAT_ATTRIB_FRONT_INDEXES: case MAT_ATTRIB_BACK_INDEXES: - cl->Size = 3; - break; + size = 3; + break; default: - cl->Size = 4; - break; + size = 4; + break; } - cl->Ptr = (const void *)ctx->Light.Material.Attrib[i]; - cl->Type = GL_FLOAT; - cl->Format = GL_RGBA; - cl->Stride = 0; - cl->StrideB = 0; - cl->Enabled = 1; - cl->_ElementSize = cl->Size * sizeof(GLfloat); - _mesa_reference_buffer_object(ctx, &cl->BufferObj, - ctx->Shared->NullBufferObj); + init_array(ctx, attrib, size, ctx->Light.Material.Attrib[i]); } } -GLboolean _vbo_CreateContext( struct gl_context *ctx ) +void +_vbo_install_exec_vtxfmt(struct gl_context *ctx) { - struct vbo_context *vbo = CALLOC_STRUCT(vbo_context); + struct vbo_context *vbo = vbo_context(ctx); - ctx->vbo_context = vbo; + _mesa_install_exec_vtxfmt(ctx, &vbo->exec.vtxfmt); +} - /* Initialize the arrayelt helper - */ - if (!ctx->aelt_context && - !_ae_create_context( ctx )) { - return GL_FALSE; - } - init_legacy_currval( ctx ); - init_generic_currval( ctx ); - init_mat_currval( ctx ); +void +vbo_exec_update_eval_maps(struct gl_context *ctx) +{ + struct vbo_context *vbo = vbo_context(ctx); + + vbo->exec.eval.recalculate_maps = GL_TRUE; +} - /* Build mappings from VERT_ATTRIB -> VBO_ATTRIB depending on type - * of vertex program active. - */ - { - GLuint i; - - /* identity mapping */ - for (i = 0; i < Elements(vbo->map_vp_none); i++) - vbo->map_vp_none[i] = i; - /* map material attribs to generic slots */ - for (i = 0; i < NR_MAT_ATTRIBS; i++) - vbo->map_vp_none[VERT_ATTRIB_GENERIC(i)] - = VBO_ATTRIB_MAT_FRONT_AMBIENT + i; - - for (i = 0; i < Elements(vbo->map_vp_arb); i++) - vbo->map_vp_arb[i] = i; - } +GLboolean +_vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects) +{ + struct vbo_context *vbo = &ctx->vbo_context; + + memset(vbo, 0, sizeof(*vbo)); + + vbo->binding.Offset = 0; + vbo->binding.Stride = 0; + vbo->binding.InstanceDivisor = 0; + + init_legacy_currval(ctx); + init_generic_currval(ctx); + init_mat_currval(ctx); + + /* make sure all VBO_ATTRIB_ values can fit in an unsigned byte */ + STATIC_ASSERT(VBO_ATTRIB_MAX <= 255); /* Hook our functions into exec and compile dispatch tables. These * 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_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(); @@ -198,40 +194,34 @@ 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 ); - 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); - free(vbo); - ctx->vbo_context = NULL; + _mesa_reference_vao(ctx, &vbo->VAO, 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]]; } + +const struct gl_vertex_buffer_binding * +_vbo_current_binding(const struct gl_context *ctx) +{ + const struct vbo_context *vbo = vbo_context_const(ctx); + return &vbo->binding; +}