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