18ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin/************************************************************************** 28ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * 38ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * Copyright 2010 VMware, Inc. 48ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * All Rights Reserved. 58ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * 68ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a 78ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * copy of this software and associated documentation files (the 88ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * "Software"), to deal in the Software without restriction, including 98ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * without limitation the rights to use, copy, modify, merge, publish, 108ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * distribute, sub license, and/or sell copies of the Software, and to 118ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * permit persons to whom the Software is furnished to do so, subject to 128ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * the following conditions: 138ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * 148ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * The above copyright notice and this permission notice (including the 158ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * next paragraph) shall be included in all copies or substantial portions 168ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * of the Software. 178ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * 188ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 198ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 208ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 218ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 228ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 238ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 248ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 258ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * 268ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin **************************************************************************/ 278ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 288ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "util/u_math.h" 298ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "util/u_memory.h" 308ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "pipe/p_shader_tokens.h" 319112e531d4c26ea88a31c05fe2bc8cc613b76b65Vinson Lee#include "pipe/p_screen.h" 328ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 338ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "draw_private.h" 348ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "draw_context.h" 358ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "draw_vs.h" 368ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "draw_llvm.h" 378ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 388ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "tgsi/tgsi_parse.h" 398ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin#include "tgsi/tgsi_scan.h" 408ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 418ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstatic void 428ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinvs_llvm_prepare(struct draw_vertex_shader *shader, 438ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin struct draw_context *draw) 448ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{ 458ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin /*struct llvm_vertex_shader *evs = llvm_vertex_shader(shader);*/ 468ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin} 478ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 488ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstatic void 498ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinvs_llvm_run_linear( struct draw_vertex_shader *shader, 508ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin const float (*input)[4], 518ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin float (*output)[4], 528ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin const void *constants[PIPE_MAX_CONSTANT_BUFFERS], 53ba2cc3b8e6ad161181b67fd2575c6bc768584d23Brian Paul const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], 548ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin unsigned count, 558ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin unsigned input_stride, 568ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin unsigned output_stride ) 578ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{ 588ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin /* we should never get here since the entire pipeline is 598ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin * generated in draw_pt_fetch_shade_pipeline_llvm.c */ 608ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin debug_assert(0); 618ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin} 628ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 638ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 648ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstatic void 658ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinvs_llvm_delete( struct draw_vertex_shader *dvs ) 668ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{ 678ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin struct llvm_vertex_shader *shader = llvm_vertex_shader(dvs); 688ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin struct draw_llvm_variant_list_item *li; 698ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 708ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin li = first_elem(&shader->variants); 718ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin while(!at_end(&shader->variants, li)) { 728ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin struct draw_llvm_variant_list_item *next = next_elem(li); 738ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin draw_llvm_destroy_variant(li->base); 748ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin li = next; 758ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin } 768ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 778ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin assert(shader->variants_cached == 0); 788ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin FREE((void*) dvs->state.tokens); 798ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin FREE( dvs ); 808ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin} 818ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 828ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 838ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusinstruct draw_vertex_shader * 848ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusindraw_create_vs_llvm(struct draw_context *draw, 858ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin const struct pipe_shader_state *state) 868ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin{ 878ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin struct llvm_vertex_shader *vs = CALLOC_STRUCT( llvm_vertex_shader ); 888ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 89150c289f6067cb1ba4572f9124948a94ef94c839Edward O'Callaghan if (!vs) 908ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin return NULL; 918ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 928ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin /* we make a private copy of the tokens */ 938ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin vs->base.state.tokens = tgsi_dup_tokens(state->tokens); 948ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin if (!vs->base.state.tokens) { 958ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin FREE(vs); 968ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin return NULL; 978ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin } 988ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 998ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin tgsi_scan_shader(state->tokens, &vs->base.info); 1008ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 101a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell vs->variant_key_size = 102a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell draw_llvm_variant_key_size( 1030eb588a37cc0427fd5c6a1ed2b212ed5d68f4dabRoland Scheidegger vs->base.info.file_max[TGSI_FILE_INPUT]+1, 1040eb588a37cc0427fd5c6a1ed2b212ed5d68f4dabRoland Scheidegger MAX2(vs->base.info.file_max[TGSI_FILE_SAMPLER]+1, 1050eb588a37cc0427fd5c6a1ed2b212ed5d68f4dabRoland Scheidegger vs->base.info.file_max[TGSI_FILE_SAMPLER_VIEW]+1)); 106a1de6f48c3fa79bbc8f2514da19b3e01138e7093Keith Whitwell 107c67a1f1d5366dc20cd07d9b677a335ff537da193Dave Airlie vs->base.state.stream_output = state->stream_output; 1088ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin vs->base.draw = draw; 1098ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin vs->base.prepare = vs_llvm_prepare; 1108ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin vs->base.run_linear = vs_llvm_run_linear; 1118ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin vs->base.delete = vs_llvm_delete; 112b7e150605d402224cdd8fa3d186924bdee3c6c49Brian Paul vs->base.create_variant = draw_vs_create_variant_generic; 1138ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 1148ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin make_empty_list(&vs->variants); 1158ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin 1168ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin return &vs->base; 1178ebfcf31eb905b7d47e520c04420620ae21bdf4eZack Rusin} 118