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