#include "main/imports.h"
#include "main/context.h"
#include "main/feedback.h"
+#include "main/varray.h"
#include "vbo/vbo.h"
}
+static void
+feedback_draw_vbo(struct gl_context *ctx,
+ const struct _mesa_prim *prims,
+ GLuint nr_prims,
+ const struct _mesa_index_buffer *ib,
+ GLboolean index_bounds_valid,
+ GLuint min_index,
+ GLuint max_index,
+ struct gl_transform_feedback_object *tfb_vertcount,
+ unsigned stream,
+ struct gl_buffer_object *indirect)
+{
+ struct st_context *st = st_context(ctx);
+
+ /* The initial pushdown of the inputs array into the drivers */
+ _mesa_set_drawing_arrays(ctx, st->draw_arrays.inputs);
+ _vbo_update_inputs(ctx, &st->draw_arrays);
+
+ /* The above needs to happen outside of st_feedback_draw_vbo,
+ * since st_RasterPossets _DrawArrays and does not want that to be
+ * overwritten by _mesa_set_drawing_arrays.
+ */
+ st_feedback_draw_vbo(ctx, prims, nr_prims, ib, index_bounds_valid,
+ min_index, max_index, tfb_vertcount,
+ stream, indirect);
+}
+
+
static void
st_RenderMode(struct gl_context *ctx, GLenum newMode )
{
if (newMode == GL_RENDER) {
/* restore normal VBO draw function */
- st_init_draw(st);
+ st_init_draw_functions(&ctx->Driver);
}
else if (newMode == GL_SELECT) {
if (!st->selection_stage)
st->selection_stage = draw_glselect_stage(ctx, draw);
draw_set_rasterize_stage(draw, st->selection_stage);
/* Plug in new vbo draw function */
- vbo_set_draw_func(ctx, st_feedback_draw_vbo);
+ ctx->Driver.Draw = feedback_draw_vbo;
}
else {
struct gl_program *vp = st->ctx->VertexProgram._Current;
st->feedback_stage = draw_glfeedback_stage(ctx, draw);
draw_set_rasterize_stage(draw, st->feedback_stage);
/* Plug in new vbo draw function */
- vbo_set_draw_func(ctx, st_feedback_draw_vbo);
+ ctx->Driver.Draw = feedback_draw_vbo;
/* need to generate/use a vertex program that emits pos/color/tex */
if (vp)
st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_vertex_program(vp));
st_init_atoms(st);
st_init_clear(st);
- st_init_draw(st);
st_init_pbo_helpers(st);
/* Choose texture target for glDrawPixels, glBitmap, renderbuffers */
/* Initialize context's winsys buffers list */
LIST_INITHEAD(&st->winsys_buffers);
+ /* Keep our list of gl_vertex_array inputs */
+ _vbo_init_inputs(&st->draw_arrays);
+
return st;
}
_mesa_init_shader_object_functions(functions);
_mesa_init_sampler_object_functions(functions);
+ st_init_draw_functions(functions);
st_init_blit_functions(functions);
st_init_bufferobject_functions(screen, functions);
st_init_clear_functions(functions);
if (screen->get_param(screen, PIPE_CAP_STRING_MARKER))
functions->EmitStringMarker = st_emit_string_marker;
- /* For now call through these into the vbo_set_draw_func... */
- functions->Draw = _vbo_draw;
- functions->DrawIndirect = _vbo_draw_indirect;
-
functions->Enable = st_Enable;
functions->UpdateState = st_invalidate_state;
functions->QueryMemoryInfo = st_query_memory_info;
unsigned i;
unsigned start = 0;
+ /* The initial pushdown of the inputs array into the drivers */
+ _mesa_set_drawing_arrays(ctx, st->draw_arrays.inputs);
+ _vbo_update_inputs(ctx, &st->draw_arrays);
+
prepare_draw(st, ctx);
if (st->vertex_array_out_of_memory)
struct pipe_draw_info info;
struct pipe_draw_indirect_info indirect;
+ /* The initial pushdown of the inputs array into the drivers */
+ _mesa_set_drawing_arrays(ctx, st->draw_arrays.inputs);
+ _vbo_update_inputs(ctx, &st->draw_arrays);
+
assert(stride);
prepare_draw(st, ctx);
void
-st_init_draw(struct st_context *st)
+st_init_draw_functions(struct dd_function_table *functions)
{
- struct gl_context *ctx = st->ctx;
-
- vbo_set_draw_func(ctx, st_draw_vbo);
- vbo_set_indirect_draw_func(ctx, st_indirect_draw_vbo);
+ functions->Draw = st_draw_vbo;
+ functions->DrawIndirect = st_indirect_draw_vbo;
}