draw_vs_ppc.c revision abbbe876ac98596b143da295abf6887e0a4e50d2
1b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul/************************************************************************** 2b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * 3b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * All Rights Reserved. 5b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * 6b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 7b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * copy of this software and associated documentation files (the 8b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * "Software"), to deal in the Software without restriction, including 9b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * without limitation the rights to use, copy, modify, merge, publish, 10b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * distribute, sub license, and/or sell copies of the Software, and to 11b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * permit persons to whom the Software is furnished to do so, subject to 12b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * the following conditions: 13b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * 14b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * The above copyright notice and this permission notice (including the 15b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * next paragraph) shall be included in all copies or substantial portions 16b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * of the Software. 17b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * 18b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * 26b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul **************************************************************************/ 27b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 28b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* 29b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * Authors: 30b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * Keith Whitwell <keith@tungstengraphics.com> 31b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * Brian Paul 32b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul */ 33b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 34b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "util/u_math.h" 35b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "util/u_memory.h" 36b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "pipe/p_config.h" 37b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 38b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "draw_vs.h" 39b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 40b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#if defined(PIPE_ARCH_PPC) 41b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 42b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "pipe/p_shader_tokens.h" 43b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 44b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "draw_private.h" 45b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "draw_context.h" 46b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 47b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "rtasm/rtasm_cpu.h" 48b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "rtasm/rtasm_ppc.h" 49b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "tgsi/tgsi_ppc.h" 50b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#include "tgsi/tgsi_parse.h" 51b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 52b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 53b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 54b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paultypedef void (PIPE_CDECL *codegen_function) (float (*inputs)[4][4], 55b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*outputs)[4][4], 56b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*temps)[4][4], 57b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*immeds)[4][4], 58abbbe876ac98596b143da295abf6887e0a4e50d2Brian Paul float (*consts)[4], 59abbbe876ac98596b143da295abf6887e0a4e50d2Brian Paul const float *builtins); 60b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 61b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#if 0 62b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const struct tgsi_exec_vector *input, 63b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct tgsi_exec_vector *output, 64b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*constant)[4], /* 3 */ 65b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct tgsi_exec_vector *temporary, /* 4 */ 66b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*immediates)[4], /* 5 */ 67b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const float (*aos_input)[4], /* 6 */ 68b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint num_inputs, /* 7 */ 69b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint input_stride, /* 8 */ 70b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*aos_output)[4], /* 9 */ 71b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint num_outputs, /* 10 */ 72b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint output_stride ); /* 11 */ 73b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#endif 74b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 75b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulstruct draw_ppc_vertex_shader { 76b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct draw_vertex_shader base; 77b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct ppc_function ppc_program; 78b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 79b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul codegen_function func; 80b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 81b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct tgsi_exec_machine *machine; 82b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul}; 83b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 84b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 85b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulstatic void 86b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulvs_ppc_prepare( struct draw_vertex_shader *base, 87b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct draw_context *draw ) 88b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul{ 89b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul} 90b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 91b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 92b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 93b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul/* Simplified vertex shader interface for the pt paths. Given the 94b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * complexity of code-generating all the above operations together, 95b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul * it's time to try doing all the other stuff separately. 96b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul */ 97b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulstatic void 98b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulvs_ppc_run_linear( struct draw_vertex_shader *base, 99b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const float (*input)[4], 100b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float (*output)[4], 101b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const float (*constants)[4], 102b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul unsigned count, 103b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul unsigned input_stride, 104b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul unsigned output_stride ) 105b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul{ 106b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct draw_ppc_vertex_shader *shader = (struct draw_ppc_vertex_shader *)base; 107b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct tgsi_exec_machine *machine = shader->machine; 108b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul unsigned int i; 109b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 110b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#define MAX_VERTICES 4 111b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 112b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* loop over verts */ 113b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul for (i = 0; i < count; i += MAX_VERTICES) { 114b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const uint max_vertices = MIN2(MAX_VERTICES, count - i); 115b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float inputs_soa[PIPE_MAX_SHADER_INPUTS][4][4] ALIGN16_ATTRIB; 116b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float outputs_soa[PIPE_MAX_SHADER_OUTPUTS][4][4] ALIGN16_ATTRIB; 117b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float temps_soa[TGSI_EXEC_NUM_TEMPS][4][4] ALIGN16_ATTRIB; 118b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint attr; 119b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 120b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* convert (up to) four input verts to SoA format */ 121b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul for (attr = 0; attr < base->info.num_inputs; attr++) { 122b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const float *vIn = (const float *) input; 123b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint vert; 124b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul for (vert = 0; vert < max_vertices; vert++) { 125b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#if 0 126b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (attr==0) 127b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul printf("Input v%d a%d: %f %f %f %f\n", 128b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vert, attr, vIn[0], vIn[1], vIn[2], vIn[3]); 129b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#endif 130b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul inputs_soa[attr][0][vert] = vIn[attr * 4 + 0]; 131b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul inputs_soa[attr][1][vert] = vIn[attr * 4 + 1]; 132b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul inputs_soa[attr][2][vert] = vIn[attr * 4 + 2]; 133b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul inputs_soa[attr][3][vert] = vIn[attr * 4 + 3]; 134b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vIn += input_stride / 4; 135b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul } 136b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul } 137b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 138b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* run compiled shader 139b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul */ 140b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#if 0 141b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul shader->func(machine->Inputs, 142b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul machine->Outputs, 143b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul (float (*)[4])constants, 144b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul machine->Temps, 145b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul (float (*)[4])shader->base.immediates, 146b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul input, 147b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul base->info.num_inputs, 148b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul input_stride, 149b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul output, 150b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul base->info.num_outputs, 151b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul output_stride ); 152b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#else 153b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul shader->func(inputs_soa, outputs_soa, temps_soa, 154b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul (float (*)[4][4]) shader->base.immediates, 155abbbe876ac98596b143da295abf6887e0a4e50d2Brian Paul (float (*)[4]) constants, 156abbbe876ac98596b143da295abf6887e0a4e50d2Brian Paul ppc_builtin_constants); 157b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 158b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /*output[0][0] = input[0][0] * 0.5;*/ 159b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#endif 160b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 161b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* convert (up to) four output verts from SoA back to AoS format */ 162b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul for (attr = 0; attr < base->info.num_outputs; attr++) { 163b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul float *vOut = (float *) output; 164b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul uint vert; 165b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul for (vert = 0; vert < max_vertices; vert++) { 166b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vOut[attr * 4 + 0] = outputs_soa[attr][0][vert]; 167b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vOut[attr * 4 + 1] = outputs_soa[attr][1][vert]; 168b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vOut[attr * 4 + 2] = outputs_soa[attr][2][vert]; 169b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vOut[attr * 4 + 3] = outputs_soa[attr][3][vert]; 170b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#if 0 171b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (attr==0) 172b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul printf("Output v%d a%d: %f %f %f %f\n", 173b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vert, attr, vOut[0], vOut[1], vOut[2], vOut[3]); 174b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#endif 175b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vOut += output_stride / 4; 176b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul } 177b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul } 178b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 179b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* advance to next group of four input/output verts */ 180b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul input = (const float (*)[4])((const char *)input + input_stride * max_vertices); 181b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul output = (float (*)[4])((char *)output + output_stride * max_vertices); 182b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul } 183b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul} 184b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 185b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 186b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 187b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 188b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulstatic void 189b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulvs_ppc_delete( struct draw_vertex_shader *base ) 190b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul{ 191b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct draw_ppc_vertex_shader *shader = (struct draw_ppc_vertex_shader *)base; 192b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 193b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul ppc_release_func( &shader->ppc_program ); 194b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 195b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul align_free( (void *) shader->base.immediates ); 196b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 197b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul FREE( (void*) shader->base.state.tokens ); 198b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul FREE( shader ); 199b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul} 200b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 201b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 202b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulstruct draw_vertex_shader * 203b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Pauldraw_create_vs_ppc(struct draw_context *draw, 204b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const struct pipe_shader_state *templ) 205b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul{ 206b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul struct draw_ppc_vertex_shader *vs; 207b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 208b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs = CALLOC_STRUCT( draw_ppc_vertex_shader ); 209b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (vs == NULL) 210b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul return NULL; 211b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 212b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul /* we make a private copy of the tokens */ 213b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.state.tokens = tgsi_dup_tokens(templ->tokens); 214b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (!vs->base.state.tokens) 215b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul goto fail; 216b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 217b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul tgsi_scan_shader(templ->tokens, &vs->base.info); 218b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 219b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.draw = draw; 220b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#if 0 221b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (1) 222b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.create_varient = draw_vs_varient_aos_ppc; 223b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul else 224b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#endif 225b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.create_varient = draw_vs_varient_generic; 226b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.prepare = vs_ppc_prepare; 227b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.run_linear = vs_ppc_run_linear; 228b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.delete = vs_ppc_delete; 229b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 230b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->base.immediates = align_malloc(TGSI_EXEC_NUM_IMMEDIATES * 4 * 4 * 231b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul sizeof(float), 16); 232b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 233b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->machine = &draw->vs.machine; 234b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 2357b1d08738f30d0fec2f07568b16e08c4fdddeeacBrian Paul ppc_init_func( &vs->ppc_program, 2000 ); /* XXX fix limit */ 236b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 237b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (!tgsi_emit_ppc( (struct tgsi_token *) vs->base.state.tokens, 238b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul &vs->ppc_program, 239b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul (float (*)[4])vs->base.immediates, 240b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul TRUE )) 241b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul goto fail; 242b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 243b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul vs->func = (codegen_function) ppc_get_func( &vs->ppc_program ); 244b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul if (!vs->func) { 245b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul goto fail; 246b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul } 247b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 248b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul return &vs->base; 249b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 250b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulfail: 251abbbe876ac98596b143da295abf6887e0a4e50d2Brian Paul /* 252b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul debug_error("tgsi_emit_ppc() failed, falling back to interpreter\n"); 253abbbe876ac98596b143da295abf6887e0a4e50d2Brian Paul */ 254b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 255b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul ppc_release_func( &vs->ppc_program ); 256b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 257b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul FREE(vs); 258b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul return NULL; 259b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul} 260b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 261b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 262b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 263b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#else /* PIPE_ARCH_PPC */ 264b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 265b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 266b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paulstruct draw_vertex_shader * 267b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Pauldraw_create_vs_ppc( struct draw_context *draw, 268b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul const struct pipe_shader_state *templ ) 269b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul{ 270b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul return (void *) 0; 271b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul} 272b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 273b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul 274b7da4c3dc199ee382bb9924ac86a3485deccc62dBrian Paul#endif /* PIPE_ARCH_PPC */ 275