#include "main/macros.h"
#include "main/light.h"
#include "main/state.h"
+#include "util/bitscan.h"
#include "vbo_context.h"
struct vbo_context *vbo = vbo_context(ctx);
fi_type vertex[VBO_ATTRIB_MAX * 4];
fi_type *data;
- GLuint i, offset;
+ GLbitfield64 mask;
+ GLuint offset;
if (node->current_size == 0)
return;
data += node->attrsz[0]; /* skip vertex position */
}
- for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
- if (node->attrsz[i]) {
- fi_type *current = (fi_type *)vbo->currval[i].Ptr;
- fi_type tmp[4];
-
- COPY_CLEAN_4V_TYPE_AS_UNION(tmp,
- node->attrsz[i],
- data,
- node->attrtype[i]);
+ mask = node->enabled & (~BITFIELD64_BIT(VBO_ATTRIB_POS));
+ while (mask) {
+ const int i = u_bit_scan64(&mask);
+ fi_type *current = (fi_type *)vbo->currval[i].Ptr;
+ fi_type tmp[4];
+ assert(node->attrsz[i]);
+
+ COPY_CLEAN_4V_TYPE_AS_UNION(tmp,
+ node->attrsz[i],
+ data,
+ node->attrtype[i]);
+
+ if (node->attrtype[i] != vbo->currval[i].Type ||
+ memcmp(current, tmp, 4 * sizeof(GLfloat)) != 0) {
+ memcpy(current, tmp, 4 * sizeof(GLfloat));
- if (node->attrtype[i] != vbo->currval[i].Type ||
- memcmp(current, tmp, 4 * sizeof(GLfloat)) != 0) {
- memcpy(current, tmp, 4 * sizeof(GLfloat));
-
- vbo->currval[i].Size = node->attrsz[i];
- vbo->currval[i]._ElementSize = vbo->currval[i].Size * sizeof(GLfloat);
- vbo->currval[i].Type = node->attrtype[i];
- vbo->currval[i].Integer =
- vbo_attrtype_to_integer_flag(node->attrtype[i]);
+ vbo->currval[i].Size = node->attrsz[i];
+ vbo->currval[i]._ElementSize = vbo->currval[i].Size * sizeof(GLfloat);
+ vbo->currval[i].Type = node->attrtype[i];
+ vbo->currval[i].Integer =
+ vbo_attrtype_to_integer_flag(node->attrtype[i]);
- if (i >= VBO_ATTRIB_FIRST_MATERIAL &&
- i <= VBO_ATTRIB_LAST_MATERIAL)
- ctx->NewState |= _NEW_LIGHT;
+ if (i >= VBO_ATTRIB_FIRST_MATERIAL &&
+ i <= VBO_ATTRIB_LAST_MATERIAL)
+ ctx->NewState |= _NEW_LIGHT;
- ctx->NewState |= _NEW_CURRENT_ATTRIB;
- }
-
- data += node->attrsz[i];
+ ctx->NewState |= _NEW_CURRENT_ATTRIB;
}
+
+ data += node->attrsz[i];
}
/* Colormaterial -- this kindof sucks.
{
struct vbo_context *vbo = vbo_context(ctx);
struct vbo_save_context *save = &vbo->save;
- struct gl_client_array *arrays = save->arrays;
+ struct gl_vertex_array *arrays = save->arrays;
GLuint buffer_offset = node->buffer_offset;
const GLuint *map;
GLuint attr;
* In that case we effectively need to route the data from
* glVertexAttrib(0, val) calls to feed into the GENERIC0 input.
*/
- if ((ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_POS) == 0 &&
- (ctx->VertexProgram._Current->Base.InputsRead & VERT_BIT_GENERIC0)) {
+ if ((ctx->VertexProgram._Current->info.inputs_read &
+ VERT_BIT_POS) == 0 &&
+ (ctx->VertexProgram._Current->info.inputs_read &
+ VERT_BIT_GENERIC0)) {
save->inputs[VERT_ATTRIB_GENERIC0] = save->inputs[0];
node_attrsz[VERT_ATTRIB_GENERIC0] = node_attrsz[0];
node_attrtype[VERT_ATTRIB_GENERIC0] = node_attrtype[0];
arrays[attr].Ptr = (const GLubyte *) NULL + buffer_offset;
arrays[attr].Size = node_attrsz[src];
arrays[attr].StrideB = node->vertex_size * sizeof(GLfloat);
- arrays[attr].Stride = node->vertex_size * sizeof(GLfloat);
arrays[attr].Type = node_attrtype[src];
arrays[attr].Integer =
vbo_attrtype_to_integer_flag(node_attrtype[src]);
arrays[attr].Format = GL_RGBA;
- arrays[attr].Enabled = 1;
arrays[attr]._ElementSize = arrays[attr].Size * sizeof(GLfloat);
_mesa_reference_buffer_object(ctx,
&arrays[attr].BufferObj,
goto end;
}
else if (save->replay_flags) {
- /* Various degnerate cases: translate into immediate mode
+ /* Various degenerate cases: translate into immediate mode
* calls rather than trying to execute in place.
*/
vbo_save_loopback_vertex_list( ctx, node );
GL_TRUE,
0, /* Node is a VBO, so this is ok */
node->count - 1,
- NULL, NULL);
+ NULL, 0, NULL);
}
}