draw_llvm.c revision 40c5987ed84f9f0b8bb1f707bb13c1aafc39330a
10a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger/**************************************************************************
20a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger *
30a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Copyright 2010 VMware, Inc.
40a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * All Rights Reserved.
50a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger *
60a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Permission is hereby granted, free of charge, to any person obtaining a
70a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * copy of this software and associated documentation files (the
80a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * "Software"), to deal in the Software without restriction, including
90a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * without limitation the rights to use, copy, modify, merge, publish,
100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * distribute, sub license, and/or sell copies of the Software, and to
110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * permit persons to whom the Software is furnished to do so, subject to
120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * the following conditions:
130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger *
140a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * The above copyright notice and this permission notice (including the
150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * next paragraph) shall be included in all copies or substantial portions
160a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * of the Software.
170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger *
180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
220a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
230a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
240a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger *
260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger **************************************************************************/
270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "draw_llvm.h"
290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "draw_context.h"
310a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "draw_vs.h"
320a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
330a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_arit.h"
340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_logic.h"
350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_const.h"
360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_swizzle.h"
370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_struct.h"
380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_type.h"
390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_flow.h"
400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_debug.h"
410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_tgsi.h"
420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_printf.h"
430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_intr.h"
440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_init.h"
450a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "gallivm/lp_bld_type.h"
460a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "tgsi/tgsi_exec.h"
480a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "tgsi/tgsi_dump.h"
490a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
500a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "util/u_math.h"
510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "util/u_pointer.h"
520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "util/u_string.h"
530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "util/u_simple_list.h"
540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define DEBUG_STORE 0
570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger/**
600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * This function is called by the gallivm "garbage collector" when
610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * the LLVM global data structures are freed.  We must free all LLVM-related
620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * data.  Specifically, all JIT'd shader variants.
630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */
640a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerstatic void
650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerdraw_llvm_garbage_collect_callback(void *cb_data)
660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger{
670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   struct draw_llvm *llvm = (struct draw_llvm *) cb_data;
680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   struct draw_llvm_variant_list_item *li;
690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
700a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   /* free all shader variants */
710a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   li = first_elem(&llvm->vs_variants_list);
720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   while (!at_end(&llvm->vs_variants_list, li)) {
730a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger      struct draw_llvm_variant_list_item *next = next_elem(li);
740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger      draw_llvm_destroy_variant(li->base);
750a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger      li = next;
760a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   }
770a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   /* Null-out these pointers so they get remade next time they're needed.
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    * See the accessor functions below.
800a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    */
810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   llvm->context_ptr_type = NULL;
820a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   llvm->buffer_ptr_type = NULL;
830a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   llvm->vb_ptr_type = NULL;
840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   llvm->vertex_header_ptr_type = NULL;
850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
860a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
870a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
880a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerstatic void
890a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerdraw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *var,
900a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                   boolean elts);
910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
920a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger/**
940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Create LLVM type for struct draw_jit_texture
950a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */
960a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerstatic LLVMTypeRef
970a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergercreate_jit_texture_type(struct gallivm_state *gallivm, const char *struct_name)
980a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger{
990a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   LLVMTargetDataRef target = gallivm->target;
1000a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   LLVMTypeRef texture_type;
1010a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   LLVMTypeRef elem_types[DRAW_JIT_TEXTURE_NUM_FIELDS];
1020a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1040a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   elem_types[DRAW_JIT_TEXTURE_WIDTH]  =
1050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   elem_types[DRAW_JIT_TEXTURE_HEIGHT] =
1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger   elem_types[DRAW_JIT_TEXTURE_DEPTH] =
107   elem_types[DRAW_JIT_TEXTURE_FIRST_LEVEL] =
108   elem_types[DRAW_JIT_TEXTURE_LAST_LEVEL] = int32_type;
109   elem_types[DRAW_JIT_TEXTURE_ROW_STRIDE] =
110   elem_types[DRAW_JIT_TEXTURE_IMG_STRIDE] =
111      LLVMArrayType(int32_type, PIPE_MAX_TEXTURE_LEVELS);
112   elem_types[DRAW_JIT_TEXTURE_DATA] =
113      LLVMArrayType(LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0),
114                    PIPE_MAX_TEXTURE_LEVELS);
115   elem_types[DRAW_JIT_TEXTURE_MIN_LOD] =
116   elem_types[DRAW_JIT_TEXTURE_MAX_LOD] =
117   elem_types[DRAW_JIT_TEXTURE_LOD_BIAS] = LLVMFloatTypeInContext(gallivm->context);
118   elem_types[DRAW_JIT_TEXTURE_BORDER_COLOR] =
119      LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
120
121#if HAVE_LLVM >= 0x0300
122   texture_type = LLVMStructCreateNamed(gallivm->context, struct_name);
123   LLVMStructSetBody(texture_type, elem_types,
124                     Elements(elem_types), 0);
125#else
126   texture_type = LLVMStructTypeInContext(gallivm->context, elem_types,
127                                          Elements(elem_types), 0);
128
129   LLVMAddTypeName(gallivm->module, struct_name, texture_type);
130
131   /* Make sure the target's struct layout cache doesn't return
132    * stale/invalid data.
133    */
134   LLVMInvalidateStructLayout(gallivm->target, texture_type);
135#endif
136
137   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, width,
138                          target, texture_type,
139                          DRAW_JIT_TEXTURE_WIDTH);
140   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, height,
141                          target, texture_type,
142                          DRAW_JIT_TEXTURE_HEIGHT);
143   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, depth,
144                          target, texture_type,
145                          DRAW_JIT_TEXTURE_DEPTH);
146   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, first_level,
147                          target, texture_type,
148                          DRAW_JIT_TEXTURE_FIRST_LEVEL);
149   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, last_level,
150                          target, texture_type,
151                          DRAW_JIT_TEXTURE_LAST_LEVEL);
152   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, row_stride,
153                          target, texture_type,
154                          DRAW_JIT_TEXTURE_ROW_STRIDE);
155   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, img_stride,
156                          target, texture_type,
157                          DRAW_JIT_TEXTURE_IMG_STRIDE);
158   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, data,
159                          target, texture_type,
160                          DRAW_JIT_TEXTURE_DATA);
161   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, min_lod,
162                          target, texture_type,
163                          DRAW_JIT_TEXTURE_MIN_LOD);
164   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, max_lod,
165                          target, texture_type,
166                          DRAW_JIT_TEXTURE_MAX_LOD);
167   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, lod_bias,
168                          target, texture_type,
169                          DRAW_JIT_TEXTURE_LOD_BIAS);
170   LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, border_color,
171                          target, texture_type,
172                          DRAW_JIT_TEXTURE_BORDER_COLOR);
173
174   LP_CHECK_STRUCT_SIZE(struct draw_jit_texture, target, texture_type);
175
176   return texture_type;
177}
178
179
180/**
181 * Create LLVM type for struct draw_jit_texture
182 */
183static LLVMTypeRef
184create_jit_context_type(struct gallivm_state *gallivm,
185                        LLVMTypeRef texture_type, const char *struct_name)
186{
187   LLVMTargetDataRef target = gallivm->target;
188   LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
189   LLVMTypeRef elem_types[5];
190   LLVMTypeRef context_type;
191
192   elem_types[0] = LLVMPointerType(float_type, 0); /* vs_constants */
193   elem_types[1] = LLVMPointerType(float_type, 0); /* gs_constants */
194   elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4),
195                                                 DRAW_TOTAL_CLIP_PLANES), 0);
196   elem_types[3] = LLVMPointerType(float_type, 0); /* viewport */
197   elem_types[4] = LLVMArrayType(texture_type,
198                                 PIPE_MAX_VERTEX_SAMPLERS); /* textures */
199#if HAVE_LLVM >= 0x0300
200   context_type = LLVMStructCreateNamed(gallivm->context, struct_name);
201   LLVMStructSetBody(context_type, elem_types,
202                     Elements(elem_types), 0);
203#else
204   context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
205                                          Elements(elem_types), 0);
206   LLVMAddTypeName(gallivm->module, struct_name, context_type);
207
208   LLVMInvalidateStructLayout(gallivm->target, context_type);
209#endif
210
211   LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, vs_constants,
212                          target, context_type, 0);
213   LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, gs_constants,
214                          target, context_type, 1);
215   LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, planes,
216                          target, context_type, 2);
217   LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, textures,
218                          target, context_type,
219                          DRAW_JIT_CTX_TEXTURES);
220   LP_CHECK_STRUCT_SIZE(struct draw_jit_context,
221                        target, context_type);
222
223   return context_type;
224}
225
226
227/**
228 * Create LLVM type for struct pipe_vertex_buffer
229 */
230static LLVMTypeRef
231create_jit_vertex_buffer_type(struct gallivm_state *gallivm, const char *struct_name)
232{
233   LLVMTargetDataRef target = gallivm->target;
234   LLVMTypeRef elem_types[3];
235   LLVMTypeRef vb_type;
236
237   elem_types[0] =
238   elem_types[1] = LLVMInt32TypeInContext(gallivm->context);
239   elem_types[2] = LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0); /* vs_constants */
240
241#if HAVE_LLVM >= 0x0300
242   vb_type = LLVMStructCreateNamed(gallivm->context, struct_name);
243   LLVMStructSetBody(vb_type, elem_types,
244                     Elements(elem_types), 0);
245#else
246   vb_type = LLVMStructTypeInContext(gallivm->context, elem_types,
247                                     Elements(elem_types), 0);
248   LLVMAddTypeName(gallivm->module, struct_name, vb_type);
249
250   LLVMInvalidateStructLayout(gallivm->target, vb_type);
251#endif
252
253   LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, stride,
254                          target, vb_type, 0);
255   LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, buffer_offset,
256                          target, vb_type, 1);
257
258   LP_CHECK_STRUCT_SIZE(struct pipe_vertex_buffer, target, vb_type);
259
260   return vb_type;
261}
262
263
264/**
265 * Create LLVM type for struct vertex_header;
266 */
267static LLVMTypeRef
268create_jit_vertex_header(struct gallivm_state *gallivm, int data_elems)
269{
270   LLVMTargetDataRef target = gallivm->target;
271   LLVMTypeRef elem_types[4];
272   LLVMTypeRef vertex_header;
273   char struct_name[24];
274
275   util_snprintf(struct_name, 23, "vertex_header%d", data_elems);
276
277   elem_types[DRAW_JIT_VERTEX_VERTEX_ID]  = LLVMIntTypeInContext(gallivm->context, 32);
278   elem_types[DRAW_JIT_VERTEX_CLIP]  = LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
279   elem_types[DRAW_JIT_VERTEX_PRE_CLIP_POS]  = LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
280   elem_types[DRAW_JIT_VERTEX_DATA]  = LLVMArrayType(elem_types[1], data_elems);
281
282#if HAVE_LLVM >= 0x0300
283   vertex_header = LLVMStructCreateNamed(gallivm->context, struct_name);
284   LLVMStructSetBody(vertex_header, elem_types,
285                     Elements(elem_types), 0);
286#else
287   vertex_header = LLVMStructTypeInContext(gallivm->context, elem_types,
288                                           Elements(elem_types), 0);
289   LLVMAddTypeName(gallivm->module, struct_name, vertex_header);
290
291   LLVMInvalidateStructLayout(gallivm->target, vertex_header);
292#endif
293
294   /* these are bit-fields and we can't take address of them
295      LP_CHECK_MEMBER_OFFSET(struct vertex_header, clipmask,
296      target, vertex_header,
297      DRAW_JIT_VERTEX_CLIPMASK);
298      LP_CHECK_MEMBER_OFFSET(struct vertex_header, edgeflag,
299      target, vertex_header,
300      DRAW_JIT_VERTEX_EDGEFLAG);
301      LP_CHECK_MEMBER_OFFSET(struct vertex_header, pad,
302      target, vertex_header,
303      DRAW_JIT_VERTEX_PAD);
304      LP_CHECK_MEMBER_OFFSET(struct vertex_header, vertex_id,
305      target, vertex_header,
306      DRAW_JIT_VERTEX_VERTEX_ID);
307   */
308   LP_CHECK_MEMBER_OFFSET(struct vertex_header, clip,
309                          target, vertex_header,
310                          DRAW_JIT_VERTEX_CLIP);
311   LP_CHECK_MEMBER_OFFSET(struct vertex_header, pre_clip_pos,
312                          target, vertex_header,
313                          DRAW_JIT_VERTEX_PRE_CLIP_POS);
314   LP_CHECK_MEMBER_OFFSET(struct vertex_header, data,
315                          target, vertex_header,
316                          DRAW_JIT_VERTEX_DATA);
317
318   return vertex_header;
319}
320
321
322/**
323 * Create LLVM types for various structures.
324 */
325static void
326create_jit_types(struct draw_llvm *llvm)
327{
328   struct gallivm_state *gallivm = llvm->gallivm;
329   LLVMTypeRef texture_type, context_type, buffer_type, vb_type;
330
331   texture_type = create_jit_texture_type(gallivm, "texture");
332
333   context_type = create_jit_context_type(gallivm, texture_type, "draw_jit_context");
334   llvm->context_ptr_type = LLVMPointerType(context_type, 0);
335
336   buffer_type = LLVMPointerType(LLVMIntTypeInContext(gallivm->context, 8), 0);
337   llvm->buffer_ptr_type = LLVMPointerType(buffer_type, 0);
338
339   vb_type = create_jit_vertex_buffer_type(gallivm, "pipe_vertex_buffer");
340   llvm->vb_ptr_type = LLVMPointerType(vb_type, 0);
341}
342
343
344static LLVMTypeRef
345get_context_ptr_type(struct draw_llvm *llvm)
346{
347   if (!llvm->context_ptr_type)
348      create_jit_types(llvm);
349   return llvm->context_ptr_type;
350}
351
352
353static LLVMTypeRef
354get_buffer_ptr_type(struct draw_llvm *llvm)
355{
356   if (!llvm->buffer_ptr_type)
357      create_jit_types(llvm);
358   return llvm->buffer_ptr_type;
359}
360
361
362static LLVMTypeRef
363get_vb_ptr_type(struct draw_llvm *llvm)
364{
365   if (!llvm->vb_ptr_type)
366      create_jit_types(llvm);
367   return llvm->vb_ptr_type;
368}
369
370static LLVMTypeRef
371get_vertex_header_ptr_type(struct draw_llvm *llvm)
372{
373   if (!llvm->vertex_header_ptr_type)
374      create_jit_types(llvm);
375   return llvm->vertex_header_ptr_type;
376}
377
378
379/**
380 * Create per-context LLVM info.
381 */
382struct draw_llvm *
383draw_llvm_create(struct draw_context *draw, struct gallivm_state *gallivm)
384{
385   struct draw_llvm *llvm;
386
387   llvm = CALLOC_STRUCT( draw_llvm );
388   if (!llvm)
389      return NULL;
390
391   lp_build_init();
392
393   llvm->draw = draw;
394   llvm->gallivm = gallivm;
395
396   if (gallivm_debug & GALLIVM_DEBUG_IR) {
397      LLVMDumpModule(llvm->gallivm->module);
398   }
399
400   llvm->nr_variants = 0;
401   make_empty_list(&llvm->vs_variants_list);
402
403   gallivm_register_garbage_collector_callback(
404                              draw_llvm_garbage_collect_callback, llvm);
405
406   return llvm;
407}
408
409
410/**
411 * Free per-context LLVM info.
412 */
413void
414draw_llvm_destroy(struct draw_llvm *llvm)
415{
416   gallivm_remove_garbage_collector_callback(
417                              draw_llvm_garbage_collect_callback, llvm);
418
419   /* XXX free other draw_llvm data? */
420   FREE(llvm);
421}
422
423
424/**
425 * Create LLVM-generated code for a vertex shader.
426 */
427struct draw_llvm_variant *
428draw_llvm_create_variant(struct draw_llvm *llvm,
429			 unsigned num_inputs,
430			 const struct draw_llvm_variant_key *key)
431{
432   struct draw_llvm_variant *variant;
433   struct llvm_vertex_shader *shader =
434      llvm_vertex_shader(llvm->draw->vs.vertex_shader);
435   LLVMTypeRef vertex_header;
436
437   variant = MALLOC(sizeof *variant +
438		    shader->variant_key_size -
439		    sizeof variant->key);
440   if (variant == NULL)
441      return NULL;
442
443   variant->llvm = llvm;
444
445   memcpy(&variant->key, key, shader->variant_key_size);
446
447   vertex_header = create_jit_vertex_header(llvm->gallivm, num_inputs);
448
449   llvm->vertex_header_ptr_type = LLVMPointerType(vertex_header, 0);
450
451   draw_llvm_generate(llvm, variant, FALSE);  /* linear */
452   draw_llvm_generate(llvm, variant, TRUE);   /* elts */
453
454   variant->shader = shader;
455   variant->list_item_global.base = variant;
456   variant->list_item_local.base = variant;
457   /*variant->no = */shader->variants_created++;
458   variant->list_item_global.base = variant;
459
460   return variant;
461}
462
463
464static void
465generate_vs(struct draw_llvm *llvm,
466            LLVMBuilderRef builder,
467            LLVMValueRef (*outputs)[NUM_CHANNELS],
468            const LLVMValueRef (*inputs)[NUM_CHANNELS],
469            LLVMValueRef system_values_array,
470            LLVMValueRef context_ptr,
471            struct lp_build_sampler_soa *draw_sampler,
472            boolean clamp_vertex_color)
473{
474   const struct tgsi_token *tokens = llvm->draw->vs.vertex_shader->state.tokens;
475   struct lp_type vs_type;
476   LLVMValueRef consts_ptr = draw_jit_context_vs_constants(llvm->gallivm, context_ptr);
477   struct lp_build_sampler_soa *sampler = 0;
478
479   memset(&vs_type, 0, sizeof vs_type);
480   vs_type.floating = TRUE; /* floating point values */
481   vs_type.sign = TRUE;     /* values are signed */
482   vs_type.norm = FALSE;    /* values are not limited to [0,1] or [-1,1] */
483   vs_type.width = 32;      /* 32-bit float */
484   vs_type.length = 4;      /* 4 elements per vector */
485#if 0
486   num_vs = 4;              /* number of vertices per block */
487#endif
488
489   if (gallivm_debug & GALLIVM_DEBUG_IR) {
490      tgsi_dump(tokens, 0);
491   }
492
493   if (llvm->draw->num_sampler_views && llvm->draw->num_samplers)
494      sampler = draw_sampler;
495
496   lp_build_tgsi_soa(llvm->gallivm,
497                     tokens,
498                     vs_type,
499                     NULL /*struct lp_build_mask_context *mask*/,
500                     consts_ptr,
501                     system_values_array,
502                     NULL /*pos*/,
503                     inputs,
504                     outputs,
505                     sampler,
506                     &llvm->draw->vs.vertex_shader->info);
507
508   if (clamp_vertex_color) {
509      LLVMValueRef out;
510      unsigned chan, attrib;
511      struct lp_build_context bld;
512      struct tgsi_shader_info* info = &llvm->draw->vs.vertex_shader->info;
513      lp_build_context_init(&bld, llvm->gallivm, vs_type);
514
515      for (attrib = 0; attrib < info->num_outputs; ++attrib) {
516         for (chan = 0; chan < NUM_CHANNELS; ++chan) {
517            if (outputs[attrib][chan]) {
518               switch (info->output_semantic_name[attrib]) {
519               case TGSI_SEMANTIC_COLOR:
520               case TGSI_SEMANTIC_BCOLOR:
521                  out = LLVMBuildLoad(builder, outputs[attrib][chan], "");
522                  out = lp_build_clamp(&bld, out, bld.zero, bld.one);
523                  LLVMBuildStore(builder, out, outputs[attrib][chan]);
524                  break;
525               }
526            }
527         }
528      }
529   }
530}
531
532
533#if DEBUG_STORE
534static void print_vectorf(LLVMBuilderRef builder,
535                         LLVMValueRef vec)
536{
537   LLVMValueRef val[4];
538   val[0] = LLVMBuildExtractElement(builder, vec,
539                                    lp_build_const_int32(gallivm, 0), "");
540   val[1] = LLVMBuildExtractElement(builder, vec,
541                                    lp_build_const_int32(gallivm, 1), "");
542   val[2] = LLVMBuildExtractElement(builder, vec,
543                                    lp_build_const_int32(gallivm, 2), "");
544   val[3] = LLVMBuildExtractElement(builder, vec,
545                                    lp_build_const_int32(gallivm, 3), "");
546   lp_build_printf(builder, "vector = [%f, %f, %f, %f]\n",
547                   val[0], val[1], val[2], val[3]);
548}
549#endif
550
551
552static void
553generate_fetch(struct gallivm_state *gallivm,
554               LLVMValueRef vbuffers_ptr,
555               LLVMValueRef *res,
556               struct pipe_vertex_element *velem,
557               LLVMValueRef vbuf,
558               LLVMValueRef index,
559               LLVMValueRef instance_id)
560{
561   LLVMBuilderRef builder = gallivm->builder;
562   LLVMValueRef indices =
563      LLVMConstInt(LLVMInt64TypeInContext(gallivm->context),
564                   velem->vertex_buffer_index, 0);
565   LLVMValueRef vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr,
566                                           &indices, 1, "");
567   LLVMValueRef vb_stride = draw_jit_vbuffer_stride(gallivm, vbuf);
568   LLVMValueRef vb_buffer_offset = draw_jit_vbuffer_offset(gallivm, vbuf);
569   LLVMValueRef stride;
570
571   if (velem->instance_divisor) {
572      /* array index = instance_id / instance_divisor */
573      index = LLVMBuildUDiv(builder, instance_id,
574                            lp_build_const_int32(gallivm, velem->instance_divisor),
575                            "instance_divisor");
576   }
577
578   stride = LLVMBuildMul(builder, vb_stride, index, "");
579
580   vbuffer_ptr = LLVMBuildLoad(builder, vbuffer_ptr, "vbuffer");
581
582   stride = LLVMBuildAdd(builder, stride,
583                         vb_buffer_offset,
584                         "");
585   stride = LLVMBuildAdd(builder, stride,
586                         lp_build_const_int32(gallivm, velem->src_offset),
587                         "");
588
589   /*lp_build_printf(builder, "vbuf index = %d, stride is %d\n", indices, stride);*/
590   vbuffer_ptr = LLVMBuildGEP(builder, vbuffer_ptr, &stride, 1, "");
591
592   *res = draw_llvm_translate_from(gallivm, vbuffer_ptr, velem->src_format);
593}
594
595
596static LLVMValueRef
597aos_to_soa(struct gallivm_state *gallivm,
598           LLVMValueRef val0,
599           LLVMValueRef val1,
600           LLVMValueRef val2,
601           LLVMValueRef val3,
602           LLVMValueRef channel)
603{
604   LLVMBuilderRef builder = gallivm->builder;
605   LLVMValueRef ex, res;
606
607   ex = LLVMBuildExtractElement(builder, val0,
608                                channel, "");
609   res = LLVMBuildInsertElement(builder,
610                                LLVMConstNull(LLVMTypeOf(val0)),
611                                ex,
612                                lp_build_const_int32(gallivm, 0),
613                                "");
614
615   ex = LLVMBuildExtractElement(builder, val1,
616                                channel, "");
617   res = LLVMBuildInsertElement(builder,
618                                res, ex,
619                                lp_build_const_int32(gallivm, 1),
620                                "");
621
622   ex = LLVMBuildExtractElement(builder, val2,
623                                channel, "");
624   res = LLVMBuildInsertElement(builder,
625                                res, ex,
626                                lp_build_const_int32(gallivm, 2),
627                                "");
628
629   ex = LLVMBuildExtractElement(builder, val3,
630                                channel, "");
631   res = LLVMBuildInsertElement(builder,
632                                res, ex,
633                                lp_build_const_int32(gallivm, 3),
634                                "");
635
636   return res;
637}
638
639
640static void
641soa_to_aos(struct gallivm_state *gallivm,
642           LLVMValueRef soa[NUM_CHANNELS],
643           LLVMValueRef aos[NUM_CHANNELS])
644{
645   LLVMBuilderRef builder = gallivm->builder;
646   LLVMValueRef comp;
647   int i = 0;
648
649   debug_assert(NUM_CHANNELS == 4);
650
651   aos[0] = LLVMConstNull(LLVMTypeOf(soa[0]));
652   aos[1] = aos[2] = aos[3] = aos[0];
653
654   for (i = 0; i < NUM_CHANNELS; ++i) {
655      LLVMValueRef channel = lp_build_const_int32(gallivm, i);
656
657      comp = LLVMBuildExtractElement(builder, soa[i],
658                                     lp_build_const_int32(gallivm, 0), "");
659      aos[0] = LLVMBuildInsertElement(builder, aos[0], comp, channel, "");
660
661      comp = LLVMBuildExtractElement(builder, soa[i],
662                                     lp_build_const_int32(gallivm, 1), "");
663      aos[1] = LLVMBuildInsertElement(builder, aos[1], comp, channel, "");
664
665      comp = LLVMBuildExtractElement(builder, soa[i],
666                                     lp_build_const_int32(gallivm, 2), "");
667      aos[2] = LLVMBuildInsertElement(builder, aos[2], comp, channel, "");
668
669      comp = LLVMBuildExtractElement(builder, soa[i],
670                                     lp_build_const_int32(gallivm, 3), "");
671      aos[3] = LLVMBuildInsertElement(builder, aos[3], comp, channel, "");
672
673   }
674}
675
676
677static void
678convert_to_soa(struct gallivm_state *gallivm,
679               LLVMValueRef (*aos)[NUM_CHANNELS],
680               LLVMValueRef (*soa)[NUM_CHANNELS],
681               int num_attribs)
682{
683   int i;
684
685   debug_assert(NUM_CHANNELS == 4);
686
687   for (i = 0; i < num_attribs; ++i) {
688      LLVMValueRef val0 = aos[i][0];
689      LLVMValueRef val1 = aos[i][1];
690      LLVMValueRef val2 = aos[i][2];
691      LLVMValueRef val3 = aos[i][3];
692
693      soa[i][0] = aos_to_soa(gallivm, val0, val1, val2, val3,
694                             lp_build_const_int32(gallivm, 0));
695      soa[i][1] = aos_to_soa(gallivm, val0, val1, val2, val3,
696                             lp_build_const_int32(gallivm, 1));
697      soa[i][2] = aos_to_soa(gallivm, val0, val1, val2, val3,
698                             lp_build_const_int32(gallivm, 2));
699      soa[i][3] = aos_to_soa(gallivm, val0, val1, val2, val3,
700                             lp_build_const_int32(gallivm, 3));
701   }
702}
703
704
705static void
706store_aos(struct gallivm_state *gallivm,
707          LLVMValueRef io_ptr,
708          LLVMValueRef index,
709          LLVMValueRef value,
710          LLVMValueRef clipmask)
711{
712   LLVMBuilderRef builder = gallivm->builder;
713   LLVMValueRef id_ptr = draw_jit_header_id(gallivm, io_ptr);
714   LLVMValueRef data_ptr = draw_jit_header_data(gallivm, io_ptr);
715   LLVMValueRef indices[3];
716   LLVMValueRef val;
717   int vertex_id_pad_edgeflag;
718
719   indices[0] = lp_build_const_int32(gallivm, 0);
720   indices[1] = index;
721   indices[2] = lp_build_const_int32(gallivm, 0);
722
723   /* If this assertion fails, it means we need to update the bit twidding
724    * code here.  See struct vertex_header in draw_private.h.
725    */
726   assert(DRAW_TOTAL_CLIP_PLANES==14);
727   /* initialize vertex id:16 = 0xffff, pad:1 = 0, edgeflag:1 = 1 */
728   vertex_id_pad_edgeflag = (0xffff << 16) | (1 << DRAW_TOTAL_CLIP_PLANES);
729   val = lp_build_const_int32(gallivm, vertex_id_pad_edgeflag);
730   /* OR with the clipmask */
731   val = LLVMBuildOr(builder, val, clipmask, "");
732
733   /* store vertex header */
734   LLVMBuildStore(builder, val, id_ptr);
735
736
737#if DEBUG_STORE
738   lp_build_printf(builder, "    ---- %p storing attribute %d (io = %p)\n", data_ptr, index, io_ptr);
739#endif
740#if 0
741   /*lp_build_printf(builder, " ---- %p storing at %d (%p)  ", io_ptr, index, data_ptr);
742     print_vectorf(builder, value);*/
743   data_ptr = LLVMBuildBitCast(builder, data_ptr,
744                               LLVMPointerType(LLVMArrayType(LLVMVectorType(LLVMFloatTypeInContext(gallivm->context), 4), 0), 0),
745                               "datavec");
746   data_ptr = LLVMBuildGEP(builder, data_ptr, indices, 2, "");
747
748   LLVMBuildStore(builder, value, data_ptr);
749#else
750   {
751      LLVMValueRef x, y, z, w;
752      LLVMValueRef idx0, idx1, idx2, idx3;
753      LLVMValueRef gep0, gep1, gep2, gep3;
754      data_ptr = LLVMBuildGEP(builder, data_ptr, indices, 3, "");
755
756      idx0 = lp_build_const_int32(gallivm, 0);
757      idx1 = lp_build_const_int32(gallivm, 1);
758      idx2 = lp_build_const_int32(gallivm, 2);
759      idx3 = lp_build_const_int32(gallivm, 3);
760
761      x = LLVMBuildExtractElement(builder, value,
762                                  idx0, "");
763      y = LLVMBuildExtractElement(builder, value,
764                                  idx1, "");
765      z = LLVMBuildExtractElement(builder, value,
766                                  idx2, "");
767      w = LLVMBuildExtractElement(builder, value,
768                                  idx3, "");
769
770      gep0 = LLVMBuildGEP(builder, data_ptr, &idx0, 1, "");
771      gep1 = LLVMBuildGEP(builder, data_ptr, &idx1, 1, "");
772      gep2 = LLVMBuildGEP(builder, data_ptr, &idx2, 1, "");
773      gep3 = LLVMBuildGEP(builder, data_ptr, &idx3, 1, "");
774
775      /*lp_build_printf(builder, "##### x = %f (%p), y = %f (%p), z = %f (%p), w = %f (%p)\n",
776        x, gep0, y, gep1, z, gep2, w, gep3);*/
777      LLVMBuildStore(builder, x, gep0);
778      LLVMBuildStore(builder, y, gep1);
779      LLVMBuildStore(builder, z, gep2);
780      LLVMBuildStore(builder, w, gep3);
781   }
782#endif
783}
784
785
786static void
787store_aos_array(struct gallivm_state *gallivm,
788                LLVMValueRef io_ptr,
789                LLVMValueRef aos[NUM_CHANNELS],
790                int attrib,
791                int num_outputs,
792                LLVMValueRef clipmask)
793{
794   LLVMBuilderRef builder = gallivm->builder;
795   LLVMValueRef attr_index = lp_build_const_int32(gallivm, attrib);
796   LLVMValueRef ind0 = lp_build_const_int32(gallivm, 0);
797   LLVMValueRef ind1 = lp_build_const_int32(gallivm, 1);
798   LLVMValueRef ind2 = lp_build_const_int32(gallivm, 2);
799   LLVMValueRef ind3 = lp_build_const_int32(gallivm, 3);
800   LLVMValueRef io0_ptr, io1_ptr, io2_ptr, io3_ptr;
801   LLVMValueRef clipmask0, clipmask1, clipmask2, clipmask3;
802
803   debug_assert(NUM_CHANNELS == 4);
804
805   io0_ptr = LLVMBuildGEP(builder, io_ptr,
806                          &ind0, 1, "");
807   io1_ptr = LLVMBuildGEP(builder, io_ptr,
808                          &ind1, 1, "");
809   io2_ptr = LLVMBuildGEP(builder, io_ptr,
810                          &ind2, 1, "");
811   io3_ptr = LLVMBuildGEP(builder, io_ptr,
812                          &ind3, 1, "");
813
814   clipmask0 = LLVMBuildExtractElement(builder, clipmask,
815                                       ind0, "");
816   clipmask1 = LLVMBuildExtractElement(builder, clipmask,
817                                       ind1, "");
818   clipmask2 = LLVMBuildExtractElement(builder, clipmask,
819                                       ind2, "");
820   clipmask3 = LLVMBuildExtractElement(builder, clipmask,
821                                       ind3, "");
822
823#if DEBUG_STORE
824   lp_build_printf(builder, "io = %p, indexes[%d, %d, %d, %d]\n, clipmask0 = %x, clipmask1 = %x, clipmask2 = %x, clipmask3 = %x\n",
825                   io_ptr, ind0, ind1, ind2, ind3, clipmask0, clipmask1, clipmask2, clipmask3);
826#endif
827   /* store for each of the 4 vertices */
828   store_aos(gallivm, io0_ptr, attr_index, aos[0], clipmask0);
829   store_aos(gallivm, io1_ptr, attr_index, aos[1], clipmask1);
830   store_aos(gallivm, io2_ptr, attr_index, aos[2], clipmask2);
831   store_aos(gallivm, io3_ptr, attr_index, aos[3], clipmask3);
832}
833
834
835static void
836convert_to_aos(struct gallivm_state *gallivm,
837               LLVMValueRef io,
838               LLVMValueRef (*outputs)[NUM_CHANNELS],
839               LLVMValueRef clipmask,
840               int num_outputs,
841               int max_vertices)
842{
843   LLVMBuilderRef builder = gallivm->builder;
844   unsigned chan, attrib;
845
846#if DEBUG_STORE
847   lp_build_printf(builder, "   # storing begin\n");
848#endif
849   for (attrib = 0; attrib < num_outputs; ++attrib) {
850      LLVMValueRef soa[4];
851      LLVMValueRef aos[4];
852      for (chan = 0; chan < NUM_CHANNELS; ++chan) {
853         if (outputs[attrib][chan]) {
854            LLVMValueRef out = LLVMBuildLoad(builder, outputs[attrib][chan], "");
855            lp_build_name(out, "output%u.%c", attrib, "xyzw"[chan]);
856            /*lp_build_printf(builder, "output %d : %d ",
857                            LLVMConstInt(LLVMInt32Type(), attrib, 0),
858                            LLVMConstInt(LLVMInt32Type(), chan, 0));
859              print_vectorf(builder, out);*/
860            soa[chan] = out;
861         }
862         else {
863            soa[chan] = 0;
864         }
865      }
866      soa_to_aos(gallivm, soa, aos);
867      store_aos_array(gallivm,
868                      io,
869                      aos,
870                      attrib,
871                      num_outputs,
872                      clipmask);
873   }
874#if DEBUG_STORE
875   lp_build_printf(builder, "   # storing end\n");
876#endif
877}
878
879
880/**
881 * Stores original vertex positions in clip coordinates
882 * There is probably a more efficient way to do this, 4 floats at once
883 * rather than extracting each element one by one.
884 */
885static void
886store_clip(struct gallivm_state *gallivm,
887           LLVMValueRef io_ptr,
888           LLVMValueRef (*outputs)[NUM_CHANNELS])
889{
890   LLVMBuilderRef builder = gallivm->builder;
891   LLVMValueRef out[4];
892   LLVMValueRef indices[2];
893   LLVMValueRef io0_ptr, io1_ptr, io2_ptr, io3_ptr;
894   LLVMValueRef clip_ptr0, clip_ptr1, clip_ptr2, clip_ptr3;
895   LLVMValueRef clip0_ptr, clip1_ptr, clip2_ptr, clip3_ptr;
896   LLVMValueRef out0elem, out1elem, out2elem, out3elem;
897   int i;
898
899   LLVMValueRef ind0 = lp_build_const_int32(gallivm, 0);
900   LLVMValueRef ind1 = lp_build_const_int32(gallivm, 1);
901   LLVMValueRef ind2 = lp_build_const_int32(gallivm, 2);
902   LLVMValueRef ind3 = lp_build_const_int32(gallivm, 3);
903
904   indices[0] =
905   indices[1] = lp_build_const_int32(gallivm, 0);
906
907   out[0] = LLVMBuildLoad(builder, outputs[0][0], ""); /*x0 x1 x2 x3*/
908   out[1] = LLVMBuildLoad(builder, outputs[0][1], ""); /*y0 y1 y2 y3*/
909   out[2] = LLVMBuildLoad(builder, outputs[0][2], ""); /*z0 z1 z2 z3*/
910   out[3] = LLVMBuildLoad(builder, outputs[0][3], ""); /*w0 w1 w2 w3*/
911
912   io0_ptr = LLVMBuildGEP(builder, io_ptr, &ind0, 1, "");
913   io1_ptr = LLVMBuildGEP(builder, io_ptr, &ind1, 1, "");
914   io2_ptr = LLVMBuildGEP(builder, io_ptr, &ind2, 1, "");
915   io3_ptr = LLVMBuildGEP(builder, io_ptr, &ind3, 1, "");
916
917   clip_ptr0 = draw_jit_header_clip(gallivm, io0_ptr);
918   clip_ptr1 = draw_jit_header_clip(gallivm, io1_ptr);
919   clip_ptr2 = draw_jit_header_clip(gallivm, io2_ptr);
920   clip_ptr3 = draw_jit_header_clip(gallivm, io3_ptr);
921
922   for (i = 0; i<4; i++) {
923      clip0_ptr = LLVMBuildGEP(builder, clip_ptr0, indices, 2, ""); /* x0 */
924      clip1_ptr = LLVMBuildGEP(builder, clip_ptr1, indices, 2, ""); /* x1 */
925      clip2_ptr = LLVMBuildGEP(builder, clip_ptr2, indices, 2, ""); /* x2 */
926      clip3_ptr = LLVMBuildGEP(builder, clip_ptr3, indices, 2, ""); /* x3 */
927
928      out0elem = LLVMBuildExtractElement(builder, out[i], ind0, ""); /* x0 */
929      out1elem = LLVMBuildExtractElement(builder, out[i], ind1, ""); /* x1 */
930      out2elem = LLVMBuildExtractElement(builder, out[i], ind2, ""); /* x2 */
931      out3elem = LLVMBuildExtractElement(builder, out[i], ind3, ""); /* x3 */
932
933      LLVMBuildStore(builder, out0elem, clip0_ptr);
934      LLVMBuildStore(builder, out1elem, clip1_ptr);
935      LLVMBuildStore(builder, out2elem, clip2_ptr);
936      LLVMBuildStore(builder, out3elem, clip3_ptr);
937
938      indices[1]= LLVMBuildAdd(builder, indices[1], ind1, "");
939   }
940
941}
942
943
944/**
945 * Equivalent of _mm_set1_ps(a)
946 */
947static LLVMValueRef
948vec4f_from_scalar(struct gallivm_state *gallivm,
949                  LLVMValueRef a,
950                  const char *name)
951{
952   LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
953   LLVMValueRef res = LLVMGetUndef(LLVMVectorType(float_type, 4));
954   int i;
955
956   for (i = 0; i < 4; ++i) {
957      LLVMValueRef index = lp_build_const_int32(gallivm, i);
958      res = LLVMBuildInsertElement(gallivm->builder, res, a,
959                                   index, i == 3 ? name : "");
960   }
961
962   return res;
963}
964
965
966/**
967 * Transforms the outputs for viewport mapping
968 */
969static void
970generate_viewport(struct draw_llvm *llvm,
971                  LLVMBuilderRef builder,
972                  LLVMValueRef (*outputs)[NUM_CHANNELS],
973                  LLVMValueRef context_ptr)
974{
975   int i;
976   struct gallivm_state *gallivm = llvm->gallivm;
977   struct lp_type f32_type = lp_type_float_vec(32);
978   LLVMValueRef out3 = LLVMBuildLoad(builder, outputs[0][3], ""); /*w0 w1 w2 w3*/
979   LLVMValueRef const1 = lp_build_const_vec(gallivm, f32_type, 1.0);       /*1.0 1.0 1.0 1.0*/
980   LLVMValueRef vp_ptr = draw_jit_context_viewport(gallivm, context_ptr);
981
982   /* for 1/w convention*/
983   out3 = LLVMBuildFDiv(builder, const1, out3, "");
984   LLVMBuildStore(builder, out3, outputs[0][3]);
985
986   /* Viewport Mapping */
987   for (i=0; i<3; i++) {
988      LLVMValueRef out = LLVMBuildLoad(builder, outputs[0][i], ""); /*x0 x1 x2 x3*/
989      LLVMValueRef scale;
990      LLVMValueRef trans;
991      LLVMValueRef scale_i;
992      LLVMValueRef trans_i;
993      LLVMValueRef index;
994
995      index = lp_build_const_int32(gallivm, i);
996      scale_i = LLVMBuildGEP(builder, vp_ptr, &index, 1, "");
997
998      index = lp_build_const_int32(gallivm, i+4);
999      trans_i = LLVMBuildGEP(builder, vp_ptr, &index, 1, "");
1000
1001      scale = vec4f_from_scalar(gallivm, LLVMBuildLoad(builder, scale_i, ""), "scale");
1002      trans = vec4f_from_scalar(gallivm, LLVMBuildLoad(builder, trans_i, ""), "trans");
1003
1004      /* divide by w */
1005      out = LLVMBuildFMul(builder, out, out3, "");
1006      /* mult by scale */
1007      out = LLVMBuildFMul(builder, out, scale, "");
1008      /* add translation */
1009      out = LLVMBuildFAdd(builder, out, trans, "");
1010
1011      /* store transformed outputs */
1012      LLVMBuildStore(builder, out, outputs[0][i]);
1013   }
1014
1015}
1016
1017
1018/**
1019 * Returns clipmask as 4xi32 bitmask for the 4 vertices
1020 */
1021static LLVMValueRef
1022generate_clipmask(struct gallivm_state *gallivm,
1023                  LLVMValueRef (*outputs)[NUM_CHANNELS],
1024                  boolean clip_xy,
1025                  boolean clip_z,
1026                  boolean clip_user,
1027                  boolean clip_halfz,
1028                  unsigned ucp_enable,
1029                  LLVMValueRef context_ptr)
1030{
1031   LLVMBuilderRef builder = gallivm->builder;
1032   LLVMValueRef mask; /* stores the <4xi32> clipmasks */
1033   LLVMValueRef test, temp;
1034   LLVMValueRef zero, shift;
1035   LLVMValueRef pos_x, pos_y, pos_z, pos_w;
1036   LLVMValueRef plane1, planes, plane_ptr, sum;
1037   struct lp_type f32_type = lp_type_float_vec(32);
1038
1039   mask = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 0);
1040   temp = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 0);
1041   zero = lp_build_const_vec(gallivm, f32_type, 0);                    /* 0.0f 0.0f 0.0f 0.0f */
1042   shift = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 1);    /* 1 1 1 1 */
1043
1044   /* Assuming position stored at output[0] */
1045   pos_x = LLVMBuildLoad(builder, outputs[0][0], ""); /*x0 x1 x2 x3*/
1046   pos_y = LLVMBuildLoad(builder, outputs[0][1], ""); /*y0 y1 y2 y3*/
1047   pos_z = LLVMBuildLoad(builder, outputs[0][2], ""); /*z0 z1 z2 z3*/
1048   pos_w = LLVMBuildLoad(builder, outputs[0][3], ""); /*w0 w1 w2 w3*/
1049
1050   /* Cliptest, for hardwired planes */
1051   if (clip_xy) {
1052      /* plane 1 */
1053      test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, pos_x , pos_w);
1054      temp = shift;
1055      test = LLVMBuildAnd(builder, test, temp, "");
1056      mask = test;
1057
1058      /* plane 2 */
1059      test = LLVMBuildFAdd(builder, pos_x, pos_w, "");
1060      test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, test);
1061      temp = LLVMBuildShl(builder, temp, shift, "");
1062      test = LLVMBuildAnd(builder, test, temp, "");
1063      mask = LLVMBuildOr(builder, mask, test, "");
1064
1065      /* plane 3 */
1066      test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, pos_y, pos_w);
1067      temp = LLVMBuildShl(builder, temp, shift, "");
1068      test = LLVMBuildAnd(builder, test, temp, "");
1069      mask = LLVMBuildOr(builder, mask, test, "");
1070
1071      /* plane 4 */
1072      test = LLVMBuildFAdd(builder, pos_y, pos_w, "");
1073      test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, test);
1074      temp = LLVMBuildShl(builder, temp, shift, "");
1075      test = LLVMBuildAnd(builder, test, temp, "");
1076      mask = LLVMBuildOr(builder, mask, test, "");
1077   }
1078
1079   if (clip_z) {
1080      temp = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 16);
1081      if (clip_halfz) {
1082         /* plane 5 */
1083         test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, pos_z);
1084         test = LLVMBuildAnd(builder, test, temp, "");
1085         mask = LLVMBuildOr(builder, mask, test, "");
1086      }
1087      else {
1088         /* plane 5 */
1089         test = LLVMBuildFAdd(builder, pos_z, pos_w, "");
1090         test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, test);
1091         test = LLVMBuildAnd(builder, test, temp, "");
1092         mask = LLVMBuildOr(builder, mask, test, "");
1093      }
1094      /* plane 6 */
1095      test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, pos_z, pos_w);
1096      temp = LLVMBuildShl(builder, temp, shift, "");
1097      test = LLVMBuildAnd(builder, test, temp, "");
1098      mask = LLVMBuildOr(builder, mask, test, "");
1099   }
1100
1101   if (clip_user) {
1102      LLVMValueRef planes_ptr = draw_jit_context_planes(gallivm, context_ptr);
1103      LLVMValueRef indices[3];
1104
1105      /* userclip planes */
1106      while (ucp_enable) {
1107         unsigned plane_idx = ffs(ucp_enable)-1;
1108         ucp_enable &= ~(1 << plane_idx);
1109         plane_idx += 6;
1110
1111         indices[0] = lp_build_const_int32(gallivm, 0);
1112         indices[1] = lp_build_const_int32(gallivm, plane_idx);
1113
1114         indices[2] = lp_build_const_int32(gallivm, 0);
1115         plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1116         plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_x");
1117         planes = vec4f_from_scalar(gallivm, plane1, "plane4_x");
1118         sum = LLVMBuildFMul(builder, planes, pos_x, "");
1119
1120         indices[2] = lp_build_const_int32(gallivm, 1);
1121         plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1122         plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_y");
1123         planes = vec4f_from_scalar(gallivm, plane1, "plane4_y");
1124         test = LLVMBuildFMul(builder, planes, pos_y, "");
1125         sum = LLVMBuildFAdd(builder, sum, test, "");
1126
1127         indices[2] = lp_build_const_int32(gallivm, 2);
1128         plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1129         plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_z");
1130         planes = vec4f_from_scalar(gallivm, plane1, "plane4_z");
1131         test = LLVMBuildFMul(builder, planes, pos_z, "");
1132         sum = LLVMBuildFAdd(builder, sum, test, "");
1133
1134         indices[2] = lp_build_const_int32(gallivm, 3);
1135         plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1136         plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_w");
1137         planes = vec4f_from_scalar(gallivm, plane1, "plane4_w");
1138         test = LLVMBuildFMul(builder, planes, pos_w, "");
1139         sum = LLVMBuildFAdd(builder, sum, test, "");
1140
1141         test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, sum);
1142         temp = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 1 << plane_idx);
1143         test = LLVMBuildAnd(builder, test, temp, "");
1144         mask = LLVMBuildOr(builder, mask, test, "");
1145      }
1146   }
1147   return mask;
1148}
1149
1150
1151/**
1152 * Returns boolean if any clipping has occurred
1153 * Used zero/non-zero i32 value to represent boolean
1154 */
1155static void
1156clipmask_bool(struct gallivm_state *gallivm,
1157              LLVMValueRef clipmask,
1158              LLVMValueRef ret_ptr)
1159{
1160   LLVMBuilderRef builder = gallivm->builder;
1161   LLVMValueRef ret = LLVMBuildLoad(builder, ret_ptr, "");
1162   LLVMValueRef temp;
1163   int i;
1164
1165   for (i=0; i<4; i++) {
1166      temp = LLVMBuildExtractElement(builder, clipmask,
1167                                     lp_build_const_int32(gallivm, i) , "");
1168      ret = LLVMBuildOr(builder, ret, temp, "");
1169   }
1170
1171   LLVMBuildStore(builder, ret, ret_ptr);
1172}
1173
1174
1175static void
1176draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant,
1177                   boolean elts)
1178{
1179   struct gallivm_state *gallivm = llvm->gallivm;
1180   LLVMContextRef context = gallivm->context;
1181   LLVMTypeRef int32_type = LLVMInt32TypeInContext(context);
1182   LLVMTypeRef arg_types[8];
1183   LLVMTypeRef func_type;
1184   LLVMValueRef context_ptr;
1185   LLVMBasicBlockRef block;
1186   LLVMBuilderRef builder;
1187   LLVMValueRef end, start;
1188   LLVMValueRef count, fetch_elts, fetch_count;
1189   LLVMValueRef stride, step, io_itr;
1190   LLVMValueRef io_ptr, vbuffers_ptr, vb_ptr;
1191   LLVMValueRef instance_id;
1192   LLVMValueRef system_values_array;
1193   LLVMValueRef zero = lp_build_const_int32(gallivm, 0);
1194   LLVMValueRef one = lp_build_const_int32(gallivm, 1);
1195   struct draw_context *draw = llvm->draw;
1196   const struct tgsi_shader_info *vs_info = &draw->vs.vertex_shader->info;
1197   unsigned i, j;
1198   struct lp_build_context bld;
1199   struct lp_build_loop_state lp_loop;
1200   const int max_vertices = 4;
1201   LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][NUM_CHANNELS];
1202   LLVMValueRef fetch_max;
1203   void *code;
1204   struct lp_build_sampler_soa *sampler = 0;
1205   LLVMValueRef ret, ret_ptr;
1206   const boolean bypass_viewport = variant->key.bypass_viewport;
1207   const boolean enable_cliptest = variant->key.clip_xy ||
1208                                   variant->key.clip_z  ||
1209                                   variant->key.clip_user;
1210   LLVMValueRef variant_func;
1211
1212   arg_types[0] = get_context_ptr_type(llvm);       /* context */
1213   arg_types[1] = get_vertex_header_ptr_type(llvm); /* vertex_header */
1214   arg_types[2] = get_buffer_ptr_type(llvm);        /* vbuffers */
1215   if (elts)
1216      arg_types[3] = LLVMPointerType(int32_type, 0);/* fetch_elts * */
1217   else
1218      arg_types[3] = int32_type;                    /* start */
1219   arg_types[4] = int32_type;                       /* fetch_count / count */
1220   arg_types[5] = int32_type;                       /* stride */
1221   arg_types[6] = get_vb_ptr_type(llvm);            /* pipe_vertex_buffer's */
1222   arg_types[7] = int32_type;                       /* instance_id */
1223
1224   func_type = LLVMFunctionType(int32_type, arg_types, Elements(arg_types), 0);
1225
1226   variant_func = LLVMAddFunction(gallivm->module,
1227                                  elts ? "draw_llvm_shader_elts" : "draw_llvm_shader",
1228                                  func_type);
1229
1230   if (elts)
1231      variant->function_elts = variant_func;
1232   else
1233      variant->function = variant_func;
1234
1235   LLVMSetFunctionCallConv(variant_func, LLVMCCallConv);
1236   for (i = 0; i < Elements(arg_types); ++i)
1237      if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
1238         LLVMAddAttribute(LLVMGetParam(variant_func, i),
1239                          LLVMNoAliasAttribute);
1240
1241   context_ptr  = LLVMGetParam(variant_func, 0);
1242   io_ptr       = LLVMGetParam(variant_func, 1);
1243   vbuffers_ptr = LLVMGetParam(variant_func, 2);
1244   stride       = LLVMGetParam(variant_func, 5);
1245   vb_ptr       = LLVMGetParam(variant_func, 6);
1246   instance_id  = LLVMGetParam(variant_func, 7);
1247
1248   lp_build_name(context_ptr, "context");
1249   lp_build_name(io_ptr, "io");
1250   lp_build_name(vbuffers_ptr, "vbuffers");
1251   lp_build_name(stride, "stride");
1252   lp_build_name(vb_ptr, "vb");
1253   lp_build_name(instance_id, "instance_id");
1254
1255   if (elts) {
1256      fetch_elts   = LLVMGetParam(variant_func, 3);
1257      fetch_count  = LLVMGetParam(variant_func, 4);
1258      lp_build_name(fetch_elts, "fetch_elts");
1259      lp_build_name(fetch_count, "fetch_count");
1260      start = count = NULL;
1261   }
1262   else {
1263      start        = LLVMGetParam(variant_func, 3);
1264      count        = LLVMGetParam(variant_func, 4);
1265      lp_build_name(start, "start");
1266      lp_build_name(count, "count");
1267      fetch_elts = fetch_count = NULL;
1268   }
1269
1270   /*
1271    * Function body
1272    */
1273
1274   block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry");
1275   builder = gallivm->builder;
1276   LLVMPositionBuilderAtEnd(builder, block);
1277
1278   lp_build_context_init(&bld, gallivm, lp_type_int(32));
1279
1280   system_values_array = lp_build_system_values_array(gallivm, vs_info,
1281                                                      instance_id, NULL);
1282
1283   /* function will return non-zero i32 value if any clipped vertices */
1284   ret_ptr = lp_build_alloca(gallivm, int32_type, "");
1285   LLVMBuildStore(builder, zero, ret_ptr);
1286
1287   /* code generated texture sampling */
1288   sampler = draw_llvm_sampler_soa_create(
1289      draw_llvm_variant_key_samplers(&variant->key),
1290      context_ptr);
1291
1292   if (elts) {
1293      start = zero;
1294      end = fetch_count;
1295   }
1296   else {
1297      end = lp_build_add(&bld, start, count);
1298   }
1299
1300   step = lp_build_const_int32(gallivm, max_vertices);
1301
1302   fetch_max = LLVMBuildSub(builder, end, one, "fetch_max");
1303
1304   lp_build_loop_begin(&lp_loop, gallivm, start);
1305   {
1306      LLVMValueRef inputs[PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
1307      LLVMValueRef aos_attribs[PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS] = { { 0 } };
1308      LLVMValueRef io;
1309      LLVMValueRef clipmask;   /* holds the clipmask value */
1310      const LLVMValueRef (*ptr_aos)[NUM_CHANNELS];
1311
1312      if (elts)
1313         io_itr = lp_loop.counter;
1314      else
1315         io_itr = LLVMBuildSub(builder, lp_loop.counter, start, "");
1316
1317      io = LLVMBuildGEP(builder, io_ptr, &io_itr, 1, "");
1318#if DEBUG_STORE
1319      lp_build_printf(builder, " --- io %d = %p, loop counter %d\n",
1320                      io_itr, io, lp_loop.counter);
1321#endif
1322      for (i = 0; i < NUM_CHANNELS; ++i) {
1323         LLVMValueRef true_index =
1324            LLVMBuildAdd(builder,
1325                         lp_loop.counter,
1326                         lp_build_const_int32(gallivm, i), "");
1327
1328         /* make sure we're not out of bounds which can happen
1329          * if fetch_count % 4 != 0, because on the last iteration
1330          * a few of the 4 vertex fetches will be out of bounds */
1331         true_index = lp_build_min(&bld, true_index, fetch_max);
1332
1333         if (elts) {
1334            LLVMValueRef fetch_ptr;
1335            fetch_ptr = LLVMBuildGEP(builder, fetch_elts,
1336                                     &true_index, 1, "");
1337            true_index = LLVMBuildLoad(builder, fetch_ptr, "fetch_elt");
1338         }
1339
1340         for (j = 0; j < draw->pt.nr_vertex_elements; ++j) {
1341            struct pipe_vertex_element *velem = &draw->pt.vertex_element[j];
1342            LLVMValueRef vb_index =
1343               lp_build_const_int32(gallivm, velem->vertex_buffer_index);
1344            LLVMValueRef vb = LLVMBuildGEP(builder, vb_ptr, &vb_index, 1, "");
1345            generate_fetch(gallivm, vbuffers_ptr,
1346                           &aos_attribs[j][i], velem, vb, true_index,
1347                           instance_id);
1348         }
1349      }
1350      convert_to_soa(gallivm, aos_attribs, inputs,
1351                     draw->pt.nr_vertex_elements);
1352
1353      ptr_aos = (const LLVMValueRef (*)[NUM_CHANNELS]) inputs;
1354      generate_vs(llvm,
1355                  builder,
1356                  outputs,
1357                  ptr_aos,
1358                  system_values_array,
1359                  context_ptr,
1360                  sampler,
1361                  variant->key.clamp_vertex_color);
1362
1363      /* store original positions in clip before further manipulation */
1364      store_clip(gallivm, io, outputs);
1365
1366      /* do cliptest */
1367      if (enable_cliptest) {
1368         /* allocate clipmask, assign it integer type */
1369         clipmask = generate_clipmask(gallivm, outputs,
1370                                      variant->key.clip_xy,
1371                                      variant->key.clip_z,
1372                                      variant->key.clip_user,
1373                                      variant->key.clip_halfz,
1374                                      variant->key.ucp_enable,
1375                                      context_ptr);
1376         /* return clipping boolean value for function */
1377         clipmask_bool(gallivm, clipmask, ret_ptr);
1378      }
1379      else {
1380         clipmask = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 0);
1381      }
1382
1383      /* do viewport mapping */
1384      if (!bypass_viewport) {
1385         generate_viewport(llvm, builder, outputs, context_ptr);
1386      }
1387
1388      /* store clipmask in vertex header,
1389       * original positions in clip
1390       * and transformed positions in data
1391       */
1392      convert_to_aos(gallivm, io, outputs, clipmask,
1393                     vs_info->num_outputs, max_vertices);
1394   }
1395
1396   lp_build_loop_end_cond(&lp_loop, end, step, LLVMIntUGE);
1397
1398   sampler->destroy(sampler);
1399
1400   ret = LLVMBuildLoad(builder, ret_ptr, "");
1401   LLVMBuildRet(builder, ret);
1402
1403   /*
1404    * Translate the LLVM IR into machine code.
1405    */
1406#ifdef DEBUG
1407   if (LLVMVerifyFunction(variant_func, LLVMPrintMessageAction)) {
1408      lp_debug_dump_value(variant_func);
1409      assert(0);
1410   }
1411#endif
1412
1413   LLVMRunFunctionPassManager(gallivm->passmgr, variant_func);
1414
1415   if (gallivm_debug & GALLIVM_DEBUG_IR) {
1416      lp_debug_dump_value(variant_func);
1417      debug_printf("\n");
1418   }
1419
1420   code = LLVMGetPointerToGlobal(gallivm->engine, variant_func);
1421   if (elts)
1422      variant->jit_func_elts = (draw_jit_vert_func_elts) pointer_to_func(code);
1423   else
1424      variant->jit_func = (draw_jit_vert_func) pointer_to_func(code);
1425
1426   if (gallivm_debug & GALLIVM_DEBUG_ASM) {
1427      lp_disassemble(code);
1428   }
1429   lp_func_delete_body(variant_func);
1430}
1431
1432
1433struct draw_llvm_variant_key *
1434draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
1435{
1436   unsigned i;
1437   struct draw_llvm_variant_key *key;
1438   struct lp_sampler_static_state *sampler;
1439
1440   key = (struct draw_llvm_variant_key *)store;
1441
1442   key->clamp_vertex_color = llvm->draw->rasterizer->clamp_vertex_color; /**/
1443
1444   /* Presumably all variants of the shader should have the same
1445    * number of vertex elements - ie the number of shader inputs.
1446    */
1447   key->nr_vertex_elements = llvm->draw->pt.nr_vertex_elements;
1448
1449   /* will have to rig this up properly later */
1450   key->clip_xy = llvm->draw->clip_xy;
1451   key->clip_z = llvm->draw->clip_z;
1452   key->clip_user = llvm->draw->clip_user;
1453   key->bypass_viewport = llvm->draw->identity_viewport;
1454   key->clip_halfz = !llvm->draw->rasterizer->gl_rasterization_rules;
1455   key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE);
1456   key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable;
1457   key->pad = 0;
1458
1459   /* All variants of this shader will have the same value for
1460    * nr_samplers.  Not yet trying to compact away holes in the
1461    * sampler array.
1462    */
1463   key->nr_samplers = llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
1464
1465   sampler = draw_llvm_variant_key_samplers(key);
1466
1467   memcpy(key->vertex_element,
1468          llvm->draw->pt.vertex_element,
1469          sizeof(struct pipe_vertex_element) * key->nr_vertex_elements);
1470
1471   memset(sampler, 0, key->nr_samplers * sizeof *sampler);
1472
1473   for (i = 0 ; i < key->nr_samplers; i++) {
1474      lp_sampler_static_state(&sampler[i],
1475			      llvm->draw->sampler_views[i],
1476			      llvm->draw->samplers[i]);
1477   }
1478
1479   return key;
1480}
1481
1482
1483void
1484draw_llvm_set_mapped_texture(struct draw_context *draw,
1485                             unsigned sampler_idx,
1486                             uint32_t width, uint32_t height, uint32_t depth,
1487                             uint32_t first_level, uint32_t last_level,
1488                             uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
1489                             uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
1490                             const void *data[PIPE_MAX_TEXTURE_LEVELS])
1491{
1492   unsigned j;
1493   struct draw_jit_texture *jit_tex;
1494
1495   assert(sampler_idx < PIPE_MAX_VERTEX_SAMPLERS);
1496
1497   jit_tex = &draw->llvm->jit_context.textures[sampler_idx];
1498
1499   jit_tex->width = width;
1500   jit_tex->height = height;
1501   jit_tex->depth = depth;
1502   jit_tex->first_level = first_level;
1503   jit_tex->last_level = last_level;
1504
1505   for (j = first_level; j <= last_level; j++) {
1506      jit_tex->data[j] = data[j];
1507      jit_tex->row_stride[j] = row_stride[j];
1508      jit_tex->img_stride[j] = img_stride[j];
1509   }
1510}
1511
1512
1513void
1514draw_llvm_set_sampler_state(struct draw_context *draw)
1515{
1516   unsigned i;
1517
1518   for (i = 0; i < draw->num_samplers; i++) {
1519      struct draw_jit_texture *jit_tex = &draw->llvm->jit_context.textures[i];
1520
1521      if (draw->samplers[i]) {
1522         jit_tex->min_lod = draw->samplers[i]->min_lod;
1523         jit_tex->max_lod = draw->samplers[i]->max_lod;
1524         jit_tex->lod_bias = draw->samplers[i]->lod_bias;
1525         COPY_4V(jit_tex->border_color, draw->samplers[i]->border_color.f);
1526      }
1527   }
1528}
1529
1530
1531void
1532draw_llvm_destroy_variant(struct draw_llvm_variant *variant)
1533{
1534   struct draw_llvm *llvm = variant->llvm;
1535
1536   if (variant->function_elts) {
1537      LLVMFreeMachineCodeForFunction(llvm->gallivm->engine,
1538                                     variant->function_elts);
1539      LLVMDeleteFunction(variant->function_elts);
1540   }
1541
1542   if (variant->function) {
1543      LLVMFreeMachineCodeForFunction(llvm->gallivm->engine,
1544                                     variant->function);
1545      LLVMDeleteFunction(variant->function);
1546   }
1547
1548   remove_from_list(&variant->list_item_local);
1549   variant->shader->variants_cached--;
1550   remove_from_list(&variant->list_item_global);
1551   llvm->nr_variants--;
1552   FREE(variant);
1553}
1554