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