Initial work for post-transformed vertex feedback buffers.

This will be used for:
   GL_NV_transform_feedback, or similar GL3 functionality
   glRasterPos
   GL selection/feedback modes
This commit is contained in:
Brian 2007-09-06 17:07:09 -06:00
parent 41ddd76b98
commit 63a51aee86
7 changed files with 93 additions and 32 deletions

View File

@ -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 */
}

View File

@ -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,

View File

@ -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)
{

View File

@ -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 );

View File

@ -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

View File

@ -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];
};

View File

@ -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 \