1 /************************************************************************** 2 * 3 * Copyright 2010 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #ifndef DRAW_LLVM_H 29 #define DRAW_LLVM_H 30 31 #include "draw/draw_private.h" 32 33 #include "draw/draw_vs.h" 34 #include "draw/draw_gs.h" 35 36 #include "gallivm/lp_bld_sample.h" 37 #include "gallivm/lp_bld_limits.h" 38 39 #include "pipe/p_context.h" 40 #include "util/simple_list.h" 41 42 43 struct draw_llvm; 44 struct llvm_vertex_shader; 45 struct llvm_geometry_shader; 46 47 struct draw_jit_texture 48 { 49 uint32_t width; 50 uint32_t height; 51 uint32_t depth; 52 uint32_t first_level; 53 uint32_t last_level; 54 const void *base; 55 uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS]; 56 uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS]; 57 uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]; 58 }; 59 60 61 struct draw_sampler_static_state 62 { 63 /* 64 * These attributes are effectively interleaved for more sane key handling. 65 * However, there might be lots of null space if the amount of samplers and 66 * textures isn't the same. 67 */ 68 struct lp_static_sampler_state sampler_state; 69 struct lp_static_texture_state texture_state; 70 }; 71 72 73 struct draw_jit_sampler 74 { 75 float min_lod; 76 float max_lod; 77 float lod_bias; 78 float border_color[4]; 79 }; 80 81 82 enum { 83 DRAW_JIT_TEXTURE_WIDTH = 0, 84 DRAW_JIT_TEXTURE_HEIGHT, 85 DRAW_JIT_TEXTURE_DEPTH, 86 DRAW_JIT_TEXTURE_FIRST_LEVEL, 87 DRAW_JIT_TEXTURE_LAST_LEVEL, 88 DRAW_JIT_TEXTURE_BASE, 89 DRAW_JIT_TEXTURE_ROW_STRIDE, 90 DRAW_JIT_TEXTURE_IMG_STRIDE, 91 DRAW_JIT_TEXTURE_MIP_OFFSETS, 92 DRAW_JIT_TEXTURE_NUM_FIELDS /* number of fields above */ 93 }; 94 95 96 enum { 97 DRAW_JIT_SAMPLER_MIN_LOD, 98 DRAW_JIT_SAMPLER_MAX_LOD, 99 DRAW_JIT_SAMPLER_LOD_BIAS, 100 DRAW_JIT_SAMPLER_BORDER_COLOR, 101 DRAW_JIT_SAMPLER_NUM_FIELDS /* number of fields above */ 102 }; 103 104 105 enum { 106 DRAW_JIT_VERTEX_VERTEX_ID = 0, 107 DRAW_JIT_VERTEX_CLIP_POS, 108 DRAW_JIT_VERTEX_DATA 109 }; 110 111 /** 112 * This structure is passed directly to the generated vertex shader. 113 * 114 * It contains the derived state. 115 * 116 * Changes here must be reflected in the draw_jit_context_* macros. 117 * Changes to the ordering should be avoided. 118 * 119 * Only use types with a clear size and padding here, in particular prefer the 120 * stdint.h types to the basic integer types. 121 */ 122 struct draw_jit_context 123 { 124 const float *vs_constants[LP_MAX_TGSI_CONST_BUFFERS]; 125 int num_vs_constants[LP_MAX_TGSI_CONST_BUFFERS]; 126 float (*planes) [DRAW_TOTAL_CLIP_PLANES][4]; 127 struct pipe_viewport_state *viewports; 128 129 struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 130 struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS]; 131 }; 132 133 enum { 134 DRAW_JIT_CTX_CONSTANTS = 0, 135 DRAW_JIT_CTX_NUM_CONSTANTS = 1, 136 DRAW_JIT_CTX_PLANES = 2, 137 DRAW_JIT_CTX_VIEWPORT = 3, 138 DRAW_JIT_CTX_TEXTURES = 4, 139 DRAW_JIT_CTX_SAMPLERS = 5, 140 DRAW_JIT_CTX_NUM_FIELDS 141 }; 142 143 #define draw_jit_context_vs_constants(_gallivm, _ptr) \ 144 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_CONSTANTS, "vs_constants") 145 146 #define draw_jit_context_num_vs_constants(_gallivm, _ptr) \ 147 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_NUM_CONSTANTS, "num_vs_constants") 148 149 #define draw_jit_context_planes(_gallivm, _ptr) \ 150 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_CTX_PLANES, "planes") 151 152 #define draw_jit_context_viewports(_gallivm, _ptr) \ 153 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_CTX_VIEWPORT, "viewports") 154 155 #define draw_jit_context_textures(_gallivm, _ptr) \ 156 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_TEXTURES, "textures") 157 158 #define draw_jit_context_samplers(_gallivm, _ptr) \ 159 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_SAMPLERS, "samplers") 160 161 #define draw_jit_header_id(_gallivm, _ptr) \ 162 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_VERTEX_ID, "id") 163 164 #define draw_jit_header_clip_pos(_gallivm, _ptr) \ 165 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_CLIP_POS, "clip_pos") 166 167 #define draw_jit_header_data(_gallivm, _ptr) \ 168 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_DATA, "data") 169 170 171 #define draw_jit_vbuffer_stride(_gallivm, _ptr) \ 172 lp_build_struct_get(_gallivm, _ptr, 0, "stride") 173 174 #define draw_jit_vbuffer_offset(_gallivm, _ptr) \ 175 lp_build_struct_get(_gallivm, _ptr, 1, "buffer_offset") 176 177 enum { 178 DRAW_JIT_DVBUFFER_MAP = 0, 179 DRAW_JIT_DVBUFFER_SIZE, 180 DRAW_JIT_DVBUFFER_NUM_FIELDS /* number of fields above */ 181 }; 182 183 #define draw_jit_dvbuffer_map(_gallivm, _ptr) \ 184 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_DVBUFFER_MAP, "map") 185 186 #define draw_jit_dvbuffer_size(_gallivm, _ptr) \ 187 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_DVBUFFER_SIZE, "size") 188 189 190 /** 191 * This structure is passed directly to the generated geometry shader. 192 * 193 * It contains the derived state. 194 * 195 * Changes here must be reflected in the draw_gs_jit_context_* macros. 196 * Changes to the ordering should be avoided. 197 * 198 * Only use types with a clear size and padding here, in particular prefer the 199 * stdint.h types to the basic integer types. 200 */ 201 struct draw_gs_jit_context 202 { 203 const float *constants[LP_MAX_TGSI_CONST_BUFFERS]; 204 int num_constants[LP_MAX_TGSI_CONST_BUFFERS]; 205 float (*planes) [DRAW_TOTAL_CLIP_PLANES][4]; 206 struct pipe_viewport_state *viewports; 207 208 /* There two need to be exactly at DRAW_JIT_CTX_TEXTURES and 209 * DRAW_JIT_CTX_SAMPLERS positions in the struct */ 210 struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 211 struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS]; 212 213 int **prim_lengths; 214 int *emitted_vertices; 215 int *emitted_prims; 216 }; 217 218 enum { 219 DRAW_GS_JIT_CTX_CONSTANTS = 0, 220 DRAW_GS_JIT_CTX_NUM_CONSTANTS = 1, 221 DRAW_GS_JIT_CTX_PLANES = 2, 222 DRAW_GS_JIT_CTX_VIEWPORT = 3, 223 /* Textures and samples are reserved for DRAW_JIT_CTX_TEXTURES 224 * and DRAW_JIT_CTX_SAMPLERS, because they both need 225 * to be at exactly the same locations as they are in the 226 * VS ctx structure for sampling to work. */ 227 DRAW_GS_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES, 228 DRAW_GS_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS, 229 DRAW_GS_JIT_CTX_PRIM_LENGTHS = 6, 230 DRAW_GS_JIT_CTX_EMITTED_VERTICES = 7, 231 DRAW_GS_JIT_CTX_EMITTED_PRIMS = 8, 232 DRAW_GS_JIT_CTX_NUM_FIELDS = 9 233 }; 234 235 #define draw_gs_jit_context_constants(_gallivm, _ptr) \ 236 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_CONSTANTS, "constants") 237 238 #define draw_gs_jit_context_num_constants(_gallivm, _ptr) \ 239 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_NUM_CONSTANTS, "num_constants") 240 241 #define draw_gs_jit_context_planes(_gallivm, _ptr) \ 242 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_PLANES, "planes") 243 244 #define draw_gs_jit_context_viewports(_gallivm, _ptr) \ 245 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_VIEWPORT, "viewports") 246 247 #define draw_gs_jit_context_textures(_gallivm, _ptr) \ 248 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_TEXTURES, "textures") 249 250 #define draw_gs_jit_context_samplers(_gallivm, _ptr) \ 251 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_SAMPLERS, "samplers") 252 253 #define draw_gs_jit_prim_lengths(_gallivm, _ptr) \ 254 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_PRIM_LENGTHS, "prim_lengths") 255 256 #define draw_gs_jit_emitted_vertices(_gallivm, _ptr) \ 257 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_EMITTED_VERTICES, "emitted_vertices") 258 259 #define draw_gs_jit_emitted_prims(_gallivm, _ptr) \ 260 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_EMITTED_PRIMS, "emitted_prims") 261 262 263 264 typedef boolean 265 (*draw_jit_vert_func)(struct draw_jit_context *context, 266 struct vertex_header *io, 267 const struct draw_vertex_buffer vbuffers[PIPE_MAX_ATTRIBS], 268 unsigned count, 269 unsigned start_or_maxelt, 270 unsigned stride, 271 struct pipe_vertex_buffer *vertex_buffers, 272 unsigned instance_id, 273 unsigned vertex_id_offset, 274 unsigned start_instance, 275 const unsigned *fetch_elts); 276 277 278 typedef int 279 (*draw_gs_jit_func)(struct draw_gs_jit_context *context, 280 float inputs[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS], 281 struct vertex_header *output, 282 unsigned num_prims, 283 unsigned instance_id, 284 int *prim_ids, 285 unsigned invocation_id); 286 287 struct draw_llvm_variant_key 288 { 289 unsigned nr_vertex_elements:8; 290 unsigned nr_samplers:8; 291 unsigned nr_sampler_views:8; 292 unsigned clamp_vertex_color:1; 293 unsigned clip_xy:1; 294 unsigned clip_z:1; 295 unsigned clip_user:1; 296 unsigned clip_halfz:1; 297 unsigned bypass_viewport:1; 298 unsigned need_edgeflags:1; 299 unsigned has_gs:1; 300 unsigned num_outputs:8; 301 unsigned ucp_enable:PIPE_MAX_CLIP_PLANES; 302 /* note padding here - must use memset */ 303 304 /* Variable number of vertex elements: 305 */ 306 struct pipe_vertex_element vertex_element[1]; 307 308 /* Followed by variable number of samplers: 309 */ 310 /* struct draw_sampler_static_state sampler; */ 311 }; 312 313 struct draw_gs_llvm_variant_key 314 { 315 unsigned nr_samplers:8; 316 unsigned nr_sampler_views:8; 317 unsigned num_outputs:8; 318 /* note padding here - must use memset */ 319 320 struct draw_sampler_static_state samplers[1]; 321 }; 322 323 #define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \ 324 (sizeof(struct draw_llvm_variant_key) + \ 325 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state) + \ 326 (PIPE_MAX_ATTRIBS-1) * sizeof(struct pipe_vertex_element)) 327 328 #define DRAW_GS_LLVM_MAX_VARIANT_KEY_SIZE \ 329 (sizeof(struct draw_gs_llvm_variant_key) + \ 330 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state)) 331 332 333 static inline size_t 334 draw_llvm_variant_key_size(unsigned nr_vertex_elements, 335 unsigned nr_samplers) 336 { 337 return (sizeof(struct draw_llvm_variant_key) + 338 nr_samplers * sizeof(struct draw_sampler_static_state) + 339 (nr_vertex_elements - 1) * sizeof(struct pipe_vertex_element)); 340 } 341 342 343 static inline size_t 344 draw_gs_llvm_variant_key_size(unsigned nr_samplers) 345 { 346 return (sizeof(struct draw_gs_llvm_variant_key) + 347 (nr_samplers - 1) * sizeof(struct draw_sampler_static_state)); 348 } 349 350 351 static inline struct draw_sampler_static_state * 352 draw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key) 353 { 354 return (struct draw_sampler_static_state *) 355 &key->vertex_element[key->nr_vertex_elements]; 356 } 357 358 359 struct draw_llvm_variant_list_item 360 { 361 struct draw_llvm_variant *base; 362 struct draw_llvm_variant_list_item *next, *prev; 363 }; 364 365 struct draw_gs_llvm_variant_list_item 366 { 367 struct draw_gs_llvm_variant *base; 368 struct draw_gs_llvm_variant_list_item *next, *prev; 369 }; 370 371 372 struct draw_llvm_variant 373 { 374 struct gallivm_state *gallivm; 375 376 /* LLVM JIT builder types */ 377 LLVMTypeRef context_ptr_type; 378 LLVMTypeRef buffer_ptr_type; 379 LLVMTypeRef vb_ptr_type; 380 LLVMTypeRef vertex_header_ptr_type; 381 382 LLVMValueRef function; 383 draw_jit_vert_func jit_func; 384 385 struct llvm_vertex_shader *shader; 386 387 struct draw_llvm *llvm; 388 struct draw_llvm_variant_list_item list_item_global; 389 struct draw_llvm_variant_list_item list_item_local; 390 391 /* key is variable-sized, must be last */ 392 struct draw_llvm_variant_key key; 393 }; 394 395 396 struct draw_gs_llvm_variant 397 { 398 struct gallivm_state *gallivm; 399 400 /* LLVM JIT builder types */ 401 LLVMTypeRef context_ptr_type; 402 LLVMTypeRef vertex_header_ptr_type; 403 LLVMTypeRef input_array_type; 404 405 LLVMValueRef context_ptr; 406 LLVMValueRef io_ptr; 407 LLVMValueRef num_prims; 408 LLVMValueRef function; 409 draw_gs_jit_func jit_func; 410 411 struct llvm_geometry_shader *shader; 412 413 struct draw_llvm *llvm; 414 struct draw_gs_llvm_variant_list_item list_item_global; 415 struct draw_gs_llvm_variant_list_item list_item_local; 416 417 /* key is variable-sized, must be last */ 418 struct draw_gs_llvm_variant_key key; 419 }; 420 421 struct llvm_vertex_shader { 422 struct draw_vertex_shader base; 423 424 unsigned variant_key_size; 425 struct draw_llvm_variant_list_item variants; 426 unsigned variants_created; 427 unsigned variants_cached; 428 }; 429 430 struct llvm_geometry_shader { 431 struct draw_geometry_shader base; 432 433 unsigned variant_key_size; 434 struct draw_gs_llvm_variant_list_item variants; 435 unsigned variants_created; 436 unsigned variants_cached; 437 }; 438 439 440 struct draw_llvm { 441 struct draw_context *draw; 442 443 LLVMContextRef context; 444 boolean context_owned; 445 446 struct draw_jit_context jit_context; 447 struct draw_gs_jit_context gs_jit_context; 448 449 struct draw_llvm_variant_list_item vs_variants_list; 450 int nr_variants; 451 452 struct draw_gs_llvm_variant_list_item gs_variants_list; 453 int nr_gs_variants; 454 }; 455 456 457 static inline struct llvm_vertex_shader * 458 llvm_vertex_shader(struct draw_vertex_shader *vs) 459 { 460 return (struct llvm_vertex_shader *)vs; 461 } 462 463 static inline struct llvm_geometry_shader * 464 llvm_geometry_shader(struct draw_geometry_shader *gs) 465 { 466 return (struct llvm_geometry_shader *)gs; 467 } 468 469 470 471 472 struct draw_llvm * 473 draw_llvm_create(struct draw_context *draw, LLVMContextRef llvm_context); 474 475 void 476 draw_llvm_destroy(struct draw_llvm *llvm); 477 478 struct draw_llvm_variant * 479 draw_llvm_create_variant(struct draw_llvm *llvm, 480 unsigned num_vertex_header_attribs, 481 const struct draw_llvm_variant_key *key); 482 483 void 484 draw_llvm_destroy_variant(struct draw_llvm_variant *variant); 485 486 struct draw_llvm_variant_key * 487 draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store); 488 489 void 490 draw_llvm_dump_variant_key(struct draw_llvm_variant_key *key); 491 492 493 struct draw_gs_llvm_variant * 494 draw_gs_llvm_create_variant(struct draw_llvm *llvm, 495 unsigned num_vertex_header_attribs, 496 const struct draw_gs_llvm_variant_key *key); 497 498 void 499 draw_gs_llvm_destroy_variant(struct draw_gs_llvm_variant *variant); 500 501 struct draw_gs_llvm_variant_key * 502 draw_gs_llvm_make_variant_key(struct draw_llvm *llvm, char *store); 503 504 void 505 draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key); 506 507 struct lp_build_sampler_soa * 508 draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state); 509 510 void 511 draw_llvm_set_sampler_state(struct draw_context *draw, unsigned shader_stage); 512 513 void 514 draw_llvm_set_mapped_texture(struct draw_context *draw, 515 unsigned shader_stage, 516 unsigned sview_idx, 517 uint32_t width, uint32_t height, uint32_t depth, 518 uint32_t first_level, uint32_t last_level, 519 const void *base_ptr, 520 uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS], 521 uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS], 522 uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]); 523 524 #endif 525