draw_gs.c revision ba2cc3b8e6ad161181b67fd2575c6bc768584d23
189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin/************************************************************************** 289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * 3da30209afdd77199c98694ef64c6eaea557d0918Vinson Lee * Copyright 2009 VMware, Inc. 489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * All Rights Reserved. 589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * 689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * Permission is hereby granted, free of charge, to any person obtaining a 789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * copy of this software and associated documentation files (the 889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * "Software"), to deal in the Software without restriction, including 989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * without limitation the rights to use, copy, modify, merge, publish, 1089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * distribute, sub license, and/or sell copies of the Software, and to 1189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * permit persons to whom the Software is furnished to do so, subject to 1289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * the following conditions: 1389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * 1489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * The above copyright notice and this permission notice (including the 1589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * next paragraph) shall be included in all copies or substantial portions 1689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * of the Software. 1789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * 1889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin * 2689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin **************************************************************************/ 2789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 2889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "draw_gs.h" 2989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 3089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "draw_private.h" 3189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "draw_context.h" 3289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 3389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "tgsi/tgsi_parse.h" 3489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "tgsi/tgsi_exec.h" 3589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 3689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "pipe/p_shader_tokens.h" 3789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 3889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "util/u_math.h" 3989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#include "util/u_memory.h" 40da4185ca77395b9dddc362891d8f7bbc2fa924cdZack Rusin#include "util/u_prim.h" 4189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 4289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin/* fixme: move it from here */ 4389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#define MAX_PRIMITIVES 64 4489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 4589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinboolean 4689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_gs_init( struct draw_context *draw ) 4789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 4889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.machine = tgsi_exec_machine_create(); 4989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!draw->gs.machine) 5089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return FALSE; 5189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 5289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.machine->Primitives = align_malloc( 5389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector), 16); 5489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!draw->gs.machine->Primitives) 5589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return FALSE; 5689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin memset(draw->gs.machine->Primitives, 0, 5789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector)); 5889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 5989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return TRUE; 6089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 6189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 62a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantzvoid draw_gs_destroy( struct draw_context *draw ) 63a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz{ 64a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz if (!draw->gs.machine) 65a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz return; 66a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz 67a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz align_free(draw->gs.machine->Primitives); 68a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz 69a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz tgsi_exec_machine_destroy(draw->gs.machine); 70a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz} 7189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 729851644435f991a1a1bbb145333a97601627b37dMichal Krolvoid 739851644435f991a1a1bbb145333a97601627b37dMichal Kroldraw_gs_set_constants(struct draw_context *draw, 749851644435f991a1a1bbb145333a97601627b37dMichal Krol unsigned slot, 759851644435f991a1a1bbb145333a97601627b37dMichal Krol const void *constants, 769851644435f991a1a1bbb145333a97601627b37dMichal Krol unsigned size) 7789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 78ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul debug_printf("draw_gs_set_constants() not implemented yet!\n"); 7989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 8089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 8189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 8289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinstruct draw_geometry_shader * 8389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_create_geometry_shader(struct draw_context *draw, 8489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin const struct pipe_shader_state *state) 8589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 8689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_geometry_shader *gs; 8789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin int i; 8889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 8989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs = CALLOC_STRUCT(draw_geometry_shader); 9089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 9189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!gs) 9289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return NULL; 9389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 944d0baa73c9e1a40b4ac089c786af79dc7f1ff219Zack Rusin gs->draw = draw; 9589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->state = *state; 9689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->state.tokens = tgsi_dup_tokens(state->tokens); 9789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!gs->state.tokens) { 9889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(gs); 9989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return NULL; 10089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 10189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 10289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin tgsi_scan_shader(state->tokens, &gs->info); 10389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 10489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin /* setup the defaults */ 10589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->input_primitive = PIPE_PRIM_TRIANGLES; 10689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->output_primitive = PIPE_PRIM_TRIANGLE_STRIP; 10789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->max_output_vertices = 32; 10889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 10989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (i = 0; i < gs->info.num_properties; ++i) { 11089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (gs->info.properties[i].name == 11189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin TGSI_PROPERTY_GS_INPUT_PRIM) 11289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->input_primitive = gs->info.properties[i].data[0]; 11389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin else if (gs->info.properties[i].name == 11489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin TGSI_PROPERTY_GS_OUTPUT_PRIM) 11589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->output_primitive = gs->info.properties[i].data[0]; 11689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin else if (gs->info.properties[i].name == 117d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES) 11889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->max_output_vertices = gs->info.properties[i].data[0]; 11989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 12089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 12189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->machine = draw->gs.machine; 12289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 12389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (gs) 12489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin { 12589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin uint i; 12689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (i = 0; i < gs->info.num_outputs; i++) { 12789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (gs->info.output_semantic_name[i] == TGSI_SEMANTIC_POSITION && 12889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->info.output_semantic_index[i] == 0) 12989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->position_output = i; 13089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 13189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 13289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 13389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return gs; 13489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 13589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 13689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_bind_geometry_shader(struct draw_context *draw, 13789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_geometry_shader *dgs) 13889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 13989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE); 14089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 14189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (dgs) { 14289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.geometry_shader = dgs; 14389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.num_gs_outputs = dgs->info.num_outputs; 14489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.position_output = dgs->position_output; 14589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw_geometry_shader_prepare(dgs, draw); 14689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 14789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin else { 14889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.geometry_shader = NULL; 14989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.num_gs_outputs = 0; 15089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 15189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 15289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 15389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_delete_geometry_shader(struct draw_context *draw, 15489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_geometry_shader *dgs) 15589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 15689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(dgs); 15789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 15889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 159d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin/*#define DEBUG_OUTPUTS 1*/ 16089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinstatic INLINE void 16189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_geometry_fetch_outputs(struct draw_geometry_shader *shader, 16289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin int num_primitives, 16329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin float (**p_output)[4]) 16489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 16589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct tgsi_exec_machine *machine = shader->machine; 16689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin unsigned prim_idx, j, slot; 1671d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin float (*output)[4]; 1681d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin 1691d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin output = *p_output; 17089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 17189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin /* Unswizzle all output results. 17289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin */ 173d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 17489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (prim_idx = 0; prim_idx < num_primitives; ++prim_idx) { 17504490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin unsigned num_verts_per_prim = machine->Primitives[prim_idx]; 176a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->primitive_lengths[prim_idx + shader->emitted_primitives] = 177a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin machine->Primitives[prim_idx]; 178d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin shader->emitted_vertices += num_verts_per_prim; 17989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (j = 0; j < num_verts_per_prim; j++) { 18089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin int idx = (prim_idx * num_verts_per_prim + j) * 18189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin shader->info.num_outputs; 18289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#ifdef DEBUG_OUTPUTS 1831d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin debug_printf("%d) Output vert:\n", idx / shader->info.num_outputs); 18489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#endif 18589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (slot = 0; slot < shader->info.num_outputs; slot++) { 18604490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][0] = machine->Outputs[idx + slot].xyzw[0].f[0]; 18704490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][1] = machine->Outputs[idx + slot].xyzw[1].f[0]; 18804490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][2] = machine->Outputs[idx + slot].xyzw[2].f[0]; 18904490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][3] = machine->Outputs[idx + slot].xyzw[3].f[0]; 19089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#ifdef DEBUG_OUTPUTS 19189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin debug_printf("\t%d: %f %f %f %f\n", slot, 19289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][0], 19389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][1], 19489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][2], 19589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][3]); 19689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#endif 19789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin debug_assert(!util_is_inf_or_nan(output[slot][0])); 19889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 19929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin output = (float (*)[4])((char *)output + shader->vertex_size); 20089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 20189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 2021d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin *p_output = output; 203a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->emitted_primitives += num_primitives; 20489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 20589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 206dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin/*#define DEBUG_INPUTS 1*/ 20729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void draw_fetch_gs_input(struct draw_geometry_shader *shader, 20829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned *indices, 20929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned num_vertices, 21029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned prim_idx) 21129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 21229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin struct tgsi_exec_machine *machine = shader->machine; 21329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned slot, vs_slot, i; 21429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned input_vertex_stride = shader->input_vertex_stride; 21529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin const float (*input_ptr)[4]; 21629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 21729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_ptr = shader->input; 21829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 21929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin for (i = 0; i < num_vertices; ++i) { 22029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin const float (*input)[4]; 221dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#if DEBUG_INPUTS 222dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin debug_printf("%d) vertex index = %d (prim idx = %d)\n", 223dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin i, indices[i], prim_idx); 224dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#endif 22529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input = (const float (*)[4])( 22629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin (const char *)input_ptr + (indices[i] * input_vertex_stride)); 22729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) { 22829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned idx = i * TGSI_EXEC_MAX_INPUT_ATTRIBS + slot; 22929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_PRIMID) { 230dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[0].f[prim_idx] = 231dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 232dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[1].f[prim_idx] = 233dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 234dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[2].f[prim_idx] = 235dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 236dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[3].f[prim_idx] = 237dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 23829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } else { 239dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#if DEBUG_INPUTS 240dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n", 241dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin slot, vs_slot, idx); 242dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#endif 24329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#if 1 24429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][0])); 24529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][1])); 24629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][2])); 24729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][3])); 24829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#endif 24929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[0].f[prim_idx] = input[vs_slot][0]; 25029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[1].f[prim_idx] = input[vs_slot][1]; 25129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[2].f[prim_idx] = input[vs_slot][2]; 25229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[3].f[prim_idx] = input[vs_slot][3]; 253dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#if DEBUG_INPUTS 25429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin debug_printf("\t\t%f %f %f %f\n", 25529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[0].f[prim_idx], 25629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[1].f[prim_idx], 25729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[2].f[prim_idx], 25829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[3].f[prim_idx]); 25929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#endif 26029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++vs_slot; 26129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } 26229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } 26329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } 26429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 26529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 26629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_flush(struct draw_geometry_shader *shader, 26729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned input_primitives) 26829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 26929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned out_prim_count; 27029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin struct tgsi_exec_machine *machine = shader->machine; 27129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 27229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin debug_assert(input_primitives > 0 && 27329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives < 4); 27429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 27529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin tgsi_set_exec_mask(machine, 27629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 1, 27729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives > 1, 27829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives > 2, 27929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives > 3); 28029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 28129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin /* run interpreter */ 28229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin tgsi_exec_machine_run(machine); 28329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 28429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin out_prim_count = 28529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Temps[TGSI_EXEC_TEMP_PRIMITIVE_I].xyzw[TGSI_EXEC_TEMP_PRIMITIVE_C].u[0]; 28629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 287215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#if 0 288215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("PRIM emitted prims = %d (verts=%d), cur prim count = %d\n", 289215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin shader->emitted_primitives, shader->emitted_vertices, 290215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin out_prim_count); 291215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#endif 29229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_geometry_fetch_outputs(shader, out_prim_count, 29329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin &shader->tmp_output); 29429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 29529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 29629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_point(struct draw_geometry_shader *shader, 29729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin int idx) 29829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 29929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned indices[1]; 30029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[0] = idx; 30229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_fetch_gs_input(shader, indices, 1, 0); 30429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++shader->in_prim_idx; 30529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin gs_flush(shader, 1); 30729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 30829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_line(struct draw_geometry_shader *shader, 31029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin int i0, int i1) 31129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 31229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned indices[2]; 31329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 31429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[0] = i0; 31529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[1] = i1; 31629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 31729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_fetch_gs_input(shader, indices, 2, 0); 31829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++shader->in_prim_idx; 31929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 32029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin gs_flush(shader, 1); 32129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 32229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 323dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusinstatic void gs_line_adj(struct draw_geometry_shader *shader, 324dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin int i0, int i1, int i2, int i3) 325dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin{ 326dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin unsigned indices[4]; 327dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 328dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[0] = i0; 329dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[1] = i1; 330dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[2] = i2; 331dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[3] = i3; 332dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 333dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin draw_fetch_gs_input(shader, indices, 4, 0); 334dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin ++shader->in_prim_idx; 335dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 336dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin gs_flush(shader, 1); 337dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin} 338dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 33929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_tri(struct draw_geometry_shader *shader, 34029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin int i0, int i1, int i2) 34129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 34229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned indices[3]; 34329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 34429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[0] = i0; 34529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[1] = i1; 34629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[2] = i2; 34729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 34829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_fetch_gs_input(shader, indices, 3, 0); 34929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++shader->in_prim_idx; 35029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 35129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin gs_flush(shader, 1); 35229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 35329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 354f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusinstatic void gs_tri_adj(struct draw_geometry_shader *shader, 355f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin int i0, int i1, int i2, 356f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin int i3, int i4, int i5) 357f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin{ 358f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin unsigned indices[6]; 359f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 360f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[0] = i0; 361f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[1] = i1; 362f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[2] = i2; 363f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[3] = i3; 364f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[4] = i4; 365f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[5] = i5; 366f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 367f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin draw_fetch_gs_input(shader, indices, 6, 0); 368f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin ++shader->in_prim_idx; 369f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 370f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin gs_flush(shader, 1); 371f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin} 372f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 37329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#define TRIANGLE(gs,i0,i1,i2) gs_tri(gs,i0,i1,i2) 374f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin#define TRI_ADJ(gs,i0,i1,i2,i3,i4,i5) gs_tri_adj(gs,i0,i1,i2,i3,i4,i5) 375dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#define LINE(gs,i0,i1) gs_line(gs,i0,i1) 376dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#define LINE_ADJ(gs,i0,i1,i2,i3) gs_line_adj(gs,i0,i1,i2,i3) 37729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#define POINT(gs,i0) gs_point(gs,i0) 37829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#define FUNC gs_run 379215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#define LOCAL_VARS 380215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#include "draw_gs_tmp.h" 381215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin 382215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin 383215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#define TRIANGLE(gs,i0,i1,i2) gs_tri(gs,elts[i0],elts[i1],elts[i2]) 384f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin#define TRI_ADJ(gs,i0,i1,i2,i3,i4,i5) \ 385f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin gs_tri_adj(gs,elts[i0],elts[i1],elts[i2],elts[i3], \ 386f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin elts[i4],elts[i5]) 387215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#define LINE(gs,i0,i1) gs_line(gs,elts[i0],elts[i1]) 388dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#define LINE_ADJ(gs,i0,i1,i2,i3) gs_line_adj(gs,elts[i0], \ 389dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin elts[i1], \ 390dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin elts[i2],elts[i3]) 391215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#define POINT(gs,i0) gs_point(gs,elts[i0]) 392215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#define FUNC gs_run_elts 393215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#define LOCAL_VARS \ 394215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin const ushort *elts = input_prims->elts; 39529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#include "draw_gs_tmp.h" 39629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 397ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul 398ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul/** 399ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul * Execute geometry shader using TGSI interpreter. 400ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul */ 401d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusinint draw_geometry_shader_run(struct draw_geometry_shader *shader, 402b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell const void *constants[PIPE_MAX_CONSTANT_BUFFERS], 403ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], 404b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell const struct draw_vertex_info *input_verts, 405b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell const struct draw_prim_info *input_prim, 406b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell struct draw_vertex_info *output_verts, 407b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell struct draw_prim_info *output_prims ) 40889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 409a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin const float (*input)[4] = (const float (*)[4])input_verts->verts->data; 410b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell unsigned input_stride = input_verts->vertex_size; 411b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell unsigned vertex_size = input_verts->vertex_size; 41289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct tgsi_exec_machine *machine = shader->machine; 413215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin unsigned num_input_verts = input_prim->linear ? 414215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_verts->count : 415215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_prim->count; 416215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin unsigned num_in_primitives = 417215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin MAX2(u_gs_prims_for_vertices(input_prim->prim, num_input_verts), 418215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin u_gs_prims_for_vertices(shader->input_primitive, num_input_verts)); 419a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin unsigned max_out_prims = u_gs_prims_for_vertices(shader->output_primitive, 420a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->max_output_vertices) 421a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin * num_in_primitives; 422b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 423b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_verts->vertex_size = input_verts->vertex_size; 424b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_verts->stride = input_verts->vertex_size; 425b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_verts->verts = 426a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin (struct vertex_header *)MALLOC(input_verts->vertex_size * 427a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin num_in_primitives * 428a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->max_output_vertices); 429b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 430b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 431215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#if 0 432215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("%s count = %d (in prims # = %d)\n", 433215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin __FUNCTION__, num_input_verts, num_in_primitives); 434215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("\tlinear = %d, prim_info->count = %d\n", 435215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_prim->linear, input_prim->count); 436215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("\tprimt pipe = %d, shader in = %d, shader out = %d, max out = %d\n", 437215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_prim->prim, shader->input_primitive, 438215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin shader->output_primitive, 439215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin shader->max_output_vertices); 440215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#endif 441da4185ca77395b9dddc362891d8f7bbc2fa924cdZack Rusin 442d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin shader->emitted_vertices = 0; 443d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin shader->emitted_primitives = 0; 44429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->vertex_size = vertex_size; 445a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->tmp_output = (float (*)[4])output_verts->verts->data; 44629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->in_prim_idx = 0; 44729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->input_vertex_stride = input_stride; 44829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->input = input; 449a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin if (shader->primitive_lengths) { 450a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin FREE(shader->primitive_lengths); 451a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin } 452a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->primitive_lengths = MALLOC(max_out_prims * sizeof(unsigned)); 453d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 454ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul tgsi_exec_set_constant_buffers(machine, PIPE_MAX_CONSTANT_BUFFERS, 455ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul constants, constants_size); 45689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 457215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin if (input_prim->linear) 458215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin gs_run(shader, input_prim, input_verts, 459215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin output_prims, output_verts); 460215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin else 461215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin gs_run_elts(shader, input_prim, input_verts, 462215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin output_prims, output_verts); 4634d0baa73c9e1a40b4ac089c786af79dc7f1ff219Zack Rusin 464a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin /* Update prim_info: 465b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell */ 466b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_prims->linear = TRUE; 467b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_prims->elts = NULL; 468a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->start = 0; 4693560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin output_prims->count = shader->emitted_vertices; 470a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->prim = shader->output_primitive; 471a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->primitive_lengths = shader->primitive_lengths; 472a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->primitive_count = shader->emitted_primitives; 473215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin output_verts->count = shader->emitted_vertices; 474b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 4753560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin#if 0 4763560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin debug_printf("GS finished, prims = %d, verts = %d\n", 4773560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin output_prims->primitive_count, 4783560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin output_verts->count); 4793560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin#endif 4803560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin 481d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin return shader->emitted_vertices; 48289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 48389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 48489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_geometry_shader_delete(struct draw_geometry_shader *shader) 48589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 48689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE((void*) shader->state.tokens); 48789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(shader); 48889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 48989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 49089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_geometry_shader_prepare(struct draw_geometry_shader *shader, 49189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_context *draw) 49289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 4931963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin if (shader && shader->machine->Tokens != shader->state.tokens) { 4941963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin tgsi_exec_machine_bind_shader(shader->machine, 4951963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin shader->state.tokens, 4961963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin draw->gs.num_samplers, 4971963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin draw->gs.samplers); 4981963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin } 49989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 500