summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorMathias Fröhlich <[email protected]>2018-03-25 19:16:54 +0200
committerMathias Fröhlich <[email protected]>2018-03-31 06:32:12 +0200
commitfca1550550793f0a1156ad795445e2242c1fea9b (patch)
tree78cf68ca67afd9a00c830d45dbcb234c56c3f901 /src/mesa/state_tracker
parent9978f55cd1d28ccc5014ac56cafdd997eac5f222 (diff)
gallium: Push down the gl_vertex_array inputs into gallium.
Let the gallium backend have its own gl_vertex_array array and basically reimplement the way _vbo_draw works. Reviewed-by: Brian Paul <[email protected]> Signed-off-by: Mathias Fröhlich <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_cb_feedback.c35
-rw-r--r--src/mesa/state_tracker/st_context.c9
-rw-r--r--src/mesa/state_tracker/st_context.h4
-rw-r--r--src/mesa/state_tracker/st_draw.c16
-rw-r--r--src/mesa/state_tracker/st_draw.h2
5 files changed, 52 insertions, 14 deletions
diff --git a/src/mesa/state_tracker/st_cb_feedback.c b/src/mesa/state_tracker/st_cb_feedback.c
index 436062b1f85..b7a082fca3d 100644
--- a/src/mesa/state_tracker/st_cb_feedback.c
+++ b/src/mesa/state_tracker/st_cb_feedback.c
@@ -40,6 +40,7 @@
#include "main/imports.h"
#include "main/context.h"
#include "main/feedback.h"
+#include "main/varray.h"
#include "vbo/vbo.h"
@@ -272,6 +273,34 @@ draw_glselect_stage(struct gl_context *ctx, struct draw_context *draw)
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 )
{
struct st_context *st = st_context(ctx);
@@ -282,14 +311,14 @@ 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;
@@ -298,7 +327,7 @@ st_RenderMode(struct gl_context *ctx, GLenum newMode )
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));
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 90b7f9359a1..a3da0f8f1fc 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -382,7 +382,6 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
st_init_atoms(st);
st_init_clear(st);
- st_init_draw(st);
st_init_pbo_helpers(st);
/* Choose texture target for glDrawPixels, glBitmap, renderbuffers */
@@ -551,6 +550,9 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
/* 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;
}
@@ -715,6 +717,7 @@ st_init_driver_functions(struct pipe_screen *screen,
_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);
@@ -752,10 +755,6 @@ st_init_driver_functions(struct pipe_screen *screen,
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;
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 9f2480e5dac..5125fc58397 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -34,6 +34,7 @@
#include "state_tracker/st_atom.h"
#include "util/u_inlines.h"
#include "util/list.h"
+#include "vbo/vbo.h"
#ifdef __cplusplus
@@ -294,6 +295,9 @@ struct st_context
/* Winsys buffers */
struct list_head winsys_buffers;
+
+ /* For the initial pushdown, keep the list of vbo inputs. */
+ struct vbo_inputs draw_arrays;
};
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index b95a2522b2e..e9ffc18d915 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -145,6 +145,10 @@ st_draw_vbo(struct gl_context *ctx,
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)
@@ -243,6 +247,10 @@ st_indirect_draw_vbo(struct gl_context *ctx,
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);
@@ -304,12 +312,10 @@ st_indirect_draw_vbo(struct gl_context *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;
}
diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h
index c4c2dc44ee4..c1ebcd9f748 100644
--- a/src/mesa/state_tracker/st_draw.h
+++ b/src/mesa/state_tracker/st_draw.h
@@ -42,7 +42,7 @@ struct gl_vertex_array;
struct gl_context;
struct st_context;
-void st_init_draw( struct st_context *st );
+void st_init_draw_functions(struct dd_function_table *functions);
void st_destroy_draw( struct st_context *st );