This will be used for: GL_NV_transform_feedback, or similar GL3 functionality glRasterPos GL selection/feedback modestags/mesa_20090313
| @@ -137,7 +137,12 @@ static void validate_pipeline( struct draw_context *draw ) | |||
| draw->pipeline.flatshade->next = next; | |||
| next = draw->pipeline.flatshade; | |||
| } | |||
| if (draw->feedback.enabled || draw->feedback.discard) { | |||
| draw->pipeline.feedback->next = next; | |||
| next = draw->pipeline.feedback; | |||
| } | |||
| draw->pipeline.first = next; | |||
| } | |||
| @@ -189,6 +194,14 @@ void draw_set_viewport_state( struct draw_context *draw, | |||
| } | |||
| void | |||
| draw_set_vertex_shader(struct draw_context *draw, | |||
| const struct pipe_shader_state *shader) | |||
| { | |||
| draw->vertex_shader = *shader; | |||
| } | |||
| void | |||
| draw_set_vertex_buffer(struct draw_context *draw, | |||
| unsigned attr, | |||
| @@ -209,9 +222,30 @@ draw_set_vertex_element(struct draw_context *draw, | |||
| } | |||
| /** | |||
| * Tell drawing context where to find mapped vertex buffers. | |||
| */ | |||
| void | |||
| draw_set_vertex_shader(struct draw_context *draw, | |||
| const struct pipe_shader_state *shader) | |||
| draw_set_mapped_vertex_buffer(struct draw_context *draw, | |||
| unsigned attr, const void *buffer) | |||
| { | |||
| draw->vertex_shader = *shader; | |||
| draw->mapped_vbuffer[attr] = buffer; | |||
| } | |||
| void | |||
| draw_set_mapped_constant_buffer(struct draw_context *draw, | |||
| const void *buffer) | |||
| { | |||
| draw->mapped_constants = buffer; | |||
| } | |||
| void | |||
| draw_set_mapped_feedback_buffer(struct draw_context *draw, uint index, | |||
| void *buffer, uint size) | |||
| { | |||
| draw->mapped_feedback_buffer[index] = buffer; | |||
| draw->mapped_feedback_buffer_size[index] = size; /* in bytes */ | |||
| } | |||
| @@ -93,14 +93,11 @@ unsigned draw_prim_info( unsigned prim, unsigned *first, unsigned *incr ); | |||
| unsigned draw_trim( unsigned count, unsigned first, unsigned incr ); | |||
| void draw_set_mapped_element_buffer( struct draw_context *draw, | |||
| unsigned eltSize, void *elements ); | |||
| void draw_set_mapped_vertex_buffer(struct draw_context *draw, | |||
| unsigned attr, const void *buffer); | |||
| void | |||
| draw_set_vertex_shader(struct draw_context *draw, | |||
| const struct pipe_shader_state *shader); | |||
| void draw_set_mapped_constant_buffer(struct draw_context *draw, | |||
| const void *buffer); | |||
| void | |||
| draw_set_vertex_buffer(struct draw_context *draw, | |||
| @@ -112,10 +109,18 @@ draw_set_vertex_element(struct draw_context *draw, | |||
| unsigned attr, | |||
| const struct pipe_vertex_element *element); | |||
| void | |||
| draw_set_vertex_shader(struct draw_context *draw, | |||
| const struct pipe_shader_state *shader); | |||
| void draw_set_mapped_element_buffer( struct draw_context *draw, | |||
| unsigned eltSize, void *elements ); | |||
| void draw_set_mapped_vertex_buffer(struct draw_context *draw, | |||
| unsigned attr, const void *buffer); | |||
| void draw_set_mapped_constant_buffer(struct draw_context *draw, | |||
| const void *buffer); | |||
| void | |||
| draw_set_mapped_feedback_buffer(struct draw_context *draw, uint index, | |||
| void *buffer, uint size); | |||
| void | |||
| draw_arrays(struct draw_context *draw, unsigned prim, | |||
| @@ -353,23 +353,6 @@ draw_set_prim( struct draw_context *draw, unsigned prim ) | |||
| } | |||
| /** | |||
| * Tell drawing context where to find mapped vertex buffers. | |||
| */ | |||
| void draw_set_mapped_vertex_buffer(struct draw_context *draw, | |||
| unsigned attr, const void *buffer) | |||
| { | |||
| draw->mapped_vbuffer[attr] = buffer; | |||
| } | |||
| void draw_set_mapped_constant_buffer(struct draw_context *draw, | |||
| const void *buffer) | |||
| { | |||
| draw->mapped_constants = buffer; | |||
| } | |||
| unsigned | |||
| draw_prim_info(unsigned prim, unsigned *first, unsigned *incr) | |||
| { | |||
| @@ -126,6 +126,7 @@ struct draw_context | |||
| struct draw_stage *first; /**< one of the following */ | |||
| /* stages (in logical order) */ | |||
| struct draw_stage *feedback; | |||
| struct draw_stage *flatshade; | |||
| struct draw_stage *clip; | |||
| struct draw_stage *cull; | |||
| @@ -137,10 +138,13 @@ struct draw_context | |||
| /* pipe state that we need: */ | |||
| struct pipe_setup_state setup; | |||
| struct pipe_feedback_state feedback; | |||
| struct pipe_viewport_state viewport; | |||
| struct pipe_vertex_buffer vertex_buffer[PIPE_ATTRIB_MAX]; | |||
| struct pipe_vertex_element vertex_element[PIPE_ATTRIB_MAX]; | |||
| struct pipe_shader_state vertex_shader; | |||
| struct pipe_vertex_buffer feedback_buffer[PIPE_ATTRIB_MAX]; | |||
| struct pipe_vertex_element feedback_element[PIPE_ATTRIB_MAX]; | |||
| /** The mapped vertex element/index buffer */ | |||
| const void *mapped_elts; | |||
| @@ -150,6 +154,10 @@ struct draw_context | |||
| /** The mapped constant buffers (for vertex shader) */ | |||
| const void *mapped_constants; | |||
| /** The mapped vertex element/index buffer */ | |||
| void *mapped_feedback_buffer[PIPE_MAX_FEEDBACK_ATTRIBS]; | |||
| uint mapped_feedback_buffer_size[PIPE_MAX_FEEDBACK_ATTRIBS]; /* in bytes */ | |||
| /* Clip derived state: | |||
| */ | |||
| float plane[12][4]; | |||
| @@ -203,6 +211,7 @@ struct draw_context | |||
| extern struct draw_stage *draw_feedback_stage( struct draw_context *context ); | |||
| extern struct draw_stage *draw_unfilled_stage( struct draw_context *context ); | |||
| extern struct draw_stage *draw_twoside_stage( struct draw_context *context ); | |||
| extern struct draw_stage *draw_offset_stage( struct draw_context *context ); | |||
| @@ -138,14 +138,28 @@ struct pipe_context { | |||
| void (*set_viewport_state)( struct pipe_context *, | |||
| const struct pipe_viewport_state * ); | |||
| /* | |||
| * Vertex arrays | |||
| */ | |||
| void (*set_vertex_buffer)( struct pipe_context *, | |||
| unsigned index, | |||
| const struct pipe_vertex_buffer * ); | |||
| void (*set_vertex_element)( struct pipe_context *, | |||
| unsigned index, | |||
| const struct pipe_vertex_element * ); | |||
| /* | |||
| * Vertex feedback | |||
| */ | |||
| void (*set_feedback_buffer)(struct pipe_context *, | |||
| unsigned index, | |||
| struct pipe_vertex_buffer *); | |||
| void (*set_feedback_element)(struct pipe_context *, | |||
| unsigned index, | |||
| const struct pipe_vertex_element *); | |||
| /* | |||
| * Surface functions | |||
| @@ -49,6 +49,7 @@ | |||
| #define PIPE_ATTRIB_MAX 32 | |||
| #define PIPE_MAX_COLOR_BUFS 8 | |||
| #define PIPE_MAX_TEXTURE_LEVELS 16 | |||
| #define PIPE_MAX_FEEDBACK_ATTRIBS 16 | |||
| /* fwd decl */ | |||
| @@ -92,6 +93,20 @@ struct pipe_setup_state | |||
| float offset_scale; | |||
| }; | |||
| /** | |||
| * Post-transform vertex feeback | |||
| */ | |||
| struct pipe_feedback_state { | |||
| uint enabled:1; /**< enable feedback? */ | |||
| uint discard:1; /**< discard primitives? */ | |||
| uint interleaved:1; /**< interleaved output? */ | |||
| uint num_attribs; | |||
| uint attrib[PIPE_MAX_FEEDBACK_ATTRIBS]; | |||
| uint size[PIPE_MAX_FEEDBACK_ATTRIBS]; | |||
| }; | |||
| struct pipe_poly_stipple { | |||
| unsigned stipple[32]; | |||
| }; | |||
| @@ -161,6 +161,7 @@ DRAW_SOURCES = \ | |||
| pipe/draw/draw_clip.c \ | |||
| pipe/draw/draw_context.c\ | |||
| pipe/draw/draw_cull.c \ | |||
| pipe/draw/draw_feedback.c \ | |||
| pipe/draw/draw_flatshade.c \ | |||
| pipe/draw/draw_offset.c \ | |||
| pipe/draw/draw_prim.c \ | |||