13f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul/************************************************************************** 23f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc. 43f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * All Rights Reserved. 53f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * 63f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 73f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * copy of this software and associated documentation files (the 83f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * "Software"), to deal in the Software without restriction, including 93f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 103f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 113f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * permit persons to whom the Software is furnished to do so, subject to 123f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * the following conditions: 133f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * 143f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * The above copyright notice and this permission notice (including the 153f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * next paragraph) shall be included in all copies or substantial portions 163f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * of the Software. 173f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * 183f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 193f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 203f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 223f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 233f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 243f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 253f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul * 263f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul **************************************************************************/ 273f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul 28877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca/* Authors: Keith Whitwell <keithw@vmware.com> 293f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul */ 308175eaa3b49f3b62f7ab251c4e0fbd14dd9f7e2bBrian Paul 318175eaa3b49f3b62f7ab251c4e0fbd14dd9f7e2bBrian Paul 323f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul#include "sp_context.h" 333f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul#include "sp_state.h" 343f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul 35057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger#include "util/u_memory.h" 36e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák#include "util/u_helpers.h" 373c9aa3a7b12cfe178c14fea93cfb64a32db0b8adMarek Olšák#include "util/u_inlines.h" 38588fa884d212eba5ffbc69fda75db37d7c77214cMarek Olšák#include "util/u_transfer.h" 396acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 408175eaa3b49f3b62f7ab251c4e0fbd14dd9f7e2bBrian Paul 413f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul 42eed4509b086828c6229a7b1865978ffa27377874Brian Paulstatic void * 43057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheideggersoftpipe_create_vertex_elements_state(struct pipe_context *pipe, 44057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger unsigned count, 45057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger const struct pipe_vertex_element *attribs) 46057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger{ 47057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger struct sp_velems_state *velems; 48057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger assert(count <= PIPE_MAX_ATTRIBS); 49e8983f70b41ea92a9527cb618db011b5dd136626Roland Scheidegger velems = (struct sp_velems_state *) MALLOC(sizeof(struct sp_velems_state)); 50057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger if (velems) { 51057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger velems->count = count; 52057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger memcpy(velems->velem, attribs, sizeof(*attribs) * count); 53057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger } 54057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger return velems; 55057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger} 56057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger 57eed4509b086828c6229a7b1865978ffa27377874Brian Paul 58eed4509b086828c6229a7b1865978ffa27377874Brian Paulstatic void 59057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheideggersoftpipe_bind_vertex_elements_state(struct pipe_context *pipe, 60057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger void *velems) 613f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul{ 623f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul struct softpipe_context *softpipe = softpipe_context(pipe); 63057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger struct sp_velems_state *sp_velems = (struct sp_velems_state *) velems; 64a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 65057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger softpipe->velems = sp_velems; 66a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 673f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul softpipe->dirty |= SP_NEW_VERTEX; 680a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 69c282c0b6e40f9ed3cbf9d4c4eeb01d1896763246José Fonseca if (sp_velems) 70c282c0b6e40f9ed3cbf9d4c4eeb01d1896763246José Fonseca draw_set_vertex_elements(softpipe->draw, sp_velems->count, sp_velems->velem); 713f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul} 723f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul 73eed4509b086828c6229a7b1865978ffa27377874Brian Paul 74eed4509b086828c6229a7b1865978ffa27377874Brian Paulstatic void 75057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheideggersoftpipe_delete_vertex_elements_state(struct pipe_context *pipe, void *velems) 76057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger{ 77057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger FREE( velems ); 78057427dd3ea9da6f907b39391f6bd1b093fb128eRoland Scheidegger} 793f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul 80eed4509b086828c6229a7b1865978ffa27377874Brian Paul 81eed4509b086828c6229a7b1865978ffa27377874Brian Paulstatic void 82a52c0416d1f2105960b4646e2e268aed26814689Brian Paulsoftpipe_set_vertex_buffers(struct pipe_context *pipe, 83e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák unsigned start_slot, unsigned count, 84a52c0416d1f2105960b4646e2e268aed26814689Brian Paul const struct pipe_vertex_buffer *buffers) 853f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul{ 863f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul struct softpipe_context *softpipe = softpipe_context(pipe); 87a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 88a52c0416d1f2105960b4646e2e268aed26814689Brian Paul assert(count <= PIPE_MAX_ATTRIBS); 89a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 90e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák util_set_vertex_buffers_count(softpipe->vertex_buffer, 91e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák &softpipe->num_vertex_buffers, 92e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák buffers, start_slot, count); 93a52c0416d1f2105960b4646e2e268aed26814689Brian Paul 943f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul softpipe->dirty |= SP_NEW_VERTEX; 950a262998ef2813d19e9fee01d3e5808416e9cb04Brian Paul 96e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák draw_set_vertex_buffers(softpipe->draw, start_slot, count, buffers); 973f70b504386e5d0b67cbd719769e44f33db0ae87Brian Paul} 986d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu 99eed4509b086828c6229a7b1865978ffa27377874Brian Paul 100eed4509b086828c6229a7b1865978ffa27377874Brian Paulstatic void 1016d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wusoftpipe_set_index_buffer(struct pipe_context *pipe, 1026d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu const struct pipe_index_buffer *ib) 1036d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu{ 1046d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu struct softpipe_context *softpipe = softpipe_context(pipe); 1056d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu 1066d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu if (ib) 1076d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu memcpy(&softpipe->index_buffer, ib, sizeof(softpipe->index_buffer)); 1086d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu else 1096d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu memset(&softpipe->index_buffer, 0, sizeof(softpipe->index_buffer)); 1106d28bf917fb1d741d90fd3f05c22769376021fcaChia-I Wu} 111eed4509b086828c6229a7b1865978ffa27377874Brian Paul 112eed4509b086828c6229a7b1865978ffa27377874Brian Paul 113eed4509b086828c6229a7b1865978ffa27377874Brian Paulvoid 114eed4509b086828c6229a7b1865978ffa27377874Brian Paulsoftpipe_init_vertex_funcs(struct pipe_context *pipe) 115eed4509b086828c6229a7b1865978ffa27377874Brian Paul{ 116eed4509b086828c6229a7b1865978ffa27377874Brian Paul pipe->create_vertex_elements_state = softpipe_create_vertex_elements_state; 117eed4509b086828c6229a7b1865978ffa27377874Brian Paul pipe->bind_vertex_elements_state = softpipe_bind_vertex_elements_state; 118eed4509b086828c6229a7b1865978ffa27377874Brian Paul pipe->delete_vertex_elements_state = softpipe_delete_vertex_elements_state; 119eed4509b086828c6229a7b1865978ffa27377874Brian Paul 120eed4509b086828c6229a7b1865978ffa27377874Brian Paul pipe->set_vertex_buffers = softpipe_set_vertex_buffers; 121eed4509b086828c6229a7b1865978ffa27377874Brian Paul pipe->set_index_buffer = softpipe_set_index_buffer; 122eed4509b086828c6229a7b1865978ffa27377874Brian Paul} 123