1 /************************************************************************** 2 * 3 * Copyright (C) 2014 Red Hat Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included 13 * in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 **************************************************************************/ 24 25 #include "tgsi/tgsi_info.h" 26 #include "tgsi/tgsi_iterate.h" 27 #include "tgsi/tgsi_scan.h" 28 #include "util/u_memory.h" 29 #include "util/u_math.h" 30 #include <string.h> 31 #include <stdio.h> 32 #include <math.h> 33 #include <errno.h> 34 #include "vrend_shader.h" 35 36 extern int vrend_dump_shaders; 37 38 /* start convert of tgsi to glsl */ 39 40 #define INTERP_PREFIX " " 41 #define INVARI_PREFIX "invariant" 42 43 #define SHADER_REQ_NONE 0 44 #define SHADER_REQ_SAMPLER_RECT (1 << 0) 45 #define SHADER_REQ_CUBE_ARRAY (1 << 1) 46 #define SHADER_REQ_INTS (1 << 2) 47 #define SHADER_REQ_SAMPLER_MS (1 << 3) 48 #define SHADER_REQ_INSTANCE_ID (1 << 4) 49 #define SHADER_REQ_LODQ (1 << 5) 50 #define SHADER_REQ_TXQ_LEVELS (1 << 6) 51 #define SHADER_REQ_TG4 (1 << 7) 52 #define SHADER_REQ_VIEWPORT_IDX (1 << 8) 53 #define SHADER_REQ_STENCIL_EXPORT (1 << 9) 54 #define SHADER_REQ_LAYER (1 << 10) 55 #define SHADER_REQ_SAMPLE_SHADING (1 << 11) 56 #define SHADER_REQ_GPU_SHADER5 (1 << 12) 57 #define SHADER_REQ_DERIVATIVE_CONTROL (1 << 13) 58 #define SHADER_REQ_FP64 (1 << 14) 59 #define SHADER_REQ_IMAGE_LOAD_STORE (1 << 15) 60 #define SHADER_REQ_ES31_COMPAT (1 << 16) 61 #define SHADER_REQ_IMAGE_SIZE (1 << 17) 62 #define SHADER_REQ_TXQS (1 << 18) 63 #define SHADER_REQ_FBFETCH (1 << 19) 64 #define SHADER_REQ_SHADER_CLOCK (1 << 20) 65 #define SHADER_REQ_PSIZE (1 << 21) 66 67 struct vrend_shader_io { 68 unsigned name; 69 unsigned gpr; 70 unsigned done; 71 int sid; 72 unsigned interpolate; 73 int first; 74 unsigned location; 75 bool invariant; 76 bool precise; 77 bool glsl_predefined_no_emit; 78 bool glsl_no_index; 79 bool glsl_gl_block; 80 bool override_no_wm; 81 bool is_int; 82 bool fbfetch_used; 83 char glsl_name[128]; 84 unsigned stream; 85 }; 86 87 struct vrend_shader_sampler { 88 int tgsi_sampler_type; 89 enum tgsi_return_type tgsi_sampler_return; 90 }; 91 92 struct vrend_shader_table { 93 uint32_t key; 94 const char *string; 95 }; 96 97 struct vrend_shader_image { 98 struct tgsi_declaration_image decl; 99 enum tgsi_return_type image_return; 100 bool vflag; 101 }; 102 103 #define MAX_IMMEDIATE 1024 104 struct immed { 105 int type; 106 union imm { 107 uint32_t ui; 108 int32_t i; 109 float f; 110 } val[4]; 111 }; 112 113 struct vrend_temp_range { 114 int first; 115 int last; 116 int array_id; 117 }; 118 119 struct vrend_io_range { 120 int first; 121 int last; 122 int array_id; 123 bool used; 124 }; 125 126 struct dump_ctx { 127 struct tgsi_iterate_context iter; 128 struct vrend_shader_cfg *cfg; 129 struct tgsi_shader_info info; 130 int prog_type; 131 int size; 132 char *glsl_main; 133 uint instno; 134 135 uint32_t num_interps; 136 uint32_t num_inputs; 137 uint32_t attrib_input_mask; 138 struct vrend_shader_io inputs[64]; 139 uint32_t num_outputs; 140 struct vrend_shader_io outputs[64]; 141 uint32_t num_system_values; 142 struct vrend_shader_io system_values[32]; 143 144 struct vrend_io_range generic_input_range; 145 struct vrend_io_range patch_input_range; 146 struct vrend_io_range generic_output_range; 147 struct vrend_io_range patch_output_range; 148 149 uint32_t num_temp_ranges; 150 struct vrend_temp_range *temp_ranges; 151 152 struct vrend_shader_sampler samplers[32]; 153 uint32_t samplers_used; 154 155 uint32_t ssbo_used_mask; 156 uint32_t ssbo_atomic_mask; 157 uint32_t ssbo_array_base; 158 uint32_t ssbo_atomic_array_base; 159 uint32_t ssbo_integer_mask; 160 161 struct vrend_shader_image images[32]; 162 uint32_t images_used_mask; 163 164 struct vrend_array *image_arrays; 165 uint32_t num_image_arrays; 166 167 struct vrend_array *sampler_arrays; 168 uint32_t num_sampler_arrays; 169 170 int num_consts; 171 int num_imm; 172 struct immed imm[MAX_IMMEDIATE]; 173 unsigned fragcoord_input; 174 175 uint32_t req_local_mem; 176 bool integer_memory; 177 178 uint32_t num_ubo; 179 uint32_t ubo_base; 180 int ubo_idx[32]; 181 int ubo_sizes[32]; 182 uint32_t num_address; 183 184 uint32_t shader_req_bits; 185 186 struct pipe_stream_output_info *so; 187 char **so_names; 188 bool write_so_outputs[PIPE_MAX_SO_OUTPUTS]; 189 bool uses_sampler_buf; 190 bool write_all_cbufs; 191 uint32_t shadow_samp_mask; 192 193 int fs_coord_origin, fs_pixel_center; 194 195 int gs_in_prim, gs_out_prim, gs_max_out_verts; 196 int gs_num_invocations; 197 198 struct vrend_shader_key *key; 199 int indent_level; 200 int num_in_clip_dist; 201 int num_clip_dist; 202 int glsl_ver_required; 203 int color_in_mask; 204 /* only used when cull is enabled */ 205 uint8_t num_cull_dist_prop, num_clip_dist_prop; 206 bool front_face_emitted; 207 208 bool has_clipvertex; 209 bool has_clipvertex_so; 210 bool vs_has_pervertex; 211 bool write_mul_utemp; 212 bool write_mul_itemp; 213 bool has_sample_input; 214 bool early_depth_stencil; 215 216 int tcs_vertices_out; 217 int tes_prim_mode; 218 int tes_spacing; 219 int tes_vertex_order; 220 int tes_point_mode; 221 222 uint16_t local_cs_block_size[3]; 223 }; 224 225 static const struct vrend_shader_table shader_req_table[] = { 226 { SHADER_REQ_SAMPLER_RECT, "GL_ARB_texture_rectangle" }, 227 { SHADER_REQ_CUBE_ARRAY, "GL_ARB_texture_cube_map_array" }, 228 { SHADER_REQ_INTS, "GL_ARB_shader_bit_encoding" }, 229 { SHADER_REQ_SAMPLER_MS, "GL_ARB_texture_multisample" }, 230 { SHADER_REQ_INSTANCE_ID, "GL_ARB_draw_instanced" }, 231 { SHADER_REQ_LODQ, "GL_ARB_texture_query_lod" }, 232 { SHADER_REQ_TXQ_LEVELS, "GL_ARB_texture_query_levels" }, 233 { SHADER_REQ_TG4, "GL_ARB_texture_gather" }, 234 { SHADER_REQ_VIEWPORT_IDX, "GL_ARB_viewport_array" }, 235 { SHADER_REQ_STENCIL_EXPORT, "GL_ARB_shader_stencil_export" }, 236 { SHADER_REQ_LAYER, "GL_ARB_fragment_layer_viewport" }, 237 { SHADER_REQ_SAMPLE_SHADING, "GL_ARB_sample_shading" }, 238 { SHADER_REQ_GPU_SHADER5, "GL_ARB_gpu_shader5" }, 239 { SHADER_REQ_DERIVATIVE_CONTROL, "GL_ARB_derivative_control" }, 240 { SHADER_REQ_FP64, "GL_ARB_gpu_shader_fp64" }, 241 { SHADER_REQ_IMAGE_LOAD_STORE, "GL_ARB_shader_image_load_store" }, 242 { SHADER_REQ_ES31_COMPAT, "GL_ARB_ES3_1_compatibility" }, 243 { SHADER_REQ_IMAGE_SIZE, "GL_ARB_shader_image_size" }, 244 { SHADER_REQ_TXQS, "GL_ARB_shader_texture_image_samples" }, 245 { SHADER_REQ_FBFETCH, "GL_EXT_shader_framebuffer_fetch" }, 246 { SHADER_REQ_SHADER_CLOCK, "GL_ARB_shader_clock" }, 247 }; 248 249 enum vrend_type_qualifier { 250 TYPE_CONVERSION_NONE = 0, 251 FLOAT = 1, 252 VEC2 = 2, 253 VEC3 = 3, 254 VEC4 = 4, 255 INT = 5, 256 IVEC2 = 6, 257 IVEC3 = 7, 258 IVEC4 = 8, 259 UINT = 9, 260 UVEC2 = 10, 261 UVEC3 = 11, 262 UVEC4 = 12, 263 FLOAT_BITS_TO_UINT = 13, 264 UINT_BITS_TO_FLOAT = 14, 265 FLOAT_BITS_TO_INT = 15, 266 INT_BITS_TO_FLOAT = 16, 267 DOUBLE = 17, 268 DVEC2 = 18, 269 }; 270 271 struct dest_info { 272 enum vrend_type_qualifier dtypeprefix; 273 enum vrend_type_qualifier dstconv; 274 enum vrend_type_qualifier udstconv; 275 enum vrend_type_qualifier idstconv; 276 bool dst_override_no_wm[2]; 277 }; 278 279 struct source_info { 280 enum vrend_type_qualifier svec4; 281 uint32_t sreg_index; 282 bool tg4_has_component; 283 bool override_no_wm[3]; 284 bool override_no_cast[3]; 285 }; 286 287 static const struct vrend_shader_table conversion_table[] = 288 { 289 {TYPE_CONVERSION_NONE, ""}, 290 {FLOAT, "float"}, 291 {VEC2, "vec2"}, 292 {VEC3, "vec3"}, 293 {VEC4, "vec4"}, 294 {INT, "int"}, 295 {IVEC2, "ivec2"}, 296 {IVEC3, "ivec3"}, 297 {IVEC4, "ivec4"}, 298 {UINT, "uint"}, 299 {UVEC2, "uvec2"}, 300 {UVEC3, "uvec3"}, 301 {UVEC4, "uvec4"}, 302 {FLOAT_BITS_TO_UINT, "floatBitsToUint"}, 303 {UINT_BITS_TO_FLOAT, "uintBitsToFloat"}, 304 {FLOAT_BITS_TO_INT, "floatBitsToInt"}, 305 {INT_BITS_TO_FLOAT, "intBitsToFloat"}, 306 {DOUBLE, "double"}, 307 {DVEC2, "dvec2"}, 308 }; 309 310 static inline const char *get_string(enum vrend_type_qualifier key) 311 { 312 if (key >= ARRAY_SIZE(conversion_table)) { 313 printf("Unable to find the correct conversion\n"); 314 return conversion_table[TYPE_CONVERSION_NONE].string; 315 } 316 317 return conversion_table[key].string; 318 } 319 320 static inline const char *get_wm_string(unsigned wm) 321 { 322 switch(wm) { 323 case TGSI_WRITEMASK_NONE: 324 return ""; 325 case TGSI_WRITEMASK_X: 326 return ".x"; 327 case TGSI_WRITEMASK_XY: 328 return ".xy"; 329 case TGSI_WRITEMASK_XYZ: 330 return ".xyz"; 331 case TGSI_WRITEMASK_W: 332 return ".w"; 333 default: 334 printf("Unable to unknown writemask\n"); 335 return ""; 336 } 337 } 338 339 const char *get_internalformat_string(int virgl_format, enum tgsi_return_type *stype); 340 341 static inline const char *tgsi_proc_to_prefix(int shader_type) 342 { 343 switch (shader_type) { 344 case TGSI_PROCESSOR_VERTEX: return "vs"; 345 case TGSI_PROCESSOR_FRAGMENT: return "fs"; 346 case TGSI_PROCESSOR_GEOMETRY: return "gs"; 347 case TGSI_PROCESSOR_TESS_CTRL: return "tc"; 348 case TGSI_PROCESSOR_TESS_EVAL: return "te"; 349 case TGSI_PROCESSOR_COMPUTE: return "cs"; 350 default: 351 return NULL; 352 }; 353 } 354 355 static inline const char *prim_to_name(int prim) 356 { 357 switch (prim) { 358 case PIPE_PRIM_POINTS: return "points"; 359 case PIPE_PRIM_LINES: return "lines"; 360 case PIPE_PRIM_LINE_STRIP: return "line_strip"; 361 case PIPE_PRIM_LINES_ADJACENCY: return "lines_adjacency"; 362 case PIPE_PRIM_TRIANGLES: return "triangles"; 363 case PIPE_PRIM_TRIANGLE_STRIP: return "triangle_strip"; 364 case PIPE_PRIM_TRIANGLES_ADJACENCY: return "triangles_adjacency"; 365 case PIPE_PRIM_QUADS: return "quads"; 366 default: return "UNKNOWN"; 367 }; 368 } 369 370 static inline const char *prim_to_tes_name(int prim) 371 { 372 switch (prim) { 373 case PIPE_PRIM_QUADS: return "quads"; 374 case PIPE_PRIM_TRIANGLES: return "triangles"; 375 case PIPE_PRIM_LINES: return "isolines"; 376 default: return "UNKNOWN"; 377 } 378 } 379 380 static const char *get_spacing_string(int spacing) 381 { 382 switch (spacing) { 383 case PIPE_TESS_SPACING_FRACTIONAL_ODD: 384 return "fractional_odd_spacing"; 385 case PIPE_TESS_SPACING_FRACTIONAL_EVEN: 386 return "fractional_even_spacing"; 387 case PIPE_TESS_SPACING_EQUAL: 388 default: 389 return "equal_spacing"; 390 } 391 } 392 393 static inline int gs_input_prim_to_size(int prim) 394 { 395 switch (prim) { 396 case PIPE_PRIM_POINTS: return 1; 397 case PIPE_PRIM_LINES: return 2; 398 case PIPE_PRIM_LINES_ADJACENCY: return 4; 399 case PIPE_PRIM_TRIANGLES: return 3; 400 case PIPE_PRIM_TRIANGLES_ADJACENCY: return 6; 401 default: return -1; 402 }; 403 } 404 405 static inline bool fs_emit_layout(struct dump_ctx *ctx) 406 { 407 if (ctx->fs_pixel_center) 408 return true; 409 /* if coord origin is 0 and invert is 0 - emit origin_upper_left, 410 if coord_origin is 0 and invert is 1 - emit nothing (lower) 411 if coord origin is 1 and invert is 0 - emit nothing (lower) 412 if coord_origin is 1 and invert is 1 - emit origin upper left */ 413 if (!(ctx->fs_coord_origin ^ ctx->key->invert_fs_origin)) 414 return true; 415 return false; 416 } 417 418 static const char *get_stage_input_name_prefix(struct dump_ctx *ctx, int processor) 419 { 420 const char *name_prefix; 421 switch (processor) { 422 case TGSI_PROCESSOR_FRAGMENT: 423 if (ctx->key->gs_present) 424 name_prefix = "gso"; 425 else if (ctx->key->tes_present) 426 name_prefix = "teo"; 427 else 428 name_prefix = "vso"; 429 break; 430 case TGSI_PROCESSOR_GEOMETRY: 431 if (ctx->key->tes_present) 432 name_prefix = "teo"; 433 else 434 name_prefix = "vso"; 435 break; 436 case TGSI_PROCESSOR_TESS_EVAL: 437 if (ctx->key->tcs_present) 438 name_prefix = "tco"; 439 else 440 name_prefix = "vso"; 441 break; 442 case TGSI_PROCESSOR_TESS_CTRL: 443 name_prefix = "vso"; 444 break; 445 case TGSI_PROCESSOR_VERTEX: 446 default: 447 name_prefix = "in"; 448 break; 449 } 450 return name_prefix; 451 } 452 453 static const char *get_stage_output_name_prefix(int processor) 454 { 455 const char *name_prefix; 456 switch (processor) { 457 case TGSI_PROCESSOR_FRAGMENT: 458 name_prefix = "fsout"; 459 break; 460 case TGSI_PROCESSOR_GEOMETRY: 461 name_prefix = "gso"; 462 break; 463 case TGSI_PROCESSOR_VERTEX: 464 name_prefix = "vso"; 465 break; 466 case TGSI_PROCESSOR_TESS_CTRL: 467 name_prefix = "tco"; 468 break; 469 case TGSI_PROCESSOR_TESS_EVAL: 470 name_prefix = "teo"; 471 break; 472 default: 473 name_prefix = "out"; 474 break; 475 } 476 return name_prefix; 477 } 478 479 static void require_glsl_ver(struct dump_ctx *ctx, int glsl_ver) 480 { 481 if (glsl_ver > ctx->glsl_ver_required) 482 ctx->glsl_ver_required = glsl_ver; 483 } 484 485 static char *strcat_realloc(char *str, const char *catstr) 486 { 487 char *new = realloc(str, strlen(str) + strlen(catstr) + 1); 488 if (!new) { 489 free(str); 490 return NULL; 491 } 492 strcat(new, catstr); 493 return new; 494 } 495 496 static char *add_str_to_glsl_main(struct dump_ctx *ctx, const char *buf) 497 { 498 ctx->glsl_main = strcat_realloc(ctx->glsl_main, buf); 499 return ctx->glsl_main; 500 } 501 502 static int allocate_temp_range(struct dump_ctx *ctx, int first, int last, 503 int array_id) 504 { 505 int idx = ctx->num_temp_ranges; 506 507 ctx->temp_ranges = realloc(ctx->temp_ranges, sizeof(struct vrend_temp_range) * (idx + 1)); 508 if (!ctx->temp_ranges) 509 return ENOMEM; 510 511 ctx->temp_ranges[idx].first = first; 512 ctx->temp_ranges[idx].last = last; 513 ctx->temp_ranges[idx].array_id = array_id; 514 ctx->num_temp_ranges++; 515 return 0; 516 } 517 518 static struct vrend_temp_range *find_temp_range(struct dump_ctx *ctx, int index) 519 { 520 uint32_t i; 521 for (i = 0; i < ctx->num_temp_ranges; i++) { 522 if (index >= ctx->temp_ranges[i].first && 523 index <= ctx->temp_ranges[i].last) 524 return &ctx->temp_ranges[i]; 525 } 526 return NULL; 527 } 528 529 static int add_images(struct dump_ctx *ctx, int first, int last, 530 struct tgsi_declaration_image *img_decl) 531 { 532 int i; 533 534 for (i = first; i <= last; i++) { 535 ctx->images[i].decl = *img_decl; 536 ctx->images[i].vflag = false; 537 ctx->images_used_mask |= (1 << i); 538 539 if (ctx->images[i].decl.Resource == TGSI_TEXTURE_CUBE_ARRAY) 540 ctx->shader_req_bits |= SHADER_REQ_CUBE_ARRAY; 541 else if (ctx->images[i].decl.Resource == TGSI_TEXTURE_2D_MSAA || 542 ctx->images[i].decl.Resource == TGSI_TEXTURE_2D_ARRAY_MSAA) 543 ctx->shader_req_bits |= SHADER_REQ_SAMPLER_MS; 544 else if (ctx->images[i].decl.Resource == TGSI_TEXTURE_BUFFER) 545 ctx->uses_sampler_buf = true; 546 else if (ctx->images[i].decl.Resource == TGSI_TEXTURE_RECT) 547 ctx->shader_req_bits |= SHADER_REQ_SAMPLER_RECT; 548 } 549 550 if (ctx->info.indirect_files & (1 << TGSI_FILE_IMAGE)) { 551 if (ctx->num_image_arrays) { 552 struct vrend_array *last_array = &ctx->image_arrays[ctx->num_image_arrays - 1]; 553 /* 554 * If this set of images is consecutive to the last array, 555 * and has compatible return and decls, then increase the array size. 556 */ 557 if ((last_array->first + last_array->array_size == first) && 558 !memcmp(&ctx->images[last_array->first].decl, &ctx->images[first].decl, sizeof(ctx->images[first].decl)) && 559 ctx->images[last_array->first].image_return == ctx->images[first].image_return) { 560 last_array->array_size += last - first + 1; 561 return 0; 562 } 563 } 564 565 /* allocate a new image array for this range of images */ 566 ctx->num_image_arrays++; 567 ctx->image_arrays = realloc(ctx->image_arrays, sizeof(struct vrend_array) * ctx->num_image_arrays); 568 if (!ctx->image_arrays) 569 return -1; 570 ctx->image_arrays[ctx->num_image_arrays - 1].first = first; 571 ctx->image_arrays[ctx->num_image_arrays - 1].array_size = last - first + 1; 572 } 573 return 0; 574 } 575 576 static int add_sampler_array(struct dump_ctx *ctx, int first, int last) 577 { 578 int idx = ctx->num_sampler_arrays; 579 ctx->num_sampler_arrays++; 580 ctx->sampler_arrays = realloc(ctx->sampler_arrays, sizeof(struct vrend_array) * ctx->num_sampler_arrays); 581 if (!ctx->sampler_arrays) 582 return -1; 583 584 ctx->sampler_arrays[idx].first = first; 585 ctx->sampler_arrays[idx].array_size = last - first + 1; 586 return 0; 587 } 588 589 static int lookup_sampler_array(struct dump_ctx *ctx, int index) 590 { 591 uint32_t i; 592 for (i = 0; i < ctx->num_sampler_arrays; i++) { 593 int last = ctx->sampler_arrays[i].first + ctx->sampler_arrays[i].array_size - 1; 594 if (index >= ctx->sampler_arrays[i].first && 595 index <= last) { 596 return ctx->sampler_arrays[i].first; 597 } 598 } 599 return -1; 600 } 601 602 int shader_lookup_sampler_array(struct vrend_shader_info *sinfo, int index) 603 { 604 int i; 605 for (i = 0; i < sinfo->num_sampler_arrays; i++) { 606 int last = sinfo->sampler_arrays[i].first + sinfo->sampler_arrays[i].array_size - 1; 607 if (index >= sinfo->sampler_arrays[i].first && 608 index <= last) { 609 return sinfo->sampler_arrays[i].first; 610 } 611 } 612 return -1; 613 } 614 615 static int add_samplers(struct dump_ctx *ctx, int first, int last, int sview_type, enum tgsi_return_type sview_rtype) 616 { 617 if (sview_rtype == TGSI_RETURN_TYPE_SINT || 618 sview_rtype == TGSI_RETURN_TYPE_UINT) 619 ctx->shader_req_bits |= SHADER_REQ_INTS; 620 621 for (int i = first; i <= last; i++) { 622 ctx->samplers[i].tgsi_sampler_return = sview_rtype; 623 ctx->samplers[i].tgsi_sampler_type = sview_type; 624 } 625 626 if (ctx->info.indirect_files & (1 << TGSI_FILE_SAMPLER)) { 627 if (ctx->num_sampler_arrays) { 628 struct vrend_array *last_array = &ctx->sampler_arrays[ctx->num_sampler_arrays - 1]; 629 if ((last_array->first + last_array->array_size == first) && 630 ctx->samplers[last_array->first].tgsi_sampler_type == sview_type && 631 ctx->samplers[last_array->first].tgsi_sampler_return == sview_rtype) { 632 last_array->array_size += last - first + 1; 633 return 0; 634 } 635 } 636 637 /* allocate a new image array for this range of images */ 638 return add_sampler_array(ctx, first, last); 639 } 640 return 0; 641 } 642 643 static bool ctx_indirect_inputs(struct dump_ctx *ctx) 644 { 645 if (ctx->info.indirect_files & (1 << TGSI_FILE_INPUT)) 646 return true; 647 if (ctx->key->num_indirect_generic_inputs || ctx->key->num_indirect_patch_inputs) 648 return true; 649 return false; 650 } 651 652 static bool ctx_indirect_outputs(struct dump_ctx *ctx) 653 { 654 if (ctx->info.indirect_files & (1 << TGSI_FILE_OUTPUT)) 655 return true; 656 if (ctx->key->num_indirect_generic_outputs || ctx->key->num_indirect_patch_outputs) 657 return true; 658 return false; 659 } 660 661 static int lookup_image_array(struct dump_ctx *ctx, int index) 662 { 663 uint32_t i; 664 for (i = 0; i < ctx->num_image_arrays; i++) { 665 if (index >= ctx->image_arrays[i].first && 666 index <= ctx->image_arrays[i].first + ctx->image_arrays[i].array_size - 1) { 667 return ctx->image_arrays[i].first; 668 } 669 } 670 return -1; 671 } 672 673 static boolean 674 iter_declaration(struct tgsi_iterate_context *iter, 675 struct tgsi_full_declaration *decl ) 676 { 677 struct dump_ctx *ctx = (struct dump_ctx *)iter; 678 int i; 679 int color_offset = 0; 680 const char *name_prefix = ""; 681 bool add_two_side = false; 682 bool indirect = false; 683 684 switch (decl->Declaration.File) { 685 case TGSI_FILE_INPUT: 686 i = ctx->num_inputs++; 687 indirect = ctx_indirect_inputs(ctx); 688 if (ctx->num_inputs > ARRAY_SIZE(ctx->inputs)) { 689 fprintf(stderr, "Number of inputs exceeded, max is %lu\n", ARRAY_SIZE(ctx->inputs)); 690 return FALSE; 691 } 692 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { 693 ctx->attrib_input_mask |= (1 << decl->Range.First); 694 } 695 ctx->inputs[i].name = decl->Semantic.Name; 696 ctx->inputs[i].sid = decl->Semantic.Index; 697 ctx->inputs[i].interpolate = decl->Interp.Interpolate; 698 ctx->inputs[i].location = decl->Interp.Location; 699 ctx->inputs[i].first = decl->Range.First; 700 ctx->inputs[i].glsl_predefined_no_emit = false; 701 ctx->inputs[i].glsl_no_index = false; 702 ctx->inputs[i].override_no_wm = false; 703 ctx->inputs[i].glsl_gl_block = false; 704 705 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT && 706 decl->Interp.Location == TGSI_INTERPOLATE_LOC_SAMPLE) { 707 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 708 ctx->has_sample_input = true; 709 } 710 711 switch (ctx->inputs[i].name) { 712 case TGSI_SEMANTIC_COLOR: 713 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 714 if (ctx->glsl_ver_required < 140) { 715 if (decl->Semantic.Index == 0) 716 name_prefix = "gl_Color"; 717 else if (decl->Semantic.Index == 1) 718 name_prefix = "gl_SecondaryColor"; 719 else 720 fprintf(stderr, "got illegal color semantic index %d\n", decl->Semantic.Index); 721 ctx->inputs[i].glsl_no_index = true; 722 } else { 723 if (ctx->key->color_two_side) { 724 int j = ctx->num_inputs++; 725 if (ctx->num_inputs > ARRAY_SIZE(ctx->inputs)) { 726 fprintf(stderr, "Number of inputs exceeded, max is %lu\n", ARRAY_SIZE(ctx->inputs)); 727 return FALSE; 728 } 729 730 ctx->inputs[j].name = TGSI_SEMANTIC_BCOLOR; 731 ctx->inputs[j].sid = decl->Semantic.Index; 732 ctx->inputs[j].interpolate = decl->Interp.Interpolate; 733 ctx->inputs[j].location = decl->Interp.Location; 734 ctx->inputs[j].first = decl->Range.First; 735 ctx->inputs[j].glsl_predefined_no_emit = false; 736 ctx->inputs[j].glsl_no_index = false; 737 ctx->inputs[j].override_no_wm = false; 738 739 ctx->color_in_mask |= (1 << decl->Semantic.Index); 740 741 if (ctx->front_face_emitted == false) { 742 int k = ctx->num_inputs++; 743 if (ctx->num_inputs > ARRAY_SIZE(ctx->inputs)) { 744 fprintf(stderr, "Number of inputs exceeded, max is %lu\n", ARRAY_SIZE(ctx->inputs)); 745 return FALSE; 746 } 747 748 ctx->inputs[k].name = TGSI_SEMANTIC_FACE; 749 ctx->inputs[k].sid = 0; 750 ctx->inputs[k].interpolate = 0; 751 ctx->inputs[k].location = TGSI_INTERPOLATE_LOC_CENTER; 752 ctx->inputs[k].first = 0; 753 ctx->inputs[k].override_no_wm = false; 754 ctx->inputs[k].glsl_predefined_no_emit = true; 755 ctx->inputs[k].glsl_no_index = true; 756 } 757 add_two_side = true; 758 } 759 name_prefix = "ex"; 760 } 761 break; 762 } 763 /* fallthrough */ 764 case TGSI_SEMANTIC_PRIMID: 765 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { 766 name_prefix = "gl_PrimitiveIDIn"; 767 ctx->inputs[i].glsl_predefined_no_emit = true; 768 ctx->inputs[i].glsl_no_index = true; 769 ctx->inputs[i].override_no_wm = true; 770 ctx->shader_req_bits |= SHADER_REQ_INTS; 771 break; 772 } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 773 name_prefix = "gl_PrimitiveID"; 774 ctx->inputs[i].glsl_predefined_no_emit = true; 775 ctx->inputs[i].glsl_no_index = true; 776 require_glsl_ver(ctx, 150); 777 break; 778 } 779 /* fallthrough */ 780 case TGSI_SEMANTIC_VIEWPORT_INDEX: 781 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 782 ctx->inputs[i].glsl_predefined_no_emit = true; 783 ctx->inputs[i].glsl_no_index = true; 784 ctx->inputs[i].is_int = true; 785 ctx->inputs[i].override_no_wm = true; 786 name_prefix = "gl_ViewportIndex"; 787 if (ctx->glsl_ver_required >= 140) 788 ctx->shader_req_bits |= SHADER_REQ_LAYER; 789 break; 790 } 791 /* fallthrough */ 792 case TGSI_SEMANTIC_LAYER: 793 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 794 name_prefix = "gl_Layer"; 795 ctx->inputs[i].glsl_predefined_no_emit = true; 796 ctx->inputs[i].glsl_no_index = true; 797 ctx->inputs[i].is_int = true; 798 ctx->inputs[i].override_no_wm = true; 799 ctx->shader_req_bits |= SHADER_REQ_LAYER; 800 break; 801 } 802 /* fallthrough */ 803 case TGSI_SEMANTIC_PSIZE: 804 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY || 805 iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL || 806 iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) { 807 name_prefix = "gl_PointSize"; 808 ctx->inputs[i].glsl_predefined_no_emit = true; 809 ctx->inputs[i].glsl_no_index = true; 810 ctx->inputs[i].override_no_wm = true; 811 ctx->inputs[i].glsl_gl_block = true; 812 ctx->shader_req_bits |= SHADER_REQ_PSIZE; 813 break; 814 } 815 /* fallthrough */ 816 case TGSI_SEMANTIC_CLIPDIST: 817 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY || 818 iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL || 819 iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) { 820 name_prefix = "gl_ClipDistance"; 821 ctx->inputs[i].glsl_predefined_no_emit = true; 822 ctx->inputs[i].glsl_no_index = true; 823 ctx->inputs[i].glsl_gl_block = true; 824 ctx->num_in_clip_dist += 4; 825 break; 826 } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 827 name_prefix = "gl_ClipDistance"; 828 ctx->inputs[i].glsl_predefined_no_emit = true; 829 ctx->inputs[i].glsl_no_index = true; 830 ctx->num_in_clip_dist += 4; 831 break; 832 } 833 /* fallthrough */ 834 case TGSI_SEMANTIC_POSITION: 835 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY || 836 iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL || 837 iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) { 838 name_prefix = "gl_Position"; 839 ctx->inputs[i].glsl_predefined_no_emit = true; 840 ctx->inputs[i].glsl_no_index = true; 841 ctx->inputs[i].glsl_gl_block = true; 842 break; 843 } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 844 name_prefix = "gl_FragCoord"; 845 ctx->inputs[i].glsl_predefined_no_emit = true; 846 ctx->inputs[i].glsl_no_index = true; 847 break; 848 } 849 /* fallthrough */ 850 case TGSI_SEMANTIC_FACE: 851 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 852 if (ctx->front_face_emitted) { 853 ctx->num_inputs--; 854 return TRUE; 855 } 856 name_prefix = "gl_FrontFacing"; 857 ctx->inputs[i].glsl_predefined_no_emit = true; 858 ctx->inputs[i].glsl_no_index = true; 859 ctx->front_face_emitted = true; 860 break; 861 } 862 /* fallthrough */ 863 case TGSI_SEMANTIC_PATCH: 864 if (indirect && ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) { 865 ctx->inputs[i].glsl_predefined_no_emit = true; 866 if (ctx->inputs[i].sid < ctx->patch_input_range.first || ctx->patch_input_range.used == false) { 867 ctx->patch_input_range.first = ctx->inputs[i].sid; 868 ctx->patch_input_range.array_id = i; 869 ctx->patch_input_range.used = true; 870 } 871 if (ctx->inputs[i].sid > ctx->patch_input_range.last) 872 ctx->patch_input_range.last = ctx->inputs[i].sid; 873 } 874 /* fallthrough */ 875 case TGSI_SEMANTIC_GENERIC: 876 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 877 if (ctx->key->coord_replace & (1 << ctx->inputs[i].sid)) { 878 if (ctx->cfg->use_gles) 879 name_prefix = "vec4(gl_PointCoord.x, mix(1.0 - gl_PointCoord.y, gl_PointCoord.y, clamp(winsys_adjust_y, 0.0, 1.0)), 0.0, 1.0)"; 880 else 881 name_prefix = "vec4(gl_PointCoord, 0.0, 1.0)"; 882 ctx->inputs[i].glsl_predefined_no_emit = true; 883 ctx->inputs[i].glsl_no_index = true; 884 break; 885 } 886 } 887 if (indirect && ctx->inputs[i].name == TGSI_SEMANTIC_GENERIC) { 888 ctx->inputs[i].glsl_predefined_no_emit = true; 889 if (ctx->inputs[i].sid < ctx->generic_input_range.first || ctx->generic_input_range.used == false) { 890 ctx->generic_input_range.first = ctx->inputs[i].sid; 891 ctx->generic_input_range.array_id = i; 892 ctx->generic_input_range.used = true; 893 } 894 if (ctx->inputs[i].sid > ctx->generic_input_range.last) 895 ctx->generic_input_range.last = ctx->inputs[i].sid; 896 } 897 /* fallthrough */ 898 default: 899 name_prefix = get_stage_input_name_prefix(ctx, iter->processor.Processor); 900 break; 901 } 902 903 if (ctx->inputs[i].glsl_no_index) 904 snprintf(ctx->inputs[i].glsl_name, 128, "%s", name_prefix); 905 else { 906 if (ctx->inputs[i].name == TGSI_SEMANTIC_FOG) 907 snprintf(ctx->inputs[i].glsl_name, 64, "%s_f%d", name_prefix, ctx->inputs[i].sid); 908 else if (ctx->inputs[i].name == TGSI_SEMANTIC_COLOR) 909 snprintf(ctx->inputs[i].glsl_name, 64, "%s_c%d", name_prefix, ctx->inputs[i].sid); 910 else if (ctx->inputs[i].name == TGSI_SEMANTIC_GENERIC) 911 snprintf(ctx->inputs[i].glsl_name, 64, "%s_g%d", name_prefix, ctx->inputs[i].sid); 912 else if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) 913 snprintf(ctx->inputs[i].glsl_name, 64, "%s_p%d", name_prefix, ctx->inputs[i].sid); 914 else 915 snprintf(ctx->inputs[i].glsl_name, 64, "%s_%d", name_prefix, ctx->inputs[i].first); 916 } 917 if (add_two_side) { 918 snprintf(ctx->inputs[i + 1].glsl_name, 64, "%s_bc%d", name_prefix, ctx->inputs[i + 1].sid); 919 if (!ctx->front_face_emitted) { 920 snprintf(ctx->inputs[i + 2].glsl_name, 64, "%s", "gl_FrontFacing"); 921 ctx->front_face_emitted = true; 922 } 923 } 924 break; 925 case TGSI_FILE_OUTPUT: 926 i = ctx->num_outputs++; 927 indirect = ctx_indirect_outputs(ctx); 928 if (ctx->num_outputs > ARRAY_SIZE(ctx->outputs)) { 929 fprintf(stderr, "Number of outputs exceeded, max is %lu\n", ARRAY_SIZE(ctx->outputs)); 930 return FALSE; 931 } 932 933 ctx->outputs[i].name = decl->Semantic.Name; 934 ctx->outputs[i].sid = decl->Semantic.Index; 935 ctx->outputs[i].interpolate = decl->Interp.Interpolate; 936 ctx->outputs[i].invariant = decl->Declaration.Invariant; 937 ctx->outputs[i].precise = false; 938 ctx->outputs[i].first = decl->Range.First; 939 ctx->outputs[i].glsl_predefined_no_emit = false; 940 ctx->outputs[i].glsl_no_index = false; 941 ctx->outputs[i].override_no_wm = false; 942 ctx->outputs[i].is_int = false; 943 ctx->outputs[i].fbfetch_used = false; 944 945 switch (ctx->outputs[i].name) { 946 case TGSI_SEMANTIC_POSITION: 947 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX || 948 iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY || 949 iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL || 950 iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) { 951 if (ctx->outputs[i].first > 0) 952 fprintf(stderr,"Illegal position input\n"); 953 name_prefix = "gl_Position"; 954 ctx->outputs[i].glsl_predefined_no_emit = true; 955 ctx->outputs[i].glsl_no_index = true; 956 if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) 957 ctx->outputs[i].glsl_gl_block = true; 958 } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 959 name_prefix = "gl_FragDepth"; 960 ctx->outputs[i].glsl_predefined_no_emit = true; 961 ctx->outputs[i].glsl_no_index = true; 962 ctx->outputs[i].override_no_wm = true; 963 } 964 break; 965 case TGSI_SEMANTIC_STENCIL: 966 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 967 name_prefix = "gl_FragStencilRefARB"; 968 ctx->outputs[i].glsl_predefined_no_emit = true; 969 ctx->outputs[i].glsl_no_index = true; 970 ctx->outputs[i].override_no_wm = true; 971 ctx->outputs[i].is_int = true; 972 ctx->shader_req_bits |= (SHADER_REQ_INTS | SHADER_REQ_STENCIL_EXPORT); 973 } 974 break; 975 case TGSI_SEMANTIC_CLIPDIST: 976 name_prefix = "gl_ClipDistance"; 977 ctx->outputs[i].glsl_predefined_no_emit = true; 978 ctx->outputs[i].glsl_no_index = true; 979 ctx->num_clip_dist += 4; 980 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX && 981 (ctx->key->gs_present || ctx->key->tcs_present)) 982 require_glsl_ver(ctx, 150); 983 if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) 984 ctx->outputs[i].glsl_gl_block = true; 985 break; 986 case TGSI_SEMANTIC_CLIPVERTEX: 987 name_prefix = "gl_ClipVertex"; 988 ctx->outputs[i].glsl_predefined_no_emit = true; 989 ctx->outputs[i].glsl_no_index = true; 990 ctx->outputs[i].override_no_wm = true; 991 if (ctx->glsl_ver_required >= 140) 992 ctx->has_clipvertex = true; 993 break; 994 case TGSI_SEMANTIC_SAMPLEMASK: 995 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 996 ctx->outputs[i].glsl_predefined_no_emit = true; 997 ctx->outputs[i].glsl_no_index = true; 998 ctx->outputs[i].override_no_wm = true; 999 ctx->outputs[i].is_int = true; 1000 ctx->shader_req_bits |= (SHADER_REQ_INTS | SHADER_REQ_SAMPLE_SHADING); 1001 name_prefix = "gl_SampleMask"; 1002 break; 1003 } 1004 break; 1005 case TGSI_SEMANTIC_COLOR: 1006 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { 1007 if (ctx->glsl_ver_required < 140) { 1008 ctx->outputs[i].glsl_no_index = true; 1009 if (ctx->outputs[i].sid == 0) 1010 name_prefix = "gl_FrontColor"; 1011 else if (ctx->outputs[i].sid == 1) 1012 name_prefix = "gl_FrontSecondaryColor"; 1013 } else 1014 name_prefix = "ex"; 1015 break; 1016 } 1017 /* fallthrough */ 1018 case TGSI_SEMANTIC_BCOLOR: 1019 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { 1020 if (ctx->glsl_ver_required < 140) { 1021 ctx->outputs[i].glsl_no_index = true; 1022 if (ctx->outputs[i].sid == 0) 1023 name_prefix = "gl_BackColor"; 1024 else if (ctx->outputs[i].sid == 1) 1025 name_prefix = "gl_BackSecondaryColor"; 1026 break; 1027 } else 1028 name_prefix = "ex"; 1029 break; 1030 } 1031 /* fallthrough */ 1032 case TGSI_SEMANTIC_PSIZE: 1033 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX || 1034 iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY || 1035 iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL || 1036 iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) { 1037 ctx->outputs[i].glsl_predefined_no_emit = true; 1038 ctx->outputs[i].glsl_no_index = true; 1039 ctx->outputs[i].override_no_wm = true; 1040 ctx->shader_req_bits |= SHADER_REQ_PSIZE; 1041 name_prefix = "gl_PointSize"; 1042 if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) 1043 ctx->outputs[i].glsl_gl_block = true; 1044 break; 1045 } 1046 /* fallthrough */ 1047 case TGSI_SEMANTIC_LAYER: 1048 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { 1049 ctx->outputs[i].glsl_predefined_no_emit = true; 1050 ctx->outputs[i].glsl_no_index = true; 1051 ctx->outputs[i].override_no_wm = true; 1052 ctx->outputs[i].is_int = true; 1053 name_prefix = "gl_Layer"; 1054 break; 1055 } 1056 /* fallthrough */ 1057 case TGSI_SEMANTIC_PRIMID: 1058 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { 1059 ctx->outputs[i].glsl_predefined_no_emit = true; 1060 ctx->outputs[i].glsl_no_index = true; 1061 ctx->outputs[i].override_no_wm = true; 1062 ctx->outputs[i].is_int = true; 1063 name_prefix = "gl_PrimitiveID"; 1064 break; 1065 } 1066 /* fallthrough */ 1067 case TGSI_SEMANTIC_VIEWPORT_INDEX: 1068 if (iter->processor.Processor == TGSI_PROCESSOR_GEOMETRY) { 1069 ctx->outputs[i].glsl_predefined_no_emit = true; 1070 ctx->outputs[i].glsl_no_index = true; 1071 ctx->outputs[i].override_no_wm = true; 1072 ctx->outputs[i].is_int = true; 1073 name_prefix = "gl_ViewportIndex"; 1074 if (ctx->glsl_ver_required >= 140) 1075 ctx->shader_req_bits |= SHADER_REQ_VIEWPORT_IDX; 1076 break; 1077 } 1078 /* fallthrough */ 1079 case TGSI_SEMANTIC_TESSOUTER: 1080 if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) { 1081 ctx->outputs[i].glsl_predefined_no_emit = true; 1082 ctx->outputs[i].glsl_no_index = true; 1083 ctx->outputs[i].override_no_wm = true; 1084 name_prefix = "gl_TessLevelOuter"; 1085 break; 1086 } 1087 /* fallthrough */ 1088 case TGSI_SEMANTIC_TESSINNER: 1089 if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) { 1090 ctx->outputs[i].glsl_predefined_no_emit = true; 1091 ctx->outputs[i].glsl_no_index = true; 1092 ctx->outputs[i].override_no_wm = true; 1093 name_prefix = "gl_TessLevelInner"; 1094 break; 1095 } 1096 /* fallthrough */ 1097 case TGSI_SEMANTIC_GENERIC: 1098 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) 1099 if (ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC) 1100 color_offset = -1; 1101 if (indirect && ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC) { 1102 ctx->outputs[i].glsl_predefined_no_emit = true; 1103 require_glsl_ver(ctx, 150); 1104 if (ctx->outputs[i].sid < ctx->generic_output_range.first || ctx->generic_output_range.used == false) { 1105 ctx->generic_output_range.array_id = i; 1106 ctx->generic_output_range.first = ctx->outputs[i].sid; 1107 ctx->generic_output_range.used = true; 1108 } 1109 if (ctx->outputs[i].sid > ctx->generic_output_range.last) 1110 ctx->generic_output_range.last = ctx->outputs[i].sid; 1111 } 1112 /* fallthrough */ 1113 case TGSI_SEMANTIC_PATCH: 1114 if (indirect && ctx->outputs[i].name == TGSI_SEMANTIC_PATCH) { 1115 ctx->outputs[i].glsl_predefined_no_emit = true; 1116 require_glsl_ver(ctx, 150); 1117 if (ctx->outputs[i].sid < ctx->patch_output_range.first || ctx->patch_output_range.used == false) { 1118 ctx->patch_output_range.array_id = i; 1119 ctx->patch_output_range.first = ctx->outputs[i].sid; 1120 ctx->patch_output_range.used = true; 1121 } 1122 if (ctx->outputs[i].sid > ctx->patch_output_range.last) 1123 ctx->patch_output_range.last = ctx->outputs[i].sid; 1124 } 1125 /* fallthrough */ 1126 default: 1127 name_prefix = get_stage_output_name_prefix(iter->processor.Processor); 1128 break; 1129 } 1130 1131 if (ctx->outputs[i].glsl_no_index) 1132 snprintf(ctx->outputs[i].glsl_name, 64, "%s", name_prefix); 1133 else { 1134 if (ctx->outputs[i].name == TGSI_SEMANTIC_FOG) 1135 snprintf(ctx->outputs[i].glsl_name, 64, "%s_f%d", name_prefix, ctx->outputs[i].sid); 1136 else if (ctx->outputs[i].name == TGSI_SEMANTIC_COLOR) 1137 snprintf(ctx->outputs[i].glsl_name, 64, "%s_c%d", name_prefix, ctx->outputs[i].sid); 1138 else if (ctx->outputs[i].name == TGSI_SEMANTIC_BCOLOR) 1139 snprintf(ctx->outputs[i].glsl_name, 64, "%s_bc%d", name_prefix, ctx->outputs[i].sid); 1140 else if (ctx->outputs[i].name == TGSI_SEMANTIC_PATCH) 1141 snprintf(ctx->outputs[i].glsl_name, 64, "%s_p%d", name_prefix, ctx->outputs[i].sid); 1142 else if (ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC) 1143 snprintf(ctx->outputs[i].glsl_name, 64, "%s_g%d", name_prefix, ctx->outputs[i].sid); 1144 else 1145 snprintf(ctx->outputs[i].glsl_name, 64, "%s_%d", name_prefix, ctx->outputs[i].first + color_offset); 1146 1147 } 1148 break; 1149 case TGSI_FILE_TEMPORARY: 1150 if (allocate_temp_range(ctx, decl->Range.First, decl->Range.Last, 1151 decl->Array.ArrayID)) 1152 return FALSE; 1153 break; 1154 case TGSI_FILE_SAMPLER: 1155 ctx->samplers_used |= (1 << decl->Range.Last); 1156 break; 1157 case TGSI_FILE_SAMPLER_VIEW: { 1158 int ret; 1159 if (decl->Range.Last >= ARRAY_SIZE(ctx->samplers)) { 1160 fprintf(stderr, "Sampler view exceeded, max is %lu\n", ARRAY_SIZE(ctx->samplers)); 1161 return FALSE; 1162 } 1163 ret = add_samplers(ctx, decl->Range.First, decl->Range.Last, decl->SamplerView.Resource, decl->SamplerView.ReturnTypeX); 1164 if (ret == -1) 1165 return FALSE; 1166 break; 1167 } 1168 case TGSI_FILE_IMAGE: { 1169 int ret; 1170 ctx->shader_req_bits |= SHADER_REQ_IMAGE_LOAD_STORE; 1171 if (decl->Range.Last >= ARRAY_SIZE(ctx->images)) { 1172 fprintf(stderr, "Image view exceeded, max is %lu\n", ARRAY_SIZE(ctx->images)); 1173 return FALSE; 1174 } 1175 ret = add_images(ctx, decl->Range.First, decl->Range.Last, &decl->Image); 1176 if (ret == -1) 1177 return FALSE; 1178 break; 1179 } 1180 case TGSI_FILE_BUFFER: 1181 if (decl->Range.First >= 32) { 1182 fprintf(stderr, "Buffer view exceeded, max is 32\n"); 1183 return FALSE; 1184 } 1185 ctx->ssbo_used_mask |= (1 << decl->Range.First); 1186 if (decl->Declaration.Atomic) { 1187 if (decl->Range.First < ctx->ssbo_atomic_array_base) 1188 ctx->ssbo_atomic_array_base = decl->Range.First; 1189 ctx->ssbo_atomic_mask |= (1 << decl->Range.First); 1190 } else { 1191 if (decl->Range.First < ctx->ssbo_array_base) 1192 ctx->ssbo_array_base = decl->Range.First; 1193 } 1194 break; 1195 case TGSI_FILE_CONSTANT: 1196 if (decl->Declaration.Dimension && decl->Dim.Index2D != 0) { 1197 if (ctx->num_ubo >= ARRAY_SIZE(ctx->ubo_idx)) { 1198 fprintf(stderr, "Number of uniforms exceeded, max is %lu\n", ARRAY_SIZE(ctx->ubo_idx)); 1199 return FALSE; 1200 } 1201 ctx->ubo_idx[ctx->num_ubo] = decl->Dim.Index2D; 1202 ctx->ubo_sizes[ctx->num_ubo] = decl->Range.Last + 1; 1203 ctx->num_ubo++; 1204 } else { 1205 /* if we have a normal single const set then ubo base should be 1 */ 1206 ctx->ubo_base = 1; 1207 if (decl->Range.Last) { 1208 if (decl->Range.Last + 1 > ctx->num_consts) 1209 ctx->num_consts = decl->Range.Last + 1; 1210 } else 1211 ctx->num_consts++; 1212 } 1213 break; 1214 case TGSI_FILE_ADDRESS: 1215 ctx->num_address = decl->Range.Last + 1; 1216 break; 1217 case TGSI_FILE_SYSTEM_VALUE: 1218 i = ctx->num_system_values++; 1219 if (ctx->num_system_values > ARRAY_SIZE(ctx->system_values)) { 1220 fprintf(stderr, "Number of system values exceeded, max is %lu\n", ARRAY_SIZE(ctx->system_values)); 1221 return FALSE; 1222 } 1223 1224 ctx->system_values[i].name = decl->Semantic.Name; 1225 ctx->system_values[i].sid = decl->Semantic.Index; 1226 ctx->system_values[i].glsl_predefined_no_emit = true; 1227 ctx->system_values[i].glsl_no_index = true; 1228 ctx->system_values[i].override_no_wm = true; 1229 ctx->system_values[i].first = decl->Range.First; 1230 if (decl->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { 1231 name_prefix = "gl_InstanceID"; 1232 ctx->shader_req_bits |= SHADER_REQ_INSTANCE_ID | SHADER_REQ_INTS; 1233 } else if (decl->Semantic.Name == TGSI_SEMANTIC_VERTEXID) { 1234 name_prefix = "gl_VertexID"; 1235 ctx->shader_req_bits |= SHADER_REQ_INTS; 1236 } else if (decl->Semantic.Name == TGSI_SEMANTIC_HELPER_INVOCATION) { 1237 name_prefix = "gl_HelperInvocation"; 1238 ctx->shader_req_bits |= SHADER_REQ_ES31_COMPAT; 1239 } else if (decl->Semantic.Name == TGSI_SEMANTIC_SAMPLEID) { 1240 name_prefix = "gl_SampleID"; 1241 ctx->shader_req_bits |= (SHADER_REQ_SAMPLE_SHADING | SHADER_REQ_INTS); 1242 } else if (decl->Semantic.Name == TGSI_SEMANTIC_SAMPLEPOS) { 1243 name_prefix = "gl_SamplePosition"; 1244 ctx->shader_req_bits |= SHADER_REQ_SAMPLE_SHADING; 1245 } else if (decl->Semantic.Name == TGSI_SEMANTIC_INVOCATIONID) { 1246 name_prefix = "gl_InvocationID"; 1247 ctx->shader_req_bits |= (SHADER_REQ_INTS | SHADER_REQ_GPU_SHADER5); 1248 } else if (decl->Semantic.Name == TGSI_SEMANTIC_SAMPLEMASK) { 1249 name_prefix = "gl_SampleMaskIn[0]"; 1250 ctx->shader_req_bits |= (SHADER_REQ_INTS | SHADER_REQ_GPU_SHADER5); 1251 } else if (decl->Semantic.Name == TGSI_SEMANTIC_PRIMID) { 1252 name_prefix = "gl_PrimitiveID"; 1253 ctx->shader_req_bits |= (SHADER_REQ_INTS | SHADER_REQ_GPU_SHADER5); 1254 } else if (decl->Semantic.Name == TGSI_SEMANTIC_TESSCOORD) { 1255 name_prefix = "gl_TessCoord"; 1256 ctx->system_values[i].override_no_wm = false; 1257 } else if (decl->Semantic.Name == TGSI_SEMANTIC_VERTICESIN) { 1258 ctx->shader_req_bits |= SHADER_REQ_INTS; 1259 name_prefix = "gl_PatchVerticesIn"; 1260 } else if (decl->Semantic.Name == TGSI_SEMANTIC_TESSOUTER) { 1261 name_prefix = "gl_TessLevelOuter"; 1262 } else if (decl->Semantic.Name == TGSI_SEMANTIC_TESSINNER) { 1263 name_prefix = "gl_TessLevelInner"; 1264 } else if (decl->Semantic.Name == TGSI_SEMANTIC_THREAD_ID) { 1265 name_prefix = "gl_LocalInvocationID"; 1266 ctx->system_values[i].override_no_wm = false; 1267 } else if (decl->Semantic.Name == TGSI_SEMANTIC_BLOCK_ID) { 1268 name_prefix = "gl_WorkGroupID"; 1269 ctx->system_values[i].override_no_wm = false; 1270 } else if (decl->Semantic.Name == TGSI_SEMANTIC_GRID_SIZE) { 1271 name_prefix = "gl_NumWorkGroups"; 1272 ctx->system_values[i].override_no_wm = false; 1273 } else { 1274 fprintf(stderr, "unsupported system value %d\n", decl->Semantic.Name); 1275 name_prefix = "unknown"; 1276 } 1277 snprintf(ctx->system_values[i].glsl_name, 64, "%s", name_prefix); 1278 break; 1279 case TGSI_FILE_MEMORY: 1280 break; 1281 default: 1282 fprintf(stderr,"unsupported file %d declaration\n", decl->Declaration.File); 1283 break; 1284 } 1285 1286 return TRUE; 1287 } 1288 1289 static boolean 1290 iter_property(struct tgsi_iterate_context *iter, 1291 struct tgsi_full_property *prop) 1292 { 1293 struct dump_ctx *ctx = (struct dump_ctx *) iter; 1294 1295 if (prop->Property.PropertyName == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { 1296 if (prop->u[0].Data == 1) 1297 ctx->write_all_cbufs = true; 1298 } 1299 1300 if (prop->Property.PropertyName == TGSI_PROPERTY_FS_COORD_ORIGIN) { 1301 ctx->fs_coord_origin = prop->u[0].Data; 1302 } 1303 1304 if (prop->Property.PropertyName == TGSI_PROPERTY_FS_COORD_PIXEL_CENTER) { 1305 ctx->fs_pixel_center = prop->u[0].Data; 1306 } 1307 1308 if (prop->Property.PropertyName == TGSI_PROPERTY_GS_INPUT_PRIM) { 1309 ctx->gs_in_prim = prop->u[0].Data; 1310 } 1311 1312 if (prop->Property.PropertyName == TGSI_PROPERTY_GS_OUTPUT_PRIM) { 1313 ctx->gs_out_prim = prop->u[0].Data; 1314 } 1315 1316 if (prop->Property.PropertyName == TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES) { 1317 ctx->gs_max_out_verts = prop->u[0].Data; 1318 } 1319 1320 if (prop->Property.PropertyName == TGSI_PROPERTY_GS_INVOCATIONS) { 1321 ctx->gs_num_invocations = prop->u[0].Data; 1322 } 1323 1324 if (prop->Property.PropertyName == TGSI_PROPERTY_NUM_CLIPDIST_ENABLED) { 1325 ctx->num_clip_dist_prop = prop->u[0].Data; 1326 } 1327 1328 if (prop->Property.PropertyName == TGSI_PROPERTY_NUM_CULLDIST_ENABLED) { 1329 ctx->num_cull_dist_prop = prop->u[0].Data; 1330 } 1331 1332 if (prop->Property.PropertyName == TGSI_PROPERTY_TCS_VERTICES_OUT) { 1333 ctx->tcs_vertices_out = prop->u[0].Data; 1334 } 1335 1336 if (prop->Property.PropertyName == TGSI_PROPERTY_TES_PRIM_MODE) { 1337 ctx->tes_prim_mode = prop->u[0].Data; 1338 } 1339 1340 if (prop->Property.PropertyName == TGSI_PROPERTY_TES_SPACING) { 1341 ctx->tes_spacing = prop->u[0].Data; 1342 } 1343 1344 if (prop->Property.PropertyName == TGSI_PROPERTY_TES_VERTEX_ORDER_CW) { 1345 ctx->tes_vertex_order = prop->u[0].Data; 1346 } 1347 1348 if (prop->Property.PropertyName == TGSI_PROPERTY_TES_POINT_MODE) { 1349 ctx->tes_point_mode = prop->u[0].Data; 1350 } 1351 1352 if (prop->Property.PropertyName == TGSI_PROPERTY_FS_EARLY_DEPTH_STENCIL) { 1353 ctx->early_depth_stencil = prop->u[0].Data > 0; 1354 if (ctx->early_depth_stencil) { 1355 require_glsl_ver(ctx, 150); 1356 ctx->shader_req_bits |= SHADER_REQ_IMAGE_LOAD_STORE; 1357 } 1358 } 1359 1360 if (prop->Property.PropertyName == TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH) 1361 ctx->local_cs_block_size[0] = prop->u[0].Data; 1362 if (prop->Property.PropertyName == TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT) 1363 ctx->local_cs_block_size[1] = prop->u[0].Data; 1364 if (prop->Property.PropertyName == TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH) 1365 ctx->local_cs_block_size[2] = prop->u[0].Data; 1366 return TRUE; 1367 } 1368 1369 static boolean 1370 iter_immediate( 1371 struct tgsi_iterate_context *iter, 1372 struct tgsi_full_immediate *imm ) 1373 { 1374 struct dump_ctx *ctx = (struct dump_ctx *) iter; 1375 int i; 1376 uint32_t first = ctx->num_imm; 1377 1378 if (first >= ARRAY_SIZE(ctx->imm)) { 1379 fprintf(stderr, "Number of immediates exceeded, max is: %lu\n", ARRAY_SIZE(ctx->imm)); 1380 return FALSE; 1381 } 1382 1383 ctx->imm[first].type = imm->Immediate.DataType; 1384 for (i = 0; i < 4; i++) { 1385 if (imm->Immediate.DataType == TGSI_IMM_FLOAT32) { 1386 ctx->imm[first].val[i].f = imm->u[i].Float; 1387 } else if (imm->Immediate.DataType == TGSI_IMM_UINT32 || 1388 imm->Immediate.DataType == TGSI_IMM_FLOAT64) { 1389 ctx->shader_req_bits |= SHADER_REQ_INTS; 1390 ctx->imm[first].val[i].ui = imm->u[i].Uint; 1391 } else if (imm->Immediate.DataType == TGSI_IMM_INT32) { 1392 ctx->shader_req_bits |= SHADER_REQ_INTS; 1393 ctx->imm[first].val[i].i = imm->u[i].Int; 1394 } 1395 } 1396 ctx->num_imm++; 1397 return TRUE; 1398 } 1399 1400 static char get_swiz_char(int swiz) 1401 { 1402 switch(swiz){ 1403 case TGSI_SWIZZLE_X: return 'x'; 1404 case TGSI_SWIZZLE_Y: return 'y'; 1405 case TGSI_SWIZZLE_Z: return 'z'; 1406 case TGSI_SWIZZLE_W: return 'w'; 1407 default: return 0; 1408 } 1409 } 1410 1411 static int emit_cbuf_writes(struct dump_ctx *ctx) 1412 { 1413 char buf[255]; 1414 int i; 1415 char *sret; 1416 1417 for (i = ctx->num_outputs; i < ctx->cfg->max_draw_buffers; i++) { 1418 snprintf(buf, 255, "fsout_c%d = fsout_c0;\n", i); 1419 sret = add_str_to_glsl_main(ctx, buf); 1420 if (!sret) 1421 return ENOMEM; 1422 } 1423 return 0; 1424 } 1425 1426 static int emit_a8_swizzle(struct dump_ctx *ctx) 1427 { 1428 char buf[255]; 1429 char *sret; 1430 snprintf(buf, 255, "fsout_c0.x = fsout_c0.w;\n"); 1431 sret = add_str_to_glsl_main(ctx, buf); 1432 if (!sret) 1433 return ENOMEM; 1434 return 0; 1435 } 1436 1437 static const char *atests[PIPE_FUNC_ALWAYS + 1] = { 1438 "false", 1439 "<", 1440 "==", 1441 "<=", 1442 ">", 1443 "!=", 1444 ">=", 1445 "true" 1446 }; 1447 1448 static int emit_alpha_test(struct dump_ctx *ctx) 1449 { 1450 char buf[255]; 1451 char comp_buf[128]; 1452 char *sret; 1453 1454 if (!ctx->num_outputs) 1455 return 0; 1456 1457 if (!ctx->write_all_cbufs) { 1458 /* only emit alpha stanza if first output is 0 */ 1459 if (ctx->outputs[0].sid != 0) 1460 return 0; 1461 } 1462 switch (ctx->key->alpha_test) { 1463 case PIPE_FUNC_NEVER: 1464 case PIPE_FUNC_ALWAYS: 1465 snprintf(comp_buf, 128, "%s", atests[ctx->key->alpha_test]); 1466 break; 1467 case PIPE_FUNC_LESS: 1468 case PIPE_FUNC_EQUAL: 1469 case PIPE_FUNC_LEQUAL: 1470 case PIPE_FUNC_GREATER: 1471 case PIPE_FUNC_NOTEQUAL: 1472 case PIPE_FUNC_GEQUAL: 1473 snprintf(comp_buf, 128, "%s %s %f", "fsout_c0.w", atests[ctx->key->alpha_test], ctx->key->alpha_ref_val); 1474 break; 1475 default: 1476 fprintf(stderr, "invalid alpha-test: %x\n", ctx->key->alpha_test); 1477 return EINVAL; 1478 } 1479 1480 snprintf(buf, 255, "if (!(%s)) {\n\tdiscard;\n}\n", comp_buf); 1481 sret = add_str_to_glsl_main(ctx, buf); 1482 if (!sret) 1483 return ENOMEM; 1484 return 0; 1485 } 1486 1487 static int emit_pstipple_pass(struct dump_ctx *ctx) 1488 { 1489 char buf[255]; 1490 char *sret; 1491 snprintf(buf, 255, "stip_temp = texture(pstipple_sampler, vec2(gl_FragCoord.x / 32, gl_FragCoord.y / 32)).x;\n"); 1492 sret = add_str_to_glsl_main(ctx, buf); 1493 if (!sret) 1494 return ENOMEM; 1495 snprintf(buf, 255, "if (stip_temp > 0) {\n\tdiscard;\n}\n"); 1496 sret = add_str_to_glsl_main(ctx, buf); 1497 return sret ? 0 : ENOMEM; 1498 } 1499 1500 static int emit_color_select(struct dump_ctx *ctx) 1501 { 1502 char buf[255]; 1503 char *sret = NULL; 1504 1505 if (!ctx->key->color_two_side || !(ctx->color_in_mask & 0x3)) 1506 return 0; 1507 1508 if (ctx->color_in_mask & 1) { 1509 snprintf(buf, 255, "realcolor0 = gl_FrontFacing ? ex_c0 : ex_bc0;\n"); 1510 sret = add_str_to_glsl_main(ctx, buf); 1511 } 1512 if (ctx->color_in_mask & 2) { 1513 snprintf(buf, 255, "realcolor1 = gl_FrontFacing ? ex_c1 : ex_bc1;\n"); 1514 sret = add_str_to_glsl_main(ctx, buf); 1515 } 1516 return sret ? 0 : ENOMEM; 1517 } 1518 1519 static int emit_prescale(struct dump_ctx *ctx) 1520 { 1521 char buf[255]; 1522 char *sret; 1523 1524 snprintf(buf, 255, "gl_Position.y = gl_Position.y * winsys_adjust_y;\n"); 1525 sret = add_str_to_glsl_main(ctx, buf); 1526 if (!sret) 1527 return ENOMEM; 1528 return 0; 1529 } 1530 1531 static int prepare_so_movs(struct dump_ctx *ctx) 1532 { 1533 uint32_t i; 1534 for (i = 0; i < ctx->so->num_outputs; i++) { 1535 ctx->write_so_outputs[i] = true; 1536 if (ctx->so->output[i].start_component != 0) 1537 continue; 1538 if (ctx->so->output[i].num_components != 4) 1539 continue; 1540 if (ctx->outputs[ctx->so->output[i].register_index].name == TGSI_SEMANTIC_CLIPDIST) 1541 continue; 1542 if (ctx->outputs[ctx->so->output[i].register_index].name == TGSI_SEMANTIC_POSITION) 1543 continue; 1544 1545 ctx->outputs[ctx->so->output[i].register_index].stream = ctx->so->output[i].stream; 1546 if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY && ctx->so->output[i].stream) 1547 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 1548 1549 ctx->write_so_outputs[i] = false; 1550 } 1551 return 0; 1552 } 1553 1554 static int emit_so_movs(struct dump_ctx *ctx) 1555 { 1556 char buf[255]; 1557 uint32_t i, j; 1558 char outtype[15] = {0}; 1559 char writemask[6]; 1560 char *sret; 1561 1562 if (ctx->so->num_outputs >= PIPE_MAX_SO_OUTPUTS) { 1563 fprintf(stderr, "Num outputs exceeded, max is %u\n", PIPE_MAX_SO_OUTPUTS); 1564 return EINVAL; 1565 } 1566 1567 for (i = 0; i < ctx->so->num_outputs; i++) { 1568 if (ctx->so->output[i].start_component != 0) { 1569 int wm_idx = 0; 1570 writemask[wm_idx++] = '.'; 1571 for (j = 0; j < ctx->so->output[i].num_components; j++) { 1572 unsigned idx = ctx->so->output[i].start_component + j; 1573 if (idx >= 4) 1574 break; 1575 if (idx <= 2) 1576 writemask[wm_idx++] = 'x' + idx; 1577 else 1578 writemask[wm_idx++] = 'w'; 1579 } 1580 writemask[wm_idx] = '\0'; 1581 } else 1582 writemask[0] = 0; 1583 1584 if (!ctx->write_so_outputs[i]) { 1585 if (ctx->so->output[i].register_index > ctx->num_outputs) 1586 ctx->so_names[i] = NULL; 1587 else if (ctx->outputs[ctx->so->output[i].register_index].name == TGSI_SEMANTIC_CLIPVERTEX && ctx->has_clipvertex) { 1588 ctx->so_names[i] = strdup("clipv_tmp"); 1589 ctx->has_clipvertex_so = true; 1590 } else 1591 ctx->so_names[i] = strdup(ctx->outputs[ctx->so->output[i].register_index].glsl_name); 1592 } else { 1593 char ntemp[8]; 1594 snprintf(ntemp, 8, "tfout%d", i); 1595 ctx->so_names[i] = strdup(ntemp); 1596 } 1597 if (ctx->so->output[i].num_components == 1) { 1598 if (ctx->outputs[ctx->so->output[i].register_index].is_int) 1599 snprintf(outtype, 15, "intBitsToFloat"); 1600 else 1601 snprintf(outtype, 15, "float"); 1602 } else 1603 snprintf(outtype, 15, "vec%d", ctx->so->output[i].num_components); 1604 1605 if (ctx->so->output[i].register_index >= 255) 1606 continue; 1607 1608 buf[0] = 0; 1609 if (ctx->outputs[ctx->so->output[i].register_index].name == TGSI_SEMANTIC_CLIPDIST) { 1610 snprintf(buf, 255, "tfout%d = %s(clip_dist_temp[%d]%s);\n", i, outtype, ctx->outputs[ctx->so->output[i].register_index].sid, 1611 writemask); 1612 } else { 1613 if (ctx->write_so_outputs[i]) 1614 snprintf(buf, 255, "tfout%d = %s(%s%s);\n", i, outtype, ctx->outputs[ctx->so->output[i].register_index].glsl_name, writemask); 1615 } 1616 sret = add_str_to_glsl_main(ctx, buf); 1617 if (!sret) 1618 return ENOMEM; 1619 } 1620 return 0; 1621 } 1622 1623 static int emit_clip_dist_movs(struct dump_ctx *ctx) 1624 { 1625 char buf[255]; 1626 int i; 1627 char *sret; 1628 bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0; 1629 int ndists; 1630 const char *prefix=""; 1631 1632 if (ctx->prog_type == PIPE_SHADER_TESS_CTRL) 1633 prefix = "gl_out[gl_InvocationID]."; 1634 if (ctx->num_clip_dist == 0 && ctx->key->clip_plane_enable) { 1635 for (i = 0; i < 8; i++) { 1636 snprintf(buf, 255, "%sgl_ClipDistance[%d] = dot(%s, clipp[%d]);\n", prefix, i, ctx->has_clipvertex ? "clipv_tmp" : "gl_Position", i); 1637 sret = add_str_to_glsl_main(ctx, buf); 1638 if (!sret) 1639 return ENOMEM; 1640 } 1641 return 0; 1642 } 1643 ndists = ctx->num_clip_dist; 1644 if (has_prop) 1645 ndists = ctx->num_clip_dist_prop + ctx->num_cull_dist_prop; 1646 for (i = 0; i < ndists; i++) { 1647 int clipidx = i < 4 ? 0 : 1; 1648 char swiz = i & 3; 1649 char wm = 0; 1650 switch (swiz) { 1651 case 0: wm = 'x'; break; 1652 case 1: wm = 'y'; break; 1653 case 2: wm = 'z'; break; 1654 case 3: wm = 'w'; break; 1655 default: 1656 return EINVAL; 1657 } 1658 bool is_cull = false; 1659 if (has_prop) { 1660 if (i >= ctx->num_clip_dist_prop && i < ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) 1661 is_cull = true; 1662 } 1663 const char *clip_cull = is_cull ? "Cull" : "Clip"; 1664 snprintf(buf, 255, "%sgl_%sDistance[%d] = clip_dist_temp[%d].%c;\n", prefix, clip_cull, 1665 is_cull ? i - ctx->num_clip_dist_prop : i, clipidx, wm); 1666 sret = add_str_to_glsl_main(ctx, buf); 1667 if (!sret) 1668 return ENOMEM; 1669 } 1670 return 0; 1671 } 1672 1673 #define emit_arit_op2(op) snprintf(buf, 255, "%s = %s(%s((%s %s %s))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], op, srcs[1], writemask) 1674 #define emit_op1(op) snprintf(buf, 255, "%s = %s(%s(%s(%s))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), op, srcs[0], writemask) 1675 #define emit_compare(op) snprintf(buf, 255, "%s = %s(%s((%s(%s(%s), %s(%s))))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), op, get_string(sinfo.svec4), srcs[0], get_string(sinfo.svec4), srcs[1], writemask) 1676 1677 #define emit_ucompare(op) snprintf(buf, 255, "%s = %s(uintBitsToFloat(%s(%s(%s(%s), %s(%s))%s) * %s(0xffffffff)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.udstconv), op, get_string(sinfo.svec4), srcs[0], get_string(sinfo.svec4), srcs[1], writemask, get_string(dinfo.udstconv)) 1678 1679 static int emit_buf(struct dump_ctx *ctx, const char *buf) 1680 { 1681 int i; 1682 char *sret; 1683 for (i = 0; i < ctx->indent_level; i++) { 1684 sret = add_str_to_glsl_main(ctx, "\t"); 1685 if (!sret) 1686 return ENOMEM; 1687 } 1688 1689 sret = add_str_to_glsl_main(ctx, buf); 1690 return sret ? 0 : ENOMEM; 1691 } 1692 1693 #define EMIT_BUF_WITH_RET(ctx, buf) do { \ 1694 int _ret = emit_buf((ctx), (buf)); \ 1695 if (_ret) return FALSE; \ 1696 } while(0) 1697 1698 static int handle_vertex_proc_exit(struct dump_ctx *ctx) 1699 { 1700 if (ctx->so && !ctx->key->gs_present && !ctx->key->tes_present) { 1701 if (emit_so_movs(ctx)) 1702 return FALSE; 1703 } 1704 1705 if (emit_clip_dist_movs(ctx)) 1706 return FALSE; 1707 1708 if (!ctx->key->gs_present && !ctx->key->tes_present) { 1709 if (emit_prescale(ctx)) 1710 return FALSE; 1711 } 1712 1713 return TRUE; 1714 } 1715 1716 static int handle_fragment_proc_exit(struct dump_ctx *ctx) 1717 { 1718 if (ctx->key->pstipple_tex) { 1719 if (emit_pstipple_pass(ctx)) 1720 return FALSE; 1721 } 1722 1723 if (ctx->key->cbufs_are_a8_bitmask) { 1724 if (emit_a8_swizzle(ctx)) 1725 return FALSE; 1726 } 1727 1728 if (ctx->key->add_alpha_test) { 1729 if (emit_alpha_test(ctx)) 1730 return FALSE; 1731 } 1732 1733 if (ctx->write_all_cbufs) { 1734 if (emit_cbuf_writes(ctx)) 1735 return FALSE; 1736 } 1737 1738 return TRUE; 1739 } 1740 1741 static bool set_texture_reqs(struct dump_ctx *ctx, 1742 struct tgsi_full_instruction *inst, 1743 uint32_t sreg_index, 1744 bool *is_shad) 1745 { 1746 if (sreg_index >= ARRAY_SIZE(ctx->samplers)) { 1747 fprintf(stderr, "Sampler view exceeded, max is %lu\n", ARRAY_SIZE(ctx->samplers)); 1748 return false; 1749 } 1750 ctx->samplers[sreg_index].tgsi_sampler_type = inst->Texture.Texture; 1751 1752 switch (inst->Texture.Texture) { 1753 case TGSI_TEXTURE_1D: 1754 case TGSI_TEXTURE_2D: 1755 case TGSI_TEXTURE_3D: 1756 case TGSI_TEXTURE_CUBE: 1757 case TGSI_TEXTURE_1D_ARRAY: 1758 case TGSI_TEXTURE_2D_ARRAY: 1759 break; 1760 case TGSI_TEXTURE_SHADOWCUBE_ARRAY: 1761 *is_shad = true; 1762 /* fallthrough */ 1763 case TGSI_TEXTURE_CUBE_ARRAY: 1764 ctx->shader_req_bits |= SHADER_REQ_CUBE_ARRAY; 1765 break; 1766 case TGSI_TEXTURE_2D_MSAA: 1767 case TGSI_TEXTURE_2D_ARRAY_MSAA: 1768 ctx->shader_req_bits |= SHADER_REQ_SAMPLER_MS; 1769 break; 1770 case TGSI_TEXTURE_BUFFER: 1771 ctx->uses_sampler_buf = true; 1772 break; 1773 case TGSI_TEXTURE_SHADOWRECT: 1774 *is_shad = true; 1775 /* fallthrough */ 1776 case TGSI_TEXTURE_RECT: 1777 ctx->shader_req_bits |= SHADER_REQ_SAMPLER_RECT; 1778 break; 1779 case TGSI_TEXTURE_SHADOW1D: 1780 case TGSI_TEXTURE_SHADOW2D: 1781 case TGSI_TEXTURE_SHADOWCUBE: 1782 case TGSI_TEXTURE_SHADOW1D_ARRAY: 1783 case TGSI_TEXTURE_SHADOW2D_ARRAY: 1784 *is_shad = true; 1785 break; 1786 default: 1787 fprintf(stderr, "unhandled texture: %x\n", inst->Texture.Texture); 1788 return false; 1789 } 1790 1791 if (ctx->cfg->glsl_version >= 140) 1792 if ((ctx->shader_req_bits & SHADER_REQ_SAMPLER_RECT) || ctx->uses_sampler_buf) 1793 require_glsl_ver(ctx, 140); 1794 1795 return true; 1796 } 1797 1798 /* size queries are pretty much separate */ 1799 static int emit_txq(struct dump_ctx *ctx, 1800 struct tgsi_full_instruction *inst, 1801 uint32_t sreg_index, 1802 char srcs[4][255], 1803 char dsts[3][255], 1804 const char *writemask) 1805 { 1806 unsigned twm = TGSI_WRITEMASK_NONE; 1807 char bias[128] = {0}; 1808 char buf[512]; 1809 const int sampler_index = 1; 1810 bool is_shad; 1811 enum vrend_type_qualifier dtypeprefix = INT_BITS_TO_FLOAT; 1812 1813 if (set_texture_reqs(ctx, inst, sreg_index, &is_shad) == false) 1814 return FALSE; 1815 1816 /* no lod parameter for txq for these */ 1817 if (inst->Texture.Texture != TGSI_TEXTURE_RECT && 1818 inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT && 1819 inst->Texture.Texture != TGSI_TEXTURE_BUFFER && 1820 inst->Texture.Texture != TGSI_TEXTURE_2D_MSAA && 1821 inst->Texture.Texture != TGSI_TEXTURE_2D_ARRAY_MSAA) 1822 snprintf(bias, 128, ", int(%s.w)", srcs[0]); 1823 1824 /* need to emit a textureQueryLevels */ 1825 if (inst->Dst[0].Register.WriteMask & 0x8) { 1826 1827 if (inst->Texture.Texture != TGSI_TEXTURE_BUFFER && 1828 inst->Texture.Texture != TGSI_TEXTURE_RECT && 1829 inst->Texture.Texture != TGSI_TEXTURE_2D_MSAA && 1830 inst->Texture.Texture != TGSI_TEXTURE_2D_ARRAY_MSAA) { 1831 ctx->shader_req_bits |= SHADER_REQ_TXQ_LEVELS; 1832 if (inst->Dst[0].Register.WriteMask & 0x7) 1833 twm = TGSI_WRITEMASK_W; 1834 snprintf(buf, 255, "%s%s = %s(textureQueryLevels(%s));\n", dsts[0], get_wm_string(twm), get_string(dtypeprefix), srcs[sampler_index]); 1835 EMIT_BUF_WITH_RET(ctx, buf); 1836 } 1837 1838 if (inst->Dst[0].Register.WriteMask & 0x7) { 1839 switch (inst->Texture.Texture) { 1840 case TGSI_TEXTURE_1D: 1841 case TGSI_TEXTURE_BUFFER: 1842 case TGSI_TEXTURE_SHADOW1D: 1843 twm = TGSI_WRITEMASK_X; 1844 break; 1845 case TGSI_TEXTURE_1D_ARRAY: 1846 case TGSI_TEXTURE_SHADOW1D_ARRAY: 1847 case TGSI_TEXTURE_2D: 1848 case TGSI_TEXTURE_SHADOW2D: 1849 case TGSI_TEXTURE_RECT: 1850 case TGSI_TEXTURE_SHADOWRECT: 1851 case TGSI_TEXTURE_CUBE: 1852 case TGSI_TEXTURE_SHADOWCUBE: 1853 case TGSI_TEXTURE_2D_MSAA: 1854 twm = TGSI_WRITEMASK_XY; 1855 break; 1856 case TGSI_TEXTURE_3D: 1857 case TGSI_TEXTURE_2D_ARRAY: 1858 case TGSI_TEXTURE_SHADOW2D_ARRAY: 1859 case TGSI_TEXTURE_SHADOWCUBE_ARRAY: 1860 case TGSI_TEXTURE_CUBE_ARRAY: 1861 case TGSI_TEXTURE_2D_ARRAY_MSAA: 1862 twm = TGSI_WRITEMASK_XYZ; 1863 break; 1864 } 1865 } 1866 } 1867 1868 if (inst->Dst[0].Register.WriteMask & 0x7) { 1869 snprintf(buf, 255, "%s%s = %s(textureSize(%s%s))%s;\n", dsts[0], get_wm_string(twm), get_string(dtypeprefix), srcs[sampler_index], bias, util_bitcount(inst->Dst[0].Register.WriteMask) > 1 ? writemask : ""); 1870 EMIT_BUF_WITH_RET(ctx, buf); 1871 } 1872 return 0; 1873 } 1874 1875 /* sample queries are pretty much separate */ 1876 static int emit_txqs(struct dump_ctx *ctx, 1877 struct tgsi_full_instruction *inst, 1878 uint32_t sreg_index, 1879 char srcs[4][255], 1880 char dsts[3][255]) 1881 { 1882 char buf[512]; 1883 const int sampler_index = 0; 1884 bool is_shad; 1885 enum vrend_type_qualifier dtypeprefix = INT_BITS_TO_FLOAT; 1886 1887 ctx->shader_req_bits |= SHADER_REQ_TXQS; 1888 if (set_texture_reqs(ctx, inst, sreg_index, &is_shad) == false) 1889 return FALSE; 1890 1891 if (inst->Texture.Texture != TGSI_TEXTURE_2D_MSAA && 1892 inst->Texture.Texture != TGSI_TEXTURE_2D_ARRAY_MSAA) 1893 return FALSE; 1894 1895 snprintf(buf, 255, "%s = %s(textureSamples(%s));\n", dsts[0], 1896 get_string(dtypeprefix), srcs[sampler_index]); 1897 EMIT_BUF_WITH_RET(ctx, buf); 1898 return 0; 1899 } 1900 1901 static const char *get_tex_inst_ext(struct tgsi_full_instruction *inst) 1902 { 1903 const char *tex_ext = ""; 1904 if (inst->Instruction.Opcode == TGSI_OPCODE_LODQ) { 1905 tex_ext = "QueryLOD"; 1906 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) { 1907 if (inst->Texture.Texture == TGSI_TEXTURE_CUBE || 1908 inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 1909 inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) 1910 tex_ext = ""; 1911 else if (inst->Texture.NumOffsets == 1) 1912 tex_ext = "ProjOffset"; 1913 else 1914 tex_ext = "Proj"; 1915 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXL || 1916 inst->Instruction.Opcode == TGSI_OPCODE_TXL2) { 1917 if (inst->Texture.NumOffsets == 1) 1918 tex_ext = "LodOffset"; 1919 else 1920 tex_ext = "Lod"; 1921 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 1922 if (inst->Texture.NumOffsets == 1) 1923 tex_ext = "GradOffset"; 1924 else 1925 tex_ext = "Grad"; 1926 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) { 1927 if (inst->Texture.NumOffsets == 4) 1928 tex_ext = "GatherOffsets"; 1929 else if (inst->Texture.NumOffsets == 1) 1930 tex_ext = "GatherOffset"; 1931 else 1932 tex_ext = "Gather"; 1933 } else { 1934 if (inst->Texture.NumOffsets == 1) 1935 tex_ext = "Offset"; 1936 else 1937 tex_ext = ""; 1938 } 1939 return tex_ext; 1940 } 1941 1942 static bool fill_offset_buffer(struct dump_ctx *ctx, 1943 struct tgsi_full_instruction *inst, 1944 char *offbuf) 1945 { 1946 if (inst->TexOffsets[0].File == TGSI_FILE_IMMEDIATE) { 1947 struct immed *imd = &ctx->imm[inst->TexOffsets[0].Index]; 1948 switch (inst->Texture.Texture) { 1949 case TGSI_TEXTURE_1D: 1950 case TGSI_TEXTURE_1D_ARRAY: 1951 case TGSI_TEXTURE_SHADOW1D: 1952 case TGSI_TEXTURE_SHADOW1D_ARRAY: 1953 snprintf(offbuf, 25, ", int(%d)", imd->val[inst->TexOffsets[0].SwizzleX].i); 1954 break; 1955 case TGSI_TEXTURE_RECT: 1956 case TGSI_TEXTURE_SHADOWRECT: 1957 case TGSI_TEXTURE_2D: 1958 case TGSI_TEXTURE_2D_ARRAY: 1959 case TGSI_TEXTURE_SHADOW2D: 1960 case TGSI_TEXTURE_SHADOW2D_ARRAY: 1961 snprintf(offbuf, 25, ", ivec2(%d, %d)", imd->val[inst->TexOffsets[0].SwizzleX].i, imd->val[inst->TexOffsets[0].SwizzleY].i); 1962 break; 1963 case TGSI_TEXTURE_3D: 1964 snprintf(offbuf, 25, ", ivec3(%d, %d, %d)", imd->val[inst->TexOffsets[0].SwizzleX].i, imd->val[inst->TexOffsets[0].SwizzleY].i, 1965 imd->val[inst->TexOffsets[0].SwizzleZ].i); 1966 break; 1967 default: 1968 fprintf(stderr, "unhandled texture: %x\n", inst->Texture.Texture); 1969 return false; 1970 } 1971 } else if (inst->TexOffsets[0].File == TGSI_FILE_TEMPORARY) { 1972 struct vrend_temp_range *range = find_temp_range(ctx, inst->TexOffsets[0].Index); 1973 int idx = inst->TexOffsets[0].Index - range->first; 1974 switch (inst->Texture.Texture) { 1975 case TGSI_TEXTURE_1D: 1976 case TGSI_TEXTURE_1D_ARRAY: 1977 case TGSI_TEXTURE_SHADOW1D: 1978 case TGSI_TEXTURE_SHADOW1D_ARRAY: 1979 snprintf(offbuf, 120, ", int(floatBitsToInt(temp%d[%d].%c))", 1980 range->first, idx, 1981 get_swiz_char(inst->TexOffsets[0].SwizzleX)); 1982 break; 1983 case TGSI_TEXTURE_RECT: 1984 case TGSI_TEXTURE_SHADOWRECT: 1985 case TGSI_TEXTURE_2D: 1986 case TGSI_TEXTURE_2D_ARRAY: 1987 case TGSI_TEXTURE_SHADOW2D: 1988 case TGSI_TEXTURE_SHADOW2D_ARRAY: 1989 snprintf(offbuf, 120, ", ivec2(floatBitsToInt(temp%d[%d].%c), floatBitsToInt(temp%d[%d].%c))", 1990 range->first, idx, 1991 get_swiz_char(inst->TexOffsets[0].SwizzleX), 1992 range->first, idx, 1993 get_swiz_char(inst->TexOffsets[0].SwizzleY)); 1994 break; 1995 case TGSI_TEXTURE_3D: 1996 snprintf(offbuf, 120, ", ivec3(floatBitsToInt(temp%d[%d].%c), floatBitsToInt(temp%d[%d].%c), floatBitsToInt(temp%d[%d].%c)", 1997 range->first, idx, 1998 get_swiz_char(inst->TexOffsets[0].SwizzleX), 1999 range->first, idx, 2000 get_swiz_char(inst->TexOffsets[0].SwizzleY), 2001 range->first, idx, 2002 get_swiz_char(inst->TexOffsets[0].SwizzleZ)); 2003 break; 2004 default: 2005 fprintf(stderr, "unhandled texture: %x\n", inst->Texture.Texture); 2006 return false; 2007 break; 2008 } 2009 } else if (inst->TexOffsets[0].File == TGSI_FILE_INPUT) { 2010 for (uint32_t j = 0; j < ctx->num_inputs; j++) { 2011 if (ctx->inputs[j].first != inst->TexOffsets[0].Index) 2012 continue; 2013 switch (inst->Texture.Texture) { 2014 case TGSI_TEXTURE_1D: 2015 case TGSI_TEXTURE_1D_ARRAY: 2016 case TGSI_TEXTURE_SHADOW1D: 2017 case TGSI_TEXTURE_SHADOW1D_ARRAY: 2018 snprintf(offbuf, 120, ", int(floatBitsToInt(%s.%c))", 2019 ctx->inputs[j].glsl_name, 2020 get_swiz_char(inst->TexOffsets[0].SwizzleX)); 2021 break; 2022 case TGSI_TEXTURE_RECT: 2023 case TGSI_TEXTURE_SHADOWRECT: 2024 case TGSI_TEXTURE_2D: 2025 case TGSI_TEXTURE_2D_ARRAY: 2026 case TGSI_TEXTURE_SHADOW2D: 2027 case TGSI_TEXTURE_SHADOW2D_ARRAY: 2028 snprintf(offbuf, 120, ", ivec2(floatBitsToInt(%s.%c), floatBitsToInt(%s.%c))", 2029 ctx->inputs[j].glsl_name, 2030 get_swiz_char(inst->TexOffsets[0].SwizzleX), 2031 ctx->inputs[j].glsl_name, 2032 get_swiz_char(inst->TexOffsets[0].SwizzleY)); 2033 break; 2034 case TGSI_TEXTURE_3D: 2035 snprintf(offbuf, 120, ", ivec3(floatBitsToInt(%s.%c), floatBitsToInt(%s.%c), floatBitsToInt(%s.%c)", 2036 ctx->inputs[j].glsl_name, 2037 get_swiz_char(inst->TexOffsets[0].SwizzleX), 2038 ctx->inputs[j].glsl_name, 2039 get_swiz_char(inst->TexOffsets[0].SwizzleY), 2040 ctx->inputs[j].glsl_name, 2041 get_swiz_char(inst->TexOffsets[0].SwizzleZ)); 2042 break; 2043 default: 2044 fprintf(stderr, "unhandled texture: %x\n", inst->Texture.Texture); 2045 return false; 2046 break; 2047 } 2048 } 2049 } 2050 return true; 2051 } 2052 2053 static int translate_tex(struct dump_ctx *ctx, 2054 struct tgsi_full_instruction *inst, 2055 struct source_info *sinfo, 2056 struct dest_info *dinfo, 2057 char srcs[4][255], 2058 char dsts[3][255], 2059 const char *writemask) 2060 { 2061 enum vrend_type_qualifier txfi = TYPE_CONVERSION_NONE; 2062 unsigned twm = TGSI_WRITEMASK_NONE, gwm = TGSI_WRITEMASK_NONE; 2063 enum vrend_type_qualifier dtypeprefix = TYPE_CONVERSION_NONE; 2064 bool is_shad = false; 2065 char buf[512]; 2066 char offbuf[128] = {0}; 2067 char bias[128] = {0}; 2068 int sampler_index; 2069 const char *tex_ext; 2070 2071 if (set_texture_reqs(ctx, inst, sinfo->sreg_index, &is_shad) == false) 2072 return FALSE; 2073 2074 switch (ctx->samplers[sinfo->sreg_index].tgsi_sampler_return) { 2075 case TGSI_RETURN_TYPE_SINT: 2076 /* if dstconv isn't an int */ 2077 if (dinfo->dstconv != INT) 2078 dtypeprefix = INT_BITS_TO_FLOAT; 2079 break; 2080 case TGSI_RETURN_TYPE_UINT: 2081 /* if dstconv isn't an int */ 2082 if (dinfo->dstconv != INT) 2083 dtypeprefix = UINT_BITS_TO_FLOAT; 2084 break; 2085 default: 2086 break; 2087 } 2088 2089 sampler_index = 1; 2090 2091 if (inst->Instruction.Opcode == TGSI_OPCODE_LODQ) 2092 ctx->shader_req_bits |= SHADER_REQ_LODQ; 2093 2094 switch (inst->Texture.Texture) { 2095 case TGSI_TEXTURE_1D: 2096 case TGSI_TEXTURE_BUFFER: 2097 if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) 2098 twm = TGSI_WRITEMASK_NONE; 2099 else 2100 twm = TGSI_WRITEMASK_X; 2101 txfi = INT; 2102 break; 2103 case TGSI_TEXTURE_1D_ARRAY: 2104 twm = TGSI_WRITEMASK_XY; 2105 txfi = IVEC2; 2106 break; 2107 case TGSI_TEXTURE_2D: 2108 case TGSI_TEXTURE_RECT: 2109 if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) 2110 twm = TGSI_WRITEMASK_NONE; 2111 else 2112 twm = TGSI_WRITEMASK_XY; 2113 txfi = IVEC2; 2114 break; 2115 case TGSI_TEXTURE_SHADOW1D: 2116 case TGSI_TEXTURE_SHADOW2D: 2117 case TGSI_TEXTURE_SHADOW1D_ARRAY: 2118 case TGSI_TEXTURE_SHADOWRECT: 2119 case TGSI_TEXTURE_3D: 2120 if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) 2121 twm = TGSI_WRITEMASK_NONE; 2122 else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) 2123 twm = TGSI_WRITEMASK_XY; 2124 else 2125 twm = TGSI_WRITEMASK_XYZ; 2126 txfi = IVEC3; 2127 break; 2128 case TGSI_TEXTURE_CUBE: 2129 case TGSI_TEXTURE_2D_ARRAY: 2130 twm = TGSI_WRITEMASK_XYZ; 2131 txfi = IVEC3; 2132 break; 2133 case TGSI_TEXTURE_2D_MSAA: 2134 twm = TGSI_WRITEMASK_XY; 2135 txfi = IVEC2; 2136 break; 2137 case TGSI_TEXTURE_2D_ARRAY_MSAA: 2138 twm = TGSI_WRITEMASK_XYZ; 2139 txfi = IVEC3; 2140 break; 2141 2142 case TGSI_TEXTURE_SHADOWCUBE: 2143 case TGSI_TEXTURE_SHADOW2D_ARRAY: 2144 case TGSI_TEXTURE_SHADOWCUBE_ARRAY: 2145 case TGSI_TEXTURE_CUBE_ARRAY: 2146 default: 2147 if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && 2148 inst->Texture.Texture != TGSI_TEXTURE_CUBE_ARRAY 2149 && inst->Texture.Texture != TGSI_TEXTURE_SHADOWCUBE_ARRAY) 2150 twm = TGSI_WRITEMASK_XYZ; 2151 else 2152 twm = TGSI_WRITEMASK_NONE; 2153 txfi = TYPE_CONVERSION_NONE; 2154 break; 2155 } 2156 2157 if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 2158 switch (inst->Texture.Texture) { 2159 case TGSI_TEXTURE_1D: 2160 case TGSI_TEXTURE_SHADOW1D: 2161 case TGSI_TEXTURE_1D_ARRAY: 2162 case TGSI_TEXTURE_SHADOW1D_ARRAY: 2163 gwm = TGSI_WRITEMASK_X; 2164 break; 2165 case TGSI_TEXTURE_2D: 2166 case TGSI_TEXTURE_SHADOW2D: 2167 case TGSI_TEXTURE_2D_ARRAY: 2168 case TGSI_TEXTURE_SHADOW2D_ARRAY: 2169 case TGSI_TEXTURE_RECT: 2170 case TGSI_TEXTURE_SHADOWRECT: 2171 gwm = TGSI_WRITEMASK_XY; 2172 break; 2173 case TGSI_TEXTURE_3D: 2174 case TGSI_TEXTURE_CUBE: 2175 case TGSI_TEXTURE_SHADOWCUBE: 2176 case TGSI_TEXTURE_CUBE_ARRAY: 2177 gwm = TGSI_WRITEMASK_XYZ; 2178 break; 2179 default: 2180 gwm = TGSI_WRITEMASK_NONE; 2181 break; 2182 } 2183 } 2184 2185 if (inst->Instruction.Opcode == TGSI_OPCODE_TXB2 || inst->Instruction.Opcode == TGSI_OPCODE_TXL2 || inst->Instruction.Opcode == TGSI_OPCODE_TEX2) { 2186 sampler_index = 2; 2187 if (inst->Instruction.Opcode != TGSI_OPCODE_TEX2) 2188 snprintf(bias, 64, ", %s.x", srcs[1]); 2189 else if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY) 2190 snprintf(bias, 64, ", float(%s)", srcs[1]); 2191 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXB || inst->Instruction.Opcode == TGSI_OPCODE_TXL) 2192 snprintf(bias, 64, ", %s.w", srcs[0]); 2193 else if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 2194 if (inst->Texture.Texture == TGSI_TEXTURE_1D || 2195 inst->Texture.Texture == TGSI_TEXTURE_2D || 2196 inst->Texture.Texture == TGSI_TEXTURE_2D_MSAA || 2197 inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY_MSAA || 2198 inst->Texture.Texture == TGSI_TEXTURE_3D || 2199 inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || 2200 inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY) { 2201 snprintf(bias, 64, ", int(%s.w)", srcs[0]); 2202 } 2203 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { 2204 snprintf(bias, 128, ", %s%s, %s%s", srcs[1], get_wm_string(gwm), srcs[2], get_wm_string(gwm)); 2205 sampler_index = 3; 2206 } else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) { 2207 sampler_index = 2; 2208 ctx->shader_req_bits |= SHADER_REQ_TG4; 2209 if (inst->Texture.NumOffsets > 1 || is_shad || (ctx->shader_req_bits & SHADER_REQ_SAMPLER_RECT)) 2210 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 2211 if (inst->Texture.NumOffsets == 1) { 2212 if (inst->TexOffsets[0].File != TGSI_FILE_IMMEDIATE) 2213 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 2214 } 2215 if (is_shad) { 2216 if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || 2217 inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY) 2218 snprintf(bias, 64, ", %s.w", srcs[0]); 2219 else if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY) 2220 snprintf(bias, 64, ", %s.x", srcs[1]); 2221 else 2222 snprintf(bias, 64, ", %s.z", srcs[0]); 2223 } else if (sinfo->tg4_has_component) { 2224 if (inst->Texture.NumOffsets == 0) { 2225 if (inst->Texture.Texture == TGSI_TEXTURE_2D || 2226 inst->Texture.Texture == TGSI_TEXTURE_RECT || 2227 inst->Texture.Texture == TGSI_TEXTURE_CUBE || 2228 inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || 2229 inst->Texture.Texture == TGSI_TEXTURE_CUBE_ARRAY) 2230 snprintf(bias, 64, ", int(%s)", srcs[1]); 2231 } else if (inst->Texture.NumOffsets) { 2232 if (inst->Texture.Texture == TGSI_TEXTURE_2D || 2233 inst->Texture.Texture == TGSI_TEXTURE_RECT || 2234 inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY) 2235 snprintf(bias, 64, ", int(%s)", srcs[1]); 2236 } 2237 } 2238 } else 2239 bias[0] = 0; 2240 2241 tex_ext = get_tex_inst_ext(inst); 2242 2243 if (inst->Texture.NumOffsets == 1) { 2244 if (inst->TexOffsets[0].Index >= (int)ARRAY_SIZE(ctx->imm)) { 2245 fprintf(stderr, "Immediate exceeded, max is %lu\n", ARRAY_SIZE(ctx->imm)); 2246 return false; 2247 } 2248 2249 if (!fill_offset_buffer(ctx, inst, offbuf)) 2250 return false; 2251 2252 if (inst->Instruction.Opcode == TGSI_OPCODE_TXL || inst->Instruction.Opcode == TGSI_OPCODE_TXL2 || inst->Instruction.Opcode == TGSI_OPCODE_TXD || (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && is_shad)) { 2253 char tmp[128]; 2254 strcpy(tmp, offbuf); 2255 strcpy(offbuf, bias); 2256 strcpy(bias, tmp); 2257 } 2258 } 2259 if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { 2260 snprintf(buf, 255, "%s = %s(%s(texelFetch%s(%s, %s(%s%s)%s%s)%s));\n", dsts[0], get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], get_string(txfi), srcs[0], get_wm_string(twm), bias, offbuf, dinfo->dst_override_no_wm[0] ? "" : writemask); 2261 } else if (ctx->cfg->glsl_version < 140 && (ctx->shader_req_bits & SHADER_REQ_SAMPLER_RECT)) { 2262 /* rect is special in GLSL 1.30 */ 2263 if (inst->Texture.Texture == TGSI_TEXTURE_RECT) 2264 snprintf(buf, 255, "%s = texture2DRect(%s, %s.xy)%s;\n", dsts[0], srcs[sampler_index], srcs[0], writemask); 2265 else if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWRECT) 2266 snprintf(buf, 255, "%s = shadow2DRect(%s, %s.xyz)%s;\n", dsts[0], srcs[sampler_index], srcs[0], writemask); 2267 } else if (is_shad && inst->Instruction.Opcode != TGSI_OPCODE_TG4) { /* TGSI returns 1.0 in alpha */ 2268 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 2269 const struct tgsi_full_src_register *src = &inst->Src[sampler_index]; 2270 snprintf(buf, 255, "%s = %s(%s(vec4(vec4(texture%s(%s, %s%s%s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dsts[0], get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], get_wm_string(twm), offbuf, bias, cname, src->Register.Index, cname, src->Register.Index, writemask); 2271 } else { 2272 /* OpenGL ES do not support 1D texture 2273 * so we use a 2D texture with a parameter set to 0.5 2274 */ 2275 if (ctx->cfg->use_gles && inst->Texture.Texture == TGSI_TEXTURE_1D) { 2276 snprintf(buf, 255, "%s = %s(%s(texture2D(%s, vec2(%s%s%s%s, 0.5))%s));\n", dsts[0], get_string(dinfo->dstconv), get_string(dtypeprefix), srcs[sampler_index], srcs[0], get_wm_string(twm), offbuf, bias, dinfo->dst_override_no_wm[0] ? "" : writemask); 2277 } else { 2278 snprintf(buf, 255, "%s = %s(%s(texture%s(%s, %s%s%s%s)%s));\n", dsts[0], get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], get_wm_string(twm), offbuf, bias, dinfo->dst_override_no_wm[0] ? "" : writemask); 2279 } 2280 } 2281 return emit_buf(ctx, buf); 2282 } 2283 2284 static void 2285 create_swizzled_clipdist(struct dump_ctx *ctx, 2286 char *result, 2287 const struct tgsi_full_src_register *src, 2288 int input_idx, 2289 bool gl_in, 2290 const char *stypeprefix, 2291 const char *prefix, 2292 const char *arrayname) 2293 { 2294 char clipdistvec[4][64] = {}; 2295 int idx; 2296 bool has_prev_vals = (ctx->key->prev_stage_num_cull_out + ctx->key->prev_stage_num_clip_out) > 0; 2297 int num_culls = has_prev_vals ? ctx->key->prev_stage_num_cull_out : 0; 2298 int num_clips = has_prev_vals ? ctx->key->prev_stage_num_clip_out : ctx->num_in_clip_dist; 2299 for (unsigned cc = 0; cc < 4; cc++) { 2300 const char *cc_name = ctx->inputs[input_idx].glsl_name; 2301 idx = ctx->inputs[input_idx].sid * 4; 2302 if (cc == 0) 2303 idx += src->Register.SwizzleX; 2304 else if (cc == 1) 2305 idx += src->Register.SwizzleY; 2306 else if (cc == 2) 2307 idx += src->Register.SwizzleZ; 2308 else if (cc == 3) 2309 idx += src->Register.SwizzleW; 2310 2311 if (num_culls) { 2312 if (idx >= num_clips) { 2313 idx -= num_clips; 2314 cc_name = "gl_CullDistance"; 2315 } 2316 if (ctx->key->prev_stage_num_cull_out) 2317 if (idx >= ctx->key->prev_stage_num_cull_out) 2318 idx = 0; 2319 } else { 2320 if (ctx->key->prev_stage_num_clip_out) 2321 if (idx >= ctx->key->prev_stage_num_clip_out) 2322 idx = 0; 2323 } 2324 if (gl_in) 2325 snprintf(clipdistvec[cc], 64, "%sgl_in%s.%s[%d]", prefix, arrayname, cc_name, idx); 2326 else 2327 snprintf(clipdistvec[cc], 64, "%s%s%s[%d]", prefix, arrayname, cc_name, idx); 2328 } 2329 snprintf(result, 255, "%s(vec4(%s,%s,%s,%s))", stypeprefix, clipdistvec[0], clipdistvec[1], clipdistvec[2], clipdistvec[3]); 2330 } 2331 2332 static enum vrend_type_qualifier get_coord_prefix(int resource, bool *is_ms) 2333 { 2334 switch(resource) { 2335 case TGSI_TEXTURE_1D: 2336 case TGSI_TEXTURE_BUFFER: 2337 return INT; 2338 case TGSI_TEXTURE_2D: 2339 case TGSI_TEXTURE_RECT: 2340 case TGSI_TEXTURE_1D_ARRAY: 2341 return IVEC2; 2342 case TGSI_TEXTURE_3D: 2343 case TGSI_TEXTURE_CUBE: 2344 case TGSI_TEXTURE_2D_ARRAY: 2345 case TGSI_TEXTURE_CUBE_ARRAY: 2346 return IVEC3; 2347 case TGSI_TEXTURE_2D_MSAA: 2348 *is_ms = true; 2349 return IVEC2; 2350 case TGSI_TEXTURE_2D_ARRAY_MSAA: 2351 *is_ms = true; 2352 return IVEC3; 2353 default: 2354 return TYPE_CONVERSION_NONE; 2355 } 2356 } 2357 2358 static bool is_integer_memory(struct dump_ctx *ctx, enum tgsi_file_type file_type, uint32_t index) 2359 { 2360 switch(file_type) { 2361 case TGSI_FILE_BUFFER: 2362 return !!(ctx->ssbo_integer_mask & (1 << index)); 2363 case TGSI_FILE_MEMORY: 2364 return ctx->integer_memory; 2365 default: 2366 fprintf(stderr, "Invalid file type"); 2367 } 2368 2369 return false; 2370 } 2371 2372 static int 2373 translate_store(struct dump_ctx *ctx, 2374 struct tgsi_full_instruction *inst, 2375 struct source_info *sinfo, 2376 char srcs[4][255], 2377 char dsts[3][255]) 2378 { 2379 const struct tgsi_full_dst_register *dst = &inst->Dst[0]; 2380 char buf[512]; 2381 2382 if (dst->Register.File == TGSI_FILE_IMAGE) { 2383 bool is_ms = false; 2384 enum vrend_type_qualifier coord_prefix = get_coord_prefix(ctx->images[dst->Register.Index].decl.Resource, &is_ms); 2385 enum tgsi_return_type itype; 2386 char ms_str[32] = {}; 2387 enum vrend_type_qualifier stypeprefix = TYPE_CONVERSION_NONE; 2388 const char *conversion = sinfo->override_no_cast[0] ? "" : get_string(FLOAT_BITS_TO_INT); 2389 get_internalformat_string(inst->Memory.Format, &itype); 2390 if (is_ms) { 2391 snprintf(ms_str, 32, "int(%s.w),", srcs[0]); 2392 } 2393 switch (itype) { 2394 case TGSI_RETURN_TYPE_UINT: 2395 stypeprefix = FLOAT_BITS_TO_UINT; 2396 break; 2397 case TGSI_RETURN_TYPE_SINT: 2398 stypeprefix = FLOAT_BITS_TO_INT; 2399 break; 2400 default: 2401 break; 2402 } 2403 snprintf(buf, 512, "imageStore(%s,%s(%s(%s)),%s%s(%s));\n", dsts[0], get_string(coord_prefix), 2404 conversion, srcs[0], ms_str, get_string(stypeprefix), srcs[1]); 2405 EMIT_BUF_WITH_RET(ctx, buf); 2406 } else if (dst->Register.File == TGSI_FILE_BUFFER || dst->Register.File == TGSI_FILE_MEMORY) { 2407 enum vrend_type_qualifier dtypeprefix; 2408 dtypeprefix = (is_integer_memory(ctx, dst->Register.File, dst->Register.Index)) ? FLOAT_BITS_TO_INT : FLOAT_BITS_TO_UINT; 2409 const char *conversion = sinfo->override_no_cast[1] ? "" : get_string(dtypeprefix); 2410 if (inst->Dst[0].Register.WriteMask & 0x1) { 2411 snprintf(buf, 255, "%s[uint(floatBitsToUint(%s))>>2] = %s(%s).x;\n", dsts[0], srcs[0], conversion, srcs[1]); 2412 EMIT_BUF_WITH_RET(ctx, buf); 2413 } 2414 if (inst->Dst[0].Register.WriteMask & 0x2) { 2415 snprintf(buf, 255, "%s[(uint(floatBitsToUint(%s))>>2)+1u] = %s(%s).y;\n", dsts[0], srcs[0], conversion, srcs[1]); 2416 EMIT_BUF_WITH_RET(ctx, buf); 2417 } 2418 if (inst->Dst[0].Register.WriteMask & 0x4) { 2419 snprintf(buf, 255, "%s[(uint(floatBitsToUint(%s))>>2)+2u] = %s(%s).z;\n", dsts[0], srcs[0], conversion, srcs[1]); 2420 EMIT_BUF_WITH_RET(ctx, buf); 2421 } 2422 if (inst->Dst[0].Register.WriteMask & 0x8) { 2423 snprintf(buf, 255, "%s[(uint(floatBitsToUint(%s))>>2)+3u] = %s(%s).w;\n", dsts[0], srcs[0], conversion, srcs[1]); 2424 EMIT_BUF_WITH_RET(ctx, buf); 2425 } 2426 } 2427 return 0; 2428 } 2429 2430 static int 2431 translate_load(struct dump_ctx *ctx, 2432 struct tgsi_full_instruction *inst, 2433 struct source_info *sinfo, 2434 struct dest_info *dinfo, 2435 char srcs[4][255], 2436 char dsts[3][255], 2437 const char *writemask) 2438 { 2439 char buf[512]; 2440 const struct tgsi_full_src_register *src = &inst->Src[0]; 2441 if (src->Register.File == TGSI_FILE_IMAGE) { 2442 bool is_ms = false; 2443 enum vrend_type_qualifier coord_prefix = get_coord_prefix(ctx->images[sinfo->sreg_index].decl.Resource, &is_ms); 2444 enum vrend_type_qualifier dtypeprefix = TYPE_CONVERSION_NONE; 2445 const char *conversion = sinfo->override_no_cast[1] ? "" : get_string(FLOAT_BITS_TO_INT); 2446 enum tgsi_return_type itype; 2447 get_internalformat_string(ctx->images[sinfo->sreg_index].decl.Format, &itype); 2448 char ms_str[32] = {}; 2449 const char *wm = dinfo->dst_override_no_wm[0] ? "" : writemask; 2450 if (is_ms) { 2451 snprintf(ms_str, 32, ", int(%s.w)", srcs[1]); 2452 } 2453 switch (itype) { 2454 case TGSI_RETURN_TYPE_UINT: 2455 dtypeprefix = UINT_BITS_TO_FLOAT; 2456 break; 2457 case TGSI_RETURN_TYPE_SINT: 2458 dtypeprefix = INT_BITS_TO_FLOAT; 2459 break; 2460 default: 2461 break; 2462 } 2463 snprintf(buf, 512, "%s = %s(imageLoad(%s, %s(%s(%s))%s)%s);\n", dsts[0], get_string(dtypeprefix), srcs[0], 2464 get_string(coord_prefix), conversion, srcs[1], ms_str, wm); 2465 EMIT_BUF_WITH_RET(ctx, buf); 2466 } else if (src->Register.File == TGSI_FILE_BUFFER || 2467 src->Register.File == TGSI_FILE_MEMORY) { 2468 char mydst[255], atomic_op[9], atomic_src[10]; 2469 enum vrend_type_qualifier dtypeprefix; 2470 strcpy(mydst, dsts[0]); 2471 char *wmp = strchr(mydst, '.'); 2472 if (wmp) 2473 wmp[0] = 0; 2474 snprintf(buf, 255, "ssbo_addr_temp = uint(floatBitsToUint(%s)) >> 2;\n", srcs[1]); 2475 EMIT_BUF_WITH_RET(ctx, buf); 2476 2477 atomic_op[0] = atomic_src[0] = '\0'; 2478 if (ctx->ssbo_atomic_mask & (1 << src->Register.Index)) { 2479 /* Emulate atomicCounter with atomicOr. */ 2480 strcpy(atomic_op, "atomicOr"); 2481 strcpy(atomic_src, ", uint(0)"); 2482 } 2483 2484 dtypeprefix = (is_integer_memory(ctx, src->Register.File, src->Register.Index)) ? INT_BITS_TO_FLOAT : UINT_BITS_TO_FLOAT; 2485 if (inst->Dst[0].Register.WriteMask & 0x1) { 2486 snprintf(buf, 255, "%s.x = (%s(%s(%s[ssbo_addr_temp]%s)));\n", mydst, get_string(dtypeprefix), atomic_op, srcs[0], atomic_src); 2487 EMIT_BUF_WITH_RET(ctx, buf); 2488 } 2489 if (inst->Dst[0].Register.WriteMask & 0x2) { 2490 snprintf(buf, 255, "%s.y = (%s(%s(%s[ssbo_addr_temp + 1u]%s)));\n", mydst, get_string(dtypeprefix), atomic_op, srcs[0], atomic_src); 2491 EMIT_BUF_WITH_RET(ctx, buf); 2492 } 2493 if (inst->Dst[0].Register.WriteMask & 0x4) { 2494 snprintf(buf, 255, "%s.z = (%s(%s(%s[ssbo_addr_temp + 2u]%s)));\n", mydst, get_string(dtypeprefix), atomic_op, srcs[0], atomic_src); 2495 EMIT_BUF_WITH_RET(ctx, buf); 2496 } 2497 if (inst->Dst[0].Register.WriteMask & 0x8) { 2498 snprintf(buf, 255, "%s.w = (%s(%s(%s[ssbo_addr_temp + 3u]%s)));\n", mydst, get_string(dtypeprefix), atomic_op, srcs[0], atomic_src); 2499 EMIT_BUF_WITH_RET(ctx, buf); 2500 } 2501 } 2502 return 0; 2503 } 2504 2505 static const char *get_atomic_opname(int tgsi_opcode, bool *is_cas) 2506 { 2507 const char *opname; 2508 *is_cas = false; 2509 switch (tgsi_opcode) { 2510 case TGSI_OPCODE_ATOMUADD: 2511 opname = "Add"; 2512 break; 2513 case TGSI_OPCODE_ATOMXCHG: 2514 opname = "Exchange"; 2515 break; 2516 case TGSI_OPCODE_ATOMCAS: 2517 opname = "CompSwap"; 2518 *is_cas = true; 2519 break; 2520 case TGSI_OPCODE_ATOMAND: 2521 opname = "And"; 2522 break; 2523 case TGSI_OPCODE_ATOMOR: 2524 opname = "Or"; 2525 break; 2526 case TGSI_OPCODE_ATOMXOR: 2527 opname = "Xor"; 2528 break; 2529 case TGSI_OPCODE_ATOMUMIN: 2530 opname = "Min"; 2531 break; 2532 case TGSI_OPCODE_ATOMUMAX: 2533 opname = "Max"; 2534 break; 2535 case TGSI_OPCODE_ATOMIMIN: 2536 opname = "Min"; 2537 break; 2538 case TGSI_OPCODE_ATOMIMAX: 2539 opname = "Max"; 2540 break; 2541 default: 2542 fprintf(stderr, "illegal atomic opcode"); 2543 return NULL; 2544 } 2545 return opname; 2546 } 2547 2548 static int 2549 translate_resq(struct dump_ctx *ctx, struct tgsi_full_instruction *inst, 2550 char srcs[4][255], char dsts[3][255]) 2551 { 2552 char buf[512]; 2553 const struct tgsi_full_src_register *src = &inst->Src[0]; 2554 2555 if (src->Register.File == TGSI_FILE_IMAGE) { 2556 if (inst->Dst[0].Register.WriteMask & 0x8) { 2557 ctx->shader_req_bits |= SHADER_REQ_TXQS | SHADER_REQ_INTS; 2558 snprintf(buf, 255, "%s = %s(imageSamples(%s));\n", dsts[0], get_string(INT_BITS_TO_FLOAT), srcs[0]); 2559 EMIT_BUF_WITH_RET(ctx, buf); 2560 } 2561 if (inst->Dst[0].Register.WriteMask & 0x7) { 2562 ctx->shader_req_bits |= SHADER_REQ_IMAGE_SIZE | SHADER_REQ_INTS; 2563 snprintf(buf, 255, "%s = %s(imageSize(%s));\n", dsts[0], get_string(INT_BITS_TO_FLOAT), srcs[0]); 2564 EMIT_BUF_WITH_RET(ctx, buf); 2565 } 2566 } else if (src->Register.File == TGSI_FILE_BUFFER) { 2567 snprintf(buf, 255, "%s = %s(int(%s.length()) << 2);\n", dsts[0], get_string(INT_BITS_TO_FLOAT), srcs[0]); 2568 EMIT_BUF_WITH_RET(ctx, buf); 2569 } 2570 2571 return 0; 2572 } 2573 2574 static int 2575 translate_atomic(struct dump_ctx *ctx, 2576 struct tgsi_full_instruction *inst, 2577 struct source_info *sinfo, 2578 char srcs[4][255], 2579 char dsts[3][255]) 2580 { 2581 char buf[512]; 2582 const struct tgsi_full_src_register *src = &inst->Src[0]; 2583 const char *opname; 2584 enum vrend_type_qualifier stypeprefix = TYPE_CONVERSION_NONE; 2585 enum vrend_type_qualifier dtypeprefix = TYPE_CONVERSION_NONE; 2586 enum vrend_type_qualifier stypecast = TYPE_CONVERSION_NONE; 2587 bool is_cas; 2588 char cas_str[128] = {}; 2589 2590 if (src->Register.File == TGSI_FILE_IMAGE) { 2591 enum tgsi_return_type itype; 2592 get_internalformat_string(ctx->images[sinfo->sreg_index].decl.Format, &itype); 2593 switch (itype) { 2594 default: 2595 case TGSI_RETURN_TYPE_UINT: 2596 stypeprefix = FLOAT_BITS_TO_UINT; 2597 dtypeprefix = UINT_BITS_TO_FLOAT; 2598 stypecast = UINT; 2599 break; 2600 case TGSI_RETURN_TYPE_SINT: 2601 stypeprefix = FLOAT_BITS_TO_INT; 2602 dtypeprefix = INT_BITS_TO_FLOAT; 2603 stypecast = INT; 2604 break; 2605 case TGSI_RETURN_TYPE_FLOAT: 2606 ctx->shader_req_bits |= SHADER_REQ_ES31_COMPAT; 2607 stypecast = FLOAT; 2608 break; 2609 } 2610 } else { 2611 stypeprefix = FLOAT_BITS_TO_UINT; 2612 dtypeprefix = UINT_BITS_TO_FLOAT; 2613 stypecast = UINT; 2614 } 2615 2616 opname = get_atomic_opname(inst->Instruction.Opcode, &is_cas); 2617 if (!opname) 2618 return -1; 2619 2620 if (is_cas) 2621 snprintf(cas_str, 128, ", %s(%s(%s))", get_string(stypecast), get_string(stypeprefix), srcs[3]); 2622 2623 if (src->Register.File == TGSI_FILE_IMAGE) { 2624 bool is_ms = false; 2625 enum vrend_type_qualifier coord_prefix = get_coord_prefix(ctx->images[sinfo->sreg_index].decl.Resource, &is_ms); 2626 const char *conversion = sinfo->override_no_cast[1] ? "" : get_string(FLOAT_BITS_TO_INT); 2627 char ms_str[32] = {}; 2628 if (is_ms) { 2629 snprintf(ms_str, 32, ", int(%s.w)", srcs[1]); 2630 } 2631 snprintf(buf, 512, "%s = %s(imageAtomic%s(%s, %s(%s(%s))%s, %s(%s(%s))%s));\n", dsts[0], 2632 get_string(dtypeprefix), opname, srcs[0], get_string(coord_prefix), conversion, 2633 srcs[1], ms_str, get_string(stypecast), get_string(stypeprefix), srcs[2], cas_str); 2634 EMIT_BUF_WITH_RET(ctx, buf); 2635 } 2636 if (src->Register.File == TGSI_FILE_BUFFER || src->Register.File == TGSI_FILE_MEMORY) { 2637 enum vrend_type_qualifier type; 2638 if ((is_integer_memory(ctx, src->Register.File, src->Register.Index))) { 2639 type = INT; 2640 dtypeprefix = INT_BITS_TO_FLOAT; 2641 stypeprefix = FLOAT_BITS_TO_INT; 2642 } else { 2643 type = UINT; 2644 dtypeprefix = UINT_BITS_TO_FLOAT; 2645 stypeprefix = FLOAT_BITS_TO_UINT; 2646 } 2647 2648 snprintf(buf, 512, "%s = %s(atomic%s(%s[int(floatBitsToInt(%s)) >> 2], %s(%s(%s).x)%s));\n", dsts[0], get_string(dtypeprefix), opname, srcs[0], srcs[1], get_string(type), get_string(stypeprefix), srcs[2], cas_str); 2649 EMIT_BUF_WITH_RET(ctx, buf); 2650 } 2651 return 0; 2652 } 2653 2654 static int 2655 get_destination_info(struct dump_ctx *ctx, 2656 const struct tgsi_full_instruction *inst, 2657 struct dest_info *dinfo, 2658 char dsts[3][255], 2659 char fp64_dsts[3][255], 2660 char *writemask) 2661 { 2662 const struct tgsi_full_dst_register *dst_reg; 2663 enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode); 2664 2665 if (dtype == TGSI_TYPE_SIGNED || dtype == TGSI_TYPE_UNSIGNED) 2666 ctx->shader_req_bits |= SHADER_REQ_INTS; 2667 2668 if (dtype == TGSI_TYPE_DOUBLE) { 2669 /* we need the uvec2 conversion for doubles */ 2670 ctx->shader_req_bits |= SHADER_REQ_INTS | SHADER_REQ_FP64; 2671 } 2672 2673 if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ) { 2674 dinfo->dtypeprefix = INT_BITS_TO_FLOAT; 2675 } else { 2676 switch (dtype) { 2677 case TGSI_TYPE_UNSIGNED: 2678 dinfo->dtypeprefix = UINT_BITS_TO_FLOAT; 2679 break; 2680 case TGSI_TYPE_SIGNED: 2681 dinfo->dtypeprefix = INT_BITS_TO_FLOAT; 2682 break; 2683 default: 2684 break; 2685 } 2686 } 2687 2688 for (uint32_t i = 0; i < inst->Instruction.NumDstRegs; i++) { 2689 char fp64_writemask[6] = {0}; 2690 dst_reg = &inst->Dst[i]; 2691 dinfo->dst_override_no_wm[i] = false; 2692 if (dst_reg->Register.WriteMask != TGSI_WRITEMASK_XYZW) { 2693 int wm_idx = 0, dbl_wm_idx = 0; 2694 writemask[wm_idx++] = '.'; 2695 fp64_writemask[dbl_wm_idx++] = '.'; 2696 2697 if (dst_reg->Register.WriteMask & 0x1) 2698 writemask[wm_idx++] = 'x'; 2699 if (dst_reg->Register.WriteMask & 0x2) 2700 writemask[wm_idx++] = 'y'; 2701 if (dst_reg->Register.WriteMask & 0x4) 2702 writemask[wm_idx++] = 'z'; 2703 if (dst_reg->Register.WriteMask & 0x8) 2704 writemask[wm_idx++] = 'w'; 2705 2706 if (dtype == TGSI_TYPE_DOUBLE) { 2707 if (dst_reg->Register.WriteMask & 0x3) 2708 fp64_writemask[dbl_wm_idx++] = 'x'; 2709 if (dst_reg->Register.WriteMask & 0xc) 2710 fp64_writemask[dbl_wm_idx++] = 'y'; 2711 } 2712 2713 if (dtype == TGSI_TYPE_DOUBLE) { 2714 if (dbl_wm_idx == 2) 2715 dinfo->dstconv = DOUBLE; 2716 else 2717 dinfo->dstconv = DVEC2; 2718 } else { 2719 dinfo->dstconv = FLOAT + wm_idx - 2; 2720 dinfo->udstconv = UINT + wm_idx - 2; 2721 dinfo->idstconv = INT + wm_idx - 2; 2722 } 2723 } else { 2724 if (dtype == TGSI_TYPE_DOUBLE) 2725 dinfo->dstconv = DVEC2; 2726 else 2727 dinfo->dstconv = VEC4; 2728 dinfo->udstconv = UVEC4; 2729 dinfo->idstconv = IVEC4; 2730 } 2731 2732 if (dst_reg->Register.File == TGSI_FILE_OUTPUT) { 2733 for (uint32_t j = 0; j < ctx->num_outputs; j++) { 2734 if (ctx->outputs[j].first == dst_reg->Register.Index) { 2735 2736 if (inst->Instruction.Precise) { 2737 ctx->outputs[j].precise = true; 2738 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 2739 } 2740 2741 if (ctx->glsl_ver_required >= 140 && ctx->outputs[j].name == TGSI_SEMANTIC_CLIPVERTEX) { 2742 snprintf(dsts[i], 255, "clipv_tmp"); 2743 } else if (ctx->outputs[j].name == TGSI_SEMANTIC_CLIPDIST) { 2744 snprintf(dsts[i], 255, "clip_dist_temp[%d]", ctx->outputs[j].sid); 2745 } else if (ctx->outputs[j].name == TGSI_SEMANTIC_TESSOUTER || 2746 ctx->outputs[j].name == TGSI_SEMANTIC_TESSINNER || 2747 ctx->outputs[j].name == TGSI_SEMANTIC_SAMPLEMASK) { 2748 int idx; 2749 switch (dst_reg->Register.WriteMask) { 2750 case 0x1: idx = 0; break; 2751 case 0x2: idx = 1; break; 2752 case 0x4: idx = 2; break; 2753 case 0x8: idx = 3; break; 2754 default: 2755 idx = 0; 2756 break; 2757 } 2758 snprintf(dsts[i], 255, "%s[%d]", ctx->outputs[j].glsl_name, idx); 2759 if (ctx->outputs[j].is_int) { 2760 dinfo->dtypeprefix = FLOAT_BITS_TO_INT; 2761 dinfo->dstconv = INT; 2762 } 2763 } else { 2764 if (ctx->outputs[j].glsl_gl_block) { 2765 snprintf(dsts[i], 255, "gl_out[%s].%s%s", 2766 ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL ? "gl_InvocationID" : "0", 2767 ctx->outputs[j].glsl_name, 2768 ctx->outputs[j].override_no_wm ? "" : writemask); 2769 } else if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL && ctx->outputs[j].name != TGSI_SEMANTIC_PATCH) { 2770 if (ctx_indirect_outputs(ctx)) { 2771 if (dst_reg->Register.Indirect) 2772 snprintf(dsts[i], 255, "oblk[gl_InvocationID].%s%d[addr%d + %d]%s", get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.first, dst_reg->Indirect.Index, dst_reg->Register.Index - ctx->generic_output_range.array_id, ctx->outputs[j].override_no_wm ? "" : writemask); 2773 else 2774 snprintf(dsts[i], 255, "oblk[gl_InvocationID].%s%d[%d]%s", get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.first, dst_reg->Register.Index - ctx->generic_output_range.array_id, ctx->outputs[j].override_no_wm ? "" : writemask); 2775 2776 } else 2777 snprintf(dsts[i], 255, "%s[gl_InvocationID]%s", ctx->outputs[j].glsl_name, ctx->outputs[j].override_no_wm ? "" : writemask); 2778 } else if (ctx_indirect_outputs(ctx) && ctx->outputs[j].name == TGSI_SEMANTIC_GENERIC) { 2779 if (dst_reg->Register.Indirect) 2780 snprintf(dsts[i], 255, "oblk.%s%d[addr%d + %d]%s", get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.first, dst_reg->Indirect.Index, dst_reg->Register.Index - ctx->generic_output_range.array_id, ctx->outputs[j].override_no_wm ? "" : writemask); 2781 else 2782 snprintf(dsts[i], 255, "oblk.%s%d[%d]%s", get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.first, dst_reg->Register.Index - ctx->generic_output_range.array_id, ctx->outputs[j].override_no_wm ? "" : writemask); 2783 dinfo->dst_override_no_wm[i] = ctx->outputs[j].override_no_wm; 2784 } else if (ctx_indirect_outputs(ctx) && ctx->outputs[j].name == TGSI_SEMANTIC_PATCH) { 2785 if (dst_reg->Register.Indirect) 2786 snprintf(dsts[i], 255, "%sp%d[addr%d + %d]%s", get_stage_output_name_prefix(ctx->prog_type), ctx->patch_output_range.first, dst_reg->Indirect.Index, dst_reg->Register.Index - ctx->patch_output_range.array_id, ctx->outputs[j].override_no_wm ? "" : writemask); 2787 else 2788 snprintf(dsts[i], 255, "%sp%d[%d]%s", get_stage_output_name_prefix(ctx->prog_type), ctx->patch_output_range.first, dst_reg->Register.Index - ctx->patch_output_range.array_id, ctx->outputs[j].override_no_wm ? "" : writemask); 2789 dinfo->dst_override_no_wm[i] = ctx->outputs[j].override_no_wm; 2790 } else { 2791 snprintf(dsts[i], 255, "%s%s", ctx->outputs[j].glsl_name, ctx->outputs[j].override_no_wm ? "" : writemask); 2792 dinfo->dst_override_no_wm[i] = ctx->outputs[j].override_no_wm; 2793 } 2794 if (ctx->outputs[j].is_int) { 2795 if (dinfo->dtypeprefix == TYPE_CONVERSION_NONE) 2796 dinfo->dtypeprefix = FLOAT_BITS_TO_INT; 2797 dinfo->dstconv = INT; 2798 } 2799 if (ctx->outputs[j].name == TGSI_SEMANTIC_PSIZE) { 2800 dinfo->dstconv = FLOAT; 2801 break; 2802 } 2803 } 2804 } 2805 } 2806 } 2807 else if (dst_reg->Register.File == TGSI_FILE_TEMPORARY) { 2808 struct vrend_temp_range *range = find_temp_range(ctx, dst_reg->Register.Index); 2809 if (!range) 2810 return FALSE; 2811 if (dst_reg->Register.Indirect) { 2812 snprintf(dsts[i], 255, "temp%d[addr0 + %d]%s", range->first, dst_reg->Register.Index - range->first, writemask); 2813 } else 2814 snprintf(dsts[i], 255, "temp%d[%d]%s", range->first, dst_reg->Register.Index - range->first, writemask); 2815 } 2816 else if (dst_reg->Register.File == TGSI_FILE_IMAGE) { 2817 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 2818 if (ctx->info.indirect_files & (1 << TGSI_FILE_IMAGE)) { 2819 int basearrayidx = lookup_image_array(ctx, dst_reg->Register.Index); 2820 if (dst_reg->Register.Indirect) { 2821 assert(dst_reg->Indirect.File == TGSI_FILE_ADDRESS); 2822 snprintf(dsts[i], 255, "%simg%d[addr%d + %d]", cname, basearrayidx, dst_reg->Indirect.Index, dst_reg->Register.Index - basearrayidx); 2823 } else 2824 snprintf(dsts[i], 255, "%simg%d[%d]", cname, basearrayidx, dst_reg->Register.Index - basearrayidx); 2825 } else 2826 snprintf(dsts[i], 255, "%simg%d", cname, dst_reg->Register.Index); 2827 } else if (dst_reg->Register.File == TGSI_FILE_BUFFER) { 2828 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 2829 if (ctx->info.indirect_files & (1 << TGSI_FILE_BUFFER)) { 2830 bool atomic_ssbo = ctx->ssbo_atomic_mask & (1 << dst_reg->Register.Index); 2831 const char *atomic_str = atomic_ssbo ? "atomic" : ""; 2832 int base = atomic_ssbo ? ctx->ssbo_atomic_array_base : ctx->ssbo_array_base; 2833 if (dst_reg->Register.Indirect) { 2834 snprintf(dsts[i], 255, "%sssboarr%s[addr%d+%d].%sssbocontents%d", cname, atomic_str, dst_reg->Indirect.Index, dst_reg->Register.Index - base, cname, base); 2835 } else 2836 snprintf(dsts[i], 255, "%sssboarr%s[%d].%sssbocontents%d", cname, atomic_str, dst_reg->Register.Index - base, cname, base); 2837 } else 2838 snprintf(dsts[i], 255, "%sssbocontents%d", cname, dst_reg->Register.Index); 2839 } else if (dst_reg->Register.File == TGSI_FILE_MEMORY) { 2840 snprintf(dsts[i], 255, "values"); 2841 } else if (dst_reg->Register.File == TGSI_FILE_ADDRESS) { 2842 snprintf(dsts[i], 255, "addr%d", dst_reg->Register.Index); 2843 } 2844 2845 if (dtype == TGSI_TYPE_DOUBLE) { 2846 strcpy(fp64_dsts[i], dsts[i]); 2847 snprintf(dsts[i], 255, "fp64_dst[%d]%s", i, fp64_writemask); 2848 writemask[0] = 0; 2849 } 2850 2851 } 2852 2853 return 0; 2854 } 2855 2856 static void fill_blkarray(struct dump_ctx *ctx, 2857 const struct tgsi_full_src_register *src, 2858 char *blkarray) 2859 { 2860 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL) 2861 strcpy(blkarray, "[gl_InvocationID]"); 2862 else { 2863 if (src->Register.Dimension) { 2864 if (src->Dimension.Indirect) 2865 snprintf(blkarray, 32, "[addr%d + %d]", src->DimIndirect.Index, src->Dimension.Index); 2866 else 2867 snprintf(blkarray, 32, "[%d]", src->Dimension.Index); 2868 } else 2869 strcpy(blkarray, "[0]"); 2870 } 2871 } 2872 2873 static int 2874 get_source_info(struct dump_ctx *ctx, 2875 const struct tgsi_full_instruction *inst, 2876 struct source_info *sinfo, 2877 char srcs[3][255], char src_swizzle0[10]) 2878 { 2879 bool stprefix = false; 2880 2881 enum vrend_type_qualifier stypeprefix = TYPE_CONVERSION_NONE; 2882 enum tgsi_opcode_type stype = tgsi_opcode_infer_src_type(inst->Instruction.Opcode); 2883 2884 if (stype == TGSI_TYPE_SIGNED || stype == TGSI_TYPE_UNSIGNED) 2885 ctx->shader_req_bits |= SHADER_REQ_INTS; 2886 if (stype == TGSI_TYPE_DOUBLE) 2887 ctx->shader_req_bits |= SHADER_REQ_INTS | SHADER_REQ_FP64; 2888 2889 switch (stype) { 2890 case TGSI_TYPE_DOUBLE: 2891 stypeprefix = FLOAT_BITS_TO_UINT; 2892 sinfo->svec4 = DVEC2; 2893 stprefix = true; 2894 break; 2895 case TGSI_TYPE_UNSIGNED: 2896 stypeprefix = FLOAT_BITS_TO_UINT; 2897 sinfo->svec4 = UVEC4; 2898 stprefix = true; 2899 break; 2900 case TGSI_TYPE_SIGNED: 2901 stypeprefix = FLOAT_BITS_TO_INT; 2902 sinfo->svec4 = IVEC4; 2903 stprefix = true; 2904 break; 2905 default: 2906 break; 2907 } 2908 2909 for (uint32_t i = 0; i < inst->Instruction.NumSrcRegs; i++) { 2910 const struct tgsi_full_src_register *src = &inst->Src[i]; 2911 char swizzle[8] = {0}; 2912 char prefix[6] = {0}; 2913 char arrayname[16] = {0}; 2914 char fp64_src[255]; 2915 int swz_idx = 0, pre_idx = 0; 2916 boolean isfloatabsolute = src->Register.Absolute && stype != TGSI_TYPE_DOUBLE; 2917 2918 sinfo->override_no_wm[i] = false; 2919 sinfo->override_no_cast[i] = false; 2920 if (isfloatabsolute) 2921 swizzle[swz_idx++] = ')'; 2922 2923 if (src->Register.Negate) 2924 prefix[pre_idx++] = '-'; 2925 if (isfloatabsolute) 2926 strcpy(&prefix[pre_idx++], "abs("); 2927 2928 if (src->Register.Dimension) { 2929 if (src->Dimension.Indirect) { 2930 assert(src->DimIndirect.File == TGSI_FILE_ADDRESS); 2931 sprintf(arrayname, "[addr%d]", src->DimIndirect.Index); 2932 } else 2933 sprintf(arrayname, "[%d]", src->Dimension.Index); 2934 } 2935 2936 if (src->Register.SwizzleX != TGSI_SWIZZLE_X || 2937 src->Register.SwizzleY != TGSI_SWIZZLE_Y || 2938 src->Register.SwizzleZ != TGSI_SWIZZLE_Z || 2939 src->Register.SwizzleW != TGSI_SWIZZLE_W) { 2940 swizzle[swz_idx++] = '.'; 2941 swizzle[swz_idx++] = get_swiz_char(src->Register.SwizzleX); 2942 swizzle[swz_idx++] = get_swiz_char(src->Register.SwizzleY); 2943 swizzle[swz_idx++] = get_swiz_char(src->Register.SwizzleZ); 2944 swizzle[swz_idx++] = get_swiz_char(src->Register.SwizzleW); 2945 } 2946 if (src->Register.File == TGSI_FILE_INPUT) { 2947 for (uint32_t j = 0; j < ctx->num_inputs; j++) 2948 if (ctx->inputs[j].first == src->Register.Index) { 2949 if (ctx->key->color_two_side && ctx->inputs[j].name == TGSI_SEMANTIC_COLOR) 2950 snprintf(srcs[i], 255, "%s(%s%s%d%s%s)", get_string(stypeprefix), prefix, "realcolor", ctx->inputs[j].sid, arrayname, swizzle); 2951 else if (ctx->inputs[j].glsl_gl_block) { 2952 /* GS input clipdist requires a conversion */ 2953 if (ctx->inputs[j].name == TGSI_SEMANTIC_CLIPDIST) { 2954 create_swizzled_clipdist(ctx, srcs[i], src, j, true, get_string(stypeprefix), prefix, arrayname); 2955 } else { 2956 snprintf(srcs[i], 255, "%s(vec4(%sgl_in%s.%s)%s)", get_string(stypeprefix), prefix, arrayname, ctx->inputs[j].glsl_name, swizzle); 2957 } 2958 } 2959 else if (ctx->inputs[j].name == TGSI_SEMANTIC_PRIMID) 2960 snprintf(srcs[i], 255, "%s(vec4(intBitsToFloat(%s)))", get_string(stypeprefix), ctx->inputs[j].glsl_name); 2961 else if (ctx->inputs[j].name == TGSI_SEMANTIC_FACE) 2962 snprintf(srcs[i], 255, "%s(%s ? 1.0 : -1.0)", get_string(stypeprefix), ctx->inputs[j].glsl_name); 2963 else if (ctx->inputs[j].name == TGSI_SEMANTIC_CLIPDIST) { 2964 create_swizzled_clipdist(ctx, srcs[i], src, j, false, get_string(stypeprefix), prefix, arrayname); 2965 } else { 2966 enum vrend_type_qualifier srcstypeprefix = stypeprefix; 2967 if ((stype == TGSI_TYPE_UNSIGNED || stype == TGSI_TYPE_SIGNED) && 2968 ctx->inputs[j].is_int) 2969 srcstypeprefix = TYPE_CONVERSION_NONE; 2970 2971 if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) { 2972 snprintf(srcs[i], 255, "floatBitsToInt(%s%s%s%s)", prefix, ctx->inputs[j].glsl_name, arrayname, swizzle); 2973 } else if (ctx->inputs[j].name == TGSI_SEMANTIC_GENERIC && 2974 ctx_indirect_inputs(ctx)) { 2975 char blkarray[32] = {}; 2976 fill_blkarray(ctx, src, blkarray); 2977 if (src->Register.Indirect) 2978 snprintf(srcs[i], 255, "%s(%sblk%s.%s%d[addr%d + %d]%s)", get_string(srcstypeprefix), prefix, blkarray, get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->generic_input_range.first, src->Indirect.Index, src->Register.Index - ctx->generic_input_range.array_id, ctx->inputs[j].is_int ? "" : swizzle); 2979 else 2980 snprintf(srcs[i], 255, "%s(%sblk%s.%s%d[%d]%s)", get_string(srcstypeprefix), prefix, blkarray, get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->generic_input_range.first, src->Register.Index - ctx->generic_input_range.array_id, ctx->inputs[j].is_int ? "" : swizzle); 2981 } else if (ctx->inputs[j].name == TGSI_SEMANTIC_PATCH && 2982 ctx_indirect_inputs(ctx)) { 2983 if (src->Register.Indirect) 2984 snprintf(srcs[i], 255, "%s(%s%sp%d[addr%d + %d]%s)", get_string(srcstypeprefix), prefix, get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->patch_input_range.first, src->Indirect.Index, src->Register.Index - ctx->patch_input_range.array_id, ctx->inputs[j].is_int ? "" : swizzle); 2985 else 2986 snprintf(srcs[i], 255, "%s(%s%sp%d[%d]%s)", get_string(srcstypeprefix), prefix, get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->patch_input_range.first, src->Register.Index - ctx->patch_input_range.array_id, ctx->inputs[j].is_int ? "" : swizzle); 2987 } else 2988 snprintf(srcs[i], 255, "%s(%s%s%s%s)", get_string(srcstypeprefix), prefix, ctx->inputs[j].glsl_name, arrayname, ctx->inputs[j].is_int ? "" : swizzle); 2989 } 2990 if ((inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE || 2991 inst->Instruction.Opcode == TGSI_OPCODE_INTERP_OFFSET || 2992 inst->Instruction.Opcode == TGSI_OPCODE_INTERP_CENTROID) && 2993 i == 0) { 2994 snprintf(srcs[0], 255, "%s", ctx->inputs[j].glsl_name); 2995 snprintf(src_swizzle0, 10, "%s", swizzle); 2996 } 2997 sinfo->override_no_wm[i] = ctx->inputs[j].override_no_wm; 2998 break; 2999 } 3000 } else if (src->Register.File == TGSI_FILE_OUTPUT) { 3001 for (uint32_t j = 0; j < ctx->num_outputs; j++) { 3002 if (ctx->outputs[j].first == src->Register.Index) { 3003 if (inst->Instruction.Opcode == TGSI_OPCODE_FBFETCH) { 3004 ctx->outputs[j].fbfetch_used = true; 3005 ctx->shader_req_bits |= SHADER_REQ_FBFETCH; 3006 } 3007 3008 enum vrend_type_qualifier srcstypeprefix = stypeprefix; 3009 if (stype == TGSI_TYPE_UNSIGNED && ctx->outputs[j].is_int) 3010 srcstypeprefix = TYPE_CONVERSION_NONE; 3011 if (ctx->outputs[j].glsl_gl_block) { 3012 if (ctx->outputs[j].name == TGSI_SEMANTIC_CLIPDIST) { 3013 snprintf(srcs[i], 255, "clip_dist_temp[%d]", ctx->outputs[j].sid); 3014 } 3015 } else if (ctx->outputs[j].name == TGSI_SEMANTIC_GENERIC && 3016 ctx_indirect_outputs(ctx)) { 3017 char blkarray[32] = {}; 3018 fill_blkarray(ctx, src, blkarray); 3019 if (src->Register.Indirect) 3020 snprintf(srcs[i], 255, "%s(%soblk%s.%s%d[addr%d + %d]%s)", get_string(srcstypeprefix), prefix, blkarray, get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.first, src->Indirect.Index, src->Register.Index - ctx->generic_output_range.array_id, ctx->outputs[j].is_int ? "" : swizzle); 3021 else 3022 snprintf(srcs[i], 255, "%s(%soblk%s.%s%d[%d]%s)", get_string(srcstypeprefix), prefix, blkarray, get_stage_output_name_prefix(ctx->prog_type), ctx->generic_output_range.first, src->Register.Index - ctx->generic_output_range.array_id, ctx->outputs[j].is_int ? "" : swizzle); 3023 } else if (ctx->outputs[j].name == TGSI_SEMANTIC_PATCH && 3024 ctx_indirect_outputs(ctx)) { 3025 if (src->Register.Indirect) 3026 snprintf(srcs[i], 255, "%s(%s%sp%d[addr%d + %d]%s)", get_string(srcstypeprefix), prefix, get_stage_output_name_prefix(ctx->prog_type), ctx->patch_output_range.first, src->Indirect.Index, src->Register.Index - ctx->patch_output_range.array_id, ctx->outputs[j].is_int ? "" : swizzle); 3027 else 3028 snprintf(srcs[i], 255, "%s(%s%sp%d[%d]%s)", get_string(srcstypeprefix), prefix, get_stage_output_name_prefix(ctx->prog_type), ctx->patch_output_range.first, src->Register.Index - ctx->patch_output_range.array_id, ctx->outputs[j].is_int ? "" : swizzle); 3029 } else { 3030 snprintf(srcs[i], 255, "%s(%s%s%s%s)", get_string(srcstypeprefix), prefix, ctx->outputs[j].glsl_name, arrayname, ctx->outputs[j].is_int ? "" : swizzle); 3031 } 3032 } 3033 } 3034 } else if (src->Register.File == TGSI_FILE_TEMPORARY) { 3035 struct vrend_temp_range *range = find_temp_range(ctx, src->Register.Index); 3036 if (!range) 3037 return FALSE; 3038 if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) { 3039 stprefix = true; 3040 stypeprefix = FLOAT_BITS_TO_INT; 3041 } 3042 3043 if (src->Register.Indirect) { 3044 assert(src->Indirect.File == TGSI_FILE_ADDRESS); 3045 snprintf(srcs[i], 255, "%s%c%stemp%d[addr%d + %d]%s%c", get_string(stypeprefix), stprefix ? '(' : ' ', prefix, range->first, src->Indirect.Index, src->Register.Index - range->first, swizzle, stprefix ? ')' : ' '); 3046 } else 3047 snprintf(srcs[i], 255, "%s%c%stemp%d[%d]%s%c", get_string(stypeprefix), stprefix ? '(' : ' ', prefix, range->first, src->Register.Index - range->first, swizzle, stprefix ? ')' : ' '); 3048 } else if (src->Register.File == TGSI_FILE_CONSTANT) { 3049 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 3050 int dim = 0; 3051 if (src->Register.Dimension && src->Dimension.Index != 0) { 3052 dim = src->Dimension.Index; 3053 if (src->Dimension.Indirect) { 3054 assert(src->DimIndirect.File == TGSI_FILE_ADDRESS); 3055 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3056 if (src->Register.Indirect) { 3057 assert(src->Indirect.File == TGSI_FILE_ADDRESS); 3058 snprintf(srcs[i], 255, "%s(%s%suboarr[addr%d].ubocontents[addr%d + %d]%s)", get_string(stypeprefix), prefix, cname, src->DimIndirect.Index, src->Indirect.Index, src->Register.Index, swizzle); 3059 } else 3060 snprintf(srcs[i], 255, "%s(%s%suboarr[addr%d].ubocontents[%d]%s)", get_string(stypeprefix), prefix, cname, src->DimIndirect.Index, src->Register.Index, swizzle); 3061 } else { 3062 if (ctx->info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT)) { 3063 if (src->Register.Indirect) { 3064 snprintf(srcs[i], 255, "%s(%s%suboarr[%d].ubocontents[addr%d + %d]%s)", get_string(stypeprefix), prefix, cname, dim - ctx->ubo_base, src->Indirect.Index, src->Register.Index, swizzle); 3065 } else 3066 snprintf(srcs[i], 255, "%s(%s%suboarr[%d].ubocontents[%d]%s)", get_string(stypeprefix), prefix, cname, dim - ctx->ubo_base, src->Register.Index, swizzle); 3067 } else { 3068 if (src->Register.Indirect) { 3069 snprintf(srcs[i], 255, "%s(%s%subo%dcontents[addr0 + %d]%s)", get_string(stypeprefix), prefix, cname, dim, src->Register.Index, swizzle); 3070 } else 3071 snprintf(srcs[i], 255, "%s(%s%subo%dcontents[%d]%s)", get_string(stypeprefix), prefix, cname, dim, src->Register.Index, swizzle); 3072 } 3073 } 3074 } else { 3075 enum vrend_type_qualifier csp = TYPE_CONVERSION_NONE; 3076 ctx->shader_req_bits |= SHADER_REQ_INTS; 3077 if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) 3078 csp = IVEC4; 3079 else if (stype == TGSI_TYPE_FLOAT || stype == TGSI_TYPE_UNTYPED) 3080 csp = UINT_BITS_TO_FLOAT; 3081 else if (stype == TGSI_TYPE_SIGNED) 3082 csp = IVEC4; 3083 3084 if (src->Register.Indirect) { 3085 snprintf(srcs[i], 255, "%s%s(%sconst%d[addr0 + %d]%s)", prefix, get_string(csp), cname, dim, src->Register.Index, swizzle); 3086 } else 3087 snprintf(srcs[i], 255, "%s%s(%sconst%d[%d]%s)", prefix, get_string(csp), cname, dim, src->Register.Index, swizzle); 3088 } 3089 } else if (src->Register.File == TGSI_FILE_SAMPLER) { 3090 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 3091 if (ctx->info.indirect_files & (1 << TGSI_FILE_SAMPLER)) { 3092 int basearrayidx = lookup_sampler_array(ctx, src->Register.Index); 3093 if (src->Register.Indirect) { 3094 snprintf(srcs[i], 255, "%ssamp%d[addr%d+%d]%s", cname, basearrayidx, src->Indirect.Index, src->Register.Index - basearrayidx, swizzle); 3095 } else { 3096 snprintf(srcs[i], 255, "%ssamp%d[%d]%s", cname, basearrayidx, src->Register.Index - basearrayidx, swizzle); 3097 } 3098 } else { 3099 snprintf(srcs[i], 255, "%ssamp%d%s", cname, src->Register.Index, swizzle); 3100 } 3101 sinfo->sreg_index = src->Register.Index; 3102 } else if (src->Register.File == TGSI_FILE_IMAGE) { 3103 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 3104 if (ctx->info.indirect_files & (1 << TGSI_FILE_IMAGE)) { 3105 int basearrayidx = lookup_image_array(ctx, src->Register.Index); 3106 if (src->Register.Indirect) { 3107 assert(src->Indirect.File == TGSI_FILE_ADDRESS); 3108 snprintf(srcs[i], 255, "%simg%d[addr%d + %d]", cname, basearrayidx, src->Indirect.Index, src->Register.Index - basearrayidx); 3109 } else 3110 snprintf(srcs[i], 255, "%simg%d[%d]", cname, basearrayidx, src->Register.Index - basearrayidx); 3111 } else 3112 snprintf(srcs[i], 255, "%simg%d%s", cname, src->Register.Index, swizzle); 3113 sinfo->sreg_index = src->Register.Index; 3114 } else if (src->Register.File == TGSI_FILE_BUFFER) { 3115 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 3116 if (ctx->info.indirect_files & (1 << TGSI_FILE_BUFFER)) { 3117 bool atomic_ssbo = ctx->ssbo_atomic_mask & (1 << src->Register.Index); 3118 const char *atomic_str = atomic_ssbo ? "atomic" : ""; 3119 int base = atomic_ssbo ? ctx->ssbo_atomic_array_base : ctx->ssbo_array_base; 3120 if (src->Register.Indirect) { 3121 snprintf(srcs[i], 255, "%sssboarr%s[addr%d+%d].%sssbocontents%d%s", cname, atomic_str, src->Indirect.Index, src->Register.Index - base, cname, base, swizzle); 3122 } else { 3123 snprintf(srcs[i], 255, "%sssboarr%s[%d].%sssbocontents%d%s", cname, atomic_str, src->Register.Index - base, cname, base, swizzle); 3124 } 3125 } else { 3126 snprintf(srcs[i], 255, "%sssbocontents%d%s", cname, src->Register.Index, swizzle); 3127 } 3128 sinfo->sreg_index = src->Register.Index; 3129 } else if (src->Register.File == TGSI_FILE_MEMORY) { 3130 snprintf(srcs[i], 255, "values"); 3131 sinfo->sreg_index = src->Register.Index; 3132 } else if (src->Register.File == TGSI_FILE_IMMEDIATE) { 3133 if (src->Register.Index >= (int)ARRAY_SIZE(ctx->imm)) { 3134 fprintf(stderr, "Immediate exceeded, max is %lu\n", ARRAY_SIZE(ctx->imm)); 3135 return false; 3136 } 3137 struct immed *imd = &ctx->imm[src->Register.Index]; 3138 int idx = src->Register.SwizzleX; 3139 char temp[48]; 3140 enum vrend_type_qualifier vtype = VEC4; 3141 enum vrend_type_qualifier imm_stypeprefix = stypeprefix; 3142 3143 if ((inst->Instruction.Opcode == TGSI_OPCODE_TG4 && i == 1) || 3144 (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1)) 3145 stype = TGSI_TYPE_SIGNED; 3146 3147 if (imd->type == TGSI_IMM_UINT32 || imd->type == TGSI_IMM_INT32) { 3148 if (imd->type == TGSI_IMM_UINT32) 3149 vtype = UVEC4; 3150 else 3151 vtype = IVEC4; 3152 3153 if (stype == TGSI_TYPE_UNSIGNED && imd->type == TGSI_IMM_INT32) 3154 imm_stypeprefix = UVEC4; 3155 else if (stype == TGSI_TYPE_SIGNED && imd->type == TGSI_IMM_UINT32) 3156 imm_stypeprefix = IVEC4; 3157 else if (stype == TGSI_TYPE_FLOAT || stype == TGSI_TYPE_UNTYPED) { 3158 if (imd->type == TGSI_IMM_INT32) 3159 imm_stypeprefix = INT_BITS_TO_FLOAT; 3160 else 3161 imm_stypeprefix = UINT_BITS_TO_FLOAT; 3162 } else if (stype == TGSI_TYPE_UNSIGNED || stype == TGSI_TYPE_SIGNED) 3163 imm_stypeprefix = TYPE_CONVERSION_NONE; 3164 } else if (imd->type == TGSI_IMM_FLOAT64) { 3165 vtype = UVEC4; 3166 if (stype == TGSI_TYPE_DOUBLE) 3167 imm_stypeprefix = TYPE_CONVERSION_NONE; 3168 else 3169 imm_stypeprefix = UINT_BITS_TO_FLOAT; 3170 } 3171 3172 /* build up a vec4 of immediates */ 3173 snprintf(srcs[i], 255, "%s(%s%s(", get_string(imm_stypeprefix), prefix, get_string(vtype)); 3174 for (uint32_t j = 0; j < 4; j++) { 3175 if (j == 0) 3176 idx = src->Register.SwizzleX; 3177 else if (j == 1) 3178 idx = src->Register.SwizzleY; 3179 else if (j == 2) 3180 idx = src->Register.SwizzleZ; 3181 else if (j == 3) 3182 idx = src->Register.SwizzleW; 3183 3184 if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && i == 1 && j == 0) { 3185 if (imd->val[idx].ui > 0) { 3186 sinfo->tg4_has_component = true; 3187 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3188 } 3189 } 3190 3191 switch (imd->type) { 3192 case TGSI_IMM_FLOAT32: 3193 if (isinf(imd->val[idx].f) || isnan(imd->val[idx].f)) { 3194 ctx->shader_req_bits |= SHADER_REQ_INTS; 3195 snprintf(temp, 48, "uintBitsToFloat(%uU)", imd->val[idx].ui); 3196 } else 3197 snprintf(temp, 25, "%.8g", imd->val[idx].f); 3198 break; 3199 case TGSI_IMM_UINT32: 3200 snprintf(temp, 25, "%uU", imd->val[idx].ui); 3201 break; 3202 case TGSI_IMM_INT32: 3203 snprintf(temp, 25, "%d", imd->val[idx].i); 3204 break; 3205 case TGSI_IMM_FLOAT64: 3206 snprintf(temp, 48, "%uU", imd->val[idx].ui); 3207 break; 3208 default: 3209 fprintf(stderr, "unhandled imm type: %x\n", imd->type); 3210 return false; 3211 } 3212 strncat(srcs[i], temp, 255); 3213 if (j < 3) 3214 strcat(srcs[i], ","); 3215 else { 3216 snprintf(temp, 4, "))%c", isfloatabsolute ? ')' : 0); 3217 strncat(srcs[i], temp, 255); 3218 } 3219 } 3220 } else if (src->Register.File == TGSI_FILE_SYSTEM_VALUE) { 3221 for (uint32_t j = 0; j < ctx->num_system_values; j++) 3222 if (ctx->system_values[j].first == src->Register.Index) { 3223 if (ctx->system_values[j].name == TGSI_SEMANTIC_VERTEXID || 3224 ctx->system_values[j].name == TGSI_SEMANTIC_INSTANCEID || 3225 ctx->system_values[j].name == TGSI_SEMANTIC_PRIMID || 3226 ctx->system_values[j].name == TGSI_SEMANTIC_VERTICESIN || 3227 ctx->system_values[j].name == TGSI_SEMANTIC_INVOCATIONID || 3228 ctx->system_values[j].name == TGSI_SEMANTIC_SAMPLEID) { 3229 if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) 3230 snprintf(srcs[i], 255, "ivec4(%s)", ctx->system_values[j].glsl_name); 3231 else 3232 snprintf(srcs[i], 255, "%s(vec4(intBitsToFloat(%s)))", get_string(stypeprefix), ctx->system_values[j].glsl_name); 3233 } else if (ctx->system_values[j].name == TGSI_SEMANTIC_HELPER_INVOCATION) { 3234 snprintf(srcs[i], 255, "uvec4(%s)", ctx->system_values[j].glsl_name); 3235 } else if (ctx->system_values[j].name == TGSI_SEMANTIC_TESSINNER || 3236 ctx->system_values[j].name == TGSI_SEMANTIC_TESSOUTER) { 3237 snprintf(srcs[i], 255, "%s(vec4(%s[%d], %s[%d], %s[%d], %s[%d]))", 3238 prefix, 3239 ctx->system_values[j].glsl_name, src->Register.SwizzleX, 3240 ctx->system_values[j].glsl_name, src->Register.SwizzleY, 3241 ctx->system_values[j].glsl_name, src->Register.SwizzleZ, 3242 ctx->system_values[j].glsl_name, src->Register.SwizzleW); 3243 } else if (ctx->system_values[j].name == TGSI_SEMANTIC_SAMPLEPOS || 3244 ctx->system_values[j].name == TGSI_SEMANTIC_TESSCOORD) { 3245 snprintf(srcs[i], 255, "%s(vec4(%s.%c, %s.%c, %s.%c, %s.%c))", 3246 prefix, 3247 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleX), 3248 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleY), 3249 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleZ), 3250 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleW)); 3251 } else if (ctx->system_values[j].name == TGSI_SEMANTIC_GRID_SIZE || 3252 ctx->system_values[j].name == TGSI_SEMANTIC_THREAD_ID || 3253 ctx->system_values[j].name == TGSI_SEMANTIC_BLOCK_ID) { 3254 snprintf(srcs[i], 255, "uvec4(%s.%c, %s.%c, %s.%c, %s.%c)", 3255 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleX), 3256 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleY), 3257 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleZ), 3258 ctx->system_values[j].glsl_name, get_swiz_char(src->Register.SwizzleW)); 3259 sinfo->override_no_cast[i] = true; 3260 } else if (ctx->system_values[j].name == TGSI_SEMANTIC_SAMPLEMASK) { 3261 snprintf(srcs[i], 255, "ivec4(%s, %s, %s, %s)", 3262 src->Register.SwizzleX == TGSI_SWIZZLE_X ? ctx->system_values[j].glsl_name : "0", 3263 src->Register.SwizzleY == TGSI_SWIZZLE_X ? ctx->system_values[j].glsl_name : "0", 3264 src->Register.SwizzleZ == TGSI_SWIZZLE_X ? ctx->system_values[j].glsl_name : "0", 3265 src->Register.SwizzleW == TGSI_SWIZZLE_X ? ctx->system_values[j].glsl_name : "0"); 3266 } else 3267 snprintf(srcs[i], 255, "%s%s", prefix, ctx->system_values[j].glsl_name); 3268 sinfo->override_no_wm[i] = ctx->system_values[j].override_no_wm; 3269 break; 3270 } 3271 } 3272 3273 if (stype == TGSI_TYPE_DOUBLE) { 3274 boolean isabsolute = src->Register.Absolute; 3275 char buf[512]; 3276 strcpy(fp64_src, srcs[i]); 3277 snprintf(srcs[i], 255, "fp64_src[%d]", i); 3278 snprintf(buf, 255, "%s.x = %spackDouble2x32(uvec2(%s%s))%s;\n", srcs[i], isabsolute ? "abs(" : "", fp64_src, swizzle, isabsolute ? ")" : ""); 3279 EMIT_BUF_WITH_RET(ctx, buf); 3280 } 3281 } 3282 3283 return 0; 3284 } 3285 3286 static boolean 3287 iter_instruction(struct tgsi_iterate_context *iter, 3288 struct tgsi_full_instruction *inst) 3289 { 3290 struct dump_ctx *ctx = (struct dump_ctx *)iter; 3291 struct dest_info dinfo = { 0 }; 3292 struct source_info sinfo = { 0 }; 3293 char srcs[4][255], dsts[3][255], buf[512]; 3294 char fp64_dsts[3][255]; 3295 uint instno = ctx->instno++; 3296 char writemask[6] = {0}; 3297 char *sret; 3298 int ret; 3299 char src_swizzle0[10]; 3300 3301 sinfo.svec4 = VEC4; 3302 3303 if (ctx->prog_type == -1) 3304 ctx->prog_type = iter->processor.Processor; 3305 3306 if (instno == 0) { 3307 sret = add_str_to_glsl_main(ctx, "void main(void)\n{\n"); 3308 if (!sret) 3309 return FALSE; 3310 if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 3311 ret = emit_color_select(ctx); 3312 if (ret) 3313 return FALSE; 3314 } 3315 if (ctx->so) 3316 prepare_so_movs(ctx); 3317 } 3318 3319 ret = get_destination_info(ctx, inst, &dinfo, dsts, fp64_dsts, writemask); 3320 if (ret) 3321 return FALSE; 3322 3323 ret = get_source_info(ctx, inst, &sinfo, srcs, src_swizzle0); 3324 if (ret) 3325 return FALSE; 3326 3327 switch (inst->Instruction.Opcode) { 3328 case TGSI_OPCODE_SQRT: 3329 case TGSI_OPCODE_DSQRT: 3330 snprintf(buf, 255, "%s = sqrt(vec4(%s))%s;\n", dsts[0], srcs[0], writemask); 3331 EMIT_BUF_WITH_RET(ctx, buf); 3332 break; 3333 case TGSI_OPCODE_LRP: 3334 snprintf(buf, 255, "%s = mix(vec4(%s), vec4(%s), vec4(%s))%s;\n", dsts[0], srcs[2], srcs[1], srcs[0], writemask); 3335 EMIT_BUF_WITH_RET(ctx, buf); 3336 break; 3337 case TGSI_OPCODE_DP2: 3338 snprintf(buf, 255, "%s = %s(dot(vec2(%s), vec2(%s)));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1]); 3339 EMIT_BUF_WITH_RET(ctx, buf); 3340 break; 3341 case TGSI_OPCODE_DP3: 3342 snprintf(buf, 255, "%s = %s(dot(vec3(%s), vec3(%s)));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1]); 3343 EMIT_BUF_WITH_RET(ctx, buf); 3344 break; 3345 case TGSI_OPCODE_DP4: 3346 snprintf(buf, 255, "%s = %s(dot(vec4(%s), vec4(%s)));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1]); 3347 EMIT_BUF_WITH_RET(ctx, buf); 3348 break; 3349 case TGSI_OPCODE_DPH: 3350 snprintf(buf, 255, "%s = %s(dot(vec4(vec3(%s), 1.0), vec4(%s)));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1]); 3351 EMIT_BUF_WITH_RET(ctx, buf); 3352 break; 3353 case TGSI_OPCODE_MAX: 3354 case TGSI_OPCODE_DMAX: 3355 case TGSI_OPCODE_IMAX: 3356 case TGSI_OPCODE_UMAX: 3357 snprintf(buf, 255, "%s = %s(%s(max(%s, %s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1]); 3358 EMIT_BUF_WITH_RET(ctx, buf); 3359 break; 3360 case TGSI_OPCODE_MIN: 3361 case TGSI_OPCODE_DMIN: 3362 case TGSI_OPCODE_IMIN: 3363 case TGSI_OPCODE_UMIN: 3364 snprintf(buf, 255, "%s = %s(%s(min(%s, %s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1]); 3365 EMIT_BUF_WITH_RET(ctx, buf); 3366 break; 3367 case TGSI_OPCODE_ABS: 3368 case TGSI_OPCODE_IABS: 3369 case TGSI_OPCODE_DABS: 3370 emit_op1("abs"); 3371 EMIT_BUF_WITH_RET(ctx, buf); 3372 break; 3373 case TGSI_OPCODE_KILL_IF: 3374 snprintf(buf, 255, "if (any(lessThan(%s, vec4(0.0))))\ndiscard;\n", srcs[0]); 3375 EMIT_BUF_WITH_RET(ctx, buf); 3376 break; 3377 case TGSI_OPCODE_IF: 3378 case TGSI_OPCODE_UIF: 3379 snprintf(buf, 255, "if (any(bvec4(%s))) {\n", srcs[0]); 3380 EMIT_BUF_WITH_RET(ctx, buf); 3381 ctx->indent_level++; 3382 break; 3383 case TGSI_OPCODE_ELSE: 3384 snprintf(buf, 255, "} else {\n"); 3385 ctx->indent_level--; 3386 EMIT_BUF_WITH_RET(ctx, buf); 3387 ctx->indent_level++; 3388 break; 3389 case TGSI_OPCODE_ENDIF: 3390 snprintf(buf, 255, "}\n"); 3391 ctx->indent_level--; 3392 EMIT_BUF_WITH_RET(ctx, buf); 3393 break; 3394 case TGSI_OPCODE_KILL: 3395 snprintf(buf, 255, "discard;\n"); 3396 EMIT_BUF_WITH_RET(ctx, buf); 3397 break; 3398 case TGSI_OPCODE_DST: 3399 snprintf(buf, 512, "%s = vec4(1.0, %s.y * %s.y, %s.z, %s.w);\n", dsts[0], 3400 srcs[0], srcs[1], srcs[0], srcs[1]); 3401 EMIT_BUF_WITH_RET(ctx, buf); 3402 break; 3403 case TGSI_OPCODE_LIT: 3404 snprintf(buf, 512, "%s = %s(vec4(1.0, max(%s.x, 0.0), step(0.0, %s.x) * pow(max(0.0, %s.y), clamp(%s.w, -128.0, 128.0)), 1.0)%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[0], srcs[0], srcs[0], writemask); 3405 EMIT_BUF_WITH_RET(ctx, buf); 3406 break; 3407 case TGSI_OPCODE_EX2: 3408 emit_op1("exp2"); 3409 EMIT_BUF_WITH_RET(ctx, buf); 3410 break; 3411 case TGSI_OPCODE_LG2: 3412 emit_op1("log2"); 3413 EMIT_BUF_WITH_RET(ctx, buf); 3414 break; 3415 case TGSI_OPCODE_EXP: 3416 snprintf(buf, 512, "%s = %s(vec4(pow(2.0, floor(%s.x)), %s.x - floor(%s.x), exp2(%s.x), 1.0)%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[0], srcs[0], srcs[0], writemask); 3417 EMIT_BUF_WITH_RET(ctx, buf); 3418 break; 3419 case TGSI_OPCODE_LOG: 3420 snprintf(buf, 512, "%s = %s(vec4(floor(log2(%s.x)), %s.x / pow(2.0, floor(log2(%s.x))), log2(%s.x), 1.0)%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[0], srcs[0], srcs[0], writemask); 3421 EMIT_BUF_WITH_RET(ctx, buf); 3422 break; 3423 case TGSI_OPCODE_COS: 3424 emit_op1("cos"); 3425 EMIT_BUF_WITH_RET(ctx, buf); 3426 break; 3427 case TGSI_OPCODE_SIN: 3428 emit_op1("sin"); 3429 EMIT_BUF_WITH_RET(ctx, buf); 3430 break; 3431 case TGSI_OPCODE_SCS: 3432 snprintf(buf, 255, "%s = %s(vec4(cos(%s.x), sin(%s.x), 0, 1)%s);\n", dsts[0], get_string(dinfo.dstconv), 3433 srcs[0], srcs[0], writemask); 3434 EMIT_BUF_WITH_RET(ctx, buf); 3435 break; 3436 case TGSI_OPCODE_DDX: 3437 emit_op1("dFdx"); 3438 EMIT_BUF_WITH_RET(ctx, buf); 3439 break; 3440 case TGSI_OPCODE_DDY: 3441 emit_op1("dFdy"); 3442 EMIT_BUF_WITH_RET(ctx, buf); 3443 break; 3444 case TGSI_OPCODE_DDX_FINE: 3445 ctx->shader_req_bits |= SHADER_REQ_DERIVATIVE_CONTROL; 3446 emit_op1("dFdxFine"); 3447 EMIT_BUF_WITH_RET(ctx, buf); 3448 break; 3449 case TGSI_OPCODE_DDY_FINE: 3450 ctx->shader_req_bits |= SHADER_REQ_DERIVATIVE_CONTROL; 3451 emit_op1("dFdyFine"); 3452 EMIT_BUF_WITH_RET(ctx, buf); 3453 break; 3454 case TGSI_OPCODE_RCP: 3455 snprintf(buf, 255, "%s = %s(1.0/(%s));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3456 EMIT_BUF_WITH_RET(ctx, buf); 3457 break; 3458 case TGSI_OPCODE_DRCP: 3459 snprintf(buf, 255, "%s = %s(1.0LF/(%s));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3460 EMIT_BUF_WITH_RET(ctx, buf); 3461 break; 3462 case TGSI_OPCODE_FLR: 3463 emit_op1("floor"); 3464 EMIT_BUF_WITH_RET(ctx, buf); 3465 break; 3466 case TGSI_OPCODE_ROUND: 3467 emit_op1("round"); 3468 EMIT_BUF_WITH_RET(ctx, buf); 3469 break; 3470 case TGSI_OPCODE_ISSG: 3471 emit_op1("sign"); 3472 EMIT_BUF_WITH_RET(ctx, buf); 3473 break; 3474 case TGSI_OPCODE_CEIL: 3475 emit_op1("ceil"); 3476 EMIT_BUF_WITH_RET(ctx, buf); 3477 break; 3478 case TGSI_OPCODE_FRC: 3479 case TGSI_OPCODE_DFRAC: 3480 emit_op1("fract"); 3481 EMIT_BUF_WITH_RET(ctx, buf); 3482 break; 3483 case TGSI_OPCODE_TRUNC: 3484 emit_op1("trunc"); 3485 EMIT_BUF_WITH_RET(ctx, buf); 3486 break; 3487 case TGSI_OPCODE_SSG: 3488 emit_op1("sign"); 3489 EMIT_BUF_WITH_RET(ctx, buf); 3490 break; 3491 case TGSI_OPCODE_RSQ: 3492 case TGSI_OPCODE_DRSQ: 3493 snprintf(buf, 255, "%s = %s(inversesqrt(%s.x));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3494 EMIT_BUF_WITH_RET(ctx, buf); 3495 break; 3496 case TGSI_OPCODE_FBFETCH: 3497 case TGSI_OPCODE_MOV: 3498 snprintf(buf, 255, "%s = %s(%s(%s%s));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], sinfo.override_no_wm[0] ? "" : writemask); 3499 EMIT_BUF_WITH_RET(ctx, buf); 3500 break; 3501 case TGSI_OPCODE_ADD: 3502 case TGSI_OPCODE_DADD: 3503 emit_arit_op2("+"); 3504 EMIT_BUF_WITH_RET(ctx, buf); 3505 break; 3506 case TGSI_OPCODE_UADD: 3507 snprintf(buf, 512, "%s = %s(%s(ivec4((uvec4(%s) + uvec4(%s))))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); 3508 EMIT_BUF_WITH_RET(ctx, buf); 3509 break; 3510 case TGSI_OPCODE_SUB: 3511 emit_arit_op2("-"); 3512 EMIT_BUF_WITH_RET(ctx, buf); 3513 break; 3514 case TGSI_OPCODE_MUL: 3515 case TGSI_OPCODE_DMUL: 3516 emit_arit_op2("*"); 3517 EMIT_BUF_WITH_RET(ctx, buf); 3518 break; 3519 case TGSI_OPCODE_DIV: 3520 case TGSI_OPCODE_DDIV: 3521 emit_arit_op2("/"); 3522 EMIT_BUF_WITH_RET(ctx, buf); 3523 break; 3524 case TGSI_OPCODE_UMUL: 3525 snprintf(buf, 512, "%s = %s(%s((uvec4(%s) * uvec4(%s)))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); 3526 EMIT_BUF_WITH_RET(ctx, buf); 3527 break; 3528 case TGSI_OPCODE_UMOD: 3529 snprintf(buf, 255, "%s = %s(%s((uvec4(%s) %% uvec4(%s)))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); 3530 EMIT_BUF_WITH_RET(ctx, buf); 3531 break; 3532 case TGSI_OPCODE_IDIV: 3533 snprintf(buf, 255, "%s = %s(%s((ivec4(%s) / ivec4(%s)))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); 3534 EMIT_BUF_WITH_RET(ctx, buf); 3535 break; 3536 case TGSI_OPCODE_UDIV: 3537 snprintf(buf, 255, "%s = %s(%s((uvec4(%s) / uvec4(%s)))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); 3538 EMIT_BUF_WITH_RET(ctx, buf); 3539 break; 3540 case TGSI_OPCODE_ISHR: 3541 case TGSI_OPCODE_USHR: 3542 emit_arit_op2(">>"); 3543 EMIT_BUF_WITH_RET(ctx, buf); 3544 break; 3545 case TGSI_OPCODE_SHL: 3546 emit_arit_op2("<<"); 3547 EMIT_BUF_WITH_RET(ctx, buf); 3548 break; 3549 case TGSI_OPCODE_MAD: 3550 snprintf(buf, 255, "%s = %s((%s * %s + %s)%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1], srcs[2], writemask); 3551 EMIT_BUF_WITH_RET(ctx, buf); 3552 break; 3553 case TGSI_OPCODE_UMAD: 3554 case TGSI_OPCODE_DMAD: 3555 snprintf(buf, 512, "%s = %s(%s((%s * %s + %s)%s));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], srcs[2], writemask); 3556 EMIT_BUF_WITH_RET(ctx, buf); 3557 break; 3558 case TGSI_OPCODE_OR: 3559 emit_arit_op2("|"); 3560 EMIT_BUF_WITH_RET(ctx, buf); 3561 break; 3562 case TGSI_OPCODE_AND: 3563 emit_arit_op2("&"); 3564 EMIT_BUF_WITH_RET(ctx, buf); 3565 break; 3566 case TGSI_OPCODE_XOR: 3567 emit_arit_op2("^"); 3568 EMIT_BUF_WITH_RET(ctx, buf); 3569 break; 3570 case TGSI_OPCODE_MOD: 3571 emit_arit_op2("%"); 3572 EMIT_BUF_WITH_RET(ctx, buf); 3573 break; 3574 case TGSI_OPCODE_TEX: 3575 case TGSI_OPCODE_TEX2: 3576 case TGSI_OPCODE_TXB: 3577 case TGSI_OPCODE_TXL: 3578 case TGSI_OPCODE_TXB2: 3579 case TGSI_OPCODE_TXL2: 3580 case TGSI_OPCODE_TXD: 3581 case TGSI_OPCODE_TXF: 3582 case TGSI_OPCODE_TG4: 3583 case TGSI_OPCODE_TXP: 3584 case TGSI_OPCODE_LODQ: 3585 ret = translate_tex(ctx, inst, &sinfo, &dinfo, srcs, dsts, writemask); 3586 if (ret) 3587 return FALSE; 3588 break; 3589 case TGSI_OPCODE_TXQ: 3590 ret = emit_txq(ctx, inst, sinfo.sreg_index, srcs, dsts, writemask); 3591 if (ret) 3592 return FALSE; 3593 break; 3594 case TGSI_OPCODE_TXQS: 3595 ret = emit_txqs(ctx, inst, sinfo.sreg_index, srcs, dsts); 3596 if (ret) 3597 return FALSE; 3598 break; 3599 case TGSI_OPCODE_I2F: 3600 snprintf(buf, 255, "%s = %s(ivec4(%s)%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0], writemask); 3601 EMIT_BUF_WITH_RET(ctx, buf); 3602 break; 3603 case TGSI_OPCODE_I2D: 3604 snprintf(buf, 255, "%s = %s(ivec4(%s));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3605 EMIT_BUF_WITH_RET(ctx, buf); 3606 break; 3607 case TGSI_OPCODE_D2F: 3608 snprintf(buf, 255, "%s = %s(%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3609 EMIT_BUF_WITH_RET(ctx, buf); 3610 break; 3611 case TGSI_OPCODE_U2F: 3612 snprintf(buf, 255, "%s = %s(uvec4(%s)%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0], writemask); 3613 EMIT_BUF_WITH_RET(ctx, buf); 3614 break; 3615 case TGSI_OPCODE_U2D: 3616 snprintf(buf, 255, "%s = %s(uvec4(%s));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3617 EMIT_BUF_WITH_RET(ctx, buf); 3618 break; 3619 case TGSI_OPCODE_F2I: 3620 snprintf(buf, 255, "%s = %s(%s(ivec4(%s))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], writemask); 3621 EMIT_BUF_WITH_RET(ctx, buf); 3622 break; 3623 case TGSI_OPCODE_D2I: 3624 snprintf(buf, 255, "%s = %s(%s(%s(%s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), get_string(dinfo.idstconv), srcs[0]); 3625 EMIT_BUF_WITH_RET(ctx, buf); 3626 break; 3627 case TGSI_OPCODE_F2U: 3628 snprintf(buf, 255, "%s = %s(%s(uvec4(%s))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], writemask); 3629 EMIT_BUF_WITH_RET(ctx, buf); 3630 break; 3631 case TGSI_OPCODE_D2U: 3632 snprintf(buf, 255, "%s = %s(%s(%s(%s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), get_string(dinfo.udstconv), srcs[0]); 3633 EMIT_BUF_WITH_RET(ctx, buf); 3634 break; 3635 case TGSI_OPCODE_F2D: 3636 snprintf(buf, 255, "%s = %s(%s(%s));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0]); 3637 EMIT_BUF_WITH_RET(ctx, buf); 3638 break; 3639 case TGSI_OPCODE_NOT: 3640 snprintf(buf, 255, "%s = %s(uintBitsToFloat(~(uvec4(%s))));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3641 EMIT_BUF_WITH_RET(ctx, buf); 3642 break; 3643 case TGSI_OPCODE_INEG: 3644 snprintf(buf, 255, "%s = %s(intBitsToFloat(-(ivec4(%s))));\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3645 EMIT_BUF_WITH_RET(ctx, buf); 3646 break; 3647 case TGSI_OPCODE_DNEG: 3648 snprintf(buf, 255, "%s = %s(-%s);\n", dsts[0], get_string(dinfo.dstconv), srcs[0]); 3649 EMIT_BUF_WITH_RET(ctx, buf); 3650 break; 3651 case TGSI_OPCODE_SEQ: 3652 emit_compare("equal"); 3653 EMIT_BUF_WITH_RET(ctx, buf); 3654 break; 3655 case TGSI_OPCODE_USEQ: 3656 case TGSI_OPCODE_FSEQ: 3657 case TGSI_OPCODE_DSEQ: 3658 if (inst->Instruction.Opcode == TGSI_OPCODE_DSEQ) 3659 strcpy(writemask, ".x"); 3660 emit_ucompare("equal"); 3661 EMIT_BUF_WITH_RET(ctx, buf); 3662 break; 3663 case TGSI_OPCODE_SLT: 3664 emit_compare("lessThan"); 3665 EMIT_BUF_WITH_RET(ctx, buf); 3666 break; 3667 case TGSI_OPCODE_ISLT: 3668 case TGSI_OPCODE_USLT: 3669 case TGSI_OPCODE_FSLT: 3670 case TGSI_OPCODE_DSLT: 3671 if (inst->Instruction.Opcode == TGSI_OPCODE_DSLT) 3672 strcpy(writemask, ".x"); 3673 emit_ucompare("lessThan"); 3674 EMIT_BUF_WITH_RET(ctx, buf); 3675 break; 3676 case TGSI_OPCODE_SNE: 3677 emit_compare("notEqual"); 3678 EMIT_BUF_WITH_RET(ctx, buf); 3679 break; 3680 case TGSI_OPCODE_USNE: 3681 case TGSI_OPCODE_FSNE: 3682 case TGSI_OPCODE_DSNE: 3683 if (inst->Instruction.Opcode == TGSI_OPCODE_DSNE) 3684 strcpy(writemask, ".x"); 3685 emit_ucompare("notEqual"); 3686 EMIT_BUF_WITH_RET(ctx, buf); 3687 break; 3688 case TGSI_OPCODE_SGE: 3689 emit_compare("greaterThanEqual"); 3690 EMIT_BUF_WITH_RET(ctx, buf); 3691 break; 3692 case TGSI_OPCODE_ISGE: 3693 case TGSI_OPCODE_USGE: 3694 case TGSI_OPCODE_FSGE: 3695 case TGSI_OPCODE_DSGE: 3696 if (inst->Instruction.Opcode == TGSI_OPCODE_DSGE) 3697 strcpy(writemask, ".x"); 3698 emit_ucompare("greaterThanEqual"); 3699 EMIT_BUF_WITH_RET(ctx, buf); 3700 break; 3701 case TGSI_OPCODE_POW: 3702 snprintf(buf, 255, "%s = %s(pow(%s, %s));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1]); 3703 EMIT_BUF_WITH_RET(ctx, buf); 3704 break; 3705 case TGSI_OPCODE_CMP: 3706 snprintf(buf, 255, "%s = mix(%s, %s, greaterThanEqual(%s, vec4(0.0)))%s;\n", dsts[0], srcs[1], srcs[2], srcs[0], writemask); 3707 EMIT_BUF_WITH_RET(ctx, buf); 3708 break; 3709 case TGSI_OPCODE_UCMP: 3710 snprintf(buf, 512, "%s = mix(%s, %s, notEqual(floatBitsToUint(%s), uvec4(0.0)))%s;\n", dsts[0], srcs[2], srcs[1], srcs[0], writemask); 3711 EMIT_BUF_WITH_RET(ctx, buf); 3712 break; 3713 case TGSI_OPCODE_END: 3714 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { 3715 if (handle_vertex_proc_exit(ctx) == FALSE) 3716 return FALSE; 3717 } else if (iter->processor.Processor == TGSI_PROCESSOR_TESS_CTRL) { 3718 ret = emit_clip_dist_movs(ctx); 3719 if (ret) 3720 return FALSE; 3721 } else if (iter->processor.Processor == TGSI_PROCESSOR_TESS_EVAL) { 3722 if (ctx->so && !ctx->key->gs_present) 3723 if (emit_so_movs(ctx)) 3724 return FALSE; 3725 ret = emit_clip_dist_movs(ctx); 3726 if (ret) 3727 return FALSE; 3728 if (!ctx->key->gs_present) { 3729 ret = emit_prescale(ctx); 3730 if (ret) 3731 return FALSE; 3732 } 3733 } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 3734 if (handle_fragment_proc_exit(ctx) == FALSE) 3735 return FALSE; 3736 } 3737 sret = add_str_to_glsl_main(ctx, "}\n"); 3738 if (!sret) 3739 return FALSE; 3740 break; 3741 case TGSI_OPCODE_RET: 3742 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { 3743 if (handle_vertex_proc_exit(ctx) == FALSE) 3744 return FALSE; 3745 } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { 3746 if (handle_fragment_proc_exit(ctx) == FALSE) 3747 return FALSE; 3748 } 3749 EMIT_BUF_WITH_RET(ctx, "return;\n"); 3750 break; 3751 case TGSI_OPCODE_ARL: 3752 snprintf(buf, 255, "%s = int(floor(%s)%s);\n", dsts[0], srcs[0], writemask); 3753 EMIT_BUF_WITH_RET(ctx, buf); 3754 break; 3755 case TGSI_OPCODE_UARL: 3756 snprintf(buf, 255, "%s = int(%s);\n", dsts[0], srcs[0]); 3757 EMIT_BUF_WITH_RET(ctx, buf); 3758 break; 3759 case TGSI_OPCODE_XPD: 3760 snprintf(buf, 255, "%s = %s(cross(vec3(%s), vec3(%s)));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1]); 3761 EMIT_BUF_WITH_RET(ctx, buf); 3762 break; 3763 case TGSI_OPCODE_BGNLOOP: 3764 snprintf(buf, 255, "do {\n"); 3765 EMIT_BUF_WITH_RET(ctx, buf); 3766 ctx->indent_level++; 3767 break; 3768 case TGSI_OPCODE_ENDLOOP: 3769 ctx->indent_level--; 3770 snprintf(buf, 255, "} while(true);\n"); 3771 EMIT_BUF_WITH_RET(ctx, buf); 3772 break; 3773 case TGSI_OPCODE_BRK: 3774 snprintf(buf, 255, "break;\n"); 3775 EMIT_BUF_WITH_RET(ctx, buf); 3776 break; 3777 case TGSI_OPCODE_EMIT: { 3778 struct immed *imd = &ctx->imm[(inst->Src[0].Register.Index)]; 3779 if (ctx->so && ctx->key->gs_present) { 3780 emit_so_movs(ctx); 3781 } 3782 ret = emit_clip_dist_movs(ctx); 3783 if (ret) 3784 return FALSE; 3785 ret = emit_prescale(ctx); 3786 if (ret) 3787 return FALSE; 3788 if (imd->val[inst->Src[0].Register.SwizzleX].ui > 0) { 3789 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3790 snprintf(buf, 255, "EmitStreamVertex(%d);\n", imd->val[inst->Src[0].Register.SwizzleX].ui); 3791 } else 3792 snprintf(buf, 255, "EmitVertex();\n"); 3793 EMIT_BUF_WITH_RET(ctx, buf); 3794 break; 3795 } 3796 case TGSI_OPCODE_ENDPRIM: { 3797 struct immed *imd = &ctx->imm[(inst->Src[0].Register.Index)]; 3798 if (imd->val[inst->Src[0].Register.SwizzleX].ui > 0) { 3799 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3800 snprintf(buf, 255, "EndStreamPrimitive(%d);\n", imd->val[inst->Src[0].Register.SwizzleX].ui); 3801 } else 3802 snprintf(buf, 255, "EndPrimitive();\n"); 3803 EMIT_BUF_WITH_RET(ctx, buf); 3804 break; 3805 } 3806 case TGSI_OPCODE_INTERP_CENTROID: 3807 snprintf(buf, 255, "%s = %s(%s(vec4(interpolateAtCentroid(%s))%s));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], src_swizzle0); 3808 EMIT_BUF_WITH_RET(ctx, buf); 3809 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3810 break; 3811 case TGSI_OPCODE_INTERP_SAMPLE: 3812 snprintf(buf, 255, "%s = %s(%s(vec4(interpolateAtSample(%s, %s.x))%s));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], src_swizzle0); 3813 EMIT_BUF_WITH_RET(ctx, buf); 3814 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3815 break; 3816 case TGSI_OPCODE_INTERP_OFFSET: 3817 snprintf(buf, 255, "%s = %s(%s(vec4(interpolateAtOffset(%s, %s.xy))%s));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], src_swizzle0); 3818 EMIT_BUF_WITH_RET(ctx, buf); 3819 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3820 break; 3821 case TGSI_OPCODE_UMUL_HI: 3822 snprintf(buf, 255, "umulExtended(%s, %s, umul_temp, mul_utemp);\n", srcs[0], srcs[1]); 3823 EMIT_BUF_WITH_RET(ctx, buf); 3824 snprintf(buf, 255, "%s = %s(%s(umul_temp));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix)); 3825 EMIT_BUF_WITH_RET(ctx, buf); 3826 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3827 ctx->write_mul_utemp = true; 3828 break; 3829 case TGSI_OPCODE_IMUL_HI: 3830 snprintf(buf, 255, "imulExtended(%s, %s, imul_temp, mul_itemp);\n", srcs[0], srcs[1]); 3831 EMIT_BUF_WITH_RET(ctx, buf); 3832 snprintf(buf, 255, "%s = %s(%s(imul_temp));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix)); 3833 EMIT_BUF_WITH_RET(ctx, buf); 3834 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3835 ctx->write_mul_itemp = true; 3836 break; 3837 3838 case TGSI_OPCODE_IBFE: 3839 snprintf(buf, 255, "%s = %s(%s(bitfieldExtract(%s, int(%s.x), int(%s.x))));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], srcs[2]); 3840 EMIT_BUF_WITH_RET(ctx, buf); 3841 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3842 break; 3843 case TGSI_OPCODE_UBFE: 3844 snprintf(buf, 255, "%s = %s(%s(bitfieldExtract(%s, int(%s.x), int(%s.x))));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], srcs[2]); 3845 EMIT_BUF_WITH_RET(ctx, buf); 3846 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3847 break; 3848 case TGSI_OPCODE_BFI: 3849 snprintf(buf, 255, "%s = %s(uintBitsToFloat(bitfieldInsert(%s, %s, int(%s), int(%s))));\n", dsts[0], get_string(dinfo.dstconv), srcs[0], srcs[1], srcs[2], srcs[3]); 3850 EMIT_BUF_WITH_RET(ctx, buf); 3851 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3852 break; 3853 case TGSI_OPCODE_BREV: 3854 snprintf(buf, 255, "%s = %s(%s(bitfieldReverse(%s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0]); 3855 EMIT_BUF_WITH_RET(ctx, buf); 3856 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3857 break; 3858 case TGSI_OPCODE_POPC: 3859 snprintf(buf, 255, "%s = %s(%s(bitCount(%s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0]); 3860 EMIT_BUF_WITH_RET(ctx, buf); 3861 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3862 break; 3863 case TGSI_OPCODE_LSB: 3864 snprintf(buf, 255, "%s = %s(%s(findLSB(%s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0]); 3865 EMIT_BUF_WITH_RET(ctx, buf); 3866 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3867 break; 3868 case TGSI_OPCODE_IMSB: 3869 case TGSI_OPCODE_UMSB: 3870 snprintf(buf, 255, "%s = %s(%s(findMSB(%s)));\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0]); 3871 EMIT_BUF_WITH_RET(ctx, buf); 3872 ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; 3873 break; 3874 case TGSI_OPCODE_BARRIER: 3875 snprintf(buf, 255, "barrier();\n"); 3876 EMIT_BUF_WITH_RET(ctx, buf); 3877 break; 3878 case TGSI_OPCODE_MEMBAR: { 3879 struct immed *imd = &ctx->imm[(inst->Src[0].Register.Index)]; 3880 uint32_t val = imd->val[inst->Src[0].Register.SwizzleX].ui; 3881 uint32_t all_val = (TGSI_MEMBAR_SHADER_BUFFER | 3882 TGSI_MEMBAR_ATOMIC_BUFFER | 3883 TGSI_MEMBAR_SHADER_IMAGE | 3884 TGSI_MEMBAR_SHARED); 3885 3886 if (val & TGSI_MEMBAR_THREAD_GROUP) { 3887 snprintf(buf, 255, "groupMemoryBarrier();\n"); 3888 EMIT_BUF_WITH_RET(ctx, buf); 3889 } else { 3890 if ((val & all_val) == all_val) { 3891 snprintf(buf, 255, "memoryBarrier();\n"); 3892 EMIT_BUF_WITH_RET(ctx, buf); 3893 } else { 3894 if (val & TGSI_MEMBAR_SHADER_BUFFER) { 3895 snprintf(buf, 255, "memoryBarrierBuffer();\n"); 3896 EMIT_BUF_WITH_RET(ctx, buf); 3897 } 3898 if (val & TGSI_MEMBAR_ATOMIC_BUFFER) { 3899 snprintf(buf, 255, "memoryBarrierAtomic();\n"); 3900 EMIT_BUF_WITH_RET(ctx, buf); 3901 } 3902 if (val & TGSI_MEMBAR_SHADER_IMAGE) { 3903 snprintf(buf, 255, "memoryBarrierImage();\n"); 3904 EMIT_BUF_WITH_RET(ctx, buf); 3905 } 3906 if (val & TGSI_MEMBAR_SHARED) { 3907 snprintf(buf, 255, "memoryBarrierShared();\n"); 3908 EMIT_BUF_WITH_RET(ctx, buf); 3909 } 3910 } 3911 } 3912 break; 3913 } 3914 case TGSI_OPCODE_STORE: 3915 ret = translate_store(ctx, inst, &sinfo, srcs, dsts); 3916 if (ret) 3917 return FALSE; 3918 break; 3919 case TGSI_OPCODE_LOAD: 3920 ret = translate_load(ctx, inst, &sinfo, &dinfo, srcs, dsts, writemask); 3921 if (ret) 3922 return FALSE; 3923 break; 3924 case TGSI_OPCODE_ATOMUADD: 3925 case TGSI_OPCODE_ATOMXCHG: 3926 case TGSI_OPCODE_ATOMCAS: 3927 case TGSI_OPCODE_ATOMAND: 3928 case TGSI_OPCODE_ATOMOR: 3929 case TGSI_OPCODE_ATOMXOR: 3930 case TGSI_OPCODE_ATOMUMIN: 3931 case TGSI_OPCODE_ATOMUMAX: 3932 case TGSI_OPCODE_ATOMIMIN: 3933 case TGSI_OPCODE_ATOMIMAX: 3934 ret = translate_atomic(ctx, inst, &sinfo, srcs, dsts); 3935 if (ret) 3936 return FALSE; 3937 break; 3938 case TGSI_OPCODE_RESQ: 3939 ret = translate_resq(ctx, inst, srcs, dsts); 3940 if (ret) 3941 return FALSE; 3942 break; 3943 case TGSI_OPCODE_CLOCK: 3944 ctx->shader_req_bits |= SHADER_REQ_SHADER_CLOCK; 3945 snprintf(buf, 255, "%s = uintBitsToFloat(clock2x32ARB());\n", dsts[0]); 3946 EMIT_BUF_WITH_RET(ctx, buf); 3947 break; 3948 default: 3949 fprintf(stderr,"failed to convert opcode %d\n", inst->Instruction.Opcode); 3950 break; 3951 } 3952 3953 for (uint32_t i = 0; i < 1; i++) { 3954 enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode); 3955 if (dtype == TGSI_TYPE_DOUBLE) { 3956 snprintf(buf, 255, "%s = uintBitsToFloat(unpackDouble2x32(%s));\n", fp64_dsts[0], dsts[0]); 3957 EMIT_BUF_WITH_RET(ctx, buf); 3958 } 3959 } 3960 if (inst->Instruction.Saturate) { 3961 snprintf(buf, 255, "%s = clamp(%s, 0.0, 1.0);\n", dsts[0], dsts[0]); 3962 EMIT_BUF_WITH_RET(ctx, buf); 3963 } 3964 return TRUE; 3965 } 3966 3967 static boolean 3968 prolog(struct tgsi_iterate_context *iter) 3969 { 3970 struct dump_ctx *ctx = (struct dump_ctx *)iter; 3971 3972 if (ctx->prog_type == -1) 3973 ctx->prog_type = iter->processor.Processor; 3974 3975 if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX && 3976 ctx->key->gs_present) 3977 require_glsl_ver(ctx, 150); 3978 3979 return TRUE; 3980 } 3981 3982 #define STRCAT_WITH_RET(mainstr, buf) do { \ 3983 (mainstr) = strcat_realloc((mainstr), (buf)); \ 3984 if ((mainstr) == NULL) return NULL; \ 3985 } while(0) 3986 3987 /* reserve space for: "#extension GL_ARB_gpu_shader5 : require\n" */ 3988 #define PAD_GPU_SHADER5(s) \ 3989 STRCAT_WITH_RET(s, " \n") 3990 3991 static char *emit_header(struct dump_ctx *ctx, char *glsl_hdr) 3992 { 3993 if (ctx->cfg->use_gles) { 3994 char buf[32]; 3995 snprintf(buf, sizeof(buf), "#version %d es\n", ctx->cfg->glsl_version); 3996 STRCAT_WITH_RET(glsl_hdr, buf); 3997 if (ctx->shader_req_bits & SHADER_REQ_SAMPLER_MS) 3998 STRCAT_WITH_RET(glsl_hdr, "#extension GL_OES_texture_storage_multisample_2d_array : require\n"); 3999 4000 if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) { 4001 STRCAT_WITH_RET(glsl_hdr, "#extension GL_EXT_geometry_shader : require\n"); 4002 if (ctx->shader_req_bits & SHADER_REQ_PSIZE) 4003 STRCAT_WITH_RET(glsl_hdr, "#extension GL_OES_geometry_point_size : enable\n"); 4004 } 4005 4006 if ((ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || 4007 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL)) { 4008 if (ctx->cfg->glsl_version < 320) 4009 STRCAT_WITH_RET(glsl_hdr, "#extension GL_OES_tessellation_shader : require\n"); 4010 STRCAT_WITH_RET(glsl_hdr, "#extension GL_OES_tessellation_point_size : enable\n"); 4011 } 4012 4013 PAD_GPU_SHADER5(glsl_hdr); 4014 STRCAT_WITH_RET(glsl_hdr, "precision highp float;\n"); 4015 STRCAT_WITH_RET(glsl_hdr, "precision highp int;\n"); 4016 } else { 4017 char buf[128]; 4018 if (ctx->prog_type == TGSI_PROCESSOR_COMPUTE) { 4019 STRCAT_WITH_RET(glsl_hdr, "#version 330\n"); 4020 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_compute_shader : require\n"); 4021 } else { 4022 if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY || 4023 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL || 4024 ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || 4025 ctx->glsl_ver_required == 150) 4026 STRCAT_WITH_RET(glsl_hdr, "#version 150\n"); 4027 else if (ctx->glsl_ver_required == 140) 4028 STRCAT_WITH_RET(glsl_hdr, "#version 140\n"); 4029 else 4030 STRCAT_WITH_RET(glsl_hdr, "#version 130\n"); 4031 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX || 4032 ctx->prog_type == TGSI_PROCESSOR_GEOMETRY || 4033 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) 4034 PAD_GPU_SHADER5(glsl_hdr); 4035 } 4036 4037 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || 4038 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) 4039 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_tessellation_shader : require\n"); 4040 4041 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX && ctx->cfg->use_explicit_locations) 4042 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_explicit_attrib_location : require\n"); 4043 if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && fs_emit_layout(ctx)) 4044 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_fragment_coord_conventions : require\n"); 4045 4046 if (ctx->num_ubo) 4047 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_uniform_buffer_object : require\n"); 4048 4049 if (ctx->num_cull_dist_prop || ctx->key->prev_stage_num_cull_out) 4050 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_cull_distance : require\n"); 4051 if (ctx->ssbo_used_mask) 4052 STRCAT_WITH_RET(glsl_hdr, "#extension GL_ARB_shader_storage_buffer_object : require\n"); 4053 4054 for (uint32_t i = 0; i < ARRAY_SIZE(shader_req_table); i++) { 4055 if (shader_req_table[i].key == SHADER_REQ_SAMPLER_RECT && ctx->glsl_ver_required >= 140) 4056 continue; 4057 4058 if (ctx->shader_req_bits & shader_req_table[i].key) { 4059 snprintf(buf, 128, "#extension %s : require\n", shader_req_table[i].string); 4060 STRCAT_WITH_RET(glsl_hdr, buf); 4061 } 4062 } 4063 } 4064 4065 return glsl_hdr; 4066 } 4067 4068 char vrend_shader_samplerreturnconv(enum tgsi_return_type type) 4069 { 4070 switch (type) { 4071 case TGSI_RETURN_TYPE_SINT: 4072 return 'i'; 4073 case TGSI_RETURN_TYPE_UINT: 4074 return 'u'; 4075 default: 4076 return ' '; 4077 } 4078 } 4079 4080 const char *vrend_shader_samplertypeconv(int sampler_type, int *is_shad) 4081 { 4082 switch (sampler_type) { 4083 case TGSI_TEXTURE_BUFFER: return "Buffer"; 4084 case TGSI_TEXTURE_1D: return "1D"; 4085 case TGSI_TEXTURE_2D: return "2D"; 4086 case TGSI_TEXTURE_3D: return "3D"; 4087 case TGSI_TEXTURE_CUBE: return "Cube"; 4088 case TGSI_TEXTURE_RECT: return "2DRect"; 4089 case TGSI_TEXTURE_SHADOW1D: *is_shad = 1; return "1DShadow"; 4090 case TGSI_TEXTURE_SHADOW2D: *is_shad = 1; return "2DShadow"; 4091 case TGSI_TEXTURE_SHADOWRECT: *is_shad = 1; return "2DRectShadow"; 4092 case TGSI_TEXTURE_1D_ARRAY: return "1DArray"; 4093 case TGSI_TEXTURE_2D_ARRAY: return "2DArray"; 4094 case TGSI_TEXTURE_SHADOW1D_ARRAY: *is_shad = 1; return "1DArrayShadow"; 4095 case TGSI_TEXTURE_SHADOW2D_ARRAY: *is_shad = 1; return "2DArrayShadow"; 4096 case TGSI_TEXTURE_SHADOWCUBE: *is_shad = 1; return "CubeShadow"; 4097 case TGSI_TEXTURE_CUBE_ARRAY: return "CubeArray"; 4098 case TGSI_TEXTURE_SHADOWCUBE_ARRAY: *is_shad = 1; return "CubeArrayShadow"; 4099 case TGSI_TEXTURE_2D_MSAA: return "2DMS"; 4100 case TGSI_TEXTURE_2D_ARRAY_MSAA: return "2DMSArray"; 4101 default: return NULL; 4102 } 4103 } 4104 4105 static const char *get_interp_string(struct vrend_shader_cfg *cfg, int interpolate, bool flatshade) 4106 { 4107 switch (interpolate) { 4108 case TGSI_INTERPOLATE_LINEAR: 4109 if (!cfg->use_gles) 4110 return "noperspective "; 4111 else 4112 return ""; 4113 case TGSI_INTERPOLATE_PERSPECTIVE: 4114 return "smooth "; 4115 case TGSI_INTERPOLATE_CONSTANT: 4116 return "flat "; 4117 case TGSI_INTERPOLATE_COLOR: 4118 if (flatshade) 4119 return "flat "; 4120 /* fallthrough */ 4121 default: 4122 return NULL; 4123 } 4124 } 4125 4126 static const char *get_aux_string(unsigned location) 4127 { 4128 switch (location) { 4129 case TGSI_INTERPOLATE_LOC_CENTER: 4130 default: 4131 return ""; 4132 case TGSI_INTERPOLATE_LOC_CENTROID: 4133 return "centroid "; 4134 case TGSI_INTERPOLATE_LOC_SAMPLE: 4135 return "sample "; 4136 } 4137 } 4138 4139 static void *emit_sampler_decl(struct dump_ctx *ctx, char *glsl_hdr, 4140 uint32_t i, uint32_t range, 4141 const struct vrend_shader_sampler *sampler) 4142 { 4143 char buf[255], ptc; 4144 int is_shad = 0; 4145 const char *sname, *precision, *stc; 4146 4147 sname = tgsi_proc_to_prefix(ctx->prog_type); 4148 4149 precision = (ctx->cfg->use_gles) ? "highp " : " "; 4150 4151 ptc = vrend_shader_samplerreturnconv(sampler->tgsi_sampler_return); 4152 stc = vrend_shader_samplertypeconv(sampler->tgsi_sampler_type, &is_shad); 4153 4154 /* GLES does not support 1D textures -- we use a 2D texture and set the parameter set to 0.5 */ 4155 if (ctx->cfg->use_gles && sampler->tgsi_sampler_type == TGSI_TEXTURE_1D) 4156 snprintf(buf, 255, "uniform highp %csampler2D %ssamp%d;\n", ptc, sname, i); 4157 else if (range) 4158 snprintf(buf, 255, "uniform %s%csampler%s %ssamp%d[%d];\n", precision, ptc, stc, sname, i, range); 4159 else 4160 snprintf(buf, 255, "uniform %s%csampler%s %ssamp%d;\n", precision, ptc, stc, sname, i); 4161 4162 STRCAT_WITH_RET(glsl_hdr, buf); 4163 if (is_shad) { 4164 snprintf(buf, 255, "uniform %svec4 %sshadmask%d;\n", precision, sname, i); 4165 STRCAT_WITH_RET(glsl_hdr, buf); 4166 snprintf(buf, 255, "uniform %svec4 %sshadadd%d;\n", precision, sname, i); 4167 STRCAT_WITH_RET(glsl_hdr, buf); 4168 ctx->shadow_samp_mask |= (1 << i); 4169 } 4170 4171 return glsl_hdr; 4172 } 4173 4174 const char *get_internalformat_string(int virgl_format, enum tgsi_return_type *stype) 4175 { 4176 switch (virgl_format) { 4177 case PIPE_FORMAT_R11G11B10_FLOAT: 4178 *stype = TGSI_RETURN_TYPE_FLOAT; 4179 return "r11f_g11f_b10f"; 4180 case PIPE_FORMAT_R10G10B10A2_UNORM: 4181 *stype = TGSI_RETURN_TYPE_UNORM; 4182 return "rgb10_a2"; 4183 case PIPE_FORMAT_R10G10B10A2_UINT: 4184 *stype = TGSI_RETURN_TYPE_UINT; 4185 return "rgb10_a2ui"; 4186 case PIPE_FORMAT_R8_UNORM: 4187 *stype = TGSI_RETURN_TYPE_UNORM; 4188 return "r8"; 4189 case PIPE_FORMAT_R8_SNORM: 4190 *stype = TGSI_RETURN_TYPE_SNORM; 4191 return "r8_snorm"; 4192 case PIPE_FORMAT_R8_UINT: 4193 *stype = TGSI_RETURN_TYPE_UINT; 4194 return "r8ui"; 4195 case PIPE_FORMAT_R8_SINT: 4196 *stype = TGSI_RETURN_TYPE_SINT; 4197 return "r8i"; 4198 case PIPE_FORMAT_R8G8_UNORM: 4199 *stype = TGSI_RETURN_TYPE_UNORM; 4200 return "rg8"; 4201 case PIPE_FORMAT_R8G8_SNORM: 4202 *stype = TGSI_RETURN_TYPE_SNORM; 4203 return "rg8_snorm"; 4204 case PIPE_FORMAT_R8G8_UINT: 4205 *stype = TGSI_RETURN_TYPE_UINT; 4206 return "rg8ui"; 4207 case PIPE_FORMAT_R8G8_SINT: 4208 *stype = TGSI_RETURN_TYPE_SINT; 4209 return "rg8i"; 4210 case PIPE_FORMAT_R8G8B8A8_UNORM: 4211 *stype = TGSI_RETURN_TYPE_UNORM; 4212 return "rgba8"; 4213 case PIPE_FORMAT_R8G8B8A8_SNORM: 4214 *stype = TGSI_RETURN_TYPE_SNORM; 4215 return "rgba8_snorm"; 4216 case PIPE_FORMAT_R8G8B8A8_UINT: 4217 *stype = TGSI_RETURN_TYPE_UINT; 4218 return "rgba8ui"; 4219 case PIPE_FORMAT_R8G8B8A8_SINT: 4220 *stype = TGSI_RETURN_TYPE_SINT; 4221 return "rgba8i"; 4222 case PIPE_FORMAT_R16_UNORM: 4223 *stype = TGSI_RETURN_TYPE_UNORM; 4224 return "r16"; 4225 case PIPE_FORMAT_R16_SNORM: 4226 *stype = TGSI_RETURN_TYPE_SNORM; 4227 return "r16_snorm"; 4228 case PIPE_FORMAT_R16_UINT: 4229 *stype = TGSI_RETURN_TYPE_UINT; 4230 return "r16ui"; 4231 case PIPE_FORMAT_R16_SINT: 4232 *stype = TGSI_RETURN_TYPE_SINT; 4233 return "r16i"; 4234 case PIPE_FORMAT_R16_FLOAT: 4235 *stype = TGSI_RETURN_TYPE_FLOAT; 4236 return "r16f"; 4237 case PIPE_FORMAT_R16G16_UNORM: 4238 *stype = TGSI_RETURN_TYPE_UNORM; 4239 return "rg16"; 4240 case PIPE_FORMAT_R16G16_SNORM: 4241 *stype = TGSI_RETURN_TYPE_SNORM; 4242 return "rg16_snorm"; 4243 case PIPE_FORMAT_R16G16_UINT: 4244 *stype = TGSI_RETURN_TYPE_UINT; 4245 return "rg16ui"; 4246 case PIPE_FORMAT_R16G16_SINT: 4247 *stype = TGSI_RETURN_TYPE_SINT; 4248 return "rg16i"; 4249 case PIPE_FORMAT_R16G16_FLOAT: 4250 *stype = TGSI_RETURN_TYPE_FLOAT; 4251 return "rg16f"; 4252 case PIPE_FORMAT_R16G16B16A16_UNORM: 4253 *stype = TGSI_RETURN_TYPE_UNORM; 4254 return "rgba16"; 4255 case PIPE_FORMAT_R16G16B16A16_SNORM: 4256 *stype = TGSI_RETURN_TYPE_SNORM; 4257 return "rgba16_snorm"; 4258 case PIPE_FORMAT_R16G16B16A16_FLOAT: 4259 *stype = TGSI_RETURN_TYPE_FLOAT; 4260 return "rgba16f"; 4261 case PIPE_FORMAT_R32_FLOAT: 4262 *stype = TGSI_RETURN_TYPE_FLOAT; 4263 return "r32f"; 4264 case PIPE_FORMAT_R32_UINT: 4265 *stype = TGSI_RETURN_TYPE_UINT; 4266 return "r32ui"; 4267 case PIPE_FORMAT_R32_SINT: 4268 *stype = TGSI_RETURN_TYPE_SINT; 4269 return "r32i"; 4270 case PIPE_FORMAT_R32G32_FLOAT: 4271 *stype = TGSI_RETURN_TYPE_FLOAT; 4272 return "rg32f"; 4273 case PIPE_FORMAT_R32G32_UINT: 4274 *stype = TGSI_RETURN_TYPE_UINT; 4275 return "rg32ui"; 4276 case PIPE_FORMAT_R32G32_SINT: 4277 *stype = TGSI_RETURN_TYPE_SINT; 4278 return "rg32i"; 4279 case PIPE_FORMAT_R32G32B32A32_FLOAT: 4280 *stype = TGSI_RETURN_TYPE_FLOAT; 4281 return "rgba32f"; 4282 case PIPE_FORMAT_R32G32B32A32_UINT: 4283 *stype = TGSI_RETURN_TYPE_UINT; 4284 return "rgba32ui"; 4285 case PIPE_FORMAT_R16G16B16A16_UINT: 4286 *stype = TGSI_RETURN_TYPE_UINT; 4287 return "rgba16ui"; 4288 case PIPE_FORMAT_R16G16B16A16_SINT: 4289 *stype = TGSI_RETURN_TYPE_SINT; 4290 return "rgba16i"; 4291 case PIPE_FORMAT_R32G32B32A32_SINT: 4292 *stype = TGSI_RETURN_TYPE_SINT; 4293 return "rgba32i"; 4294 case PIPE_FORMAT_NONE: 4295 *stype = TGSI_RETURN_TYPE_UNORM; 4296 return ""; 4297 default: 4298 *stype = TGSI_RETURN_TYPE_UNORM; 4299 fprintf(stderr, "illegal format %d\n", virgl_format); 4300 return ""; 4301 } 4302 } 4303 4304 static void *emit_image_decl(const struct dump_ctx *ctx, char *glsl_hdr, 4305 uint32_t i, uint32_t range, 4306 const struct vrend_shader_image *image) 4307 { 4308 char buf[255], ptc; 4309 int is_shad = 0; 4310 const char *sname, *stc, *formatstr; 4311 enum tgsi_return_type itype; 4312 const char *volatile_str = image->vflag ? "volatile " : ""; 4313 const char *precision = ctx->cfg->use_gles ? "highp " : ""; 4314 const char *access = ""; 4315 formatstr = get_internalformat_string(image->decl.Format, &itype); 4316 ptc = vrend_shader_samplerreturnconv(itype); 4317 sname = tgsi_proc_to_prefix(ctx->prog_type); 4318 stc = vrend_shader_samplertypeconv(image->decl.Resource, &is_shad); 4319 4320 if (!image->decl.Writable) 4321 access = "readonly "; 4322 else if (!image->decl.Format) 4323 access = "writeonly "; 4324 4325 if (ctx->cfg->use_gles) { /* TODO: enable on OpenGL 4.2 and up also */ 4326 snprintf(buf, 255, "layout(binding=%d%s%s) ", 4327 i, formatstr[0] != '\0' ? ", " : "", formatstr); 4328 STRCAT_WITH_RET(glsl_hdr, buf); 4329 } else if (formatstr[0] != '\0') { 4330 snprintf(buf, 255, "layout(%s) ", formatstr); 4331 STRCAT_WITH_RET(glsl_hdr, buf); 4332 } 4333 4334 if (range) 4335 snprintf(buf, 255, "%s%suniform %s%cimage%s %simg%d[%d];\n", 4336 access, volatile_str, precision, ptc, stc, sname, i, range); 4337 else 4338 snprintf(buf, 255, "%s%suniform %s%cimage%s %simg%d;\n", 4339 access, volatile_str, precision, ptc, stc, sname, i); 4340 4341 STRCAT_WITH_RET(glsl_hdr, buf); 4342 return glsl_hdr; 4343 } 4344 4345 static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr) 4346 { 4347 uint32_t i; 4348 char buf[255]; 4349 char postfix[8]; 4350 const char *prefix = "", *auxprefix = ""; 4351 bool fcolor_emitted[2], bcolor_emitted[2]; 4352 uint32_t nsamp; 4353 const char *sname = tgsi_proc_to_prefix(ctx->prog_type); 4354 ctx->num_interps = 0; 4355 4356 if (ctx->so && ctx->so->num_outputs >= PIPE_MAX_SO_OUTPUTS) { 4357 fprintf(stderr, "Num outputs exceeded, max is %u\n", PIPE_MAX_SO_OUTPUTS); 4358 return NULL; 4359 } 4360 4361 if (ctx->key->color_two_side) { 4362 fcolor_emitted[0] = fcolor_emitted[1] = false; 4363 bcolor_emitted[0] = bcolor_emitted[1] = false; 4364 } 4365 if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT) { 4366 if (fs_emit_layout(ctx)) { 4367 bool upper_left = !(ctx->fs_coord_origin ^ ctx->key->invert_fs_origin); 4368 char comma = (upper_left && ctx->fs_pixel_center) ? ',' : ' '; 4369 4370 snprintf(buf, 255, "layout(%s%c%s) in vec4 gl_FragCoord;\n", 4371 upper_left ? "origin_upper_left" : "", 4372 comma, 4373 ctx->fs_pixel_center ? "pixel_center_integer" : ""); 4374 STRCAT_WITH_RET(glsl_hdr, buf); 4375 } 4376 if (ctx->early_depth_stencil) { 4377 snprintf(buf, 255, "layout(early_fragment_tests) in;\n"); 4378 STRCAT_WITH_RET(glsl_hdr, buf); 4379 } 4380 } 4381 4382 if (ctx->prog_type == TGSI_PROCESSOR_COMPUTE) { 4383 snprintf(buf, 255, "layout (local_size_x = %d, local_size_y = %d, local_size_z = %d) in;\n", 4384 ctx->local_cs_block_size[0], ctx->local_cs_block_size[1], ctx->local_cs_block_size[2]); 4385 STRCAT_WITH_RET(glsl_hdr, buf); 4386 4387 if (ctx->req_local_mem) { 4388 enum vrend_type_qualifier type = ctx->integer_memory ? INT : UINT; 4389 snprintf(buf, 255, "shared %s values[%d];\n", get_string(type), ctx->req_local_mem / 4); 4390 STRCAT_WITH_RET(glsl_hdr, buf); 4391 } 4392 } 4393 4394 if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) { 4395 char invocbuf[25]; 4396 4397 if (ctx->gs_num_invocations) 4398 snprintf(invocbuf, 25, ", invocations = %d", ctx->gs_num_invocations); 4399 4400 snprintf(buf, 255, "layout(%s%s) in;\n", prim_to_name(ctx->gs_in_prim), 4401 ctx->gs_num_invocations > 1 ? invocbuf : ""); 4402 STRCAT_WITH_RET(glsl_hdr, buf); 4403 snprintf(buf, 255, "layout(%s, max_vertices = %d) out;\n", prim_to_name(ctx->gs_out_prim), ctx->gs_max_out_verts); 4404 STRCAT_WITH_RET(glsl_hdr, buf); 4405 } 4406 4407 if (ctx_indirect_inputs(ctx)) { 4408 const char *name_prefix = get_stage_input_name_prefix(ctx, ctx->prog_type); 4409 if (ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) { 4410 if (ctx->patch_input_range.used) { 4411 int size = ctx->patch_input_range.last - ctx->patch_input_range.first + 1; 4412 if (size < ctx->key->num_indirect_patch_inputs) 4413 size = ctx->key->num_indirect_patch_inputs; 4414 snprintf(buf, 255, "patch in vec4 %sp%d[%d];\n", name_prefix, ctx->patch_input_range.first, size); 4415 STRCAT_WITH_RET(glsl_hdr, buf); 4416 } 4417 } 4418 4419 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || 4420 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) { 4421 if (ctx->generic_input_range.used) { 4422 int size = ctx->generic_input_range.last - ctx->generic_input_range.first + 1; 4423 if (size < ctx->key->num_indirect_generic_inputs) 4424 size = ctx->key->num_indirect_generic_inputs; 4425 snprintf(buf, 255, "in block { vec4 %s%d[%d]; } blk[];\n", name_prefix, ctx->generic_input_range.first, size); 4426 STRCAT_WITH_RET(glsl_hdr, buf); 4427 } 4428 } 4429 } 4430 for (i = 0; i < ctx->num_inputs; i++) { 4431 if (!ctx->inputs[i].glsl_predefined_no_emit) { 4432 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX && ctx->cfg->use_explicit_locations) { 4433 snprintf(buf, 255, "layout(location=%d) ", ctx->inputs[i].first); 4434 STRCAT_WITH_RET(glsl_hdr, buf); 4435 } 4436 if (ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL && ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) 4437 prefix = "patch "; 4438 else if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && 4439 (ctx->inputs[i].name == TGSI_SEMANTIC_GENERIC || 4440 ctx->inputs[i].name == TGSI_SEMANTIC_COLOR)) { 4441 prefix = get_interp_string(ctx->cfg, ctx->inputs[i].interpolate, ctx->key->flatshade); 4442 if (!prefix) 4443 prefix = ""; 4444 auxprefix = get_aux_string(ctx->inputs[i].location); 4445 ctx->num_interps++; 4446 } 4447 4448 if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) { 4449 snprintf(postfix, 8, "[%d]", gs_input_prim_to_size(ctx->gs_in_prim)); 4450 } else if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || 4451 (ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL && ctx->inputs[i].name != TGSI_SEMANTIC_PATCH)) { 4452 snprintf(postfix, 8, "[]"); 4453 } else 4454 postfix[0] = 0; 4455 snprintf(buf, 255, "%s%sin vec4 %s%s;\n", prefix, auxprefix, ctx->inputs[i].glsl_name, postfix); 4456 STRCAT_WITH_RET(glsl_hdr, buf); 4457 } 4458 4459 if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && ctx->cfg->use_gles && 4460 (ctx->key->coord_replace & (1 << ctx->inputs[i].sid))) { 4461 snprintf(buf, 255, "uniform float winsys_adjust_y;\n"); 4462 STRCAT_WITH_RET(glsl_hdr, buf); 4463 } 4464 } 4465 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL) { 4466 snprintf(buf, 255, "layout(vertices = %d) out;\n", ctx->tcs_vertices_out); 4467 STRCAT_WITH_RET(glsl_hdr, buf); 4468 } 4469 if (ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) { 4470 snprintf(buf, 255, "layout(%s, %s, %s%s) in;\n", 4471 prim_to_tes_name(ctx->tes_prim_mode), 4472 get_spacing_string(ctx->tes_spacing), 4473 ctx->tes_vertex_order ? "cw" : "ccw", 4474 ctx->tes_point_mode ? ", point_mode" : ""); 4475 STRCAT_WITH_RET(glsl_hdr, buf); 4476 } 4477 4478 if (ctx_indirect_outputs(ctx)) { 4479 const char *name_prefix = get_stage_output_name_prefix(ctx->prog_type); 4480 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX) { 4481 if (ctx->generic_output_range.used) { 4482 snprintf(buf, 255, "out block { vec4 %s%d[%d]; } oblk;\n", name_prefix, ctx->generic_output_range.first, ctx->generic_output_range.last - ctx->generic_output_range.first + 1); 4483 STRCAT_WITH_RET(glsl_hdr, buf); 4484 } 4485 } 4486 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL) { 4487 if (ctx->generic_output_range.used) { 4488 snprintf(buf, 255, "out block { vec4 %s%d[%d]; } oblk[];\n", name_prefix, ctx->generic_output_range.first, ctx->generic_output_range.last - ctx->generic_output_range.first + 1); 4489 STRCAT_WITH_RET(glsl_hdr, buf); 4490 } 4491 if (ctx->patch_output_range.used) { 4492 snprintf(buf, 255, "patch out vec4 %sp%d[%d];\n", name_prefix, ctx->patch_output_range.first, ctx->patch_output_range.last - ctx->patch_output_range.first + 1); 4493 STRCAT_WITH_RET(glsl_hdr, buf); 4494 } 4495 } 4496 } 4497 4498 if (ctx->write_all_cbufs) { 4499 for (i = 0; i < (uint32_t)ctx->cfg->max_draw_buffers; i++) { 4500 if (ctx->cfg->use_gles) 4501 snprintf(buf, 255, "layout (location=%d) out vec4 fsout_c%d;\n", i, i); 4502 else 4503 snprintf(buf, 255, "out vec4 fsout_c%d;\n", i); 4504 STRCAT_WITH_RET(glsl_hdr, buf); 4505 } 4506 } else { 4507 for (i = 0; i < ctx->num_outputs; i++) { 4508 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX && ctx->key->color_two_side && ctx->outputs[i].sid < 2) { 4509 if (ctx->outputs[i].name == TGSI_SEMANTIC_COLOR) 4510 fcolor_emitted[ctx->outputs[i].sid] = true; 4511 if (ctx->outputs[i].name == TGSI_SEMANTIC_BCOLOR) 4512 bcolor_emitted[ctx->outputs[i].sid] = true; 4513 } 4514 if (!ctx->outputs[i].glsl_predefined_no_emit) { 4515 if ((ctx->prog_type == TGSI_PROCESSOR_VERTEX || 4516 ctx->prog_type == TGSI_PROCESSOR_GEOMETRY || 4517 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) && 4518 (ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC || 4519 ctx->outputs[i].name == TGSI_SEMANTIC_COLOR || 4520 ctx->outputs[i].name == TGSI_SEMANTIC_BCOLOR)) { 4521 ctx->num_interps++; 4522 prefix = INTERP_PREFIX; 4523 } else 4524 prefix = ""; 4525 /* ugly leave spaces to patch interp in later */ 4526 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL) { 4527 if (ctx->outputs[i].name == TGSI_SEMANTIC_PATCH) 4528 snprintf(buf, 255, "patch out vec4 %s;\n", ctx->outputs[i].glsl_name); 4529 else 4530 snprintf(buf, 255, "%sout vec4 %s[];\n", prefix, ctx->outputs[i].glsl_name); 4531 } else if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY && ctx->outputs[i].stream) 4532 snprintf(buf, 255, "layout (stream = %d) %s%s%sout vec4 %s;\n", ctx->outputs[i].stream, prefix, 4533 ctx->outputs[i].precise ? "precise " : "", 4534 ctx->outputs[i].invariant ? "invariant " : "", 4535 ctx->outputs[i].glsl_name); 4536 else 4537 snprintf(buf, 255, "%s%s%s%s vec4 %s;\n", 4538 prefix, 4539 ctx->outputs[i].precise ? "precise " : "", 4540 ctx->outputs[i].invariant ? "invariant " : "", 4541 ctx->outputs[i].fbfetch_used ? "inout" : "out", 4542 ctx->outputs[i].glsl_name); 4543 STRCAT_WITH_RET(glsl_hdr, buf); 4544 } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) { 4545 snprintf(buf, 255, "%s%s %s;\n", 4546 ctx->outputs[i].precise ? "precise " : "", 4547 ctx->outputs[i].invariant ? "invariant " : "", 4548 ctx->outputs[i].glsl_name); 4549 STRCAT_WITH_RET(glsl_hdr, buf); 4550 } 4551 } 4552 } 4553 4554 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX && ctx->key->color_two_side) { 4555 for (i = 0; i < 2; i++) { 4556 if (fcolor_emitted[i] && !bcolor_emitted[i]) { 4557 snprintf(buf, 255, "%sout vec4 ex_bc%d;\n", INTERP_PREFIX, i); 4558 STRCAT_WITH_RET(glsl_hdr, buf); 4559 } 4560 if (bcolor_emitted[i] && !fcolor_emitted[i]) { 4561 snprintf(buf, 255, "%sout vec4 ex_c%d;\n", INTERP_PREFIX, i); 4562 STRCAT_WITH_RET(glsl_hdr, buf); 4563 } 4564 } 4565 } 4566 4567 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX || 4568 ctx->prog_type == TGSI_PROCESSOR_GEOMETRY || 4569 ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) { 4570 snprintf(buf, 255, "uniform float winsys_adjust_y;\n"); 4571 STRCAT_WITH_RET(glsl_hdr, buf); 4572 } 4573 4574 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX) { 4575 if (ctx->has_clipvertex) { 4576 snprintf(buf, 255, "%svec4 clipv_tmp;\n", ctx->has_clipvertex_so ? "out " : ""); 4577 STRCAT_WITH_RET(glsl_hdr, buf); 4578 } 4579 if (ctx->num_clip_dist || ctx->key->clip_plane_enable) { 4580 bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0; 4581 int num_clip_dists = ctx->num_clip_dist ? ctx->num_clip_dist : 8; 4582 int num_cull_dists = 0; 4583 char cull_buf[64] = { 0 }; 4584 char clip_buf[64] = { 0 }; 4585 if (has_prop) { 4586 num_clip_dists = ctx->num_clip_dist_prop; 4587 num_cull_dists = ctx->num_cull_dist_prop; 4588 if (num_clip_dists) 4589 snprintf(clip_buf, 64, "out float gl_ClipDistance[%d];\n", num_clip_dists); 4590 if (num_cull_dists) 4591 snprintf(cull_buf, 64, "out float gl_CullDistance[%d];\n", num_cull_dists); 4592 } else 4593 snprintf(clip_buf, 64, "out float gl_ClipDistance[%d];\n", num_clip_dists); 4594 if (ctx->key->clip_plane_enable) { 4595 snprintf(buf, 255, "uniform vec4 clipp[8];\n"); 4596 STRCAT_WITH_RET(glsl_hdr, buf); 4597 } 4598 if (ctx->key->gs_present || ctx->key->tes_present) { 4599 ctx->vs_has_pervertex = true; 4600 snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n%s%s};\n", clip_buf, cull_buf); 4601 STRCAT_WITH_RET(glsl_hdr, buf); 4602 } else { 4603 snprintf(buf, 255, "%s%s", clip_buf, cull_buf); 4604 STRCAT_WITH_RET(glsl_hdr, buf); 4605 } 4606 snprintf(buf, 255, "vec4 clip_dist_temp[2];\n"); 4607 STRCAT_WITH_RET(glsl_hdr, buf); 4608 } 4609 } 4610 4611 if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) { 4612 if (ctx->num_in_clip_dist || ctx->key->clip_plane_enable || ctx->key->prev_stage_pervertex_out) { 4613 int clip_dist, cull_dist; 4614 char clip_var[64] = {}, cull_var[64] = {}; 4615 4616 clip_dist = ctx->key->prev_stage_num_clip_out ? ctx->key->prev_stage_num_clip_out : ctx->num_in_clip_dist; 4617 cull_dist = ctx->key->prev_stage_num_cull_out; 4618 4619 if (clip_dist) 4620 snprintf(clip_var, 64, "float gl_ClipDistance[%d];\n", clip_dist); 4621 if (cull_dist) 4622 snprintf(cull_var, 64, "float gl_CullDistance[%d];\n", cull_dist); 4623 4624 snprintf(buf, 255, "in gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize; \n %s%s\n} gl_in[];\n", clip_var, cull_var); 4625 STRCAT_WITH_RET(glsl_hdr, buf); 4626 } 4627 if (ctx->num_clip_dist) { 4628 bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0; 4629 int num_clip_dists = ctx->num_clip_dist ? ctx->num_clip_dist : 8; 4630 int num_cull_dists = 0; 4631 char cull_buf[64] = { 0 }; 4632 char clip_buf[64] = { 0 }; 4633 if (has_prop) { 4634 num_clip_dists = ctx->num_clip_dist_prop; 4635 num_cull_dists = ctx->num_cull_dist_prop; 4636 if (num_clip_dists) 4637 snprintf(clip_buf, 64, "out float gl_ClipDistance[%d];\n", num_clip_dists); 4638 if (num_cull_dists) 4639 snprintf(cull_buf, 64, "out float gl_CullDistance[%d];\n", num_cull_dists); 4640 } else 4641 snprintf(clip_buf, 64, "out float gl_ClipDistance[%d];\n", num_clip_dists); 4642 snprintf(buf, 255, "%s%s\n", clip_buf, cull_buf); 4643 STRCAT_WITH_RET(glsl_hdr, buf); 4644 snprintf(buf, 255, "vec4 clip_dist_temp[2];\n"); 4645 STRCAT_WITH_RET(glsl_hdr, buf); 4646 } 4647 } 4648 4649 if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && ctx->num_in_clip_dist) { 4650 if (ctx->key->prev_stage_num_clip_out) { 4651 snprintf(buf, 255, "in float gl_ClipDistance[%d];\n", ctx->key->prev_stage_num_clip_out); 4652 STRCAT_WITH_RET(glsl_hdr, buf); 4653 } 4654 if (ctx->key->prev_stage_num_cull_out) { 4655 snprintf(buf, 255, "in float gl_CullDistance[%d];\n", ctx->key->prev_stage_num_cull_out); 4656 STRCAT_WITH_RET(glsl_hdr, buf); 4657 } 4658 } 4659 4660 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL) { 4661 if (ctx->num_in_clip_dist || ctx->key->prev_stage_pervertex_out) { 4662 int clip_dist, cull_dist; 4663 char clip_var[64] = {}, cull_var[64] = {}; 4664 4665 clip_dist = ctx->key->prev_stage_num_clip_out ? ctx->key->prev_stage_num_clip_out : ctx->num_in_clip_dist; 4666 cull_dist = ctx->key->prev_stage_num_cull_out; 4667 4668 if (clip_dist) 4669 snprintf(clip_var, 64, "float gl_ClipDistance[%d];\n", clip_dist); 4670 if (cull_dist) 4671 snprintf(cull_var, 64, "float gl_CullDistance[%d];\n", cull_dist); 4672 4673 snprintf(buf, 255, "in gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize; \n %s%s} gl_in[];\n", clip_var, cull_var); 4674 STRCAT_WITH_RET(glsl_hdr, buf); 4675 } 4676 if (ctx->num_clip_dist) { 4677 snprintf(buf, 255, "out gl_PerVertex {\n vec4 gl_Position;\n float gl_PointSize;\n float gl_ClipDistance[%d];\n} gl_out[];\n", ctx->num_clip_dist ? ctx->num_clip_dist : 8); 4678 STRCAT_WITH_RET(glsl_hdr, buf); 4679 snprintf(buf, 255, "vec4 clip_dist_temp[2];\n"); 4680 STRCAT_WITH_RET(glsl_hdr, buf); 4681 } 4682 } 4683 4684 if (ctx->so) { 4685 char outtype[6] = {0}; 4686 for (i = 0; i < ctx->so->num_outputs; i++) { 4687 if (!ctx->write_so_outputs[i]) 4688 continue; 4689 if (ctx->so->output[i].num_components == 1) 4690 snprintf(outtype, 6, "float"); 4691 else 4692 snprintf(outtype, 6, "vec%d", ctx->so->output[i].num_components); 4693 if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL) 4694 snprintf(buf, 255, "out %s tfout%d[];\n", outtype, i); 4695 else if (ctx->so->output[i].stream && ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) 4696 snprintf(buf, 255, "layout (stream=%d) out %s tfout%d;\n", ctx->so->output[i].stream, outtype, i); 4697 else 4698 snprintf(buf, 255, "out %s tfout%d;\n", outtype, i); 4699 STRCAT_WITH_RET(glsl_hdr, buf); 4700 } 4701 } 4702 for (i = 0; i < ctx->num_temp_ranges; i++) { 4703 snprintf(buf, 255, "vec4 temp%d[%d];\n", ctx->temp_ranges[i].first, ctx->temp_ranges[i].last - ctx->temp_ranges[i].first + 1); 4704 STRCAT_WITH_RET(glsl_hdr, buf); 4705 } 4706 4707 if (ctx->write_mul_utemp) { 4708 snprintf(buf, 255, "uvec4 mul_utemp;\n"); 4709 STRCAT_WITH_RET(glsl_hdr, buf); 4710 snprintf(buf, 255, "uvec4 umul_temp;\n"); 4711 STRCAT_WITH_RET(glsl_hdr, buf); 4712 } 4713 4714 if (ctx->write_mul_itemp) { 4715 snprintf(buf, 255, "ivec4 mul_itemp;\n"); 4716 STRCAT_WITH_RET(glsl_hdr, buf); 4717 snprintf(buf, 255, "ivec4 imul_temp;\n"); 4718 STRCAT_WITH_RET(glsl_hdr, buf); 4719 } 4720 4721 if (ctx->ssbo_used_mask) { 4722 snprintf(buf, 255, "uint ssbo_addr_temp;\n"); 4723 STRCAT_WITH_RET(glsl_hdr, buf); 4724 } 4725 4726 if (ctx->shader_req_bits & SHADER_REQ_FP64) { 4727 snprintf(buf, 255, "dvec2 fp64_dst[3];\n"); 4728 STRCAT_WITH_RET(glsl_hdr, buf); 4729 snprintf(buf, 255, "dvec2 fp64_src[4];\n"); 4730 STRCAT_WITH_RET(glsl_hdr, buf); 4731 } 4732 4733 for (i = 0; i < ctx->num_address; i++) { 4734 snprintf(buf, 255, "int addr%d;\n", i); 4735 STRCAT_WITH_RET(glsl_hdr, buf); 4736 } 4737 if (ctx->num_consts) { 4738 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 4739 snprintf(buf, 255, "uniform uvec4 %sconst0[%d];\n", cname, ctx->num_consts); 4740 STRCAT_WITH_RET(glsl_hdr, buf); 4741 } 4742 4743 if (ctx->key->color_two_side) { 4744 if (ctx->color_in_mask & 1) { 4745 snprintf(buf, 255, "vec4 realcolor0;\n"); 4746 STRCAT_WITH_RET(glsl_hdr, buf); 4747 } 4748 if (ctx->color_in_mask & 2) { 4749 snprintf(buf, 255, "vec4 realcolor1;\n"); 4750 STRCAT_WITH_RET(glsl_hdr, buf); 4751 } 4752 } 4753 if (ctx->num_ubo) { 4754 const char *cname = tgsi_proc_to_prefix(ctx->prog_type); 4755 4756 if (ctx->info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT)) { 4757 require_glsl_ver(ctx, 150); 4758 snprintf(buf, 255, "uniform %subo { vec4 ubocontents[%d]; } %suboarr[%d];\n", cname, ctx->ubo_sizes[0], cname, ctx->num_ubo); 4759 STRCAT_WITH_RET(glsl_hdr, buf); 4760 } else { 4761 for (i = 0; i < ctx->num_ubo; i++) { 4762 snprintf(buf, 255, "uniform %subo%d { vec4 %subo%dcontents[%d]; };\n", cname, ctx->ubo_idx[i], cname, ctx->ubo_idx[i], ctx->ubo_sizes[i]); 4763 STRCAT_WITH_RET(glsl_hdr, buf); 4764 } 4765 } 4766 } 4767 4768 if (ctx->info.indirect_files & (1 << TGSI_FILE_SAMPLER)) { 4769 for (i = 0; i < ctx->num_sampler_arrays; i++) { 4770 uint32_t first = ctx->sampler_arrays[i].first; 4771 uint32_t range = ctx->sampler_arrays[i].array_size; 4772 glsl_hdr = emit_sampler_decl(ctx, glsl_hdr, first, range, ctx->samplers + first); 4773 if (!glsl_hdr) 4774 return NULL; 4775 } 4776 } else { 4777 nsamp = util_last_bit(ctx->samplers_used); 4778 for (i = 0; i < nsamp; i++) { 4779 4780 if ((ctx->samplers_used & (1 << i)) == 0) 4781 continue; 4782 4783 glsl_hdr = emit_sampler_decl(ctx, glsl_hdr, i, 0, ctx->samplers + i); 4784 if (!glsl_hdr) 4785 return NULL; 4786 } 4787 } 4788 4789 if (ctx->info.indirect_files & (1 << TGSI_FILE_IMAGE)) { 4790 for (i = 0; i < ctx->num_image_arrays; i++) { 4791 uint32_t first = ctx->image_arrays[i].first; 4792 uint32_t range = ctx->image_arrays[i].array_size; 4793 glsl_hdr = emit_image_decl(ctx, glsl_hdr, first, range, ctx->images + first); 4794 if (!glsl_hdr) 4795 return NULL; 4796 } 4797 } else { 4798 uint32_t mask = ctx->images_used_mask; 4799 while (mask) { 4800 i = u_bit_scan(&mask); 4801 glsl_hdr = emit_image_decl(ctx, glsl_hdr, i, 0, ctx->images + i); 4802 if (!glsl_hdr) 4803 return NULL; 4804 } 4805 } 4806 4807 if (ctx->info.indirect_files & (1 << TGSI_FILE_BUFFER)) { 4808 uint32_t mask = ctx->ssbo_used_mask; 4809 while (mask) { 4810 int start, count; 4811 u_bit_scan_consecutive_range(&mask, &start, &count); 4812 const char *atomic = (ctx->ssbo_atomic_mask & (1 << start)) ? "atomic" : ""; 4813 snprintf(buf, 255, "layout (binding = %d, std430) buffer %sssbo%d { uint %sssbocontents%d[]; } %sssboarr%s[%d];\n", start, sname, start, sname, start, sname, atomic, count); 4814 STRCAT_WITH_RET(glsl_hdr, buf); 4815 } 4816 } else { 4817 uint32_t mask = ctx->ssbo_used_mask; 4818 while (mask) { 4819 uint32_t id = u_bit_scan(&mask); 4820 sname = tgsi_proc_to_prefix(ctx->prog_type); 4821 enum vrend_type_qualifier type = (ctx->ssbo_integer_mask & (1 << id)) ? INT : UINT; 4822 snprintf(buf, 255, "layout (binding = %d, std430) buffer %sssbo%d { %s %sssbocontents%d[]; };\n", id, sname, id, 4823 get_string(type), sname, id); 4824 STRCAT_WITH_RET(glsl_hdr, buf); 4825 } 4826 } 4827 4828 if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && 4829 ctx->key->pstipple_tex == true) { 4830 snprintf(buf, 255, "uniform sampler2D pstipple_sampler;\nfloat stip_temp;\n"); 4831 STRCAT_WITH_RET(glsl_hdr, buf); 4832 } 4833 return glsl_hdr; 4834 } 4835 4836 static boolean fill_fragment_interpolants(struct dump_ctx *ctx, struct vrend_shader_info *sinfo) 4837 { 4838 uint32_t i, index = 0; 4839 4840 for (i = 0; i < ctx->num_inputs; i++) { 4841 if (ctx->inputs[i].glsl_predefined_no_emit) 4842 continue; 4843 4844 if (ctx->inputs[i].name != TGSI_SEMANTIC_GENERIC && 4845 ctx->inputs[i].name != TGSI_SEMANTIC_COLOR) 4846 continue; 4847 4848 if (index >= ctx->num_interps) { 4849 fprintf(stderr, "mismatch in number of interps %d %d\n", index, ctx->num_interps); 4850 return TRUE; 4851 } 4852 sinfo->interpinfo[index].semantic_name = ctx->inputs[i].name; 4853 sinfo->interpinfo[index].semantic_index = ctx->inputs[i].sid; 4854 sinfo->interpinfo[index].interpolate = ctx->inputs[i].interpolate; 4855 sinfo->interpinfo[index].location = ctx->inputs[i].location; 4856 index++; 4857 } 4858 return TRUE; 4859 } 4860 4861 static boolean fill_interpolants(struct dump_ctx *ctx, struct vrend_shader_info *sinfo) 4862 { 4863 boolean ret; 4864 4865 if (!ctx->num_interps) 4866 return TRUE; 4867 if (ctx->prog_type == TGSI_PROCESSOR_VERTEX || ctx->prog_type == TGSI_PROCESSOR_GEOMETRY) 4868 return TRUE; 4869 4870 free(sinfo->interpinfo); 4871 sinfo->interpinfo = calloc(ctx->num_interps, sizeof(struct vrend_interp_info)); 4872 if (!sinfo->interpinfo) 4873 return FALSE; 4874 4875 ret = fill_fragment_interpolants(ctx, sinfo); 4876 if (ret == FALSE) 4877 goto out_fail; 4878 4879 return TRUE; 4880 out_fail: 4881 free(sinfo->interpinfo); 4882 return FALSE; 4883 } 4884 4885 static boolean analyze_instruction(struct tgsi_iterate_context *iter, 4886 struct tgsi_full_instruction *inst) 4887 { 4888 struct dump_ctx *ctx = (struct dump_ctx *)iter; 4889 uint32_t opcode = inst->Instruction.Opcode; 4890 if (opcode == TGSI_OPCODE_ATOMIMIN || opcode == TGSI_OPCODE_ATOMIMAX) { 4891 const struct tgsi_full_src_register *src = &inst->Src[0]; 4892 if (src->Register.File == TGSI_FILE_BUFFER) 4893 ctx->ssbo_integer_mask |= 1 << src->Register.Index; 4894 if (src->Register.File == TGSI_FILE_MEMORY) 4895 ctx->integer_memory = true; 4896 } 4897 4898 return true; 4899 } 4900 4901 char *vrend_convert_shader(struct vrend_shader_cfg *cfg, 4902 const struct tgsi_token *tokens, 4903 uint32_t req_local_mem, 4904 struct vrend_shader_key *key, 4905 struct vrend_shader_info *sinfo) 4906 { 4907 struct dump_ctx ctx; 4908 char *glsl_final = NULL; 4909 boolean bret; 4910 char *glsl_hdr = NULL; 4911 4912 memset(&ctx, 0, sizeof(struct dump_ctx)); 4913 4914 /* First pass to deal with edge cases. */ 4915 ctx.iter.iterate_instruction = analyze_instruction; 4916 bret = tgsi_iterate_shader(tokens, &ctx.iter); 4917 if (bret == FALSE) 4918 return NULL; 4919 4920 ctx.iter.prolog = prolog; 4921 ctx.iter.iterate_instruction = iter_instruction; 4922 ctx.iter.iterate_declaration = iter_declaration; 4923 ctx.iter.iterate_immediate = iter_immediate; 4924 ctx.iter.iterate_property = iter_property; 4925 ctx.iter.epilog = NULL; 4926 ctx.key = key; 4927 ctx.cfg = cfg; 4928 ctx.prog_type = -1; 4929 ctx.num_image_arrays = 0; 4930 ctx.image_arrays = NULL; 4931 ctx.num_sampler_arrays = 0; 4932 ctx.sampler_arrays = NULL; 4933 ctx.ssbo_array_base = 0xffffffff; 4934 ctx.ssbo_atomic_array_base = 0xffffffff; 4935 ctx.has_sample_input = false; 4936 ctx.req_local_mem = req_local_mem; 4937 tgsi_scan_shader(tokens, &ctx.info); 4938 /* if we are in core profile mode we should use GLSL 1.40 */ 4939 if (cfg->use_core_profile && cfg->glsl_version >= 140) 4940 require_glsl_ver(&ctx, 140); 4941 4942 if (sinfo->so_info.num_outputs) { 4943 ctx.so = &sinfo->so_info; 4944 ctx.so_names = calloc(sinfo->so_info.num_outputs, sizeof(char *)); 4945 if (!ctx.so_names) 4946 goto fail; 4947 } else 4948 ctx.so_names = NULL; 4949 4950 if (ctx.info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT)) 4951 require_glsl_ver(&ctx, 150); 4952 4953 if (ctx.info.indirect_files & (1 << TGSI_FILE_BUFFER) || 4954 ctx.info.indirect_files & (1 << TGSI_FILE_IMAGE)) { 4955 require_glsl_ver(&ctx, 150); 4956 ctx.shader_req_bits |= SHADER_REQ_GPU_SHADER5; 4957 } 4958 if (ctx.info.indirect_files & (1 << TGSI_FILE_SAMPLER)) 4959 ctx.shader_req_bits |= SHADER_REQ_GPU_SHADER5; 4960 4961 ctx.glsl_main = malloc(4096); 4962 if (!ctx.glsl_main) 4963 goto fail; 4964 4965 ctx.glsl_main[0] = '\0'; 4966 bret = tgsi_iterate_shader(tokens, &ctx.iter); 4967 if (bret == FALSE) 4968 goto fail; 4969 4970 glsl_hdr = malloc(1024); 4971 if (!glsl_hdr) 4972 goto fail; 4973 glsl_hdr[0] = '\0'; 4974 glsl_hdr = emit_header(&ctx, glsl_hdr); 4975 if (!glsl_hdr) 4976 goto fail; 4977 4978 glsl_hdr = emit_ios(&ctx, glsl_hdr); 4979 if (!glsl_hdr) 4980 goto fail; 4981 4982 glsl_final = malloc(strlen(glsl_hdr) + strlen(ctx.glsl_main) + 1); 4983 if (!glsl_final) 4984 goto fail; 4985 4986 glsl_final[0] = '\0'; 4987 4988 bret = fill_interpolants(&ctx, sinfo); 4989 if (bret == FALSE) 4990 goto fail; 4991 4992 strcat(glsl_final, glsl_hdr); 4993 strcat(glsl_final, ctx.glsl_main); 4994 if (vrend_dump_shaders) 4995 fprintf(stderr,"GLSL: %s\n", glsl_final); 4996 free(ctx.temp_ranges); 4997 free(ctx.glsl_main); 4998 free(glsl_hdr); 4999 sinfo->num_ucp = ctx.key->clip_plane_enable ? 8 : 0; 5000 sinfo->has_pervertex_out = ctx.vs_has_pervertex; 5001 sinfo->has_sample_input = ctx.has_sample_input; 5002 bool has_prop = (ctx.num_clip_dist_prop + ctx.num_cull_dist_prop) > 0; 5003 sinfo->num_clip_out = has_prop ? ctx.num_clip_dist_prop : (ctx.num_clip_dist ? ctx.num_clip_dist : 8); 5004 sinfo->num_cull_out = has_prop ? ctx.num_cull_dist_prop : 0; 5005 sinfo->samplers_used_mask = ctx.samplers_used; 5006 sinfo->images_used_mask = ctx.images_used_mask; 5007 sinfo->num_consts = ctx.num_consts; 5008 sinfo->num_ubos = ctx.num_ubo; 5009 memcpy(sinfo->ubo_idx, ctx.ubo_idx, ctx.num_ubo * sizeof(*ctx.ubo_idx)); 5010 5011 sinfo->ssbo_used_mask = ctx.ssbo_used_mask; 5012 5013 sinfo->ubo_indirect = ctx.info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT); 5014 if (ctx_indirect_inputs(&ctx)) { 5015 if (ctx.generic_input_range.used) 5016 sinfo->num_indirect_generic_inputs = ctx.generic_input_range.last - ctx.generic_input_range.first + 1; 5017 if (ctx.patch_input_range.used) 5018 sinfo->num_indirect_patch_inputs = ctx.patch_input_range.last - ctx.patch_input_range.first + 1; 5019 } 5020 if (ctx_indirect_outputs(&ctx)) { 5021 if (ctx.generic_output_range.used) 5022 sinfo->num_indirect_generic_outputs = ctx.generic_output_range.last - ctx.generic_output_range.first + 1; 5023 if (ctx.patch_output_range.used) 5024 sinfo->num_indirect_patch_outputs = ctx.patch_output_range.last - ctx.patch_output_range.first + 1; 5025 } 5026 5027 sinfo->num_inputs = ctx.num_inputs; 5028 sinfo->num_interps = ctx.num_interps; 5029 sinfo->num_outputs = ctx.num_outputs; 5030 sinfo->shadow_samp_mask = ctx.shadow_samp_mask; 5031 sinfo->glsl_ver = ctx.glsl_ver_required; 5032 sinfo->gs_out_prim = ctx.gs_out_prim; 5033 sinfo->tes_prim = ctx.tes_prim_mode; 5034 sinfo->tes_point_mode = ctx.tes_point_mode; 5035 sinfo->so_names = ctx.so_names; 5036 sinfo->attrib_input_mask = ctx.attrib_input_mask; 5037 sinfo->sampler_arrays = ctx.sampler_arrays; 5038 sinfo->num_sampler_arrays = ctx.num_sampler_arrays; 5039 sinfo->image_arrays = ctx.image_arrays; 5040 sinfo->num_image_arrays = ctx.num_image_arrays; 5041 return glsl_final; 5042 fail: 5043 free(ctx.glsl_main); 5044 free(glsl_final); 5045 free(glsl_hdr); 5046 free(ctx.so_names); 5047 free(ctx.temp_ranges); 5048 return NULL; 5049 } 5050 5051 static void replace_interp(char *program, 5052 const char *var_name, 5053 const char *pstring, const char *auxstring) 5054 { 5055 char *ptr; 5056 int mylen = strlen(INTERP_PREFIX) + strlen("out vec4 "); 5057 5058 ptr = strstr(program, var_name); 5059 5060 if (!ptr) 5061 return; 5062 5063 ptr -= mylen; 5064 5065 memset(ptr, ' ', strlen(INTERP_PREFIX)); 5066 memcpy(ptr, pstring, strlen(pstring)); 5067 memcpy(ptr + strlen(pstring), auxstring, strlen(auxstring)); 5068 } 5069 5070 static const char *gpu_shader5_string = "#extension GL_ARB_gpu_shader5 : require\n"; 5071 5072 static void require_gpu_shader5(char *program) 5073 { 5074 /* the first line is the #version line */ 5075 char *ptr = strchr(program, '\n'); 5076 if (!ptr) 5077 return; 5078 ptr++; 5079 5080 memcpy(ptr, gpu_shader5_string, strlen(gpu_shader5_string)); 5081 } 5082 5083 bool vrend_patch_vertex_shader_interpolants(struct vrend_shader_cfg *cfg, char *program, 5084 struct vrend_shader_info *vs_info, 5085 struct vrend_shader_info *fs_info, const char *oprefix, bool flatshade) 5086 { 5087 int i; 5088 const char *pstring, *auxstring; 5089 char glsl_name[64]; 5090 if (!vs_info || !fs_info) 5091 return true; 5092 5093 if (!fs_info->interpinfo) 5094 return true; 5095 5096 if (fs_info->has_sample_input) 5097 require_gpu_shader5(program); 5098 5099 for (i = 0; i < fs_info->num_interps; i++) { 5100 pstring = get_interp_string(cfg, fs_info->interpinfo[i].interpolate, flatshade); 5101 if (!pstring) 5102 continue; 5103 5104 auxstring = get_aux_string(fs_info->interpinfo[i].location); 5105 5106 switch (fs_info->interpinfo[i].semantic_name) { 5107 case TGSI_SEMANTIC_COLOR: 5108 /* color is a bit trickier */ 5109 if (fs_info->glsl_ver < 140) { 5110 if (fs_info->interpinfo[i].semantic_index == 1) { 5111 replace_interp(program, "gl_FrontSecondaryColor", pstring, auxstring); 5112 replace_interp(program, "gl_BackSecondaryColor", pstring, auxstring); 5113 } else { 5114 replace_interp(program, "gl_FrontColor", pstring, auxstring); 5115 replace_interp(program, "gl_BackColor", pstring, auxstring); 5116 } 5117 } else { 5118 snprintf(glsl_name, 64, "ex_c%d", fs_info->interpinfo[i].semantic_index); 5119 replace_interp(program, glsl_name, pstring, auxstring); 5120 snprintf(glsl_name, 64, "ex_bc%d", fs_info->interpinfo[i].semantic_index); 5121 replace_interp(program, glsl_name, pstring, auxstring); 5122 } 5123 break; 5124 case TGSI_SEMANTIC_GENERIC: 5125 snprintf(glsl_name, 64, "%s_g%d", oprefix, fs_info->interpinfo[i].semantic_index); 5126 replace_interp(program, glsl_name, pstring, auxstring); 5127 break; 5128 default: 5129 fprintf(stderr,"unhandled semantic: %x\n", fs_info->interpinfo[i].semantic_name); 5130 return false; 5131 } 5132 } 5133 5134 if (vrend_dump_shaders) 5135 fprintf(stderr,"GLSL: post interp: %s\n", program); 5136 return true; 5137 } 5138