llvmpipe: adapt to new vertex element cso

This commit is contained in:
Roland Scheidegger 2010-03-01 18:46:39 +01:00
parent 057427dd3e
commit f897303855
4 changed files with 42 additions and 17 deletions

View file

@ -145,6 +145,10 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
llvmpipe->pipe.bind_vs_state = llvmpipe_bind_vs_state;
llvmpipe->pipe.delete_vs_state = llvmpipe_delete_vs_state;
llvmpipe->pipe.create_vertex_elements_state = llvmpipe_create_vertex_elements_state;
llvmpipe->pipe.bind_vertex_elements_state = llvmpipe_bind_vertex_elements_state;
llvmpipe->pipe.delete_vertex_elements_state = llvmpipe_delete_vertex_elements_state;
llvmpipe->pipe.set_blend_color = llvmpipe_set_blend_color;
llvmpipe->pipe.set_stencil_ref = llvmpipe_set_stencil_ref;
llvmpipe->pipe.set_clip_state = llvmpipe_set_clip_state;
@ -157,7 +161,6 @@ llvmpipe_create_context( struct pipe_screen *screen, void *priv )
llvmpipe->pipe.set_viewport_state = llvmpipe_set_viewport_state;
llvmpipe->pipe.set_vertex_buffers = llvmpipe_set_vertex_buffers;
llvmpipe->pipe.set_vertex_elements = llvmpipe_set_vertex_elements;
llvmpipe->pipe.draw_arrays = llvmpipe_draw_arrays;
llvmpipe->pipe.draw_elements = llvmpipe_draw_elements;

View file

@ -46,6 +46,7 @@ struct lp_fragment_shader;
struct lp_vertex_shader;
struct lp_blend_state;
struct setup_context;
struct lp_velems_state;
struct llvmpipe_context {
struct pipe_context pipe; /**< base class */
@ -58,6 +59,7 @@ struct llvmpipe_context {
const struct pipe_rasterizer_state *rasterizer;
struct lp_fragment_shader *fs;
const struct lp_vertex_shader *vs;
const struct lp_velems_state *velems;
/** Other rendering state */
struct pipe_blend_color blend_color;
@ -71,13 +73,11 @@ struct llvmpipe_context {
struct pipe_texture *vertex_textures[PIPE_MAX_VERTEX_SAMPLERS];
struct pipe_viewport_state viewport;
struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
unsigned num_samplers;
unsigned num_textures;
unsigned num_vertex_samplers;
unsigned num_vertex_textures;
unsigned num_vertex_elements;
unsigned num_vertex_buffers;
unsigned dirty; /**< Mask of LP_NEW_x flags */

View file

@ -119,6 +119,10 @@ struct lp_vertex_shader {
struct draw_vertex_shader *draw_data;
};
struct lp_velems_state {
unsigned count;
struct pipe_vertex_element velem[];
};
void *
@ -176,8 +180,14 @@ void *llvmpipe_create_vs_state(struct pipe_context *,
void llvmpipe_bind_vs_state(struct pipe_context *, void *);
void llvmpipe_delete_vs_state(struct pipe_context *, void *);
void *llvmpipe_create_vertex_elements_state(struct pipe_context *,
unsigned count,
const struct pipe_vertex_element *);
void llvmpipe_bind_vertex_elements_state(struct pipe_context *, void *);
void llvmpipe_delete_vertex_elements_state(struct pipe_context *, void *);
void llvmpipe_set_polygon_stipple( struct pipe_context *,
const struct pipe_poly_stipple * );
const struct pipe_poly_stipple * );
void llvmpipe_set_scissor_state( struct pipe_context *,
const struct pipe_scissor_state * );
@ -194,10 +204,6 @@ llvmpipe_set_vertex_sampler_textures(struct pipe_context *,
void llvmpipe_set_viewport_state( struct pipe_context *,
const struct pipe_viewport_state * );
void llvmpipe_set_vertex_elements(struct pipe_context *,
unsigned count,
const struct pipe_vertex_element *);
void llvmpipe_set_vertex_buffers(struct pipe_context *,
unsigned count,
const struct pipe_vertex_buffer *);

View file

@ -35,24 +35,40 @@
#include "draw/draw_context.h"
void *
llvmpipe_create_vertex_elements_state(struct pipe_context *pipe,
unsigned count,
const struct pipe_vertex_element *attribs)
{
struct lp_velems_state *velems;
assert(count <= PIPE_MAX_ATTRIBS);
velems = (struct lp_velems_state *) MALLOC(sizeof(struct lp_velems_state) + count * sizeof(*attribs));
if (velems) {
velems->count = count;
memcpy(velems->velem, attribs, sizeof(*attribs) * count);
}
return velems;
}
void
llvmpipe_set_vertex_elements(struct pipe_context *pipe,
unsigned count,
const struct pipe_vertex_element *attribs)
llvmpipe_bind_vertex_elements_state(struct pipe_context *pipe,
void *velems)
{
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
struct lp_velems_state *lp_velems = (struct lp_velems_state *) velems;
assert(count <= PIPE_MAX_ATTRIBS);
memcpy(llvmpipe->vertex_element, attribs,
count * sizeof(struct pipe_vertex_element));
llvmpipe->num_vertex_elements = count;
llvmpipe->velems = lp_velems;
llvmpipe->dirty |= LP_NEW_VERTEX;
draw_set_vertex_elements(llvmpipe->draw, count, attribs);
draw_set_vertex_elements(llvmpipe->draw, lp_velems->count, lp_velems->velem);
}
void
llvmpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems)
{
FREE( velems );
}
void
llvmpipe_set_vertex_buffers(struct pipe_context *pipe,