The series looks great. Just a few minor things below. Reviewed-by: Brian Paul <bri...@vmware.com>
On 11/17/2018 05:14 AM, mathias.froehl...@gmx.net wrote: > From: Mathias Fröhlich <mathias.froehl...@web.de> > > Factor out struct gl_vertex_format from array attributes. > The data type is supposed to describe the type of a vertex > element. At this current stage the data type is only used > with the VAO, but actually is useful in various other places. > Due to the bitfields being used, special care needs to be > taken for the glGet code paths. > > Signed-off-by: Mathias Fröhlich <mathias.froehl...@web.de> > --- > src/mesa/drivers/dri/i965/brw_context.h | 2 +- > src/mesa/drivers/dri/i965/brw_draw.c | 14 ++-- > src/mesa/drivers/dri/i965/brw_draw_upload.c | 60 ++++++++--------- > src/mesa/drivers/dri/i965/genX_state_upload.c | 14 ++-- > src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 10 +-- > src/mesa/main/api_arrayelt.c | 34 +++++----- > src/mesa/main/arrayobj.c | 21 +++--- > src/mesa/main/draw.c | 13 ++-- > src/mesa/main/get.c | 15 ++++- > src/mesa/main/get_hash_params.py | 20 +++--- > src/mesa/main/mtypes.h | 27 +++++--- > src/mesa/main/varray.c | 64 ++++++++++--------- > src/mesa/main/varray.h | 20 ++++++ > src/mesa/state_tracker/st_atom.h | 2 +- > src/mesa/state_tracker/st_atom_array.c | 28 ++++---- > src/mesa/state_tracker/st_draw_feedback.c | 2 +- > src/mesa/tnl/t_draw.c | 22 +++---- > src/mesa/tnl/t_split_copy.c | 18 ++---- > src/mesa/vbo/vbo_context.c | 5 +- > src/mesa/vbo/vbo_exec_api.c | 13 ++-- > src/mesa/vbo/vbo_private.h | 10 +++ > src/mesa/vbo/vbo_save_api.c | 12 ++-- > src/mesa/vbo/vbo_save_draw.c | 14 ++-- > src/mesa/vbo/vbo_save_loopback.c | 2 +- > 24 files changed, 239 insertions(+), 203 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index 7fd15669eb..e5d57dd8df 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -1493,7 +1493,7 @@ gl_clip_plane *brw_select_clip_planes(struct gl_context > *ctx); > > /* brw_draw_upload.c */ > unsigned brw_get_vertex_surface_type(struct brw_context *brw, > - const struct gl_array_attributes > *glattr); > + const struct gl_vertex_format > *glformat); > > static inline unsigned > brw_get_index_type(unsigned index_size) > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c > b/src/mesa/drivers/dri/i965/brw_draw.c > index 8536c04010..f080a9fefc 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw.c > +++ b/src/mesa/drivers/dri/i965/brw_draw.c > @@ -303,16 +303,16 @@ brw_merge_inputs(struct brw_context *brw) > * 2_10_10_10_REV vertex formats. Set appropriate workaround flags. > */ > while (mask) { > - const struct gl_array_attributes *glattrib; > + const struct gl_vertex_format *glformat; > uint8_t wa_flags = 0; > > i = u_bit_scan64(&mask); > - glattrib = brw->vb.inputs[i].glattrib; > + glformat = &brw->vb.inputs[i].glattrib->Format; > > - switch (glattrib->Type) { > + switch (glformat->Type) { > > case GL_FIXED: > - wa_flags = glattrib->Size; > + wa_flags = glformat->Size; > break; > > case GL_INT_2_10_10_10_REV: > @@ -320,12 +320,12 @@ brw_merge_inputs(struct brw_context *brw) > /* fallthough */ > > case GL_UNSIGNED_INT_2_10_10_10_REV: > - if (glattrib->Format == GL_BGRA) > + if (glformat->Format == GL_BGRA) > wa_flags |= BRW_ATTRIB_WA_BGRA; > > - if (glattrib->Normalized) > + if (glformat->Normalized) > wa_flags |= BRW_ATTRIB_WA_NORMALIZE; > - else if (!glattrib->Integer) > + else if (!glformat->Integer) > wa_flags |= BRW_ATTRIB_WA_SCALE; > > break; > diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c > b/src/mesa/drivers/dri/i965/brw_draw_upload.c > index dc3022bc41..dfbc45fe93 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c > @@ -249,21 +249,21 @@ double_types(int size, GLboolean doubles) > */ > unsigned > brw_get_vertex_surface_type(struct brw_context *brw, > - const struct gl_array_attributes *glattrib) > + const struct gl_vertex_format *glformat) > { > - int size = glattrib->Size; > + int size = glformat->Size; > const struct gen_device_info *devinfo = &brw->screen->devinfo; > const bool is_ivybridge_or_older = > devinfo->gen <= 7 && !devinfo->is_baytrail && !devinfo->is_haswell; > > if (unlikely(INTEL_DEBUG & DEBUG_VERTS)) > fprintf(stderr, "type %s size %d normalized %d\n", > - _mesa_enum_to_string(glattrib->Type), > - glattrib->Size, glattrib->Normalized); > + _mesa_enum_to_string(glformat->Type), > + glformat->Size, glformat->Normalized); > > - if (glattrib->Integer) { > - assert(glattrib->Format == GL_RGBA); /* sanity check */ > - switch (glattrib->Type) { > + if (glformat->Integer) { > + assert(glformat->Format == GL_RGBA); /* sanity check */ > + switch (glformat->Type) { > case GL_INT: return int_types_direct[size]; > case GL_SHORT: > if (is_ivybridge_or_older && size == 3) > @@ -288,11 +288,11 @@ brw_get_vertex_surface_type(struct brw_context *brw, > return ubyte_types_direct[size]; > default: unreachable("not reached"); > } > - } else if (glattrib->Type == GL_UNSIGNED_INT_10F_11F_11F_REV) { > + } else if (glformat->Type == GL_UNSIGNED_INT_10F_11F_11F_REV) { > return ISL_FORMAT_R11G11B10_FLOAT; > - } else if (glattrib->Normalized) { > - switch (glattrib->Type) { > - case GL_DOUBLE: return double_types(size, glattrib->Doubles); > + } else if (glformat->Normalized) { > + switch (glformat->Type) { > + case GL_DOUBLE: return double_types(size, glformat->Doubles); > case GL_FLOAT: return float_types[size]; > case GL_HALF_FLOAT: > case GL_HALF_FLOAT_OES: > @@ -306,7 +306,7 @@ brw_get_vertex_surface_type(struct brw_context *brw, > case GL_UNSIGNED_INT: return uint_types_norm[size]; > case GL_UNSIGNED_SHORT: return ushort_types_norm[size]; > case GL_UNSIGNED_BYTE: > - if (glattrib->Format == GL_BGRA) { > + if (glformat->Format == GL_BGRA) { > /* See GL_EXT_vertex_array_bgra */ > assert(size == 4); > return ISL_FORMAT_B8G8R8A8_UNORM; > @@ -330,7 +330,7 @@ brw_get_vertex_surface_type(struct brw_context *brw, > case GL_INT_2_10_10_10_REV: > assert(size == 4); > if (devinfo->gen >= 8 || devinfo->is_haswell) { > - return glattrib->Format == GL_BGRA > + return glformat->Format == GL_BGRA > ? ISL_FORMAT_B10G10R10A2_SNORM > : ISL_FORMAT_R10G10B10A2_SNORM; > } > @@ -338,7 +338,7 @@ brw_get_vertex_surface_type(struct brw_context *brw, > case GL_UNSIGNED_INT_2_10_10_10_REV: > assert(size == 4); > if (devinfo->gen >= 8 || devinfo->is_haswell) { > - return glattrib->Format == GL_BGRA > + return glformat->Format == GL_BGRA > ? ISL_FORMAT_B10G10R10A2_UNORM > : ISL_FORMAT_R10G10B10A2_UNORM; > } > @@ -352,26 +352,26 @@ brw_get_vertex_surface_type(struct brw_context *brw, > * like to use here, so upload everything as UINT and fix > * it in the shader > */ > - if (glattrib->Type == GL_INT_2_10_10_10_REV) { > + if (glformat->Type == GL_INT_2_10_10_10_REV) { > assert(size == 4); > if (devinfo->gen >= 8 || devinfo->is_haswell) { > - return glattrib->Format == GL_BGRA > + return glformat->Format == GL_BGRA > ? ISL_FORMAT_B10G10R10A2_SSCALED > : ISL_FORMAT_R10G10B10A2_SSCALED; > } > return ISL_FORMAT_R10G10B10A2_UINT; > - } else if (glattrib->Type == GL_UNSIGNED_INT_2_10_10_10_REV) { > + } else if (glformat->Type == GL_UNSIGNED_INT_2_10_10_10_REV) { > assert(size == 4); > if (devinfo->gen >= 8 || devinfo->is_haswell) { > - return glattrib->Format == GL_BGRA > + return glformat->Format == GL_BGRA > ? ISL_FORMAT_B10G10R10A2_USCALED > : ISL_FORMAT_R10G10B10A2_USCALED; > } > return ISL_FORMAT_R10G10B10A2_UINT; > } > - assert(glattrib->Format == GL_RGBA); /* sanity check */ > - switch (glattrib->Type) { > - case GL_DOUBLE: return double_types(size, glattrib->Doubles); > + assert(glformat->Format == GL_RGBA); /* sanity check */ > + switch (glformat->Type) { > + case GL_DOUBLE: return double_types(size, glformat->Doubles); > case GL_FLOAT: return float_types[size]; > case GL_HALF_FLOAT: > case GL_HALF_FLOAT_OES: > @@ -407,6 +407,7 @@ copy_array_to_vbo_array(struct brw_context *brw, > { > const struct gl_vertex_buffer_binding *glbinding = element->glbinding; > const struct gl_array_attributes *glattrib = element->glattrib; > + const struct gl_vertex_format *glformat = &glattrib->Format; > const int src_stride = glbinding->Stride; > > /* If the source stride is zero, we just want to upload the current > @@ -414,11 +415,11 @@ copy_array_to_vbo_array(struct brw_context *brw, > * to replicate it out. > */ > if (src_stride == 0) { > - brw_upload_data(&brw->upload, glattrib->Ptr, glattrib->_ElementSize, > - glattrib->_ElementSize, &buffer->bo, &buffer->offset); > + brw_upload_data(&brw->upload, glattrib->Ptr, glformat->_ElementSize, > + glformat->_ElementSize, &buffer->bo, &buffer->offset); > > buffer->stride = 0; > - buffer->size = glattrib->_ElementSize; > + buffer->size = glformat->_ElementSize; > return; > } > > @@ -531,13 +532,13 @@ brw_prepare_vertices(struct brw_context *brw) > start = offset + glbinding->Stride * brw->baseinstance; > range = (glbinding->Stride * ((brw->num_instances - 1) / > glbinding->InstanceDivisor) + > - glattrib->_ElementSize); > + glattrib->Format._ElementSize); > } > } else { > if (brw->vb.index_bounds_valid) { > start = offset + min_index * glbinding->Stride; > range = (glbinding->Stride * (max_index - min_index) + > - glattrib->_ElementSize); > + glattrib->Format._ElementSize); > } > } > > @@ -594,7 +595,8 @@ brw_prepare_vertices(struct brw_context *brw) > else if (interleaved != glbinding->Stride || > glbinding->InstanceDivisor != 0 || > glattrib->Ptr < ptr || > - (uintptr_t)(glattrib->Ptr - ptr) + glattrib->_ElementSize > > interleaved) > + (uintptr_t)(glattrib->Ptr - ptr) + > + glattrib->Format._ElementSize > interleaved) > { > /* If our stride is different from the first attribute's stride, > * or if we are using an instance divisor or if the first > @@ -677,7 +679,7 @@ brw_prepare_vertices(struct brw_context *brw) > const struct gl_array_attributes *glattrib = upload[i]->glattrib; > if (glbinding->InstanceDivisor == 0) { > copy_array_to_vbo_array(brw, upload[i], min_index, max_index, > - buffer, glattrib->_ElementSize); > + buffer, glattrib->Format._ElementSize); > } else { > /* This is an instanced attribute, since its InstanceDivisor > * is not zero. Therefore, its data will be stepped after the > @@ -686,7 +688,7 @@ brw_prepare_vertices(struct brw_context *brw) > uint32_t instanced_attr_max_index = > (brw->num_instances - 1) / glbinding->InstanceDivisor; > copy_array_to_vbo_array(brw, upload[i], 0, > instanced_attr_max_index, > - buffer, glattrib->_ElementSize); > + buffer, glattrib->Format._ElementSize); > } > buffer->offset -= delta * buffer->stride; > buffer->size += delta * buffer->stride; > diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c > b/src/mesa/drivers/dri/i965/genX_state_upload.c > index 5acd092292..8e3fcbf12e 100644 > --- a/src/mesa/drivers/dri/i965/genX_state_upload.c > +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c > @@ -620,7 +620,7 @@ genX(emit_vertices)(struct brw_context *brw) > for (unsigned i = 0; i < brw->vb.nr_enabled; i++) { > struct brw_vertex_element *input = brw->vb.enabled[i]; > const struct gl_array_attributes *glattrib = input->glattrib; > - uint32_t format = brw_get_vertex_surface_type(brw, glattrib); > + uint32_t format = brw_get_vertex_surface_type(brw, &glattrib->Format); > > if (uploads_needed(format, input->is_dual_slot) > 1) > nr_elements++; > @@ -713,7 +713,7 @@ genX(emit_vertices)(struct brw_context *brw) > for (i = 0; i < brw->vb.nr_enabled; i++) { > const struct brw_vertex_element *input = brw->vb.enabled[i]; > const struct gl_array_attributes *glattrib = input->glattrib; > - uint32_t format = brw_get_vertex_surface_type(brw, glattrib); > + uint32_t format = brw_get_vertex_surface_type(brw, &glattrib->Format); > uint32_t comp0 = VFCOMP_STORE_SRC; > uint32_t comp1 = VFCOMP_STORE_SRC; > uint32_t comp2 = VFCOMP_STORE_SRC; > @@ -756,16 +756,16 @@ genX(emit_vertices)(struct brw_context *brw) > > const struct gl_array_attributes *glattrib = input->glattrib; > const int size = (GEN_GEN < 8 && is_passthru_format(format)) ? > - upload_format_size(upload_format) : glattrib->Size; > + upload_format_size(upload_format) : glattrib->Format.Size; > > switch (size) { > case 0: comp0 = VFCOMP_STORE_0; > case 1: comp1 = VFCOMP_STORE_0; > case 2: comp2 = VFCOMP_STORE_0; > case 3: > - if (GEN_GEN >= 8 && glattrib->Doubles) { > + if (GEN_GEN >= 8 && glattrib->Format.Doubles) { > comp3 = VFCOMP_STORE_0; > - } else if (glattrib->Integer) { > + } else if (glattrib->Format.Integer) { > comp3 = VFCOMP_STORE_1_INT; > } else { > comp3 = VFCOMP_STORE_1_FP; > @@ -790,7 +790,7 @@ genX(emit_vertices)(struct brw_context *brw) > * to be specified as VFCOMP_STORE_0 in order to output a > 256-bit > * vertex element." > */ > - if (glattrib->Doubles && !input->is_dual_slot) { > + if (glattrib->Format.Doubles && !input->is_dual_slot) { > /* Store vertex elements which correspond to double and dvec2 > vertex > * shader inputs as 128-bit vertex elements, instead of > 256-bits. > */ > @@ -877,7 +877,7 @@ genX(emit_vertices)(struct brw_context *brw) > #if GEN_GEN >= 6 > if (gen6_edgeflag_input) { > const struct gl_array_attributes *glattrib = > gen6_edgeflag_input->glattrib; > - const uint32_t format = brw_get_vertex_surface_type(brw, glattrib); > + const uint32_t format = brw_get_vertex_surface_type(brw, > &glattrib->Format); > > struct GENX(VERTEX_ELEMENT_STATE) elem_state = { > .Valid = true, > diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > index 97ff07808b..f037bd2015 100644 > --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c > @@ -49,7 +49,7 @@ get_array_stride(struct gl_context *ctx, const struct > tnl_vertex_array *a) > if (render->mode == VBO && !_mesa_is_bufferobj(binding->BufferObj)) { > const struct gl_array_attributes *attrib = a->VertexAttrib; > /* Pack client buffers. */ > - return align(attrib->_ElementSize, 4); > + return align(attrib->Format._ElementSize, 4); > } else { > return binding->Stride; > } > @@ -86,7 +86,7 @@ vbo_init_arrays(struct gl_context *ctx, const struct > _mesa_index_buffer *ib, > > nouveau_init_array(&render->attrs[attr], attr, > get_array_stride(ctx, array), > - attrib->Size, attrib->Type, > + attrib->Format.Size, attrib->Format.Type, > imm ? binding->BufferObj : NULL, > p, imm, ctx); > } > @@ -154,8 +154,8 @@ vbo_emit_attr(struct gl_context *ctx, const struct > tnl_vertex_array *arrays, > return; > > /* Constant attribute. */ > - nouveau_init_array(a, attr, binding->Stride, attrib->Size, > - attrib->Type, binding->BufferObj, p, > + nouveau_init_array(a, attr, binding->Stride, > attrib->Format.Size, > + attrib->Format.Type, binding->BufferObj, p, > GL_TRUE, ctx); > EMIT_IMM(ctx, a, 0); > nouveau_deinit_array(a); > @@ -166,7 +166,7 @@ vbo_emit_attr(struct gl_context *ctx, const struct > tnl_vertex_array *arrays, > > if (render->mode == VBO) { > render->map[info->vbo_index] = attr; > - render->vertex_size += attrib->_ElementSize; > + render->vertex_size += attrib->Format._ElementSize; > render->attr_count = MAX2(render->attr_count, > info->vbo_index + 1); > } else { > diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c > index 25cbc5326f..2b59c478d9 100644 > --- a/src/mesa/main/api_arrayelt.c > +++ b/src/mesa/main/api_arrayelt.c > @@ -1575,7 +1575,7 @@ _ae_update_state(struct gl_context *ctx) > if (vao->Enabled & VERT_BIT_COLOR_INDEX) { > aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)]; > + aa->offset = IndexFuncs[TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > @@ -1591,7 +1591,7 @@ _ae_update_state(struct gl_context *ctx) > if (vao->Enabled & VERT_BIT_NORMAL) { > aa->array = &vao->VertexAttrib[VERT_ATTRIB_NORMAL]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)]; > + aa->offset = NormalFuncs[TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > @@ -1599,7 +1599,7 @@ _ae_update_state(struct gl_context *ctx) > if (vao->Enabled & VERT_BIT_COLOR0) { > aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR0]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; > + aa->offset = > ColorFuncs[aa->array->Format.Size-3][TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > @@ -1607,7 +1607,7 @@ _ae_update_state(struct gl_context *ctx) > if (vao->Enabled & VERT_BIT_COLOR1) { > aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR1]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)]; > + aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > @@ -1615,7 +1615,7 @@ _ae_update_state(struct gl_context *ctx) > if (vao->Enabled & VERT_BIT_FOG) { > aa->array = &vao->VertexAttrib[VERT_ATTRIB_FOG]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)]; > + aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > @@ -1629,10 +1629,10 @@ _ae_update_state(struct gl_context *ctx) > */ > at->array = attribArray; > at->binding = &vao->BufferBinding[attribArray->BufferBindingIndex]; > - assert(!at->array->Normalized); > - at->func = AttribFuncsNV[at->array->Normalized] > - [at->array->Size-1] > - [TYPE_IDX(at->array->Type)]; > + assert(!at->array->Format.Normalized); > + at->func = AttribFuncsNV[at->array->Format.Normalized] > + [at->array->Format.Size-1] > + [TYPE_IDX(at->array->Format.Type)]; > at->index = VERT_ATTRIB_TEX0 + i; > check_vbo(actx, at->binding->BufferObj); > at++; > @@ -1652,18 +1652,18 @@ _ae_update_state(struct gl_context *ctx) > * change from one execution of _ae_ArrayElement() to > * the next. Doing so caused UT to break. > */ > - if (at->array->Doubles) > + if (at->array->Format.Doubles) > intOrNorm = 3; > - else if (at->array->Integer) > + else if (at->array->Format.Integer) > intOrNorm = 2; > - else if (at->array->Normalized) > + else if (at->array->Format.Normalized) > intOrNorm = 1; > else > intOrNorm = 0; > > at->func = AttribFuncsARB[intOrNorm] > - [at->array->Size-1] > - [TYPE_IDX(at->array->Type)]; > + [at->array->Format.Size-1] > + [TYPE_IDX(at->array->Format.Type)]; > > at->index = i; > check_vbo(actx, at->binding->BufferObj); > @@ -1678,15 +1678,15 @@ _ae_update_state(struct gl_context *ctx) > */ > aa->array = &vao->VertexAttrib[VERT_ATTRIB_GENERIC0]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - assert(aa->array->Size >= 2); /* XXX fix someday? */ > - aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; > + assert(aa->array->Format.Size >= 2); /* XXX fix someday? */ > + aa->offset = > VertexFuncs[aa->array->Format.Size-2][TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > else if (vao->Enabled & VERT_BIT_POS) { > aa->array = &vao->VertexAttrib[VERT_ATTRIB_POS]; > aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; > - aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; > + aa->offset = > VertexFuncs[aa->array->Format.Size-2][TYPE_IDX(aa->array->Format.Type)]; > check_vbo(actx, aa->binding->BufferObj); > aa++; > } > diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c > index f80bf2c949..bfd6fce679 100644 > --- a/src/mesa/main/arrayobj.c > +++ b/src/mesa/main/arrayobj.c > @@ -385,22 +385,17 @@ init_array(struct gl_context *ctx, > assert(index < ARRAY_SIZE(vao->BufferBinding)); > struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[index]; > > - array->Size = size; > - array->Type = type; > - array->Format = GL_RGBA; /* only significant for GL_EXT_vertex_array_bgra > */ > + _mesa_set_vertex_format(&array->Format, size, type, GL_RGBA, > + GL_FALSE, GL_FALSE, GL_FALSE); > array->Stride = 0; > array->Ptr = NULL; > array->RelativeOffset = 0; > - array->Normalized = GL_FALSE; > - array->Integer = GL_FALSE; > - array->Doubles = GL_FALSE; > - array->_ElementSize = size * _mesa_sizeof_type(type); > ASSERT_BITFIELD_SIZE(struct gl_array_attributes, BufferBindingIndex, > VERT_ATTRIB_MAX - 1); > array->BufferBindingIndex = index; > > binding->Offset = 0; > - binding->Stride = array->_ElementSize; > + binding->Stride = array->Format._ElementSize; > binding->BufferObj = NULL; > binding->_BoundArrays = BITFIELD_BIT(index); > > @@ -756,7 +751,7 @@ _mesa_update_vao_derived_arrays(struct gl_context *ctx, > GLbitfield eff_bound_arrays = bound; > > const GLubyte *ptr = attrib->Ptr; > - unsigned vertex_end = attrib->_ElementSize; > + unsigned vertex_end = attrib->Format._ElementSize; > > /* Walk other user space arrays and see which are interleaved > * using the same binding parameters. > @@ -778,9 +773,10 @@ _mesa_update_vao_derived_arrays(struct gl_context *ctx, > if (binding->InstanceDivisor != binding2->InstanceDivisor) > continue; > if (ptr <= attrib2->Ptr) { > - if (ptr + binding->Stride < attrib2->Ptr + > attrib2->_ElementSize) > + if (ptr + binding->Stride < attrib2->Ptr + > + attrib2->Format._ElementSize) > continue; > - unsigned end = attrib2->Ptr + attrib2->_ElementSize - ptr; > + unsigned end = attrib2->Ptr + attrib2->Format._ElementSize - > ptr; > vertex_end = MAX2(vertex_end, end); > } else { > if (attrib2->Ptr + binding->Stride < ptr + vertex_end) > @@ -823,7 +819,8 @@ _mesa_update_vao_derived_arrays(struct gl_context *ctx, > /* Query the original api defined attrib/binding information ... */ > const unsigned char *const map =_mesa_vao_attribute_map[mode]; > if (vao->Enabled & VERT_BIT(map[attr])) { > - const struct gl_array_attributes *attrib = > &vao->VertexAttrib[map[attr]]; > + const struct gl_array_attributes *attrib = > + &vao->VertexAttrib[map[attr]]; > const struct gl_vertex_buffer_binding *binding = > &vao->BufferBinding[attrib->BufferBindingIndex]; > /* ... and compare that with the computed attrib/binding */ > diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c > index 313df6aa8b..bfc4b9c937 100644 > --- a/src/mesa/main/draw.c > +++ b/src/mesa/main/draw.c > @@ -82,18 +82,19 @@ check_array_data(struct gl_context *ctx, struct > gl_vertex_array_object *vao, > data = ADD_POINTERS(_mesa_vertex_attrib_address(array, binding), > bo->Mappings[MAP_INTERNAL].Pointer); > } > - switch (array->Type) { > + switch (array->Format.Type) { > case GL_FLOAT: > { > GLfloat *f = (GLfloat *) ((GLubyte *) data + binding->Stride * > j); > GLint k; > - for (k = 0; k < array->Size; k++) { > + for (k = 0; k < array->Format.Size; k++) { > if (IS_INF_OR_NAN(f[k]) || f[k] >= 1.0e20F || f[k] <= > -1.0e10F) { > printf("Bad array data:\n"); > printf(" Element[%u].%u = %f\n", j, k, f[k]); > printf(" Array %u at %p\n", attrib, (void *) array); > printf(" Type 0x%x, Size %d, Stride %d\n", > - array->Type, array->Size, binding->Stride); > + array->Format.Type, array->Format.Size, > + binding->Stride); > printf(" Address/offset %p in Buffer Object %u\n", > array->Ptr, bo->Name); > f[k] = 1.0F; /* XXX replace the bad value! */ > @@ -288,7 +289,7 @@ print_draw_arrays(struct gl_context *ctx, > printf("attr %s: size %d stride %d " > "ptr %p Bufobj %u\n", > gl_vert_attrib_name((gl_vert_attrib) i), > - array->Size, binding->Stride, > + array->Format.Size, binding->Stride, > array->Ptr, bufObj->Name); > > if (_mesa_is_bufferobj(bufObj)) { > @@ -299,7 +300,7 @@ print_draw_arrays(struct gl_context *ctx, > _mesa_vertex_attrib_address(array, binding); > > unsigned multiplier; > - switch (array->Type) { > + switch (array->Format.Type) { > case GL_DOUBLE: > case GL_INT64_ARB: > case GL_UNSIGNED_INT64_ARB: > @@ -313,7 +314,7 @@ print_draw_arrays(struct gl_context *ctx, > int *k = (int *) f; > int i = 0; > int n = (count - 1) * (binding->Stride / (4 * multiplier)) > - + array->Size; > + + array->Format.Size; > if (n > 32) > n = 32; > printf(" Data at offset %d:\n", offset); > diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c > index ac17539f09..ee77c45d03 100644 > --- a/src/mesa/main/get.c > +++ b/src/mesa/main/get.c > @@ -755,13 +755,22 @@ find_custom_value(struct gl_context *ctx, const struct > value_desc *d, union valu > v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_POINT_SIZE); > break; > > - case GL_TEXTURE_COORD_ARRAY_SIZE: > case GL_TEXTURE_COORD_ARRAY_TYPE: > case GL_TEXTURE_COORD_ARRAY_STRIDE: > array = > &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)]; > v->value_int = *(GLuint *) ((char *) array + d->offset); > break; > > + case GL_TEXTURE_COORD_ARRAY_SIZE: > + array = > &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)]; > + v->value_int = array->Format.Size; > + break; > + > + case GL_VERTEX_ARRAY_SIZE: > + array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POS]; > + v->value_int = array->Format.Size; > + break; > + > case GL_ACTIVE_TEXTURE_ARB: > v->value_int = GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit; > break; > @@ -969,11 +978,11 @@ find_custom_value(struct gl_context *ctx, const struct > value_desc *d, union valu > /* ARB_vertex_array_bgra */ > case GL_COLOR_ARRAY_SIZE: > array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0]; > - v->value_int = array->Format == GL_BGRA ? GL_BGRA : array->Size; > + v->value_int = array->Format.Format == GL_BGRA ? GL_BGRA : > array->Format.Size; > break; > case GL_SECONDARY_COLOR_ARRAY_SIZE: > array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1]; > - v->value_int = array->Format == GL_BGRA ? GL_BGRA : array->Size; > + v->value_int = array->Format.Format == GL_BGRA ? GL_BGRA : > array->Format.Size; > break; > > /* ARB_copy_buffer */ > diff --git a/src/mesa/main/get_hash_params.py > b/src/mesa/main/get_hash_params.py > index ec5eef5f19..0b8ec9ea0b 100644 > --- a/src/mesa/main/get_hash_params.py > +++ b/src/mesa/main/get_hash_params.py > @@ -212,19 +212,19 @@ descriptor=[ > [ "TEXTURE_MATRIX", "LOC_CUSTOM, TYPE_MATRIX, 0, > extra_valid_texture_unit" ], > [ "TEXTURE_STACK_DEPTH", "LOC_CUSTOM, TYPE_INT, 0, > extra_valid_texture_unit" ], > [ "VERTEX_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "VERTEX_ARRAY_SIZE", "ARRAY_UBYTE(VertexAttrib[VERT_ATTRIB_POS].Size), > NO_EXTRA" ], > - [ "VERTEX_ARRAY_TYPE", "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_POS].Type), > NO_EXTRA" ], > + [ "VERTEX_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ], > + [ "VERTEX_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_POS].Format.Type), NO_EXTRA" ], > [ "VERTEX_ARRAY_STRIDE", > "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_POS].Stride), NO_EXTRA" ], > [ "NORMAL_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "NORMAL_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_NORMAL].Type), NO_EXTRA" ], > + [ "NORMAL_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_NORMAL].Format.Type), NO_EXTRA" ], > [ "NORMAL_ARRAY_STRIDE", > "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_NORMAL].Stride), NO_EXTRA" ], > [ "COLOR_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > [ "COLOR_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ], > - [ "COLOR_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR0].Type), NO_EXTRA" ], > + [ "COLOR_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR0].Format.Type), NO_EXTRA" ], > [ "COLOR_ARRAY_STRIDE", > "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_COLOR0].Stride), NO_EXTRA" ], > [ "TEXTURE_COORD_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "TEXTURE_COORD_ARRAY_SIZE", "LOC_CUSTOM, TYPE_UBYTE, offsetof(struct > gl_array_attributes, Size), NO_EXTRA" ], > - [ "TEXTURE_COORD_ARRAY_TYPE", "LOC_CUSTOM, TYPE_ENUM16, offsetof(struct > gl_array_attributes, Type), NO_EXTRA" ], > + [ "TEXTURE_COORD_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ], > + [ "TEXTURE_COORD_ARRAY_TYPE", "LOC_CUSTOM, TYPE_ENUM16, offsetof(struct > gl_array_attributes, Format.Type), NO_EXTRA" ], > [ "TEXTURE_COORD_ARRAY_STRIDE", "LOC_CUSTOM, TYPE_SHORT, offsetof(struct > gl_array_attributes, Stride), NO_EXTRA" ], > > # GL_ARB_multitexture > @@ -254,7 +254,7 @@ descriptor=[ > { "apis": ["GLES"], "params": [ > # OES_point_size_array > [ "POINT_SIZE_ARRAY_OES", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "POINT_SIZE_ARRAY_TYPE_OES", > "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Type, TYPE_ENUM16), > NO_EXTRA" ], > + [ "POINT_SIZE_ARRAY_TYPE_OES", > "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Format.Type, TYPE_ENUM16), > NO_EXTRA" ], > [ "POINT_SIZE_ARRAY_STRIDE_OES", > "ARRAY_FIELD(VertexAttrib[VERT_ATTRIB_POINT_SIZE].Stride, TYPE_SHORT), > NO_EXTRA" ], > [ "POINT_SIZE_ARRAY_BUFFER_BINDING_OES", "LOC_CUSTOM, TYPE_INT, 0, > NO_EXTRA" ], > ]}, > @@ -794,7 +794,7 @@ descriptor=[ > [ "NORMAL_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ], > [ "COLOR_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ], > [ "INDEX_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "INDEX_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Type), NO_EXTRA" ], > + [ "INDEX_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Format.Type), NO_EXTRA" ], > [ "INDEX_ARRAY_STRIDE", > "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Stride), NO_EXTRA" ], > [ "INDEX_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ], > [ "TEXTURE_COORD_ARRAY_COUNT_EXT", "CONST(0), NO_EXTRA" ], > @@ -828,14 +828,14 @@ descriptor=[ > [ "COLOR_SUM", "CONTEXT_BOOL(Fog.ColorSumEnabled), NO_EXTRA" ], > [ "CURRENT_SECONDARY_COLOR", > "CONTEXT_FIELD(Current.Attrib[VERT_ATTRIB_COLOR1][0], TYPE_FLOATN_4), > extra_flush_current" ], > [ "SECONDARY_COLOR_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "SECONDARY_COLOR_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR1].Type), NO_EXTRA" ], > + [ "SECONDARY_COLOR_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_COLOR1].Format.Type), NO_EXTRA" ], > [ "SECONDARY_COLOR_ARRAY_STRIDE", > "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_COLOR1].Stride), NO_EXTRA" ], > [ "SECONDARY_COLOR_ARRAY_SIZE", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ], > > # GL_EXT_fog_coord > [ "CURRENT_FOG_COORDINATE", > "CONTEXT_FLOAT(Current.Attrib[VERT_ATTRIB_FOG][0]), extra_flush_current" ], > [ "FOG_COORDINATE_ARRAY", "LOC_CUSTOM, TYPE_BOOLEAN, 0, NO_EXTRA" ], > - [ "FOG_COORDINATE_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_FOG].Type), NO_EXTRA" ], > + [ "FOG_COORDINATE_ARRAY_TYPE", > "ARRAY_ENUM16(VertexAttrib[VERT_ATTRIB_FOG].Format.Type), NO_EXTRA" ], > [ "FOG_COORDINATE_ARRAY_STRIDE", > "ARRAY_SHORT(VertexAttrib[VERT_ATTRIB_FOG].Stride), NO_EXTRA" ], > [ "FOG_COORDINATE_SOURCE", "CONTEXT_ENUM16(Fog.FogCoordinateSource), > NO_EXTRA" ], > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index da6a261688..421b078337 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -456,6 +456,21 @@ struct gl_colorbuffer_attrib > }; > > > +/** > + * Vertex format to describe a vertex element. > + */ > +struct gl_vertex_format > +{ > + GLenum16 Type; /**< datatype: GL_FLOAT, GL_INT, etc */ > + GLenum16 Format; /**< default: GL_RGBA, but may be GL_BGRA */ > + GLubyte Size:5; /**< components per element (1,2,3,4) */ > + unsigned char Normalized:1; /**< GL_ARB_vertex_program */ > + unsigned char Integer:1; /**< Integer-valued? */ > + unsigned char Doubles:1; /**< double values are not converted to > floats */ > + unsigned char _ElementSize; /**< Size of each element in bytes */ GLubyte ? > +}; > + > + > /** > * Current attribute group (GL_CURRENT_BIT). > */ > @@ -1419,14 +1434,10 @@ struct gl_array_attributes > const GLubyte *Ptr; > /** Offset of the first element relative to the binding offset */ > GLuint RelativeOffset; > - GLshort Stride; /**< Stride as specified with gl*Pointer() */ > - GLenum16 Type; /**< Datatype: GL_FLOAT, GL_INT, etc */ > - GLenum16 Format; /**< Default: GL_RGBA, but may be GL_BGRA */ > - GLubyte Size; /**< Components per element (1,2,3,4) */ > - unsigned Normalized:1; /**< Fixed-point values are normalized when > converted to floats */ > - unsigned Integer:1; /**< Fixed-point values are not converted to > floats */ > - unsigned Doubles:1; /**< double precision values are not converted > to floats */ > - unsigned _ElementSize:8; /**< Size of each element in bytes */ > + /** Vertex format */ > + struct gl_vertex_format Format; > + /** Stride as specified with gl*Pointer() */ > + GLshort Stride; > /** Index into gl_vertex_array_object::BufferBinding[] array */ > unsigned BufferBindingIndex:6; > > diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c > index a6d00c6ef9..2507e5338c 100644 > --- a/src/mesa/main/varray.c > +++ b/src/mesa/main/varray.c > @@ -33,6 +33,7 @@ > #include "context.h" > #include "enable.h" > #include "enums.h" > +#include "glformats.h" > #include "hash.h" > #include "image.h" > #include "macros.h" > @@ -243,6 +244,24 @@ vertex_binding_divisor(struct gl_context *ctx, > } > > > +void > +_mesa_set_vertex_format(struct gl_vertex_format *vertex_format, > + GLubyte size, GLenum16 type, GLenum16 format, > + GLboolean normalized, GLboolean integer, > + GLboolean doubles) > +{ > + assert(size <= 4); > + vertex_format->Type = type; > + vertex_format->Format = format; > + vertex_format->Size = size; > + vertex_format->Normalized = normalized; > + vertex_format->Integer = integer; > + vertex_format->Doubles = doubles; > + vertex_format->_ElementSize = _mesa_bytes_per_vertex_attrib(size, type); > + assert(vertex_format->_ElementSize <= 4*sizeof(double)); > +} > + > + > /** > * Examine the API profile and extensions to determine which types are legal > * for vertex arrays. This is called once from update_array_format(). > @@ -330,22 +349,13 @@ _mesa_update_array_format(struct gl_context *ctx, > GLuint relativeOffset) > { > struct gl_array_attributes *const array = &vao->VertexAttrib[attrib]; > - GLint elementSize; > > assert(!vao->SharedAndImmutable); > assert(size <= 4); > > - elementSize = _mesa_bytes_per_vertex_attrib(size, type); > - assert(elementSize != -1); > - > - array->Size = size; > - array->Type = type; > - array->Format = format; > - array->Normalized = normalized; > - array->Integer = integer; > - array->Doubles = doubles; > array->RelativeOffset = relativeOffset; > - array->_ElementSize = elementSize; > + _mesa_set_vertex_format(&array->Format, size, type, format, > + normalized, integer, doubles); > > vao->NewArrays |= vao->Enabled & VERT_BIT(attrib); > if (vao == ctx->Array.VAO) > @@ -609,7 +619,8 @@ update_array(struct gl_context *ctx, > array->Ptr = ptr; > > /* Update the vertex buffer binding */ > - GLsizei effectiveStride = stride != 0 ? stride : array->_ElementSize; > + GLsizei effectiveStride = stride != 0 ? > + stride : array->Format._ElementSize; > _mesa_bind_vertex_buffer(ctx, vao, attrib, > ctx->Array.ArrayBufferObj, (GLintptr) ptr, > effectiveStride); > @@ -1269,25 +1280,25 @@ get_vertex_array_attrib(struct gl_context *ctx, > case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: > return !!(vao->Enabled & VERT_BIT_GENERIC(index)); > case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: > - return (array->Format == GL_BGRA) ? GL_BGRA : array->Size; > + return (array->Format.Format == GL_BGRA) ? GL_BGRA : > array->Format.Size; > case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: > return array->Stride; > case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: > - return array->Type; > + return array->Format.Type; > case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: > - return array->Normalized; > + return array->Format.Normalized; > case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: > return vao->BufferBinding[array->BufferBindingIndex].BufferObj->Name; > case GL_VERTEX_ATTRIB_ARRAY_INTEGER: > if ((_mesa_is_desktop_gl(ctx) > && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4)) > || _mesa_is_gles3(ctx)) { > - return array->Integer; > + return array->Format.Integer; > } > goto error; > case GL_VERTEX_ATTRIB_ARRAY_LONG: > if (_mesa_is_desktop_gl(ctx)) { > - return array->Doubles; > + return array->Format.Doubles; > } > goto error; > case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB: > @@ -2771,17 +2782,11 @@ _mesa_copy_vertex_attrib_array(struct gl_context *ctx, > struct gl_array_attributes *dst, > const struct gl_array_attributes *src) > { > - dst->Size = src->Size; > - dst->Type = src->Type; > - dst->Format = src->Format; > - dst->BufferBindingIndex = src->BufferBindingIndex; > - dst->RelativeOffset = src->RelativeOffset; > - dst->Format = src->Format; > - dst->Integer = src->Integer; > - dst->Doubles = src->Doubles; > - dst->Normalized = src->Normalized; > dst->Ptr = src->Ptr; > - dst->_ElementSize = src->_ElementSize; > + dst->RelativeOffset = src->RelativeOffset; > + _mesa_copy_vertex_format(&dst->Format, &src->Format); > + dst->Stride = src->Stride; > + dst->BufferBindingIndex = src->BufferBindingIndex; > dst->_EffBufferBindingIndex = src->_EffBufferBindingIndex; > dst->_EffRelativeOffset = src->_EffRelativeOffset; > } > @@ -2823,8 +2828,9 @@ _mesa_print_arrays(struct gl_context *ctx) > fprintf(stderr, " %s: Ptr=%p, Type=%s, Size=%d, ElemSize=%u, " > "Stride=%d, Buffer=%u(Size %lu)\n", > gl_vert_attrib_name((gl_vert_attrib)i), > - array->Ptr, _mesa_enum_to_string(array->Type), array->Size, > - array->_ElementSize, binding->Stride, bo->Name, > + array->Ptr, _mesa_enum_to_string(array->Format.Type), > + array->Format.Size, > + array->Format._ElementSize, binding->Stride, bo->Name, > (unsigned long) bo->Size); > } > } > diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h > index 823e4f408b..fcb688f89f 100644 > --- a/src/mesa/main/varray.h > +++ b/src/mesa/main/varray.h > @@ -29,6 +29,26 @@ > > #include "bufferobj.h" > > +void > +_mesa_set_vertex_format(struct gl_vertex_format *vertex_format, > + GLubyte size, GLenum16 type, GLenum16 format, > + GLboolean normalized, GLboolean integer, > + GLboolean doubles); > + > + > +static inline void > +_mesa_copy_vertex_format(struct gl_vertex_format *dst, > + const struct gl_vertex_format *src) > +{ > + dst->Type = src->Type; > + dst->Format = src->Format; > + dst->Size = src->Size; > + dst->Normalized = src->Normalized; > + dst->Integer = src->Integer; > + dst->Doubles = src->Doubles; > + dst->_ElementSize = src->_ElementSize; > +} Do we really need this function? Can't we just use ordinary assignments? > + > > /** > * Returns a pointer to the vertex attribute data in a client array, > diff --git a/src/mesa/state_tracker/st_atom.h > b/src/mesa/state_tracker/st_atom.h > index 96e128d38c..9f3ca38c19 100644 > --- a/src/mesa/state_tracker/st_atom.h > +++ b/src/mesa/state_tracker/st_atom.h > @@ -55,7 +55,7 @@ void st_validate_state( struct st_context *st, enum > st_pipeline pipeline ); > GLuint st_compare_func_to_pipe(GLenum func); > > enum pipe_format > -st_pipe_vertex_format(const struct gl_array_attributes *attrib); > +st_pipe_vertex_format(const struct gl_vertex_format *glformat); > > > /* Define ST_NEW_xxx_INDEX */ > diff --git a/src/mesa/state_tracker/st_atom_array.c > b/src/mesa/state_tracker/st_atom_array.c > index e4fc19eb5e..19a5ef29a9 100644 > --- a/src/mesa/state_tracker/st_atom_array.c > +++ b/src/mesa/state_tracker/st_atom_array.c > @@ -238,18 +238,18 @@ static const uint16_t vertex_formats[][4][4] = { > * Return a PIPE_FORMAT_x for the given GL datatype and size. > */ > enum pipe_format > -st_pipe_vertex_format(const struct gl_array_attributes *attrib) > +st_pipe_vertex_format(const struct gl_vertex_format *vformat) > { > - const GLubyte size = attrib->Size; > - const GLenum16 format = attrib->Format; > - const bool normalized = attrib->Normalized; > - const bool integer = attrib->Integer; > - GLenum16 type = attrib->Type; > + const GLubyte size = vformat->Size; > + const GLenum16 format = vformat->Format; > + const bool normalized = vformat->Normalized; > + const bool integer = vformat->Integer; > + GLenum16 type = vformat->Type; > unsigned index; > > assert(size >= 1 && size <= 4); > assert(format == GL_RGBA || format == GL_BGRA); > - assert(attrib->_ElementSize == _mesa_bytes_per_vertex_attrib(size, type)); > + assert(vformat->_ElementSize == _mesa_bytes_per_vertex_attrib(size, > type)); > > switch (type) { > case GL_HALF_FLOAT_OES: > @@ -320,13 +320,13 @@ static void init_velement(struct pipe_vertex_element > *velement, > > static void init_velement_lowered(const struct st_vertex_program *vp, > struct pipe_vertex_element *velements, > - const struct gl_array_attributes *attrib, > + const struct gl_vertex_format *vformat, > int src_offset, int instance_divisor, > int vbo_index, int idx) > { > - const GLubyte nr_components = attrib->Size; > + const GLubyte nr_components = vformat->Size; > > - if (attrib->Doubles) { > + if (vformat->Doubles) { > int lower_format; > > if (nr_components < 2) > @@ -357,7 +357,7 @@ static void init_velement_lowered(const struct > st_vertex_program *vp, > } > } > } else { > - const unsigned format = st_pipe_vertex_format(attrib); > + const unsigned format = st_pipe_vertex_format(vformat); > > init_velement(&velements[idx], src_offset, > format, instance_divisor, vbo_index); > @@ -447,7 +447,7 @@ st_update_array(struct st_context *st) > const struct gl_array_attributes *const attrib > = _mesa_draw_array_attrib(vao, attr); > const GLuint off = _mesa_draw_attributes_relative_offset(attrib); > - init_velement_lowered(vp, velements, attrib, off, > + init_velement_lowered(vp, velements, &attrib->Format, off, > binding->InstanceDivisor, bufidx, > input_to_index[attr]); > } > @@ -468,14 +468,14 @@ st_update_array(struct st_context *st) > const gl_vert_attrib attr = u_bit_scan(&curmask); > const struct gl_array_attributes *const attrib > = _mesa_draw_current_attrib(ctx, attr); > - const unsigned size = attrib->_ElementSize; > + const unsigned size = attrib->Format._ElementSize; > const unsigned alignment = util_next_power_of_two(size); > max_alignment = MAX2(max_alignment, alignment); > memcpy(cursor, attrib->Ptr, size); > if (alignment != size) > memset(cursor + size, 0, alignment - size); > > - init_velement_lowered(vp, velements, attrib, cursor - data, 0, > + init_velement_lowered(vp, velements, &attrib->Format, cursor - > data, 0, > bufidx, input_to_index[attr]); > > cursor += alignment; > diff --git a/src/mesa/state_tracker/st_draw_feedback.c > b/src/mesa/state_tracker/st_draw_feedback.c > index eb05ac9669..11097b4cac 100644 > --- a/src/mesa/state_tracker/st_draw_feedback.c > +++ b/src/mesa/state_tracker/st_draw_feedback.c > @@ -212,7 +212,7 @@ st_feedback_draw_vbo(struct gl_context *ctx, > vbuffers[attr].stride = binding->Stride; /* in bytes */ > velements[attr].instance_divisor = 0; > velements[attr].vertex_buffer_index = attr; > - velements[attr].src_format = st_pipe_vertex_format(attrib); > + velements[attr].src_format = st_pipe_vertex_format(&attrib->Format); > assert(velements[attr].src_format); > > /* tell draw about this attribute */ > diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c > index 1fe2d405cb..009a0bf362 100644 > --- a/src/mesa/tnl/t_draw.c > +++ b/src/mesa/tnl/t_draw.c > @@ -70,7 +70,7 @@ static void free_space(struct gl_context *ctx) > */ > #define CONVERT( TYPE, MACRO ) do { \ > GLuint i, j; \ > - if (attrib->Normalized) { \ > + if (attrib->Format.Normalized) { \ > for (i = 0; i < count; i++) { \ > const TYPE *in = (TYPE *)ptr; \ > for (j = 0; j < sz; j++) { \ > @@ -104,8 +104,8 @@ convert_bgra_to_float(const struct > gl_vertex_buffer_binding *binding, > GLuint count ) > { > GLuint i; > - assert(attrib->Normalized); > - assert(attrib->Size == 4); > + assert(attrib->Format.Normalized); > + assert(attrib->Format.Size == 4); > for (i = 0; i < count; i++) { > const GLubyte *in = (GLubyte *) ptr; /* in is in BGRA order */ > *fptr++ = UBYTE_TO_FLOAT(in[2]); /* red */ > @@ -152,9 +152,9 @@ convert_fixed_to_float(const struct > gl_vertex_buffer_binding *binding, > { > GLuint i; > GLint j; > - const GLint size = attrib->Size; > + const GLint size = attrib->Format.Size; > > - if (attrib->Normalized) { > + if (attrib->Format.Normalized) { > for (i = 0; i < count; ++i) { > const GLfixed *in = (GLfixed *) ptr; > for (j = 0; j < size; ++j) { > @@ -187,17 +187,17 @@ static void _tnl_import_array( struct gl_context *ctx, > struct vertex_buffer *VB = &tnl->vb; > GLuint stride = binding->Stride; > > - if (attrib->Type != GL_FLOAT) { > - const GLuint sz = attrib->Size; > + if (attrib->Format.Type != GL_FLOAT) { > + const GLuint sz = attrib->Format.Size; > GLubyte *buf = get_space(ctx, count * sz * sizeof(GLfloat)); > GLfloat *fptr = (GLfloat *)buf; > > - switch (attrib->Type) { > + switch (attrib->Format.Type) { > case GL_BYTE: > CONVERT(GLbyte, BYTE_TO_FLOAT); > break; > case GL_UNSIGNED_BYTE: > - if (attrib->Format == GL_BGRA) { > + if (attrib->Format.Format == GL_BGRA) { > /* See GL_EXT_vertex_array_bgra */ > convert_bgra_to_float(binding, attrib, ptr, fptr, count); > } > @@ -240,11 +240,11 @@ static void _tnl_import_array( struct gl_context *ctx, > VB->AttribPtr[attr]->start = (GLfloat *)ptr; > VB->AttribPtr[attr]->count = count; > VB->AttribPtr[attr]->stride = stride; > - VB->AttribPtr[attr]->size = attrib->Size; > + VB->AttribPtr[attr]->size = attrib->Format.Size; > > /* This should die, but so should the whole GLvector4f concept: > */ > - VB->AttribPtr[attr]->flags = (((1<<attrib->Size)-1) | > + VB->AttribPtr[attr]->flags = (((1<<attrib->Format.Size)-1) | > VEC_NOT_WRITEABLE | > (stride == 4*sizeof(GLfloat) ? 0 : > VEC_BAD_STRIDE)); > > diff --git a/src/mesa/tnl/t_split_copy.c b/src/mesa/tnl/t_split_copy.c > index 1732b4c9ca..e04cfad049 100644 > --- a/src/mesa/tnl/t_split_copy.c > +++ b/src/mesa/tnl/t_split_copy.c > @@ -169,7 +169,7 @@ dump_draw_info(struct gl_context *ctx, > const GLubyte *ptr = _mesa_vertex_attrib_address(attrib, binding); > printf(" array %d at %p:\n", j, (void*) &arrays[j]); > printf(" ptr %p, size %d, type 0x%x, stride %d\n", > - ptr, attrib->Size, attrib->Type, binding->Stride); > + ptr, attrib->Format.Size, attrib->Format.Type, > binding->Stride); > if (0) { > GLint k = prims[i].start + prims[i].count - 1; > GLfloat *last = (GLfloat *) (ptr + binding->Stride * k); > @@ -269,7 +269,7 @@ elt(struct copy_context *copy, GLuint elt_idx) > csr += copy->varying[i].size; > > #ifdef NAN_CHECK > - if (srcarray->Type == GL_FLOAT) { > + if (srcarray->Format.Type == GL_FLOAT) { > GLuint k; > GLfloat *f = (GLfloat *) srcptr; > for (k = 0; k < srcarray->Size; k++) { > @@ -451,8 +451,8 @@ replay_init(struct copy_context *copy) > > copy->varying[j].attr = i; > copy->varying[j].array = ©->array[i]; > - copy->varying[j].size = attrib->_ElementSize; > - copy->vertex_size += attrib->_ElementSize; > + copy->varying[j].size = attrib->Format._ElementSize; > + copy->vertex_size += attrib->Format._ElementSize; > > if (_mesa_is_bufferobj(vbo) && > !_mesa_bufferobj_mapped(vbo, MAP_INTERNAL)) > @@ -528,16 +528,10 @@ replay_init(struct copy_context *copy) > struct gl_vertex_buffer_binding *dstbind = > ©->varying[i].dstbinding; > struct gl_array_attributes *dstattr = ©->varying[i].dstattribs; > > - dstattr->Size = srcattr->Size; > - dstattr->Type = srcattr->Type; > - dstattr->Format = GL_RGBA; > - dstbind->Stride = copy->vertex_size; > + _mesa_copy_vertex_format(&dstattr->Format, &srcattr->Format); Can't we just do dstattr->Format = srcattr->Format? > dstattr->Ptr = copy->dstbuf + offset; > - dstattr->Normalized = srcattr->Normalized; > - dstattr->Integer = srcattr->Integer; > - dstattr->Doubles = srcattr->Doubles; > + dstbind->Stride = copy->vertex_size; > dstbind->BufferObj = ctx->Shared->NullBufferObj; > - dstattr->_ElementSize = srcattr->_ElementSize; > dst->BufferBinding = dstbind; > dst->VertexAttrib = dstattr; > > diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c > index 364de2c507..484625d9ac 100644 > --- a/src/mesa/vbo/vbo_context.c > +++ b/src/mesa/vbo/vbo_context.c > @@ -58,11 +58,8 @@ init_array(struct gl_context *ctx, struct > gl_array_attributes *attrib, > { > memset(attrib, 0, sizeof(*attrib)); > > - attrib->Size = size; > - attrib->Type = GL_FLOAT; > - attrib->Format = GL_RGBA; > + vbo_set_vertex_format(&attrib->Format, size, GL_FLOAT); > attrib->Stride = 0; > - attrib->_ElementSize = size * sizeof(GLfloat); > attrib->Ptr = pointer; > } > > diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c > index 24bd1f0ba1..fd88b7d2d4 100644 > --- a/src/mesa/vbo/vbo_exec_api.c > +++ b/src/mesa/vbo/vbo_exec_api.c > @@ -195,7 +195,7 @@ vbo_exec_copy_to_current(struct vbo_exec_context *exec) > exec->vtx.attrtype[i]); > } > > - if (exec->vtx.attrtype[i] != vbo->current[i].Type || > + if (exec->vtx.attrtype[i] != vbo->current[i].Format.Type || > memcmp(current, tmp, 4 * sizeof(GLfloat) * dmul) != 0) { > memcpy(current, tmp, 4 * sizeof(GLfloat) * dmul); > > @@ -205,14 +205,9 @@ vbo_exec_copy_to_current(struct vbo_exec_context *exec) > * directly. > */ > /* Size here is in components - not bytes */ > - vbo->current[i].Size = exec->vtx.attrsz[i] / dmul; > - vbo->current[i]._ElementSize = > - vbo->current[i].Size * sizeof(GLfloat) * dmul; > - vbo->current[i].Type = exec->vtx.attrtype[i]; > - vbo->current[i].Integer = > - vbo_attrtype_to_integer_flag(exec->vtx.attrtype[i]); > - vbo->current[i].Doubles = > - vbo_attrtype_to_double_flag(exec->vtx.attrtype[i]); > + vbo_set_vertex_format(&vbo->current[i].Format, > + exec->vtx.attrsz[i] / dmul, > + exec->vtx.attrtype[i]); > > /* This triggers rather too much recalculation of Mesa state > * that doesn't get used (eg light positions). > diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h > index 1fc2ab48fd..6110a6cc0e 100644 > --- a/src/mesa/vbo/vbo_private.h > +++ b/src/mesa/vbo/vbo_private.h > @@ -115,6 +115,16 @@ vbo_attrtype_to_double_flag(GLenum format) > } > > > +static inline void > +vbo_set_vertex_format(struct gl_vertex_format* vertex_format, > + GLubyte size, GLenum16 type) > +{ > + _mesa_set_vertex_format(vertex_format, size, type, GL_RGBA, GL_FALSE, > + vbo_attrtype_to_integer_flag(type), > + vbo_attrtype_to_double_flag(type)); > +} > + > + > /** > * Return default component values for the given format. > * The return type is an array of fi_types, because that's how we declare > diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c > index 8dc03b9f77..fb8d68d556 100644 > --- a/src/mesa/vbo/vbo_save_api.c > +++ b/src/mesa/vbo/vbo_save_api.c > @@ -450,14 +450,14 @@ compare_vao(gl_vertex_processing_mode mode, > const struct gl_array_attributes *attrib = &vao->VertexAttrib[attr]; > if (attrib->RelativeOffset + vao->BufferBinding[0].Offset != off) > return false; > - if (attrib->Type != tp) > + if (attrib->Format.Type != tp) > return false; > - if (attrib->Size != size[vbo_attr]) > + if (attrib->Format.Size != size[vbo_attr]) > return false; > - assert(attrib->Format == GL_RGBA); > - assert(attrib->Normalized == GL_FALSE); > - assert(attrib->Integer == vbo_attrtype_to_integer_flag(tp)); > - assert(attrib->Doubles == vbo_attrtype_to_double_flag(tp)); > + assert(attrib->Format.Format == GL_RGBA); > + assert(attrib->Format.Normalized == GL_FALSE); > + assert(attrib->Format.Integer == vbo_attrtype_to_integer_flag(tp)); > + assert(attrib->Format.Doubles == vbo_attrtype_to_double_flag(tp)); > assert(attrib->BufferBindingIndex == 0); > } > > diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c > index b3578cc27c..b5807bb377 100644 > --- a/src/mesa/vbo/vbo_save_draw.c > +++ b/src/mesa/vbo/vbo_save_draw.c > @@ -52,8 +52,8 @@ copy_vao(struct gl_context *ctx, const struct > gl_vertex_array_object *vao, > const int i = u_bit_scan(&mask); > const struct gl_array_attributes *attrib = &vao->VertexAttrib[i]; > struct gl_array_attributes *currval = &vbo->current[shift + i]; > - const GLubyte size = attrib->Size; > - const GLenum16 type = attrib->Type; > + const GLubyte size = attrib->Format.Size; > + const GLenum16 type = attrib->Format.Type; > fi_type tmp[8]; > int dmul = 1; > > @@ -66,17 +66,11 @@ copy_vao(struct gl_context *ctx, const struct > gl_vertex_array_object *vao, > else > COPY_CLEAN_4V_TYPE_AS_UNION(tmp, size, *data, type); > > - if (type != currval->Type || > + if (type != currval->Format.Type || > memcmp(currval->Ptr, tmp, 4 * sizeof(GLfloat) * dmul) != 0) { > memcpy((fi_type*)currval->Ptr, tmp, 4 * sizeof(GLfloat) * dmul); > > - currval->Size = size; > - currval->_ElementSize = size * sizeof(GLfloat) * dmul; > - currval->Type = type; > - currval->Integer = vbo_attrtype_to_integer_flag(type); > - currval->Doubles = vbo_attrtype_to_double_flag(type); > - currval->Normalized = GL_FALSE; > - currval->Format = GL_RGBA; > + vbo_set_vertex_format(&currval->Format, size, type); > > ctx->NewState |= state; > } > diff --git a/src/mesa/vbo/vbo_save_loopback.c > b/src/mesa/vbo/vbo_save_loopback.c > index 7e9296bae2..26a9f94fac 100644 > --- a/src/mesa/vbo/vbo_save_loopback.c > +++ b/src/mesa/vbo/vbo_save_loopback.c > @@ -139,7 +139,7 @@ append_attr(GLuint *nr, struct loopback_attr la[], int i, > int shift, > { > la[*nr].index = shift + i; > la[*nr].offset = vao->VertexAttrib[i].RelativeOffset; > - la[*nr].func = vert_attrfunc[vao->VertexAttrib[i].Size - 1]; > + la[*nr].func = vert_attrfunc[vao->VertexAttrib[i].Format.Size - 1]; > (*nr)++; > } > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev