sp_state_shader.c revision 28486880ca3ec39419ccee0cb1a3bedc9ef7117c
18e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell/************************************************************************** 28e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 3c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 48e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * All Rights Reserved. 58e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 68e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 78e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * copy of this software and associated documentation files (the 88e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * "Software"), to deal in the Software without restriction, including 98e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 118e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 128e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * the following conditions: 138e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 148e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * The above copyright notice and this permission notice (including the 158e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 168e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * of the Software. 178e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 188e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 198e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 208e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 218e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 228e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 238e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 248e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 258e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 268e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell **************************************************************************/ 278e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 286393cda6766b707ef01e925d378239a66d143ae0Keith Whitwell#include "sp_context.h" 296393cda6766b707ef01e925d378239a66d143ae0Keith Whitwell#include "sp_state.h" 30c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell#include "sp_fs.h" 318e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 32c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian#include "pipe/p_defines.h" 334f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 3428486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 356ac2c1cc0cd1253ba2014d459010032127f185ecKeith Whitwell#include "draw/draw_context.h" 364fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell#include "draw/draw_vs.h" 37c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 38c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_scan.h" 39fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell#include "tgsi/tgsi_parse.h" 408e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 418e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 422b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid * 432b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_create_fs_state(struct pipe_context *pipe, 442b40838972bb84a0dff8f8a3c933b0d2b8384f10Brian const struct pipe_shader_state *templ) 45ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin{ 46344464bf2e4e151968cfb101c2477e440508b1f0Michel Dänzer struct softpipe_context *softpipe = softpipe_context(pipe); 47c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct sp_fragment_shader *state; 48b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri unsigned i; 49344464bf2e4e151968cfb101c2477e440508b1f0Michel Dänzer 50f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian /* debug */ 51c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell if (softpipe->dump_fs) 52c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell tgsi_dump(templ->tokens, 0); 5352659e3c238d961de1f25bed9254747f2f931547Brian 54f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian /* codegen */ 55b5c389721aec09c260789e6371910937f15ef1a0Keith Whitwell state = softpipe_create_fs_sse( softpipe, templ ); 56012391357fcbefd2b34e999eed91a129d5efd77cBrian if (!state) { 57b5c389721aec09c260789e6371910937f15ef1a0Keith Whitwell state = softpipe_create_fs_exec( softpipe, templ ); 58012391357fcbefd2b34e999eed91a129d5efd77cBrian } 59f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian 60c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell assert(state); 61f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian 62f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian /* get/save the summary info for this shader */ 63f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian tgsi_scan_shader(templ->tokens, &state->info); 64f74279002a0ae0b106bd5410487ef9c0e9b1d8b6Brian 65b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri for (i = 0; i < state->info.num_properties; ++i) { 66b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri if (state->info.properties[i].name == TGSI_PROPERTY_FS_COORD_ORIGIN) 67b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri state->origin_lower_left = state->info.properties[i].data[0]; 68b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri else if (state->info.properties[i].name == TGSI_PROPERTY_FS_COORD_PIXEL_CENTER) 69b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri state->pixel_center_integer = state->info.properties[i].data[0]; 70b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri } 71b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri 7251345cb3c4d85a9e88ac35b59e938b0692df6205Zack Rusin return state; 73ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin} 74ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin 7552659e3c238d961de1f25bed9254747f2f931547Brian 762b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid 772b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_bind_fs_state(struct pipe_context *pipe, void *fs) 788e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{ 796393cda6766b707ef01e925d378239a66d143ae0Keith Whitwell struct softpipe_context *softpipe = softpipe_context(pipe); 808e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 814ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca draw_flush(softpipe->draw); 824ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca 834ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca if (softpipe->fs == fs) 844ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca return; 854ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca 864ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca draw_flush(softpipe->draw); 874ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca 884ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca softpipe->fs = fs; 898e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 90a380f98b6cc1da78d0845746ab86c3490a800126Brian softpipe->dirty |= SP_NEW_FS; 918e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell} 928e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 9352659e3c238d961de1f25bed9254747f2f931547Brian 942b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid 952b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_delete_fs_state(struct pipe_context *pipe, void *fs) 96a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin{ 97c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct sp_fragment_shader *state = fs; 98ce454d2192918ae4b2535d0e76c68ebde3c4653fBrian Paul 99f30285e99c1e158971855b12331df3da38555004Keith Whitwell assert(fs != softpipe_context(pipe)->fs); 100c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell 101c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell state->delete( state ); 102a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin} 103a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 104a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 1052b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid * 1062b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_create_vs_state(struct pipe_context *pipe, 1072b40838972bb84a0dff8f8a3c933b0d2b8384f10Brian const struct pipe_shader_state *templ) 108a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin{ 109a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin struct softpipe_context *softpipe = softpipe_context(pipe); 110c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell struct sp_vertex_shader *state; 111ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol 112c04a7f8929d674971a472ffa4d3a31200c22aa5aKeith Whitwell state = CALLOC_STRUCT(sp_vertex_shader); 113fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell if (state == NULL ) 114fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell goto fail; 115fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell 116fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell /* copy shader tokens, the ones passed in will go away. 117fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell */ 118fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell state->shader.tokens = tgsi_dup_tokens(templ->tokens); 119fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell if (state->shader.tokens == NULL) 120fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell goto fail; 121ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol 1229671f7ae476cadb46f9f8f9d0363f24aabaf9f87Brian Paul state->draw_data = draw_create_vertex_shader(softpipe->draw, templ); 123fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell if (state->draw_data == NULL) 124fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell goto fail; 125a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 1264fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell state->max_sampler = state->draw_data->info.file_max[TGSI_FILE_SAMPLER]; 1274fc7d0345a18042a79686940fb7cc4e698cc9192Keith Whitwell 128a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin return state; 129fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell 130fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwellfail: 131fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell if (state) { 132fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell FREE( (void *)state->shader.tokens ); 133fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell FREE( state->draw_data ); 134fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell FREE( state ); 135fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell } 136fa0f48504a32642d688d4b81f62eea54c693b23fKeith Whitwell return NULL; 137a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin} 1388e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 13952659e3c238d961de1f25bed9254747f2f931547Brian 1402b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid 1412b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_bind_vs_state(struct pipe_context *pipe, void *vs) 142de653b4c9bddcec46f3ddf411ec082dd178d7b38Brian{ 143de653b4c9bddcec46f3ddf411ec082dd178d7b38Brian struct softpipe_context *softpipe = softpipe_context(pipe); 1448e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1454256c5829f8c23f8bd5c7c29491210f0f7813bf9Brian Paul softpipe->vs = (struct sp_vertex_shader *) vs; 1460a262998ef2813d19e9fee01d3e5808416e9cb04Brian 147339e7ec6805e6de8794514c0a935081b5d36d38fBrian draw_bind_vertex_shader(softpipe->draw, 148339e7ec6805e6de8794514c0a935081b5d36d38fBrian (softpipe->vs ? softpipe->vs->draw_data : NULL)); 149c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 150a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin softpipe->dirty |= SP_NEW_VS; 151ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin} 152ccd63b54cfbb6bb241d55f7ac95afcd14819f469Zack Rusin 15352659e3c238d961de1f25bed9254747f2f931547Brian 1542b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid 1552b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_delete_vs_state(struct pipe_context *pipe, void *vs) 156901577e07fcab0cf90a272fee900cb0831ae84c3Zack Rusin{ 157a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin struct softpipe_context *softpipe = softpipe_context(pipe); 158a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 1594256c5829f8c23f8bd5c7c29491210f0f7813bf9Brian Paul struct sp_vertex_shader *state = (struct sp_vertex_shader *) vs; 160a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 161a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin draw_delete_vertex_shader(softpipe->draw, state->draw_data); 162a24631bcd7ab2cbc6fff2a536502a07a13a9bc83Alan Hourihane FREE( (void *)state->shader.tokens ); 163ee295fccdd0c94cb6b8af4dfb30283e39f548223Michal Krol FREE( state ); 164901577e07fcab0cf90a272fee900cb0831ae84c3Zack Rusin} 1656dcfddb8e2ec2bfb6187b912807fa65f28da2c5eZack Rusin 166a1a989f0be8dc34082b52bb3b3a6eacb36d9e75eZack Rusin 1672b40838972bb84a0dff8f8a3c933b0d2b8384f10Brian 1682b40838972bb84a0dff8f8a3c933b0d2b8384f10Brianvoid 1692b40838972bb84a0dff8f8a3c933b0d2b8384f10Briansoftpipe_set_constant_buffer(struct pipe_context *pipe, 1702b40838972bb84a0dff8f8a3c933b0d2b8384f10Brian uint shader, uint index, 17170c8d2a29724d018bacc4a68ddc61db08faea00dRoland Scheidegger struct pipe_buffer *buf) 172c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian{ 173c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian struct softpipe_context *softpipe = softpipe_context(pipe); 174c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 175c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian assert(shader < PIPE_SHADER_TYPES); 1767c5f255201f42303188137f56ea8acc030444f0eMichal Krol assert(index < PIPE_MAX_CONSTANT_BUFFERS); 177c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 1784ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca draw_flush(softpipe->draw); 1794ccf0bb74e7f88ff51bba64a2a94a29f997231f5José Fonseca 180c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian /* note: reference counting */ 181835bab0143e11ab98551a061043f944fd6eab456Michal Krol pipe_buffer_reference(&softpipe->constants[shader][index], buf); 182c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian 183c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian softpipe->dirty |= SP_NEW_CONSTANTS; 184c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian} 18589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 18689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid * 18789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinsoftpipe_create_gs_state(struct pipe_context *pipe, 18889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin const struct pipe_shader_state *templ) 18989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 19089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct softpipe_context *softpipe = softpipe_context(pipe); 19189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct sp_geometry_shader *state; 19289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 19389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin state = CALLOC_STRUCT(sp_geometry_shader); 19489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (state == NULL ) 19589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin goto fail; 19689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 197ac96ee1c16419583aa43c9f4100aaca774b9439aZack Rusin /* debug */ 198ac96ee1c16419583aa43c9f4100aaca774b9439aZack Rusin if (softpipe->dump_gs) 199ac96ee1c16419583aa43c9f4100aaca774b9439aZack Rusin tgsi_dump(templ->tokens, 0); 200ac96ee1c16419583aa43c9f4100aaca774b9439aZack Rusin 20189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin /* copy shader tokens, the ones passed in will go away. 20289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin */ 20389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin state->shader.tokens = tgsi_dup_tokens(templ->tokens); 20489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (state->shader.tokens == NULL) 20589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin goto fail; 20689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 20789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin state->draw_data = draw_create_geometry_shader(softpipe->draw, templ); 20889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (state->draw_data == NULL) 20989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin goto fail; 21089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 21189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return state; 21289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 21389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinfail: 21489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (state) { 21589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE( (void *)state->shader.tokens ); 21689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE( state->draw_data ); 21789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE( state ); 21889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 21989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return NULL; 22089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 22189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 22289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 22389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid 22489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinsoftpipe_bind_gs_state(struct pipe_context *pipe, void *gs) 22589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 22689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct softpipe_context *softpipe = softpipe_context(pipe); 22789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 22889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin softpipe->gs = (struct sp_geometry_shader *)gs; 22989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 23089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw_bind_geometry_shader(softpipe->draw, 23189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin (softpipe->gs ? softpipe->gs->draw_data : NULL)); 23289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 23389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin softpipe->dirty |= SP_NEW_GS; 23489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 23589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 23689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 23789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid 23889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinsoftpipe_delete_gs_state(struct pipe_context *pipe, void *gs) 23989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 24089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct softpipe_context *softpipe = softpipe_context(pipe); 24189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 24289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct sp_geometry_shader *state = 24389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin (struct sp_geometry_shader *)gs; 24489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 24542eefb8235437655632b36490f49a3a8fdc69401Zack Rusin draw_delete_geometry_shader(softpipe->draw, 24642eefb8235437655632b36490f49a3a8fdc69401Zack Rusin (state) ? state->draw_data : 0); 24789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(state); 24889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 249