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{ 48bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul draw->gs.tgsi.machine = tgsi_exec_machine_create(); 49bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul if (!draw->gs.tgsi.machine) 5089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return FALSE; 5189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 52bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul draw->gs.tgsi.machine->Primitives = align_malloc( 5389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin MAX_PRIMITIVES * sizeof(struct tgsi_exec_vector), 16); 54bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul if (!draw->gs.tgsi.machine->Primitives) 5589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return FALSE; 56bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul memset(draw->gs.tgsi.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{ 64bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul if (!draw->gs.tgsi.machine) 65a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz return; 66a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz 67bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul align_free(draw->gs.tgsi.machine->Primitives); 68a5c03bd6f16517bf35c273741080492d70d64c29Jakob Bornecrantz 69bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul tgsi_exec_machine_destroy(draw->gs.tgsi.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{ 78dd406cf34196a5a60362d8e1928b1308b56dd3f8Zack Rusin /* noop. added here for symmetry with the VS 79dd406cf34196a5a60362d8e1928b1308b56dd3f8Zack Rusin * code and in case we'll ever want to allign 80dd406cf34196a5a60362d8e1928b1308b56dd3f8Zack Rusin * the constants, e.g. when we'll change to a 81dd406cf34196a5a60362d8e1928b1308b56dd3f8Zack Rusin * different interpreter */ 8289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 8389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 8489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 8589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinstruct draw_geometry_shader * 8689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_create_geometry_shader(struct draw_context *draw, 8789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin const struct pipe_shader_state *state) 8889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 8989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_geometry_shader *gs; 9089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin int i; 9189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 9289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs = CALLOC_STRUCT(draw_geometry_shader); 9389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 9489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!gs) 9589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return NULL; 9689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 974d0baa73c9e1a40b4ac089c786af79dc7f1ff219Zack Rusin gs->draw = draw; 9889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->state = *state; 9989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->state.tokens = tgsi_dup_tokens(state->tokens); 10089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (!gs->state.tokens) { 10189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(gs); 10289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return NULL; 10389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 10489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 10589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin tgsi_scan_shader(state->tokens, &gs->info); 10689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 10789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin /* setup the defaults */ 10889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->input_primitive = PIPE_PRIM_TRIANGLES; 10989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->output_primitive = PIPE_PRIM_TRIANGLE_STRIP; 11089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->max_output_vertices = 32; 11189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 11289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (i = 0; i < gs->info.num_properties; ++i) { 11389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (gs->info.properties[i].name == 11489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin TGSI_PROPERTY_GS_INPUT_PRIM) 11589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->input_primitive = gs->info.properties[i].data[0]; 11689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin else if (gs->info.properties[i].name == 11789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin TGSI_PROPERTY_GS_OUTPUT_PRIM) 11889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->output_primitive = gs->info.properties[i].data[0]; 11989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin else if (gs->info.properties[i].name == 120d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES) 12189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->max_output_vertices = gs->info.properties[i].data[0]; 12289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 12389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 124bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul gs->machine = draw->gs.tgsi.machine; 12589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 12689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (gs) 12789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin { 12889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin uint i; 12989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (i = 0; i < gs->info.num_outputs; i++) { 13089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (gs->info.output_semantic_name[i] == TGSI_SEMANTIC_POSITION && 13189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->info.output_semantic_index[i] == 0) 13289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin gs->position_output = i; 13389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 13489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 13589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 13689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin return gs; 13789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 13889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 13989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_bind_geometry_shader(struct draw_context *draw, 14089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_geometry_shader *dgs) 14189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 14289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE); 14389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 14489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin if (dgs) { 14589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.geometry_shader = dgs; 14689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.num_gs_outputs = dgs->info.num_outputs; 14789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.position_output = dgs->position_output; 14889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw_geometry_shader_prepare(dgs, draw); 14989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 15089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin else { 15189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.geometry_shader = NULL; 15289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin draw->gs.num_gs_outputs = 0; 15389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 15489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 15589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 15689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_delete_geometry_shader(struct draw_context *draw, 15789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_geometry_shader *dgs) 15889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 15989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(dgs); 16089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 16189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 162d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin/*#define DEBUG_OUTPUTS 1*/ 16389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinstatic INLINE void 16489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusindraw_geometry_fetch_outputs(struct draw_geometry_shader *shader, 16589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin int num_primitives, 16629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin float (**p_output)[4]) 16789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 16889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct tgsi_exec_machine *machine = shader->machine; 16989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin unsigned prim_idx, j, slot; 1701d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin float (*output)[4]; 1711d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin 1721d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin output = *p_output; 17389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 17489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin /* Unswizzle all output results. 17589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin */ 176d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 17789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (prim_idx = 0; prim_idx < num_primitives; ++prim_idx) { 17804490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin unsigned num_verts_per_prim = machine->Primitives[prim_idx]; 179a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->primitive_lengths[prim_idx + shader->emitted_primitives] = 180a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin machine->Primitives[prim_idx]; 181d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin shader->emitted_vertices += num_verts_per_prim; 18289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (j = 0; j < num_verts_per_prim; j++) { 18389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin int idx = (prim_idx * num_verts_per_prim + j) * 18489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin shader->info.num_outputs; 18589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#ifdef DEBUG_OUTPUTS 1861d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin debug_printf("%d) Output vert:\n", idx / shader->info.num_outputs); 18789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#endif 18889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin for (slot = 0; slot < shader->info.num_outputs; slot++) { 18904490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][0] = machine->Outputs[idx + slot].xyzw[0].f[0]; 19004490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][1] = machine->Outputs[idx + slot].xyzw[1].f[0]; 19104490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][2] = machine->Outputs[idx + slot].xyzw[2].f[0]; 19204490ad31d0d763a0a1da7b521da55f5ea14e1cdZack Rusin output[slot][3] = machine->Outputs[idx + slot].xyzw[3].f[0]; 19389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#ifdef DEBUG_OUTPUTS 19489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin debug_printf("\t%d: %f %f %f %f\n", slot, 19589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][0], 19689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][1], 19789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][2], 19889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin output[slot][3]); 19989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin#endif 20089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin debug_assert(!util_is_inf_or_nan(output[slot][0])); 20189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 20229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin output = (float (*)[4])((char *)output + shader->vertex_size); 20389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 20489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin } 2051d11eac93f408053a0807783b434624a6dfcb3fbZack Rusin *p_output = output; 206a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->emitted_primitives += num_primitives; 20789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 20889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 209dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin/*#define DEBUG_INPUTS 1*/ 21029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void draw_fetch_gs_input(struct draw_geometry_shader *shader, 21129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned *indices, 21229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned num_vertices, 21329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned prim_idx) 21429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 21529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin struct tgsi_exec_machine *machine = shader->machine; 21629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned slot, vs_slot, i; 21729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned input_vertex_stride = shader->input_vertex_stride; 21829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin const float (*input_ptr)[4]; 21929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 22029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_ptr = shader->input; 22129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 22229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin for (i = 0; i < num_vertices; ++i) { 22329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin const float (*input)[4]; 224dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#if DEBUG_INPUTS 225dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin debug_printf("%d) vertex index = %d (prim idx = %d)\n", 226dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin i, indices[i], prim_idx); 227dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#endif 22829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input = (const float (*)[4])( 22929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin (const char *)input_ptr + (indices[i] * input_vertex_stride)); 23029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; ++slot) { 23129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned idx = i * TGSI_EXEC_MAX_INPUT_ATTRIBS + slot; 23229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin if (shader->info.input_semantic_name[slot] == TGSI_SEMANTIC_PRIMID) { 233dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[0].f[prim_idx] = 234dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 235dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[1].f[prim_idx] = 236dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 237dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[2].f[prim_idx] = 238dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 239dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin machine->Inputs[idx].xyzw[3].f[prim_idx] = 240dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin (float)shader->in_prim_idx; 24129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } else { 242dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#if DEBUG_INPUTS 243dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n", 244dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin slot, vs_slot, idx); 245dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#endif 24629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#if 1 24729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][0])); 24829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][1])); 24929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][2])); 25029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin assert(!util_is_inf_or_nan(input[vs_slot][3])); 25129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#endif 25229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[0].f[prim_idx] = input[vs_slot][0]; 25329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[1].f[prim_idx] = input[vs_slot][1]; 25429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[2].f[prim_idx] = input[vs_slot][2]; 25529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[3].f[prim_idx] = input[vs_slot][3]; 256dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin#if DEBUG_INPUTS 25729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin debug_printf("\t\t%f %f %f %f\n", 25829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[0].f[prim_idx], 25929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[1].f[prim_idx], 26029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[2].f[prim_idx], 26129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Inputs[idx].xyzw[3].f[prim_idx]); 26229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#endif 26329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++vs_slot; 26429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } 26529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } 26629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin } 26729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 26829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 26929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_flush(struct draw_geometry_shader *shader, 27029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned input_primitives) 27129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 27229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned out_prim_count; 27329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin struct tgsi_exec_machine *machine = shader->machine; 27429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 27529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin debug_assert(input_primitives > 0 && 27629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives < 4); 27729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 27829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin tgsi_set_exec_mask(machine, 27929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 1, 28029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives > 1, 28129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives > 2, 28229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin input_primitives > 3); 28329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 28429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin /* run interpreter */ 28529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin tgsi_exec_machine_run(machine); 28629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 28729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin out_prim_count = 28829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin machine->Temps[TGSI_EXEC_TEMP_PRIMITIVE_I].xyzw[TGSI_EXEC_TEMP_PRIMITIVE_C].u[0]; 28929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 290215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#if 0 291215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("PRIM emitted prims = %d (verts=%d), cur prim count = %d\n", 292215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin shader->emitted_primitives, shader->emitted_vertices, 293215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin out_prim_count); 294215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#endif 29529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_geometry_fetch_outputs(shader, out_prim_count, 29629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin &shader->tmp_output); 29729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 29829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 29929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_point(struct draw_geometry_shader *shader, 30029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin int idx) 30129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 30229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned indices[1]; 30329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[0] = idx; 30529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_fetch_gs_input(shader, indices, 1, 0); 30729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++shader->in_prim_idx; 30829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 30929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin gs_flush(shader, 1); 31029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 31129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 31229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_line(struct draw_geometry_shader *shader, 31329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin int i0, int i1) 31429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 31529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned indices[2]; 31629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 31729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[0] = i0; 31829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[1] = i1; 31929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 32029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_fetch_gs_input(shader, indices, 2, 0); 32129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++shader->in_prim_idx; 32229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 32329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin gs_flush(shader, 1); 32429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 32529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 326dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusinstatic void gs_line_adj(struct draw_geometry_shader *shader, 327dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin int i0, int i1, int i2, int i3) 328dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin{ 329dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin unsigned indices[4]; 330dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 331dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[0] = i0; 332dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[1] = i1; 333dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[2] = i2; 334dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin indices[3] = i3; 335dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 336dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin draw_fetch_gs_input(shader, indices, 4, 0); 337dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin ++shader->in_prim_idx; 338dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 339dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin gs_flush(shader, 1); 340dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin} 341dc8f64c537a72d82c4c3d9e3bf6bf1e4a07c3b53Zack Rusin 34229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusinstatic void gs_tri(struct draw_geometry_shader *shader, 34329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin int i0, int i1, int i2) 34429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin{ 34529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin unsigned indices[3]; 34629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 34729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[0] = i0; 34829639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[1] = i1; 34929639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin indices[2] = i2; 35029639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 35129639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin draw_fetch_gs_input(shader, indices, 3, 0); 35229639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin ++shader->in_prim_idx; 35329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 35429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin gs_flush(shader, 1); 35529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin} 35629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 357f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusinstatic void gs_tri_adj(struct draw_geometry_shader *shader, 358f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin int i0, int i1, int i2, 359f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin int i3, int i4, int i5) 360f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin{ 361f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin unsigned indices[6]; 362f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 363f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[0] = i0; 364f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[1] = i1; 365f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[2] = i2; 366f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[3] = i3; 367f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[4] = i4; 368f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin indices[5] = i5; 369f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 370f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin draw_fetch_gs_input(shader, indices, 6, 0); 371f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin ++shader->in_prim_idx; 372f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 373f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin gs_flush(shader, 1); 374f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin} 375f542a2770a5ac3eb487cd3723cf98a383779a98dZack Rusin 37623176779f88c5cff7365698f391194141e11e64cChia-I Wu#define FUNC gs_run 37723176779f88c5cff7365698f391194141e11e64cChia-I Wu#define GET_ELT(idx) (idx) 378215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#include "draw_gs_tmp.h" 379215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin 380215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin 38123176779f88c5cff7365698f391194141e11e64cChia-I Wu#define FUNC gs_run_elts 38223176779f88c5cff7365698f391194141e11e64cChia-I Wu#define LOCAL_VARS const ushort *elts = input_prims->elts; 383c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu#define GET_ELT(idx) (elts[idx]) 38429639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin#include "draw_gs_tmp.h" 38529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin 386ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul 387ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul/** 388ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul * Execute geometry shader using TGSI interpreter. 389ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul */ 390d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusinint draw_geometry_shader_run(struct draw_geometry_shader *shader, 391b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell const void *constants[PIPE_MAX_CONSTANT_BUFFERS], 392ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], 393b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell const struct draw_vertex_info *input_verts, 394b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell const struct draw_prim_info *input_prim, 395b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell struct draw_vertex_info *output_verts, 396b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell struct draw_prim_info *output_prims ) 39789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 398a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin const float (*input)[4] = (const float (*)[4])input_verts->verts->data; 399b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell unsigned input_stride = input_verts->vertex_size; 400b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell unsigned vertex_size = input_verts->vertex_size; 40189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct tgsi_exec_machine *machine = shader->machine; 402215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin unsigned num_input_verts = input_prim->linear ? 403215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_verts->count : 404215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_prim->count; 405215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin unsigned num_in_primitives = 406215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin MAX2(u_gs_prims_for_vertices(input_prim->prim, num_input_verts), 407215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin u_gs_prims_for_vertices(shader->input_primitive, num_input_verts)); 408a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin unsigned max_out_prims = u_gs_prims_for_vertices(shader->output_primitive, 409a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->max_output_vertices) 410a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin * num_in_primitives; 411b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 412b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_verts->vertex_size = input_verts->vertex_size; 413b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_verts->stride = input_verts->vertex_size; 414b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_verts->verts = 415a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin (struct vertex_header *)MALLOC(input_verts->vertex_size * 416a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin num_in_primitives * 417a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->max_output_vertices); 418b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 419b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 420215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#if 0 421215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("%s count = %d (in prims # = %d)\n", 422215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin __FUNCTION__, num_input_verts, num_in_primitives); 423215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("\tlinear = %d, prim_info->count = %d\n", 424215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_prim->linear, input_prim->count); 425215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin debug_printf("\tprimt pipe = %d, shader in = %d, shader out = %d, max out = %d\n", 426215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin input_prim->prim, shader->input_primitive, 427215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin shader->output_primitive, 428215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin shader->max_output_vertices); 429215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin#endif 430da4185ca77395b9dddc362891d8f7bbc2fa924cdZack Rusin 431d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin shader->emitted_vertices = 0; 432d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin shader->emitted_primitives = 0; 43329639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->vertex_size = vertex_size; 434a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->tmp_output = (float (*)[4])output_verts->verts->data; 43529639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->in_prim_idx = 0; 43629639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->input_vertex_stride = input_stride; 43729639932f7d42ce3eb2f4b487366c67bb0bc910bZack Rusin shader->input = input; 438a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin if (shader->primitive_lengths) { 439a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin FREE(shader->primitive_lengths); 440a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin } 441a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin shader->primitive_lengths = MALLOC(max_out_prims * sizeof(unsigned)); 442d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin 443ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul tgsi_exec_set_constant_buffers(machine, PIPE_MAX_CONSTANT_BUFFERS, 444ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul constants, constants_size); 44589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 446215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin if (input_prim->linear) 447215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin gs_run(shader, input_prim, input_verts, 448215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin output_prims, output_verts); 449215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin else 450215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin gs_run_elts(shader, input_prim, input_verts, 451215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin output_prims, output_verts); 4524d0baa73c9e1a40b4ac089c786af79dc7f1ff219Zack Rusin 453a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin /* Update prim_info: 454b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell */ 455b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_prims->linear = TRUE; 456b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell output_prims->elts = NULL; 457a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->start = 0; 4583560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin output_prims->count = shader->emitted_vertices; 459a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->prim = shader->output_primitive; 460f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu output_prims->flags = 0x0; 461a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->primitive_lengths = shader->primitive_lengths; 462a192b5eeafae80f9f9e7e7e442abc5b44d583d1aZack Rusin output_prims->primitive_count = shader->emitted_primitives; 463215e10ac2615359065cc264c68f08f39533bafd4Zack Rusin output_verts->count = shader->emitted_vertices; 464b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell 4653560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin#if 0 4663560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin debug_printf("GS finished, prims = %d, verts = %d\n", 4673560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin output_prims->primitive_count, 4683560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin output_verts->count); 4693560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin#endif 4703560652ccf0d88bcc23c326ea99bbc7091b45f39Zack Rusin 471d4ef0f6c67aefe06d8dd647acf8d9005df39a709Zack Rusin return shader->emitted_vertices; 47289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 47389d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 47489d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_geometry_shader_delete(struct draw_geometry_shader *shader) 47589d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 47689d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE((void*) shader->state.tokens); 47789d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin FREE(shader); 47889d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 47989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin 48089d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusinvoid draw_geometry_shader_prepare(struct draw_geometry_shader *shader, 48189d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin struct draw_context *draw) 48289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin{ 4831963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin if (shader && shader->machine->Tokens != shader->state.tokens) { 4841963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin tgsi_exec_machine_bind_shader(shader->machine, 4851963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin shader->state.tokens, 486bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul draw->gs.tgsi.num_samplers, 487bef196c7929606bb8c7e9c06fe83a90fc0d95f09Brian Paul draw->gs.tgsi.samplers); 4881963112f9d0a2ed8e237641eef8eb384365d1375Zack Rusin } 48989d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin} 490