X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_pipe_vertex.c;h=82bd1b33efeee241a3496b4c89cbca90f5b3ed7b;hb=71682c1599c3fe0096cccfdbd8eb762cd909fbd8;hp=28e2787e0d3d77c2f20c57f6ff0c223789524466;hpb=e128cc205e30540597ecd57849060a6bf4714d9f;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_pipe_vertex.c b/src/gallium/drivers/svga/svga_pipe_vertex.c index 28e2787e0d3..82bd1b33efe 100644 --- a/src/gallium/drivers/svga/svga_pipe_vertex.c +++ b/src/gallium/drivers/svga/svga_pipe_vertex.c @@ -23,93 +23,98 @@ * **********************************************************/ -#include "pipe/p_inlines.h" +#include "util/u_helpers.h" +#include "util/u_inlines.h" #include "pipe/p_defines.h" #include "util/u_math.h" #include "util/u_memory.h" +#include "util/u_transfer.h" #include "tgsi/tgsi_parse.h" #include "svga_screen.h" -#include "svga_screen_buffer.h" +#include "svga_resource_buffer.h" #include "svga_context.h" -#include "svga_state.h" -#include "svga_winsys.h" - -#include "svga_hw_reg.h" static void svga_set_vertex_buffers(struct pipe_context *pipe, - unsigned count, + unsigned start_slot, unsigned count, const struct pipe_vertex_buffer *buffers) { struct svga_context *svga = svga_context(pipe); - unsigned i; - boolean any_user_buffer = FALSE; - - /* Check for no change */ - if (count == svga->curr.num_vertex_buffers && - memcmp(svga->curr.vb, buffers, count * sizeof buffers[0]) == 0) - return; - - /* Adjust refcounts */ - for (i = 0; i < count; i++) { - pipe_buffer_reference(&svga->curr.vb[i].buffer, buffers[i].buffer); - if (svga_buffer(buffers[i].buffer)->user) - any_user_buffer = TRUE; - } - for ( ; i < svga->curr.num_vertex_buffers; i++) - pipe_buffer_reference(&svga->curr.vb[i].buffer, NULL); - - /* Copy remaining data */ - memcpy(svga->curr.vb, buffers, count * sizeof buffers[0]); - svga->curr.num_vertex_buffers = count; - svga->curr.any_user_vertex_buffers = any_user_buffer; + util_set_vertex_buffers_count(svga->curr.vb, + &svga->curr.num_vertex_buffers, + buffers, start_slot, count); svga->dirty |= SVGA_NEW_VBUFFER; } -static void svga_set_vertex_elements(struct pipe_context *pipe, - unsigned count, - const struct pipe_vertex_element *elements) + +static void svga_set_index_buffer(struct pipe_context *pipe, + const struct pipe_index_buffer *ib) { struct svga_context *svga = svga_context(pipe); - unsigned i; - for (i = 0; i < count; i++) - svga->curr.ve[i] = elements[i]; + if (ib) { + pipe_resource_reference(&svga->curr.ib.buffer, ib->buffer); + memcpy(&svga->curr.ib, ib, sizeof(svga->curr.ib)); + } + else { + pipe_resource_reference(&svga->curr.ib.buffer, NULL); + memset(&svga->curr.ib, 0, sizeof(svga->curr.ib)); + } - svga->curr.num_vertex_elements = count; - svga->dirty |= SVGA_NEW_VELEMENT; + /* TODO make this more like a state */ } -static void svga_set_edgeflags(struct pipe_context *pipe, - const unsigned *bitfield) +static void * +svga_create_vertex_elements_state(struct pipe_context *pipe, + unsigned count, + const struct pipe_vertex_element *attribs) +{ + struct svga_velems_state *velems; + assert(count <= PIPE_MAX_ATTRIBS); + velems = (struct svga_velems_state *) MALLOC(sizeof(struct svga_velems_state)); + if (velems) { + velems->count = count; + memcpy(velems->velem, attribs, sizeof(*attribs) * count); + } + return velems; +} + +static void svga_bind_vertex_elements_state(struct pipe_context *pipe, + void *velems) { struct svga_context *svga = svga_context(pipe); + struct svga_velems_state *svga_velems = (struct svga_velems_state *) velems; - if (bitfield != NULL || svga->curr.edgeflags != NULL) { - svga->curr.edgeflags = bitfield; - svga->dirty |= SVGA_NEW_EDGEFLAGS; - } + svga->curr.velems = svga_velems; + svga->dirty |= SVGA_NEW_VELEMENT; } +static void svga_delete_vertex_elements_state(struct pipe_context *pipe, + void *velems) +{ + FREE(velems); +} void svga_cleanup_vertex_state( struct svga_context *svga ) { unsigned i; for (i = 0 ; i < svga->curr.num_vertex_buffers; i++) - pipe_buffer_reference(&svga->curr.vb[i].buffer, NULL); + pipe_resource_reference(&svga->curr.vb[i].buffer, NULL); } void svga_init_vertex_functions( struct svga_context *svga ) { svga->pipe.set_vertex_buffers = svga_set_vertex_buffers; - svga->pipe.set_vertex_elements = svga_set_vertex_elements; - svga->pipe.set_edgeflags = svga_set_edgeflags; + svga->pipe.set_index_buffer = svga_set_index_buffer; + svga->pipe.create_vertex_elements_state = svga_create_vertex_elements_state; + svga->pipe.bind_vertex_elements_state = svga_bind_vertex_elements_state; + svga->pipe.delete_vertex_elements_state = svga_delete_vertex_elements_state; }