newObj->EverBound = GL_TRUE;
}
- if (ctx->Array.DrawMethod == DRAW_ARRAYS) {
- /* The _DrawArrays pointer is pointing at the VAO being unbound and
- * that VAO may be in the process of being deleted. If it's not going
- * to be deleted, this will have no effect, because the pointer needs
- * to be updated by the VBO module anyway.
- *
- * Before the VBO module can update the pointer, we have to set it
- * to NULL for drivers not to set up arrays which are not bound,
- * or to prevent a crash if the VAO being unbound is going to be
- * deleted.
- */
- ctx->Array._DrawArrays = NULL;
- ctx->Array.DrawMethod = DRAW_NONE;
- }
+ /* The _DrawArrays pointer is pointing at the VAO being unbound and
+ * that VAO may be in the process of being deleted. If it's not going
+ * to be deleted, this will have no effect, because the pointer needs
+ * to be updated by the VBO module anyway.
+ *
+ * Before the VBO module can update the pointer, we have to set it
+ * to NULL for drivers not to set up arrays which are not bound,
+ * or to prevent a crash if the VAO being unbound is going to be
+ * deleted.
+ */
+ _mesa_set_drawing_arrays(ctx, NULL);
ctx->NewState |= _NEW_ARRAY;
_mesa_reference_vao(ctx, &ctx->Array.VAO, newObj);
/* skip ArrayBufferObj */
/* skip IndexBufferObj */
- /* Invalidate draw state. It will be updated during the next draw. */
- dest->DrawMethod = DRAW_NONE;
- dest->_DrawArrays = NULL;
+ /* Invalidate array state. It will be updated during the next draw. */
+ _mesa_set_drawing_arrays(ctx, NULL);
}
/**
};
-/**
- * Used to signal when transitioning from one kind of drawing method
- * to another.
- */
-typedef enum
-{
- DRAW_NONE, /**< Initial value only */
- DRAW_BEGIN_END,
- DRAW_DISPLAY_LIST,
- DRAW_ARRAYS
-} gl_draw_method;
-
-
/**
* Enum for the OpenGL APIs we know about and may support.
*
GLuint RestartIndex;
/*@}*/
- /** One of the DRAW_xxx flags, not consumed by drivers */
- gl_draw_method DrawMethod;
-
/* GL_ARB_vertex_buffer_object */
struct gl_buffer_object *ArrayBufferObj;
return ctx->_AttribZeroAliasesVertex;
}
+
+/**
+ * This specifies the set of vertex arrays used by the driver for drawing.
+ */
+static inline void
+_mesa_set_drawing_arrays(struct gl_context *ctx,
+ const struct gl_vertex_array **arrays)
+{
+ if (ctx->Array._DrawArrays != arrays) {
+ ctx->Array._DrawArrays = arrays;
+ ctx->NewDriverState |= ctx->DriverFlags.NewArray;
+ }
+}
+
+
extern void
_mesa_update_array_format(struct gl_context *ctx,
struct gl_vertex_array_object *vao,
return;
}
- vbo_draw_method(vbo_context(ctx), DRAW_BEGIN_END);
+ _mesa_set_drawing_arrays(ctx, exec->vtx.inputs);
if (ctx->NewState) {
_mesa_update_state(ctx);
struct vbo_context *vbo = vbo_context(ctx);
struct vbo_exec_context *exec = &vbo->exec;
- vbo_draw_method(vbo, DRAW_ARRAYS);
+ _mesa_set_drawing_arrays(ctx, vbo->exec.array.inputs);
if (exec->array.recalculate_inputs) {
recalculate_input_bindings(ctx);
}
-/**
- * This is called by glBegin, glDrawArrays and glDrawElements (and
- * variations of those calls). When we transition from immediate mode
- * drawing to array drawing we need to invalidate the array state.
- *
- * glBegin/End builds vertex arrays. Those arrays may look identical
- * to glDrawArrays arrays except that the position of the elements may
- * be different. For example, arrays of (position3v, normal3f) vs. arrays
- * of (normal3f, position3f). So we need to make sure we notify drivers
- * that arrays may be changing.
- */
-static inline void
-vbo_draw_method(struct vbo_context *vbo, gl_draw_method method)
-{
- struct gl_context *ctx = vbo->exec.ctx;
-
- if (ctx->Array.DrawMethod != method) {
- switch (method) {
- case DRAW_ARRAYS:
- ctx->Array._DrawArrays = vbo->exec.array.inputs;
- break;
- case DRAW_BEGIN_END:
- ctx->Array._DrawArrays = vbo->exec.vtx.inputs;
- break;
- case DRAW_DISPLAY_LIST:
- ctx->Array._DrawArrays = vbo->save.inputs;
- break;
- default:
- unreachable("Bad VBO drawing method");
- }
-
- ctx->NewDriverState |= ctx->DriverFlags.NewArray;
- ctx->Array.DrawMethod = method;
- }
-}
-
-
/**
* Return if format is integer. The immediate mode commands only emit floats
* for non-integer types, thus everything else is integer.
#include "main/macros.h"
#include "main/light.h"
#include "main/state.h"
+#include "main/varray.h"
#include "util/bitscan.h"
#include "vbo_private.h"
{
const struct vbo_save_vertex_list *node =
(const struct vbo_save_vertex_list *) data;
- struct vbo_save_context *save = &vbo_context(ctx)->save;
+ struct vbo_context *vbo = vbo_context(ctx);
+ struct vbo_save_context *save = &vbo->save;
GLboolean remap_vertex_store = GL_FALSE;
if (save->vertex_store && save->vertex_store->buffer_map) {
bind_vertex_list(ctx, node);
- vbo_draw_method(vbo_context(ctx), DRAW_DISPLAY_LIST);
+ _mesa_set_drawing_arrays(ctx, vbo->save.inputs);
/* Again...
*/