ReactOS 0.4.17-dev-934-g091855f
glsl.c
Go to the documentation of this file.
1/*
2 * Copyright 2021 Atharva Nimbalkar
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
20
22{
23 /* The number of coordinates needed to sample the resource type. */
24 size_t coord_size;
25 /* Whether the resource type is an array type. */
26 bool array;
27 /* Whether the resource type has a shadow/comparison variant. */
28 bool shadow;
29 /* The type suffix for resource type. I.e., the "2D" part of "usampler2D"
30 * or "iimage2D". */
31 const char *type_suffix;
32};
33
35{
37};
38
40{
44};
45
47{
53 unsigned int indent;
54 const char *prefix;
55 bool failed;
56
58 {
59 unsigned int input_count;
60 unsigned int output_count;
64
69};
70
72 const struct vkd3d_shader_src_param *rel_addr, unsigned int offset);
73
74static void VKD3D_PRINTF_FUNC(3, 4) vkd3d_glsl_compiler_error(
77{
79
81 vkd3d_shader_verror(generator->message_context, &generator->location, error, fmt, args);
82 va_end(args);
83 generator->failed = true;
84}
85
87{
88 switch (type)
89 {
91 return "vs";
93 return "hs";
95 return "ds";
97 return "gs";
99 return "ps";
101 return "cs";
102 default:
103 return NULL;
104 }
105}
106
108{
109 static const struct glsl_resource_type_info info[] =
110 {
111 {0, 0, 0, "None"}, /* VKD3D_SHADER_RESOURCE_NONE */
112 {1, 0, 0, "Buffer"}, /* VKD3D_SHADER_RESOURCE_BUFFER */
113 {1, 0, 1, "1D"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_1D */
114 {2, 0, 1, "2D"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2D */
115 {2, 0, 0, "2DMS"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2DMS */
116 {3, 0, 0, "3D"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_3D */
117 {3, 0, 1, "Cube"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_CUBE */
118 {2, 1, 1, "1DArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY */
119 {3, 1, 1, "2DArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY */
120 {3, 1, 0, "2DMSArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY */
121 {4, 1, 1, "CubeArray"}, /* VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY */
122 };
123
124 if (!t || t >= ARRAY_SIZE(info))
125 return NULL;
126
127 return &info[t];
128}
129
131 enum vkd3d_shader_descriptor_type type, unsigned int idx, unsigned int space)
132{
134
135 for (unsigned int i = 0; i < info->descriptor_count; ++i)
136 {
137 const struct vkd3d_shader_descriptor_info1 *d = &info->descriptors[i];
138
139 if (d->type == type && d->register_space == space && d->register_index == idx)
140 return d;
141 }
142
143 return NULL;
144}
145
147 struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int id)
148{
150
151 for (unsigned int i = 0; i < info->descriptor_count; ++i)
152 {
153 const struct vkd3d_shader_descriptor_info1 *d = &info->descriptors[i];
154
155 if (d->type == type && d->register_id == id)
156 return d;
157 }
158
159 return NULL;
160}
161
163{
165}
166
168 struct vkd3d_glsl_generator *gen, unsigned int resource_index,
169 unsigned int resource_space, unsigned int sampler_index, unsigned int sampler_space)
170{
171 vkd3d_string_buffer_printf(buffer, "%s_t_%u", gen->prefix, resource_index);
172 if (resource_space)
173 vkd3d_string_buffer_printf(buffer, "_%u", resource_space);
174 if (sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX)
175 {
176 vkd3d_string_buffer_printf(buffer, "_s_%u", sampler_index);
177 if (sampler_space)
178 vkd3d_string_buffer_printf(buffer, "_%u", sampler_space);
179 }
180}
181
183 struct vkd3d_glsl_generator *gen, unsigned int idx, unsigned int space)
184{
185 vkd3d_string_buffer_printf(buffer, "%s_image_%u", gen->prefix, idx);
186 if (space)
188}
189
191 struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_register *reg)
192{
193 switch (reg->type)
194 {
195 case VKD3DSPR_TEMP:
196 vkd3d_string_buffer_printf(buffer, "r[%u]", reg->idx[0].offset);
197 break;
198
199 case VKD3DSPR_INPUT:
200 if (reg->idx_count != 1)
201 {
202 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
203 "Internal compiler error: Unhandled input register index count %u.", reg->idx_count);
204 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
205 break;
206 }
207 if (reg->idx[0].rel_addr)
208 {
209 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
210 "Internal compiler error: Unhandled input register indirect addressing.");
211 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
212 break;
213 }
214 vkd3d_string_buffer_printf(buffer, "%s_in[%u]", gen->prefix, reg->idx[0].offset);
215 break;
216
217 case VKD3DSPR_OUTPUT:
218 if (reg->idx_count != 1)
219 {
220 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
221 "Internal compiler error: Unhandled output register index count %u.", reg->idx_count);
222 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
223 break;
224 }
225 if (reg->idx[0].rel_addr)
226 {
227 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
228 "Internal compiler error: Unhandled output register indirect addressing.");
229 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
230 break;
231 }
232 vkd3d_string_buffer_printf(buffer, "%s_out[%u]", gen->prefix, reg->idx[0].offset);
233 break;
234
236 if (gen->program->shader_version.type != VKD3D_SHADER_TYPE_PIXEL)
237 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
238 "Internal compiler error: Unhandled depth output in shader type #%x.",
239 gen->program->shader_version.type);
240 vkd3d_string_buffer_printf(buffer, "gl_FragDepth");
241 break;
242
244 switch (reg->dimension)
245 {
247 vkd3d_string_buffer_printf(buffer, "%#xu", reg->u.immconst_u32[0]);
248 break;
249
251 vkd3d_string_buffer_printf(buffer, "uvec4(%#xu, %#xu, %#xu, %#xu)",
252 reg->u.immconst_u32[0], reg->u.immconst_u32[1],
253 reg->u.immconst_u32[2], reg->u.immconst_u32[3]);
254 break;
255
256 default:
257 vkd3d_string_buffer_printf(buffer, "<unhandled_dimension %#x>", reg->dimension);
258 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
259 "Internal compiler error: Unhandled dimension %#x.", reg->dimension);
260 break;
261 }
262 break;
263
265 if (reg->idx_count != 3)
266 {
267 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
268 "Internal compiler error: Unhandled constant buffer register index count %u.", reg->idx_count);
269 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
270 break;
271 }
272 if (reg->idx[0].rel_addr || reg->idx[2].rel_addr)
273 {
274 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
275 "Internal compiler error: Unhandled constant buffer register indirect addressing.");
276 vkd3d_string_buffer_printf(buffer, "<unhandled register %#x>", reg->type);
277 break;
278 }
279 vkd3d_string_buffer_printf(buffer, "%s_cb_%u[%u]",
280 gen->prefix, reg->idx[0].offset, reg->idx[2].offset);
281 break;
282
284 vkd3d_string_buffer_printf(buffer, "gl_GlobalInvocationID");
285 break;
286
287 case VKD3DSPR_IDXTEMP:
288 vkd3d_string_buffer_printf(buffer, "x%u", reg->idx[0].offset);
289 shader_glsl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
290 break;
291
292 default:
293 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
294 "Internal compiler error: Unhandled register type %#x.", reg->type);
295 vkd3d_string_buffer_printf(buffer, "<unrecognised register %#x>", reg->type);
296 break;
297 }
298}
299
301{
302 const char swizzle_chars[] = "xyzw";
303 unsigned int i;
304
306 for (i = 0; i < VKD3D_VEC4_SIZE; ++i)
307 {
308 if (mask & (VKD3DSP_WRITEMASK_0 << i))
310 }
311}
312
314{
316 if (write_mask & VKD3DSP_WRITEMASK_0)
318 if (write_mask & VKD3DSP_WRITEMASK_1)
320 if (write_mask & VKD3DSP_WRITEMASK_2)
322 if (write_mask & VKD3DSP_WRITEMASK_3)
324}
325
327{
329}
330
332 const char *src, enum vkd3d_data_type dst_data_type, enum vkd3d_data_type src_data_type, unsigned int size)
333{
334 if (dst_data_type == VKD3D_DATA_UNORM || dst_data_type == VKD3D_DATA_SNORM)
335 dst_data_type = VKD3D_DATA_FLOAT;
336 if (src_data_type == VKD3D_DATA_UNORM || src_data_type == VKD3D_DATA_SNORM)
337 src_data_type = VKD3D_DATA_FLOAT;
338
339 if (dst_data_type == src_data_type)
340 {
342 return;
343 }
344
345 if (src_data_type == VKD3D_DATA_FLOAT)
346 {
347 switch (dst_data_type)
348 {
349 case VKD3D_DATA_INT:
350 vkd3d_string_buffer_printf(dst, "floatBitsToInt(%s)", src);
351 return;
352 case VKD3D_DATA_UINT:
353 vkd3d_string_buffer_printf(dst, "floatBitsToUint(%s)", src);
354 return;
355 default:
356 break;
357 }
358 }
359
360 if (src_data_type == VKD3D_DATA_UINT)
361 {
362 switch (dst_data_type)
363 {
364 case VKD3D_DATA_FLOAT:
365 vkd3d_string_buffer_printf(dst, "uintBitsToFloat(%s)", src);
366 return;
367 case VKD3D_DATA_INT:
368 if (size == 1)
370 else
371 vkd3d_string_buffer_printf(dst, "ivec%u(%s)", size, src);
372 return;
373 default:
374 break;
375 }
376 }
377
378 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
379 "Internal compiler error: Unhandled bitcast from %#x to %#x.",
380 src_data_type, dst_data_type);
382}
383
385 const struct vkd3d_shader_src_param *vsir_src, uint32_t mask, enum vkd3d_data_type data_type)
386{
387 const struct vkd3d_shader_register *reg = &vsir_src->reg;
388 struct vkd3d_string_buffer *register_name, *str;
389 enum vkd3d_data_type src_data_type;
390 unsigned int size;
391
392 register_name = vkd3d_string_buffer_get(&gen->string_buffers);
393
394 if (reg->non_uniform)
395 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
396 "Internal compiler error: Unhandled 'non-uniform' modifier.");
397
398 if (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_THREADID)
399 src_data_type = VKD3D_DATA_UINT;
400 else
401 src_data_type = VKD3D_DATA_FLOAT;
402
403 shader_glsl_print_register_name(register_name, gen, reg);
404
405 if (!vsir_src->modifiers)
406 str = buffer;
407 else
409
410 size = reg->dimension == VSIR_DIMENSION_VEC4 ? 4 : 1;
411 shader_glsl_print_bitcast(str, gen, register_name->buffer, data_type, src_data_type, size);
412 if (reg->dimension == VSIR_DIMENSION_VEC4)
414
415 switch (vsir_src->modifiers)
416 {
417 case VKD3DSPSM_NONE:
418 break;
419 case VKD3DSPSM_NEG:
420 vkd3d_string_buffer_printf(buffer, "-%s", str->buffer);
421 break;
422 case VKD3DSPSM_ABS:
423 vkd3d_string_buffer_printf(buffer, "abs(%s)", str->buffer);
424 break;
425 default:
426 vkd3d_string_buffer_printf(buffer, "<unhandled modifier %#x>(%s)",
427 vsir_src->modifiers, str->buffer);
428 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
429 "Internal compiler error: Unhandled source modifier(s) %#x.", vsir_src->modifiers);
430 break;
431 }
432
433 if (str != buffer)
435 vkd3d_string_buffer_release(&gen->string_buffers, register_name);
436}
437
438static void glsl_src_init(struct glsl_src *glsl_src, struct vkd3d_glsl_generator *gen,
439 const struct vkd3d_shader_src_param *vsir_src, uint32_t mask)
440{
442 shader_glsl_print_src(glsl_src->str, gen, vsir_src, mask, vsir_src->reg.data_type);
443}
444
446{
448 vkd3d_string_buffer_release(cache, dst->register_name);
449}
450
452 const struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_dst_param *vsir_dst)
453{
454 uint32_t write_mask = vsir_dst->write_mask;
455
456 if (ins->flags & VKD3DSI_PRECISE_XYZW)
457 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
458 "Internal compiler error: Unhandled 'precise' modifier.");
459 if (vsir_dst->reg.non_uniform)
460 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
461 "Internal compiler error: Unhandled 'non-uniform' modifier.");
462
463 glsl_dst->vsir = vsir_dst;
466
469
470 return write_mask;
471}
472
474 const struct vkd3d_shader_src_param *rel_addr, unsigned int offset)
475{
476 struct glsl_src r;
477
478 if (!rel_addr)
479 {
481 return;
482 }
483
484 glsl_src_init(&r, gen, rel_addr, VKD3DSP_WRITEMASK_0);
485 vkd3d_string_buffer_printf(buffer, "[%s", r.str->buffer);
486 if (offset)
488 else
491}
492
493static void VKD3D_PRINTF_FUNC(4, 0) shader_glsl_vprint_assignment(struct vkd3d_glsl_generator *gen,
495{
496 struct vkd3d_string_buffer *buffer = gen->buffer;
497 uint32_t modifiers = dst->vsir->modifiers;
498 bool close = true;
499
500 if (dst->vsir->shift)
501 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
502 "Internal compiler error: Unhandled destination shift %#x.", dst->vsir->shift);
503 if (modifiers & ~VKD3DSPDM_SATURATE)
504 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
505 "Internal compiler error: Unhandled destination modifier(s) %#x.", modifiers);
506
507 shader_glsl_print_indent(buffer, gen->indent);
508 vkd3d_string_buffer_printf(buffer, "%s%s = ", dst->register_name->buffer, dst->mask->buffer);
509 if (modifiers & VKD3DSPDM_SATURATE)
511
512 switch (data_type)
513 {
514 default:
515 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
516 "Internal compiler error: Unhandled destination register data type %#x.", data_type);
517 /* fall through */
518 case VKD3D_DATA_FLOAT:
519 close = false;
520 break;
521 case VKD3D_DATA_INT:
522 vkd3d_string_buffer_printf(buffer, "intBitsToFloat(");
523 break;
524 case VKD3D_DATA_UINT:
525 vkd3d_string_buffer_printf(buffer, "uintBitsToFloat(");
526 break;
527 }
528
530
531 if (close)
533 if (modifiers & VKD3DSPDM_SATURATE)
534 vkd3d_string_buffer_printf(buffer, ", 0.0, 1.0)");
536}
537
538static void VKD3D_PRINTF_FUNC(3, 4) shader_glsl_print_assignment(
540{
542
544 shader_glsl_vprint_assignment(gen, dst, dst->vsir->reg.data_type, format, args);
545 va_end(args);
546}
547
548static void VKD3D_PRINTF_FUNC(4, 5) shader_glsl_print_assignment_ext(struct vkd3d_glsl_generator *gen,
550{
552
554 shader_glsl_vprint_assignment(gen, dst, data_type, format, args);
555 va_end(args);
556}
557
558static void shader_glsl_unhandled(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
559{
561 vkd3d_string_buffer_printf(gen->buffer, "/* <unhandled instruction %#x> */\n", ins->opcode);
562 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
563 "Internal compiler error: Unhandled instruction %#x.", ins->opcode);
564}
565
567 const struct vkd3d_shader_instruction *ins, const char *op)
568{
569 struct glsl_src src[2];
570 struct glsl_dst dst;
572
573 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
574 glsl_src_init(&src[0], gen, &ins->src[0], mask);
575 glsl_src_init(&src[1], gen, &ins->src[1], mask);
576
577 shader_glsl_print_assignment(gen, &dst, "%s %s %s", src[0].str->buffer, op, src[1].str->buffer);
578
582}
583
584static void shader_glsl_dot(struct vkd3d_glsl_generator *gen,
585 const struct vkd3d_shader_instruction *ins, uint32_t src_mask)
586{
587 unsigned int component_count;
588 struct glsl_src src[2];
589 struct glsl_dst dst;
590 uint32_t dst_mask;
591
592 dst_mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
593 glsl_src_init(&src[0], gen, &ins->src[0], src_mask);
594 glsl_src_init(&src[1], gen, &ins->src[1], src_mask);
595
597 shader_glsl_print_assignment(gen, &dst, "vec%d(dot(%s, %s))",
598 component_count, src[0].str->buffer, src[1].str->buffer);
599 else
600 shader_glsl_print_assignment(gen, &dst, "dot(%s, %s)",
601 src[0].str->buffer, src[1].str->buffer);
602
606}
607
609 const struct vkd3d_shader_instruction *ins, const char *op)
610{
612 struct glsl_src src;
613 struct glsl_dst dst;
614 unsigned int i;
616
617 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
619
620 for (i = 0; i < ins->src_count; ++i)
621 {
622 glsl_src_init(&src, gen, &ins->src[i], mask);
623 vkd3d_string_buffer_printf(args, "%s%s", i ? ", " : "", src.str->buffer);
625 }
626 shader_glsl_print_assignment(gen, &dst, "%s(%s)", op, args->buffer);
627
630}
631
633 const struct vkd3d_shader_instruction *ins, const char *scalar_op, const char *vector_op)
634{
635 unsigned int mask_size;
636 struct glsl_src src[2];
637 struct glsl_dst dst;
639
640 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
641 glsl_src_init(&src[0], gen, &ins->src[0], mask);
642 glsl_src_init(&src[1], gen, &ins->src[1], mask);
643
644 if ((mask_size = vsir_write_mask_component_count(mask)) > 1)
645 shader_glsl_print_assignment(gen, &dst, "uvec%u(%s(%s, %s)) * 0xffffffffu",
646 mask_size, vector_op, src[0].str->buffer, src[1].str->buffer);
647 else
648 shader_glsl_print_assignment(gen, &dst, "%s %s %s ? 0xffffffffu : 0u",
649 src[0].str->buffer, scalar_op, src[1].str->buffer);
650
654}
655
656static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins,
657 const char *scalar_constructor, const char *vector_constructor)
658{
659 unsigned int component_count;
660 struct glsl_src src;
661 struct glsl_dst dst;
663
664 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
665 glsl_src_init(&src, gen, &ins->src[0], mask);
666
668 shader_glsl_print_assignment(gen, &dst, "%s%u(%s)",
669 vector_constructor, component_count, src.str->buffer);
670 else
671 shader_glsl_print_assignment(gen, &dst, "%s(%s)",
672 scalar_constructor, src.str->buffer);
673
676}
677
679{
680 --gen->indent;
683}
684
686{
689 ++gen->indent;
690}
691
692static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
693{
694 const char *condition;
695 struct glsl_src src;
696
697 glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
698
700 condition = ins->flags == VKD3D_SHADER_CONDITIONAL_OP_NZ ? "bool" : "!bool";
701 vkd3d_string_buffer_printf(gen->buffer, "if (%s(%s))\n", condition, src.str->buffer);
702
704
706}
707
708static void shader_glsl_else(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
709{
712 vkd3d_string_buffer_printf(gen->buffer, "else\n");
714}
715
717{
719 vkd3d_string_buffer_printf(gen->buffer, "for (;;)\n");
721}
722
724{
726 vkd3d_string_buffer_printf(gen->buffer, "break;\n");
727}
728
730{
732 vkd3d_string_buffer_printf(gen->buffer, "continue;\n");
733}
734
735static void shader_glsl_switch(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
736{
737 struct glsl_src src;
738
739 glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
740
742 vkd3d_string_buffer_printf(gen->buffer, "switch (%s)\n", src.str->buffer);
744
746}
747
748static void shader_glsl_case(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
749{
750 struct glsl_src src;
751
752 glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
753
755 vkd3d_string_buffer_printf(gen->buffer, "case %s:\n", src.str->buffer);
756
758}
759
761{
763 vkd3d_string_buffer_printf(gen->buffer, "default:\n");
764}
765
767 unsigned int offset_size, const struct vkd3d_shader_texel_offset *offset)
768{
769 switch (offset_size)
770 {
771 case 1:
773 break;
774 case 2:
775 vkd3d_string_buffer_printf(buffer, "ivec2(%d, %d)", offset->u, offset->v);
776 break;
777 default:
778 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
779 "Internal compiler error: Invalid texel offset size %u.", offset_size);
780 /* fall through */
781 case 3:
782 vkd3d_string_buffer_printf(buffer, "ivec3(%d, %d, %d)", offset->u, offset->v, offset->w);
783 break;
784 }
785}
786
787static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
788{
789 unsigned int resource_id, resource_idx, resource_space, sample_count;
791 const struct vkd3d_shader_descriptor_info1 *d;
792 enum vkd3d_shader_component_type sampled_type;
794 struct vkd3d_string_buffer *fetch;
796 struct glsl_src coord;
797 struct glsl_dst dst;
798 uint32_t coord_mask;
799
801 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
802 "Internal compiler error: Unhandled texel fetch offset.");
803
804 if (ins->src[1].reg.idx[0].rel_addr || ins->src[1].reg.idx[1].rel_addr)
805 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
806 "Descriptor indexing is not supported.");
807
808 resource_id = ins->src[1].reg.idx[0].offset;
809 resource_idx = ins->src[1].reg.idx[1].offset;
811 {
812 resource_type = d->resource_type;
813 resource_space = d->register_space;
814 sample_count = d->sample_count;
815 sampled_type = vkd3d_component_type_from_resource_data_type(d->resource_data_type);
817 }
818 else
819 {
820 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
821 "Internal compiler error: Undeclared resource descriptor %u.", resource_id);
822 resource_space = 0;
823 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
824 sample_count = 1;
826 }
827
829 {
831 }
832 else
833 {
834 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
835 "Internal compiler error: Unhandled resource type %#x.", resource_type);
837 }
838
839 glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
840 glsl_src_init(&coord, gen, &ins->src[0], coord_mask);
842
843 vkd3d_string_buffer_printf(fetch, "texelFetch(");
844 shader_glsl_print_combined_sampler_name(fetch, gen, resource_idx,
845 resource_space, VKD3D_SHADER_DUMMY_SAMPLER_INDEX, 0);
846 vkd3d_string_buffer_printf(fetch, ", %s", coord.str->buffer);
847 if (resource_type != VKD3D_SHADER_RESOURCE_BUFFER)
848 {
849 vkd3d_string_buffer_printf(fetch, ", ");
850 if (ins->opcode != VKD3DSIH_LD2DMS)
851 shader_glsl_print_src(fetch, gen, &ins->src[0], VKD3DSP_WRITEMASK_3, ins->src[0].reg.data_type);
852 else if (sample_count == 1)
853 /* If the resource isn't a true multisample resource, this is the
854 * "lod" parameter instead of the "sample" parameter. */
855 vkd3d_string_buffer_printf(fetch, "0");
856 else
857 shader_glsl_print_src(fetch, gen, &ins->src[2], VKD3DSP_WRITEMASK_0, ins->src[2].reg.data_type);
858 }
859 vkd3d_string_buffer_printf(fetch, ")");
860 shader_glsl_print_swizzle(fetch, ins->src[1].swizzle, ins->dst[0].write_mask);
861
862 shader_glsl_print_assignment_ext(gen, &dst, data_type, "%s", fetch->buffer);
863
867}
868
870 const struct vkd3d_shader_src_param *coord, const struct vkd3d_shader_src_param *ref, unsigned int coord_size)
871{
873
874 switch (coord_size)
875 {
876 case 1:
878 shader_glsl_print_src(buffer, gen, coord, coord_mask, coord->reg.data_type);
882 break;
883
884 case 4:
885 shader_glsl_print_src(buffer, gen, coord, coord_mask, coord->reg.data_type);
888 break;
889
890 default:
892 shader_glsl_print_src(buffer, gen, coord, coord_mask, coord->reg.data_type);
896 break;
897 }
898}
899
900static void shader_glsl_sample(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
901{
902 bool shadow_sampler, array, bias, dynamic_offset, gather, grad, lod, lod_zero, offset, shadow;
905 unsigned int resource_id, resource_idx, resource_space;
906 unsigned int sampler_id, sampler_idx, sampler_space;
907 const struct vkd3d_shader_descriptor_info1 *d;
908 enum vkd3d_shader_component_type sampled_type;
910 unsigned int component_idx, coord_size;
913 struct glsl_dst dst;
914
915 bias = ins->opcode == VKD3DSIH_SAMPLE_B;
916 dynamic_offset = ins->opcode == VKD3DSIH_GATHER4_PO;
917 gather = ins->opcode == VKD3DSIH_GATHER4 || ins->opcode == VKD3DSIH_GATHER4_PO;
918 grad = ins->opcode == VKD3DSIH_SAMPLE_GRAD;
920 lod_zero = ins->opcode == VKD3DSIH_SAMPLE_C_LZ;
921 offset = dynamic_offset || vkd3d_shader_instruction_has_texel_offset(ins);
922 shadow = ins->opcode == VKD3DSIH_SAMPLE_C || ins->opcode == VKD3DSIH_SAMPLE_C_LZ;
923
924 resource = &ins->src[1 + dynamic_offset];
925 sampler = &ins->src[2 + dynamic_offset];
926
927 if (resource->reg.idx[0].rel_addr || resource->reg.idx[1].rel_addr
928 || sampler->reg.idx[0].rel_addr || sampler->reg.idx[1].rel_addr)
929 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
930 "Descriptor indexing is not supported.");
931
932 resource_id = resource->reg.idx[0].offset;
933 resource_idx = resource->reg.idx[1].offset;
935 {
936 resource_type = d->resource_type;
937 resource_space = d->register_space;
938 sampled_type = vkd3d_component_type_from_resource_data_type(d->resource_data_type);
940 }
941 else
942 {
943 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
944 "Internal compiler error: Undeclared resource descriptor %u.", resource_id);
945 resource_space = 0;
946 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
948 }
949
951 {
952 coord_size = resource_type_info->coord_size;
953 array = resource_type_info->array;
954 }
955 else
956 {
957 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
958 "Internal compiler error: Unhandled resource type %#x.", resource_type);
959 coord_size = 2;
960 array = false;
961 }
962
963 sampler_id = sampler->reg.idx[0].offset;
964 sampler_idx = sampler->reg.idx[1].offset;
966 {
967 sampler_space = d->register_space;
969
970 if (shadow)
971 {
972 if (!shadow_sampler)
973 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
974 "Internal compiler error: Sampler %u is not a comparison sampler.", sampler_id);
975 }
976 else
977 {
978 if (shadow_sampler)
979 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
980 "Internal compiler error: Sampler %u is a comparison sampler.", sampler_id);
981 }
982 }
983 else
984 {
985 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
986 "Internal compiler error: Undeclared sampler descriptor %u.", sampler_id);
987 sampler_space = 0;
988 }
989
990 glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
992
993 if (gather)
994 vkd3d_string_buffer_printf(sample, "textureGather");
995 else if (grad)
996 vkd3d_string_buffer_printf(sample, "textureGrad");
997 else if (lod)
998 vkd3d_string_buffer_printf(sample, "textureLod");
999 else
1001 vkd3d_string_buffer_printf(sample, "%s(", offset ? "Offset" : "");
1002 shader_glsl_print_combined_sampler_name(sample, gen, resource_idx, resource_space, sampler_idx, sampler_space);
1004 if (shadow)
1005 shader_glsl_print_shadow_coord(sample, gen, &ins->src[0], &ins->src[3], coord_size);
1006 else
1007 shader_glsl_print_src(sample, gen, &ins->src[0],
1008 vkd3d_write_mask_from_component_count(coord_size), ins->src[0].reg.data_type);
1009 if (grad)
1010 {
1012 shader_glsl_print_src(sample, gen, &ins->src[3],
1013 vkd3d_write_mask_from_component_count(coord_size - array), ins->src[3].reg.data_type);
1015 shader_glsl_print_src(sample, gen, &ins->src[4],
1016 vkd3d_write_mask_from_component_count(coord_size - array), ins->src[4].reg.data_type);
1017 }
1018 else if (lod_zero)
1019 {
1021 }
1022 else if (lod)
1023 {
1025 shader_glsl_print_src(sample, gen, &ins->src[3], VKD3DSP_WRITEMASK_0, ins->src[3].reg.data_type);
1026 }
1027 if (offset)
1028 {
1030 if (dynamic_offset)
1031 shader_glsl_print_src(sample, gen, &ins->src[1],
1032 vkd3d_write_mask_from_component_count(coord_size - array), ins->src[1].reg.data_type);
1033 else
1035 }
1036 if (bias)
1037 {
1039 shader_glsl_print_src(sample, gen, &ins->src[3], VKD3DSP_WRITEMASK_0, ins->src[3].reg.data_type);
1040 }
1041 else if (gather)
1042 {
1043 if ((component_idx = vsir_swizzle_get_component(sampler->swizzle, 0)))
1044 vkd3d_string_buffer_printf(sample, ", %d", component_idx);
1045 }
1047 shader_glsl_print_swizzle(sample, resource->swizzle, ins->dst[0].write_mask);
1048
1049 shader_glsl_print_assignment_ext(gen, &dst, data_type, "%s", sample->buffer);
1050
1053}
1054
1056{
1059 const struct vkd3d_shader_descriptor_info1 *d;
1061 unsigned int uav_id, uav_idx, uav_space;
1062 struct vkd3d_string_buffer *load;
1063 struct glsl_src coord;
1064 struct glsl_dst dst;
1065 uint32_t coord_mask;
1066
1067 if (ins->src[1].reg.idx[0].rel_addr || ins->src[1].reg.idx[1].rel_addr)
1068 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1069 "Descriptor indexing is not supported.");
1070
1071 uav_id = ins->src[1].reg.idx[0].offset;
1072 uav_idx = ins->src[1].reg.idx[1].offset;
1074 {
1075 resource_type = d->resource_type;
1076 uav_space = d->register_space;
1078 }
1079 else
1080 {
1081 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1082 "Internal compiler error: Undeclared UAV descriptor %u.", uav_id);
1083 uav_space = 0;
1084 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
1086 }
1087
1089 {
1091 }
1092 else
1093 {
1094 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1095 "Internal compiler error: Unhandled UAV type %#x.", resource_type);
1097 }
1098
1099 glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1100 glsl_src_init(&coord, gen, &ins->src[0], coord_mask);
1102
1103 vkd3d_string_buffer_printf(load, "imageLoad(");
1104 shader_glsl_print_image_name(load, gen, uav_idx, uav_space);
1105 vkd3d_string_buffer_printf(load, ", %s)", coord.str->buffer);
1106 shader_glsl_print_swizzle(load, ins->src[1].swizzle, ins->dst[0].write_mask);
1107
1108 shader_glsl_print_assignment_ext(gen, &dst,
1110
1114}
1115
1117{
1120 const struct vkd3d_shader_descriptor_info1 *d;
1122 unsigned int uav_id, uav_idx, uav_space;
1123 struct vkd3d_string_buffer *image_data;
1124 struct glsl_src image_coord;
1125 uint32_t coord_mask;
1126
1127 if (ins->dst[0].reg.idx[0].rel_addr || ins->dst[0].reg.idx[1].rel_addr)
1128 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1129 "Descriptor indexing is not supported.");
1130
1131 uav_id = ins->dst[0].reg.idx[0].offset;
1132 uav_idx = ins->dst[0].reg.idx[1].offset;
1134 {
1135 resource_type = d->resource_type;
1136 uav_space = d->register_space;
1138 }
1139 else
1140 {
1141 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1142 "Internal compiler error: Undeclared UAV descriptor %u.", uav_id);
1143 uav_space = 0;
1144 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
1146 }
1147
1149 {
1151 }
1152 else
1153 {
1154 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1155 "Internal compiler error: Unhandled UAV type %#x.", resource_type);
1157 }
1158
1159 glsl_src_init(&image_coord, gen, &ins->src[0], coord_mask);
1160 image_data = vkd3d_string_buffer_get(&gen->string_buffers);
1161
1162 if (ins->src[1].reg.dimension == VSIR_DIMENSION_SCALAR)
1163 {
1164 switch (component_type)
1165 {
1167 vkd3d_string_buffer_printf(image_data, "uvec4(");
1168 break;
1170 vkd3d_string_buffer_printf(image_data, "ivec4(");
1171 break;
1172 default:
1173 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1174 "Internal compiler error: Unhandled component type %#x.", component_type);
1175 /* fall through */
1177 vkd3d_string_buffer_printf(image_data, "vec4(");
1178 break;
1179 }
1180 }
1181 shader_glsl_print_src(image_data, gen, &ins->src[1], VKD3DSP_WRITEMASK_ALL,
1183 if (ins->src[1].reg.dimension == VSIR_DIMENSION_SCALAR)
1184 vkd3d_string_buffer_printf(image_data, ", 0, 0, 0)");
1185
1187 vkd3d_string_buffer_printf(gen->buffer, "imageStore(");
1188 shader_glsl_print_image_name(gen->buffer, gen, uav_idx, uav_space);
1189 vkd3d_string_buffer_printf(gen->buffer, ", %s, %s);\n", image_coord.str->buffer, image_data->buffer);
1190
1192 glsl_src_cleanup(&image_coord, &gen->string_buffers);
1193}
1194
1196 const struct vkd3d_shader_instruction *ins, const char *op)
1197{
1198 struct glsl_src src;
1199 struct glsl_dst dst;
1200 uint32_t mask;
1201
1202 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1203 glsl_src_init(&src, gen, &ins->src[0], mask);
1204
1205 shader_glsl_print_assignment(gen, &dst, "%s%s", op, src.str->buffer);
1206
1209}
1210
1211static void shader_glsl_mov(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
1212{
1213 struct glsl_src src;
1214 struct glsl_dst dst;
1215 uint32_t mask;
1216
1217 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1218 glsl_src_init(&src, gen, &ins->src[0], mask);
1219
1220 shader_glsl_print_assignment(gen, &dst, "%s", src.str->buffer);
1221
1224}
1225
1226static void shader_glsl_movc(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
1227{
1228 unsigned int component_count;
1229 struct glsl_src src[3];
1230 struct glsl_dst dst;
1231 uint32_t mask;
1232
1233 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1234 glsl_src_init(&src[0], gen, &ins->src[0], mask);
1235 glsl_src_init(&src[1], gen, &ins->src[1], mask);
1236 glsl_src_init(&src[2], gen, &ins->src[2], mask);
1237
1239 shader_glsl_print_assignment(gen, &dst, "mix(%s, %s, bvec%u(%s))",
1240 src[2].str->buffer, src[1].str->buffer, component_count, src[0].str->buffer);
1241 else
1242 shader_glsl_print_assignment(gen, &dst, "mix(%s, %s, bool(%s))",
1243 src[2].str->buffer, src[1].str->buffer, src[0].str->buffer);
1244
1249}
1250
1252{
1253 struct glsl_src src[2];
1254 struct glsl_dst dst;
1255 uint32_t mask;
1256
1257 if (ins->dst[0].reg.type != VKD3DSPR_NULL)
1258 {
1259 /* FIXME: imulExtended()/umulExtended() from ARB_gpu_shader5/GLSL 4.00+. */
1260 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
1261 shader_glsl_print_assignment(gen, &dst, "<unhandled 64-bit multiplication>");
1263
1264 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1265 "Internal compiler error: Unhandled 64-bit integer multiplication.");
1266 }
1267
1268 if (ins->dst[1].reg.type != VKD3DSPR_NULL)
1269 {
1270 mask = glsl_dst_init(&dst, gen, ins, &ins->dst[1]);
1271 glsl_src_init(&src[0], gen, &ins->src[0], mask);
1272 glsl_src_init(&src[1], gen, &ins->src[1], mask);
1273
1274 shader_glsl_print_assignment(gen, &dst, "%s * %s", src[0].str->buffer, src[1].str->buffer);
1275
1279 }
1280}
1281
1283 enum vkd3d_shader_sysval_semantic sysval, unsigned int idx)
1284{
1285 const struct vkd3d_shader_version *version = &gen->program->shader_version;
1286
1287 switch (sysval)
1288 {
1291 {
1292 vkd3d_string_buffer_printf(buffer, "<unhandled sysval %#x>", sysval);
1293 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1294 "Internal compiler error: Unhandled SV_POSITION in shader type #%x.", version->type);
1295 break;
1296 }
1297 if (idx)
1298 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1299 "Internal compiler error: Unhandled SV_POSITION index %u.", idx);
1300 if (version->type == VKD3D_SHADER_TYPE_PIXEL)
1301 vkd3d_string_buffer_printf(buffer, "gl_FragCoord");
1302 else
1303 vkd3d_string_buffer_printf(buffer, "gl_Position");
1304 break;
1305
1307 if (version->type != VKD3D_SHADER_TYPE_VERTEX)
1308 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1309 "Internal compiler error: Unhandled SV_VERTEX_ID in shader type #%x.", version->type);
1310 vkd3d_string_buffer_printf(buffer, "intBitsToFloat(ivec4(gl_VertexID, 0, 0, 0))");
1311 break;
1312
1314 if (version->type != VKD3D_SHADER_TYPE_PIXEL)
1315 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1316 "Internal compiler error: Unhandled SV_IS_FRONT_FACE in shader type #%x.", version->type);
1318 "uintBitsToFloat(uvec4(gl_FrontFacing ? 0xffffffffu : 0u, 0u, 0u, 0u))");
1319 break;
1320
1322 if (version->type != VKD3D_SHADER_TYPE_PIXEL)
1323 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1324 "Internal compiler error: Unhandled SV_SAMPLE_INDEX in shader type #%x.", version->type);
1325 vkd3d_string_buffer_printf(buffer, "intBitsToFloat(ivec4(gl_SampleID, 0, 0, 0))");
1326 break;
1327
1329 if (version->type != VKD3D_SHADER_TYPE_PIXEL)
1330 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1331 "Internal compiler error: Unhandled SV_TARGET in shader type #%x.", version->type);
1332 vkd3d_string_buffer_printf(buffer, "shader_out_%u", idx);
1333 break;
1334
1335 default:
1336 vkd3d_string_buffer_printf(buffer, "<unhandled sysval %#x>", sysval);
1337 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1338 "Internal compiler error: Unhandled system value %#x.", sysval);
1339 break;
1340 }
1341}
1342
1344{
1345 const struct shader_signature *signature = &gen->program->input_signature;
1346 struct vkd3d_string_buffer *buffer = gen->buffer;
1347 const struct signature_element *e;
1348 unsigned int i;
1349
1350 for (i = 0; i < signature->element_count; ++i)
1351 {
1352 e = &signature->elements[i];
1353
1354 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
1355 continue;
1356
1358 vkd3d_string_buffer_printf(buffer, "%s_in[%u]", gen->prefix, e->register_index);
1360 if (e->sysval_semantic == VKD3D_SHADER_SV_NONE)
1361 {
1362 if (gen->interstage_input)
1363 {
1364 vkd3d_string_buffer_printf(buffer, " = shader_in.reg_%u", e->target_location);
1365 if (e->target_location >= gen->limits.input_count)
1366 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1367 "Internal compiler error: Input element %u specifies target location %u, "
1368 "but only %u inputs are supported.",
1369 i, e->target_location, gen->limits.input_count);
1370 }
1371 else
1372 {
1373 switch (e->component_type)
1374 {
1376 vkd3d_string_buffer_printf(buffer, " = uintBitsToFloat(shader_in_%u)", i);
1377 break;
1379 vkd3d_string_buffer_printf(buffer, " = intBitsToFloat(shader_in_%u)", i);
1380 break;
1381 default:
1382 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1383 "Internal compiler error: Unhandled input component type %#x.", e->component_type);
1384 /* fall through */
1386 vkd3d_string_buffer_printf(buffer, " = shader_in_%u", i);
1387 break;
1388 }
1389 }
1390 }
1391 else
1392 {
1394 shader_glsl_print_sysval_name(buffer, gen, e->sysval_semantic, e->semantic_index);
1395 }
1398 }
1399}
1400
1402{
1403 const struct shader_signature *signature = &gen->program->output_signature;
1404 struct vkd3d_string_buffer *buffer = gen->buffer;
1406 const struct signature_element *e;
1407 unsigned int i;
1408
1409 for (i = 0; i < signature->element_count; ++i)
1410 {
1411 e = &signature->elements[i];
1412
1413 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
1414 continue;
1415
1416 type = e->component_type;
1418 if (e->sysval_semantic == VKD3D_SHADER_SV_NONE)
1419 {
1420 if (gen->interstage_output)
1421 {
1423 vkd3d_string_buffer_printf(buffer, "shader_out.reg_%u", e->target_location);
1424 if (e->target_location >= gen->limits.output_count)
1425 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1426 "Internal compiler error: Output element %u specifies target location %u, "
1427 "but only %u outputs are supported.",
1428 i, e->target_location, gen->limits.output_count);
1429 }
1430 else
1431 {
1432 vkd3d_string_buffer_printf(buffer, "<unhandled output %u>", e->target_location);
1433 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1434 "Internal compiler error: Unhandled output.");
1435 }
1436 }
1437 else
1438 {
1439 shader_glsl_print_sysval_name(buffer, gen, e->sysval_semantic, e->semantic_index);
1440 }
1442 switch (type)
1443 {
1445 vkd3d_string_buffer_printf(buffer, " = floatBitsToUint(%s_out[%u])", gen->prefix, e->register_index);
1446 break;
1448 vkd3d_string_buffer_printf(buffer, " = floatBitsToInt(%s_out[%u])", gen->prefix, e->register_index);
1449 break;
1450 default:
1451 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1452 "Internal compiler error: Unhandled output component type %#x.", e->component_type);
1453 /* fall through */
1455 vkd3d_string_buffer_printf(buffer, " = %s_out[%u]", gen->prefix, e->register_index);
1456 break;
1457 }
1460 }
1461}
1462
1463static void shader_glsl_ret(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
1464{
1465 const struct vkd3d_shader_version *version = &gen->program->shader_version;
1466
1467 if (version->major >= 4)
1468 {
1471 vkd3d_string_buffer_printf(gen->buffer, "return;\n");
1472 }
1473}
1474
1476 const struct vkd3d_shader_instruction *ins)
1477{
1479 vkd3d_string_buffer_printf(gen->buffer, "vec4 x%u[%u];\n",
1480 ins->declaration.indexable_temp.register_idx,
1481 ins->declaration.indexable_temp.register_size);
1482}
1483
1485 const struct vkd3d_shader_instruction *ins)
1486{
1487 gen->location = ins->location;
1488
1489 switch (ins->opcode)
1490 {
1491 case VKD3DSIH_ADD:
1492 case VKD3DSIH_IADD:
1493 shader_glsl_binop(gen, ins, "+");
1494 break;
1495 case VKD3DSIH_AND:
1496 shader_glsl_binop(gen, ins, "&");
1497 break;
1498 case VKD3DSIH_BREAK:
1499 shader_glsl_break(gen);
1500 break;
1501 case VKD3DSIH_CASE:
1502 shader_glsl_case(gen, ins);
1503 break;
1504 case VKD3DSIH_CONTINUE:
1506 break;
1509 break;
1510 case VKD3DSIH_DCL_INPUT:
1517 case VKD3DSIH_NOP:
1518 break;
1519 case VKD3DSIH_DEFAULT:
1521 break;
1522 case VKD3DSIH_DIV:
1523 shader_glsl_binop(gen, ins, "/");
1524 break;
1525 case VKD3DSIH_DP2:
1527 break;
1528 case VKD3DSIH_DP3:
1530 break;
1531 case VKD3DSIH_DP4:
1533 break;
1534 case VKD3DSIH_ELSE:
1535 shader_glsl_else(gen, ins);
1536 break;
1537 case VKD3DSIH_ENDIF:
1538 case VKD3DSIH_ENDLOOP:
1539 case VKD3DSIH_ENDSWITCH:
1541 break;
1542 case VKD3DSIH_EQO:
1543 case VKD3DSIH_IEQ:
1544 shader_glsl_relop(gen, ins, "==", "equal");
1545 break;
1546 case VKD3DSIH_EXP:
1547 shader_glsl_intrinsic(gen, ins, "exp2");
1548 break;
1549 case VKD3DSIH_FRC:
1550 shader_glsl_intrinsic(gen, ins, "fract");
1551 break;
1552 case VKD3DSIH_FTOI:
1553 shader_glsl_cast(gen, ins, "int", "ivec");
1554 break;
1555 case VKD3DSIH_FTOU:
1556 shader_glsl_cast(gen, ins, "uint", "uvec");
1557 break;
1558 case VKD3DSIH_GATHER4:
1560 case VKD3DSIH_SAMPLE:
1561 case VKD3DSIH_SAMPLE_B:
1562 case VKD3DSIH_SAMPLE_C:
1566 shader_glsl_sample(gen, ins);
1567 break;
1568 case VKD3DSIH_GEO:
1569 case VKD3DSIH_IGE:
1570 shader_glsl_relop(gen, ins, ">=", "greaterThanEqual");
1571 break;
1572 case VKD3DSIH_IF:
1573 shader_glsl_if(gen, ins);
1574 break;
1575 case VKD3DSIH_MAD:
1576 shader_glsl_intrinsic(gen, ins, "fma");
1577 break;
1578 case VKD3DSIH_ILT:
1579 case VKD3DSIH_LTO:
1580 case VKD3DSIH_ULT:
1581 shader_glsl_relop(gen, ins, "<", "lessThan");
1582 break;
1583 case VKD3DSIH_IMAX:
1584 case VKD3DSIH_MAX:
1585 case VKD3DSIH_UMAX:
1586 shader_glsl_intrinsic(gen, ins, "max");
1587 break;
1588 case VKD3DSIH_MIN:
1589 case VKD3DSIH_UMIN:
1590 shader_glsl_intrinsic(gen, ins, "min");
1591 break;
1592 case VKD3DSIH_IMUL:
1593 shader_glsl_mul_extended(gen, ins);
1594 break;
1595 case VKD3DSIH_INE:
1596 case VKD3DSIH_NEU:
1597 shader_glsl_relop(gen, ins, "!=", "notEqual");
1598 break;
1599 case VKD3DSIH_INEG:
1600 shader_glsl_unary_op(gen, ins, "-");
1601 break;
1602 case VKD3DSIH_ISHL:
1603 shader_glsl_binop(gen, ins, "<<");
1604 break;
1605 case VKD3DSIH_ISHR:
1606 case VKD3DSIH_USHR:
1607 shader_glsl_binop(gen, ins, ">>");
1608 break;
1609 case VKD3DSIH_ITOF:
1610 case VKD3DSIH_UTOF:
1611 shader_glsl_cast(gen, ins, "float", "vec");
1612 break;
1613 case VKD3DSIH_LD:
1614 case VKD3DSIH_LD2DMS:
1615 shader_glsl_ld(gen, ins);
1616 break;
1619 break;
1620 case VKD3DSIH_LOG:
1621 shader_glsl_intrinsic(gen, ins, "log2");
1622 break;
1623 case VKD3DSIH_LOOP:
1624 shader_glsl_loop(gen);
1625 break;
1626 case VKD3DSIH_MOV:
1627 shader_glsl_mov(gen, ins);
1628 break;
1629 case VKD3DSIH_MOVC:
1630 shader_glsl_movc(gen, ins);
1631 break;
1632 case VKD3DSIH_MUL:
1633 shader_glsl_binop(gen, ins, "*");
1634 break;
1635 case VKD3DSIH_NOT:
1636 shader_glsl_unary_op(gen, ins, "~");
1637 break;
1638 case VKD3DSIH_OR:
1639 shader_glsl_binop(gen, ins, "|");
1640 break;
1641 case VKD3DSIH_RET:
1642 shader_glsl_ret(gen, ins);
1643 break;
1644 case VKD3DSIH_ROUND_NE:
1645 shader_glsl_intrinsic(gen, ins, "roundEven");
1646 break;
1647 case VKD3DSIH_ROUND_NI:
1648 shader_glsl_intrinsic(gen, ins, "floor");
1649 break;
1650 case VKD3DSIH_ROUND_PI:
1651 shader_glsl_intrinsic(gen, ins, "ceil");
1652 break;
1653 case VKD3DSIH_ROUND_Z:
1654 shader_glsl_intrinsic(gen, ins, "trunc");
1655 break;
1656 case VKD3DSIH_RSQ:
1657 shader_glsl_intrinsic(gen, ins, "inversesqrt");
1658 break;
1659 case VKD3DSIH_SQRT:
1660 shader_glsl_intrinsic(gen, ins, "sqrt");
1661 break;
1664 break;
1665 case VKD3DSIH_SWITCH:
1666 shader_glsl_switch(gen, ins);
1667 break;
1668 default:
1669 shader_glsl_unhandled(gen, ins);
1670 break;
1671 }
1672}
1673
1675 enum vkd3d_shader_visibility visibility)
1676{
1677 enum vkd3d_shader_type t = gen->program->shader_version.type;
1678
1679 switch (visibility)
1680 {
1682 return true;
1684 return t == VKD3D_SHADER_TYPE_VERTEX;
1686 return t == VKD3D_SHADER_TYPE_HULL;
1688 return t == VKD3D_SHADER_TYPE_DOMAIN;
1690 return t == VKD3D_SHADER_TYPE_GEOMETRY;
1692 return t == VKD3D_SHADER_TYPE_PIXEL;
1694 return t == VKD3D_SHADER_TYPE_COMPUTE;
1695 default:
1696 WARN("Invalid shader visibility %#x.\n", visibility);
1697 return false;
1698 }
1699}
1700
1701static bool shader_glsl_get_uav_binding(const struct vkd3d_glsl_generator *gen, unsigned int register_space,
1702 unsigned int register_idx, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
1703{
1706 enum vkd3d_shader_binding_flag resource_type_flag;
1707 unsigned int i;
1708
1709 if (!interface_info)
1710 return false;
1711
1712 resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
1714
1715 for (i = 0; i < interface_info->binding_count; ++i)
1716 {
1717 binding = &interface_info->bindings[i];
1718
1720 continue;
1721 if (binding->register_space != register_space)
1722 continue;
1723 if (binding->register_index != register_idx)
1724 continue;
1725 if (!shader_glsl_check_shader_visibility(gen, binding->shader_visibility))
1726 continue;
1727 if (!(binding->flags & resource_type_flag))
1728 continue;
1729 *binding_idx = i;
1730 return true;
1731 }
1732
1733 return false;
1734}
1735
1737 const struct vkd3d_shader_descriptor_info1 *uav)
1738{
1740 const char *image_type_prefix, *image_type, *read_format;
1743 struct vkd3d_string_buffer *buffer = gen->buffer;
1745 unsigned int binding_idx;
1746
1747 if (uav->count != 1)
1748 {
1749 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1750 "UAV %u has unsupported descriptor array size %u.", uav->register_id, uav->count);
1751 return;
1752 }
1753
1755 uav->register_index, uav->resource_type, &binding_idx))
1756 {
1757 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1758 "No descriptor binding specified for UAV %u.", uav->register_id);
1759 return;
1760 }
1761
1762 binding = &gen->interface_info->bindings[binding_idx].binding;
1763
1764 if (binding->set != 0)
1765 {
1766 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1767 "Unsupported binding set %u specified for UAV %u.", binding->set, uav->register_id);
1768 return;
1769 }
1770
1771 if (binding->count != 1)
1772 {
1773 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1774 "Unsupported binding count %u specified for UAV %u.", binding->count, uav->register_id);
1775 return;
1776 }
1777
1778 if (gen->offset_info && gen->offset_info->binding_offsets)
1779 {
1780 offset = &gen->offset_info->binding_offsets[binding_idx];
1781 if (offset->static_offset || offset->dynamic_offset_index != ~0u)
1782 {
1783 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1784 "Internal compiler error: Unhandled descriptor offset specified for UAV %u.",
1785 uav->register_id);
1786 return;
1787 }
1788 }
1789
1791 {
1792 image_type = resource_type_info->type_suffix;
1793 }
1794 else
1795 {
1796 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1797 "Internal compiler error: Unhandled UAV type %#x.", uav->resource_type);
1798 image_type = "<unhandled image type>";
1799 }
1800
1802 {
1804 image_type_prefix = "u";
1805 read_format = "r32ui";
1806 break;
1808 image_type_prefix = "i";
1809 read_format = "r32i";
1810 break;
1811 default:
1812 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1813 "Internal compiler error: Unhandled component type %#x for UAV %u.",
1815 /* fall through */
1817 image_type_prefix = "";
1818 read_format = "r32f";
1819 break;
1820 }
1821
1822 vkd3d_string_buffer_printf(buffer, "layout(binding = %u", binding->binding);
1824 vkd3d_string_buffer_printf(buffer, ", %s) ", read_format);
1825 else
1826 vkd3d_string_buffer_printf(buffer, ") writeonly ");
1827 vkd3d_string_buffer_printf(buffer, "uniform %simage%s ", image_type_prefix, image_type);
1830}
1831
1833 unsigned int register_space, unsigned int register_idx, unsigned int *binding_idx)
1834{
1837 unsigned int i;
1838
1839 if (!interface_info)
1840 return false;
1841
1842 for (i = 0; i < interface_info->binding_count; ++i)
1843 {
1844 binding = &interface_info->bindings[i];
1845
1847 continue;
1848 if (binding->register_space != register_space)
1849 continue;
1850 if (binding->register_index != register_idx)
1851 continue;
1852 if (!shader_glsl_check_shader_visibility(gen, binding->shader_visibility))
1853 continue;
1855 continue;
1856 *binding_idx = i;
1857 return true;
1858 }
1859
1860 return false;
1861}
1862
1864 const struct vkd3d_shader_descriptor_info1 *cbv)
1865{
1868 struct vkd3d_string_buffer *buffer = gen->buffer;
1869 const char *prefix = gen->prefix;
1870 unsigned int binding_idx;
1871 size_t size;
1872
1873 if (cbv->count != 1)
1874 {
1875 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
1876 "Constant buffer %u has unsupported descriptor array size %u.", cbv->register_id, cbv->count);
1877 return;
1878 }
1879
1880 if (!shader_glsl_get_cbv_binding(gen, cbv->register_space, cbv->register_index, &binding_idx))
1881 {
1882 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1883 "No descriptor binding specified for constant buffer %u.", cbv->register_id);
1884 return;
1885 }
1886
1887 binding = &gen->interface_info->bindings[binding_idx].binding;
1888
1889 if (binding->set != 0)
1890 {
1891 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1892 "Unsupported binding set %u specified for constant buffer %u.", binding->set, cbv->register_id);
1893 return;
1894 }
1895
1896 if (binding->count != 1)
1897 {
1898 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
1899 "Unsupported binding count %u specified for constant buffer %u.", binding->count, cbv->register_id);
1900 return;
1901 }
1902
1903 if (gen->offset_info && gen->offset_info->binding_offsets)
1904 {
1905 offset = &gen->offset_info->binding_offsets[binding_idx];
1906 if (offset->static_offset || offset->dynamic_offset_index != ~0u)
1907 {
1908 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1909 "Internal compiler error: Unhandled descriptor offset specified for constant buffer %u.",
1910 cbv->register_id);
1911 return;
1912 }
1913 }
1914
1915 size = align(cbv->buffer_size, VKD3D_VEC4_SIZE * sizeof(uint32_t));
1916 size /= VKD3D_VEC4_SIZE * sizeof(uint32_t);
1917
1919 "layout(std140, binding = %u) uniform block_%s_cb_%u { vec4 %s_cb_%u[%zu]; };\n",
1920 binding->binding, prefix, cbv->register_id, prefix, cbv->register_id, size);
1921}
1922
1925 enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
1926{
1929 enum vkd3d_shader_binding_flag resource_type_flag;
1930 unsigned int i;
1931
1932 if (!interface_info)
1933 return false;
1934
1935 resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
1937
1938 for (i = 0; i < interface_info->combined_sampler_count; ++i)
1939 {
1940 s = &interface_info->combined_samplers[i];
1941
1942 if (s->resource_space != crs->resource_space)
1943 continue;
1944 if (s->resource_index != crs->resource_index)
1945 continue;
1947 {
1948 if (s->sampler_space != crs->sampler_space)
1949 continue;
1950 if (s->sampler_index != crs->sampler_index)
1951 continue;
1952 }
1953 if (!shader_glsl_check_shader_visibility(gen, s->shader_visibility))
1954 continue;
1955 if (!(s->flags & resource_type_flag))
1956 continue;
1957 *binding_idx = i;
1958 return true;
1959 }
1960
1961 return false;
1962}
1963
1966{
1967 const struct vkd3d_shader_descriptor_info1 *sampler, *srv;
1970 struct vkd3d_string_buffer *buffer = gen->buffer;
1972 const char *sampler_type, *sampler_type_prefix;
1973 enum vkd3d_shader_resource_type resource_type;
1974 unsigned int binding_idx;
1975 bool shadow = false;
1976
1978 {
1980 crs->sampler_index, crs->sampler_space)))
1981 {
1982 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1983 "Internal compiler error: No descriptor found for sampler %u, space %u.",
1984 crs->sampler_index, crs->sampler_space);
1985 return;
1986 }
1988 }
1989
1991 crs->resource_index, crs->resource_space)))
1992 {
1993 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
1994 "Internal compiler error: No descriptor found for resource %u, space %u.",
1995 crs->resource_index, crs->resource_space);
1996 return;
1997 }
1998
1999 resource_type = srv->resource_type;
2000 if (srv->sample_count == 1)
2001 {
2002 /* The OpenGL API distinguishes between multi-sample textures with
2003 * sample count 1 and single-sample textures. Direct3D and Vulkan
2004 * don't make this distinction at the API level, but Direct3D shaders
2005 * are capable of expressing both. We therefore map such multi-sample
2006 * textures to their single-sample equivalents here. */
2007 if (resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMS)
2008 resource_type = VKD3D_SHADER_RESOURCE_TEXTURE_2D;
2009 else if (resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY)
2011 }
2012
2014 {
2015 sampler_type = resource_type_info->type_suffix;
2016 if (shadow && !resource_type_info->shadow)
2017 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED,
2018 "Comparison samplers are not supported with resource type %#x.", resource_type);
2019 }
2020 else
2021 {
2022 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2023 "Internal compiler error: Unhandled resource type %#x for combined resource/sampler "
2024 "for resource %u, space %u and sampler %u, space %u.", resource_type,
2026 sampler_type = "<unhandled sampler type>";
2027 }
2028
2030 {
2032 sampler_type_prefix = "u";
2033 break;
2035 sampler_type_prefix = "i";
2036 break;
2038 sampler_type_prefix = "";
2039 break;
2040 default:
2041 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2042 "Internal compiler error: Unhandled component type %#x for combined resource/sampler "
2043 "for resource %u, space %u and sampler %u, space %u.", component_type,
2045 sampler_type_prefix = "";
2046 break;
2047 }
2048
2049 if (!shader_glsl_get_combined_sampler_binding(gen, crs, resource_type, &binding_idx))
2050 {
2051 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
2052 "No descriptor binding specified for combined resource/sampler "
2053 "for resource %u, space %u and sampler %u, space %u.",
2055 return;
2056 }
2057
2058 binding = &gen->interface_info->combined_samplers[binding_idx].binding;
2059
2060 if (binding->set != 0)
2061 {
2062 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
2063 "Unsupported binding set %u specified for combined resource/sampler "
2064 "for resource %u, space %u and sampler %u, space %u.", binding->set,
2066 return;
2067 }
2068
2069 if (binding->count != 1)
2070 {
2071 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND,
2072 "Unsupported binding count %u specified for combined resource/sampler "
2073 "for resource %u, space %u and sampler %u, space %u.", binding->count,
2075 return;
2076 }
2077
2078 vkd3d_string_buffer_printf(buffer, "layout(binding = %u) uniform %ssampler%s%s ",
2079 binding->binding, sampler_type_prefix, sampler_type, shadow ? "Shadow" : "");
2081 crs->resource_space, crs->sampler_index, crs->sampler_space);
2083}
2084
2086{
2090 unsigned int i;
2091
2092 for (i = 0; i < info->descriptor_count; ++i)
2093 {
2094 descriptor = &info->descriptors[i];
2095
2096 switch (descriptor->type)
2097 {
2100 /* GLSL uses combined resource/sampler descriptors.*/
2101 break;
2102
2105 break;
2106
2109 break;
2110
2111 default:
2112 vkd3d_string_buffer_printf(gen->buffer, "/* <unhandled descriptor type %#x> */\n", descriptor->type);
2113 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2114 "Internal compiler error: Unhandled descriptor type %#x.", descriptor->type);
2115 break;
2116 }
2117 }
2118 for (i = 0; i < sampler_info->combined_sampler_count; ++i)
2119 {
2121 }
2122 if (info->descriptor_count)
2124}
2125
2127 const struct shader_signature *signature, unsigned int location)
2128{
2129 const struct signature_element *e;
2130 unsigned int i;
2131
2132 for (i = 0; i < signature->element_count; ++i)
2133 {
2134 e = &signature->elements[i];
2135
2136 if (e->target_location != location)
2137 continue;
2138
2139 return e;
2140 }
2141
2142 return NULL;
2143}
2144
2146 const struct shader_signature *signature, const char *type, unsigned int location)
2147{
2149 const struct signature_element *e;
2150
2152 m = e->interpolation_mode;
2153 else
2154 m = VKD3DSIM_NONE;
2155
2156 switch (m)
2157 {
2158 case VKD3DSIM_NONE:
2159 case VKD3DSIM_LINEAR:
2160 return "";
2161 case VKD3DSIM_CONSTANT:
2162 return "flat ";
2163 default:
2164 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2165 "Internal compiler error: Unhandled interpolation mode %#x for %s location %u.", m, type, location);
2166 return "";
2167 }
2168}
2169
2171 const struct shader_signature *signature, const char *type, unsigned int count)
2172{
2173 struct vkd3d_string_buffer *buffer = gen->buffer;
2174 const char *interpolation;
2175 unsigned int i;
2176
2177 vkd3d_string_buffer_printf(buffer, "%s shader_in_out\n{\n", type);
2178 for (i = 0; i < count; ++i)
2179 {
2180 interpolation = shader_glsl_get_interpolation(gen, signature, type, i);
2181 vkd3d_string_buffer_printf(buffer, " %svec4 reg_%u;\n", interpolation, i);
2182 }
2183 vkd3d_string_buffer_printf(buffer, "} shader_%s;\n", type);
2184}
2185
2187{
2188 const struct shader_signature *signature = &gen->program->input_signature;
2189 struct vkd3d_string_buffer *buffer = gen->buffer;
2190 const struct signature_element *e;
2191 unsigned int i, count;
2192
2193 if (!gen->interstage_input)
2194 {
2195 for (i = 0, count = 0; i < signature->element_count; ++i)
2196 {
2197 e = &signature->elements[i];
2198
2199 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED || e->sysval_semantic)
2200 continue;
2201
2202 if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE)
2203 {
2204 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2205 "Internal compiler error: Unhandled minimum precision %#x.", e->min_precision);
2206 continue;
2207 }
2208
2209 if (e->interpolation_mode != VKD3DSIM_NONE)
2210 {
2211 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2212 "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
2213 continue;
2214 }
2215
2216 vkd3d_string_buffer_printf(buffer, "layout(location = %u) in ", e->target_location);
2217 switch (e->component_type)
2218 {
2221 break;
2224 break;
2227 break;
2228 default:
2229 vkd3d_string_buffer_printf(buffer, "<unhandled type %#x>", e->component_type);
2230 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2231 "Internal compiler error: Unhandled input component type %#x.", e->component_type);
2232 break;
2233 }
2234 vkd3d_string_buffer_printf(buffer, " shader_in_%u;\n", i);
2235 ++count;
2236 }
2237 if (count)
2239 }
2240 else if (gen->limits.input_count)
2241 {
2242 shader_glsl_generate_interface_block(gen, signature, "in", gen->limits.input_count);
2244 }
2245}
2246
2248{
2249 const struct shader_signature *signature = &gen->program->output_signature;
2250 struct vkd3d_string_buffer *buffer = gen->buffer;
2251 const struct signature_element *e;
2252 unsigned int i, count;
2253
2254 if (!gen->interstage_output)
2255 {
2256 for (i = 0, count = 0; i < signature->element_count; ++i)
2257 {
2258 e = &signature->elements[i];
2259
2260 if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
2261 continue;
2262
2263 if (e->sysval_semantic != VKD3D_SHADER_SV_TARGET)
2264 {
2265 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2266 "Internal compiler error: Unhandled system value %#x.", e->sysval_semantic);
2267 continue;
2268 }
2269
2270 if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE)
2271 {
2272 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2273 "Internal compiler error: Unhandled minimum precision %#x.", e->min_precision);
2274 continue;
2275 }
2276
2277 if (e->interpolation_mode != VKD3DSIM_NONE)
2278 {
2279 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2280 "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
2281 continue;
2282 }
2283
2284 vkd3d_string_buffer_printf(buffer, "layout(location = %u) out ", e->target_location);
2285 switch (e->component_type)
2286 {
2289 break;
2292 break;
2295 break;
2296 default:
2297 vkd3d_string_buffer_printf(buffer, "<unhandled type %#x>", e->component_type);
2298 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2299 "Internal compiler error: Unhandled output component type %#x.", e->component_type);
2300 break;
2301 }
2302 vkd3d_string_buffer_printf(buffer, " shader_out_%u;\n", e->semantic_index);
2303 ++count;
2304 }
2305 if (count)
2307 }
2308 else if (gen->limits.output_count)
2309 {
2310 shader_glsl_generate_interface_block(gen, signature, "out", gen->limits.output_count);
2312 }
2313}
2314
2317{
2319 {
2320 vkd3d_string_buffer_printf(buffer, "layout(early_fragment_tests) in;\n");
2321 flags &= ~VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL;
2322 }
2323
2324 if (flags)
2325 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2326 "Internal compiler error: Unhandled global flags %#"PRIx64".", (uint64_t)flags);
2327}
2328
2330{
2331 const struct vsir_program *program = gen->program;
2332 struct vkd3d_string_buffer *buffer = gen->buffer;
2333 const struct vsir_thread_group_size *group_size;
2334
2335 if (program->shader_version.type == VKD3D_SHADER_TYPE_COMPUTE)
2336 {
2337 group_size = &program->thread_group_size;
2338 vkd3d_string_buffer_printf(buffer, "layout(local_size_x = %u, local_size_y = %u, local_size_z = %u) in;\n\n",
2339 group_size->x, group_size->y, group_size->z);
2340 }
2341
2342 shader_glsl_handle_global_flags(buffer, gen, program->global_flags);
2343
2347
2348 if (gen->limits.input_count)
2349 vkd3d_string_buffer_printf(buffer, "vec4 %s_in[%u];\n", gen->prefix, gen->limits.input_count);
2350 if (gen->limits.output_count)
2351 vkd3d_string_buffer_printf(buffer, "vec4 %s_out[%u];\n", gen->prefix, gen->limits.output_count);
2352 if (program->temp_count)
2353 vkd3d_string_buffer_printf(buffer, "vec4 r[%u];\n", program->temp_count);
2355}
2356
2358{
2359 const struct vkd3d_shader_instruction_array *instructions = &gen->program->instructions;
2360 struct vkd3d_string_buffer *buffer = gen->buffer;
2361 unsigned int i;
2362 void *code;
2363
2364 MESSAGE("Generating a GLSL shader. This is unsupported; you get to keep all the pieces if it breaks.\n");
2365
2366 vkd3d_string_buffer_printf(buffer, "#version 440\n\n");
2367
2368 vkd3d_string_buffer_printf(buffer, "/* Generated by %s. */\n\n", vkd3d_shader_get_version(NULL, NULL));
2369
2371
2372 vkd3d_string_buffer_printf(buffer, "void main()\n{\n");
2373
2374 ++gen->indent;
2376 for (i = 0; i < instructions->count; ++i)
2377 {
2378 vkd3d_glsl_handle_instruction(gen, &instructions->elements[i]);
2379 }
2380
2382
2383 if (TRACE_ON())
2385
2386 if (gen->failed)
2388
2389 if ((code = vkd3d_malloc(buffer->buffer_size)))
2390 {
2391 memcpy(code, buffer->buffer, buffer->content_size);
2392 out->size = buffer->content_size;
2393 out->code = code;
2394 }
2395 else return VKD3D_ERROR_OUT_OF_MEMORY;
2396
2397 return VKD3D_OK;
2398}
2399
2401{
2404}
2405
2407{
2408 struct shader_limits *limits = &gen->limits;
2409
2410 if (version->major < 4 || version->major >= 6)
2411 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2412 "Internal compiler error: Unhandled shader version %u.%u.", version->major, version->minor);
2413
2414 switch (version->type)
2415 {
2417 limits->input_count = 32;
2418 limits->output_count = 32;
2419 break;
2421 limits->input_count = 32;
2422 limits->output_count = 8;
2423 break;
2425 limits->input_count = 0;
2426 limits->output_count = 0;
2427 break;
2428 default:
2429 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2430 "Internal compiler error: Unhandled shader type %#x.", version->type);
2431 limits->input_count = 0;
2432 limits->output_count = 0;
2433 break;
2434 }
2435}
2436
2438 struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info,
2439 const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info,
2440 const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info,
2441 struct vkd3d_shader_message_context *message_context)
2442{
2443 enum vkd3d_shader_type type = program->shader_version.type;
2444
2445 memset(gen, 0, sizeof(*gen));
2446 gen->program = program;
2449 gen->location.source_name = compile_info->source_name;
2450 gen->message_context = message_context;
2451 if (!(gen->prefix = shader_glsl_get_prefix(type)))
2452 {
2453 vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
2454 "Internal compiler error: Unhandled shader type %#x.", type);
2455 gen->prefix = "unknown";
2456 }
2457 shader_glsl_init_limits(gen, &program->shader_version);
2460
2461 gen->interface_info = vkd3d_find_struct(compile_info->next, INTERFACE_INFO);
2462 gen->offset_info = vkd3d_find_struct(compile_info->next, DESCRIPTOR_OFFSET_INFO);
2463 gen->descriptor_info = descriptor_info;
2464 gen->combined_sampler_info = combined_sampler_info;
2465}
2466
2467int glsl_compile(struct vsir_program *program, uint64_t config_flags,
2468 const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info,
2469 const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info,
2470 const struct vkd3d_shader_compile_info *compile_info,
2471 struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
2472{
2473 struct vkd3d_glsl_generator generator;
2474 int ret;
2475
2476 if ((ret = vsir_program_transform(program, config_flags, compile_info, message_context)) < 0)
2477 return ret;
2478
2479 VKD3D_ASSERT(program->normalisation_level == VSIR_FULLY_NORMALISED_IO);
2480
2481 vkd3d_glsl_generator_init(&generator, program, compile_info,
2483 ret = vkd3d_glsl_generator_generate(&generator, out);
2484 vkd3d_glsl_generator_cleanup(&generator);
2485
2486 return ret;
2487}
UCHAR src_mask[]
Definition: GetObject.c:14
#define close
Definition: acwin.h:99
#define ARRAY_SIZE(A)
Definition: main.h:20
#define WARN(fmt,...)
Definition: precomp.h:61
unsigned int component_count
component_type
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
UINT64 uint64_t
Definition: types.h:77
UINT op
Definition: effect.c:235
unsigned int idx
Definition: utils.c:40
static const WCHAR indent[]
Definition: object.c:1231
#define TRACE_ON(x)
Definition: compat.h:75
static const WCHAR version[]
Definition: asmname.c:66
#define PRIx64
Definition: inttypes.h:29
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
char * va_list
Definition: vadefs.h:50
return ret
Definition: mutex.c:147
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLdouble GLdouble t
Definition: gl.h:2047
GLenum src
Definition: glext.h:6340
GLuint GLenum swizzle
Definition: glext.h:9511
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLfloat bias
Definition: glext.h:7909
GLintptr offset
Definition: glext.h:5920
GLenum condition
Definition: glext.h:9255
GLuint coord
Definition: glext.h:9511
GLuint sampler
Definition: glext.h:7283
GLenum GLint GLuint mask
Definition: glext.h:6028
GLint lod
Definition: glext.h:7795
GLuint program
Definition: glext.h:6723
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
const GLfloat * m
Definition: glext.h:10848
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
static void shader_glsl_dot(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, uint32_t src_mask)
Definition: glsl.c:584
static void shader_glsl_generate_output_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2247
static void shader_glsl_intrinsic(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
Definition: glsl.c:608
static int vkd3d_glsl_generator_generate(struct vkd3d_glsl_generator *gen, struct vkd3d_shader_code *out)
Definition: glsl.c:2357
static void vkd3d_glsl_generator_cleanup(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2400
static void shader_glsl_binop(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
Definition: glsl.c:566
static void shader_glsl_print_subscript(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *rel_addr, unsigned int offset)
Definition: glsl.c:473
static void shader_glsl_shader_prologue(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:1343
static void shader_glsl_generate_sampler_declaration(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_combined_resource_sampler_info *crs)
Definition: glsl.c:1964
static void shader_glsl_mul_extended(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1251
static void shader_glsl_generate_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2329
static void shader_glsl_dcl_indexable_temp(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1475
static void shader_glsl_init_limits(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_version *version)
Definition: glsl.c:2406
static void shader_glsl_print_texel_offset(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int offset_size, const struct vkd3d_shader_texel_offset *offset)
Definition: glsl.c:766
static void shader_glsl_default(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:760
static void shader_glsl_print_register_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_register *reg)
Definition: glsl.c:190
static bool shader_glsl_get_uav_binding(const struct vkd3d_glsl_generator *gen, unsigned int register_space, unsigned int register_idx, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
Definition: glsl.c:1701
static void glsl_src_init(struct glsl_src *glsl_src, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *vsir_src, uint32_t mask)
Definition: glsl.c:438
static const struct signature_element * signature_get_element_by_location(const struct shader_signature *signature, unsigned int location)
Definition: glsl.c:2126
static void shader_glsl_print_combined_sampler_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int resource_index, unsigned int resource_space, unsigned int sampler_index, unsigned int sampler_space)
Definition: glsl.c:167
static void shader_glsl_handle_global_flags(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, enum vsir_global_flags flags)
Definition: glsl.c:2315
static void glsl_src_cleanup(struct glsl_src *src, struct vkd3d_string_buffer_cache *cache)
Definition: glsl.c:326
static void shader_glsl_unhandled(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:558
static void shader_glsl_relop(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *scalar_op, const char *vector_op)
Definition: glsl.c:632
static void shader_glsl_continue(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:729
static void glsl_dst_cleanup(struct glsl_dst *dst, struct vkd3d_string_buffer_cache *cache)
Definition: glsl.c:445
static bool shader_glsl_check_shader_visibility(const struct vkd3d_glsl_generator *gen, enum vkd3d_shader_visibility visibility)
Definition: glsl.c:1674
static void shader_glsl_generate_interface_block(struct vkd3d_glsl_generator *gen, const struct shader_signature *signature, const char *type, unsigned int count)
Definition: glsl.c:2170
static void shader_glsl_break(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:723
static void shader_glsl_print_shadow_coord(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *coord, const struct vkd3d_shader_src_param *ref, unsigned int coord_size)
Definition: glsl.c:869
static void shader_glsl_ret(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1463
static bool shader_glsl_get_combined_sampler_binding(const struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_combined_resource_sampler_info *crs, enum vkd3d_shader_resource_type resource_type, unsigned int *binding_idx)
Definition: glsl.c:1923
static void shader_glsl_sample(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:900
static void shader_glsl_mov(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1211
int glsl_compile(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: glsl.c:2467
static const struct glsl_resource_type_info * shader_glsl_get_resource_type_info(enum vkd3d_shader_resource_type t)
Definition: glsl.c:107
static void shader_glsl_print_image_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, unsigned int idx, unsigned int space)
Definition: glsl.c:182
static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:692
static bool shader_glsl_get_cbv_binding(const struct vkd3d_glsl_generator *gen, unsigned int register_space, unsigned int register_idx, unsigned int *binding_idx)
Definition: glsl.c:1832
static void shader_glsl_load_uav_typed(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1055
static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *scalar_constructor, const char *vector_constructor)
Definition: glsl.c:656
static void shader_glsl_print_sysval_name(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, enum vkd3d_shader_sysval_semantic sysval, unsigned int idx)
Definition: glsl.c:1282
static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:787
static void shader_glsl_print_indent(struct vkd3d_string_buffer *buffer, unsigned int indent)
Definition: glsl.c:162
static void shader_glsl_store_uav_typed(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1116
static void shader_glsl_case(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:748
static void shader_glsl_end_block(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:678
static void shader_glsl_unary_op(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op)
Definition: glsl.c:1195
static void shader_glsl_print_bitcast(struct vkd3d_string_buffer *dst, struct vkd3d_glsl_generator *gen, const char *src, enum vkd3d_data_type dst_data_type, enum vkd3d_data_type src_data_type, unsigned int size)
Definition: glsl.c:331
static const char * shader_glsl_get_interpolation(struct vkd3d_glsl_generator *gen, const struct shader_signature *signature, const char *type, unsigned int location)
Definition: glsl.c:2145
static void shader_glsl_shader_epilogue(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:1401
static const char * shader_glsl_get_prefix(enum vkd3d_shader_type type)
Definition: glsl.c:86
static void shader_glsl_loop(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:716
static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor(struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int idx, unsigned int space)
Definition: glsl.c:130
static const struct vkd3d_shader_descriptor_info1 * shader_glsl_get_descriptor_by_id(struct vkd3d_glsl_generator *gen, enum vkd3d_shader_descriptor_type type, unsigned int id)
Definition: glsl.c:146
static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1484
static void shader_glsl_print_src(struct vkd3d_string_buffer *buffer, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_src_param *vsir_src, uint32_t mask, enum vkd3d_data_type data_type)
Definition: glsl.c:384
static void vkd3d_glsl_generator_init(struct vkd3d_glsl_generator *gen, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info, const struct vkd3d_shader_scan_combined_resource_sampler_info *combined_sampler_info, struct vkd3d_shader_message_context *message_context)
Definition: glsl.c:2437
static void shader_glsl_switch(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:735
static void shader_glsl_print_swizzle(struct vkd3d_string_buffer *buffer, uint32_t swizzle, uint32_t mask)
Definition: glsl.c:300
static uint32_t glsl_dst_init(struct glsl_dst *glsl_dst, struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_dst_param *vsir_dst)
Definition: glsl.c:451
static void shader_glsl_print_write_mask(struct vkd3d_string_buffer *buffer, uint32_t write_mask)
Definition: glsl.c:313
static void shader_glsl_generate_descriptor_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2085
static void shader_glsl_begin_block(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:685
static void shader_glsl_else(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:708
static void shader_glsl_generate_input_declarations(struct vkd3d_glsl_generator *gen)
Definition: glsl.c:2186
static void shader_glsl_movc(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
Definition: glsl.c:1226
static void shader_glsl_generate_uav_declaration(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_descriptor_info1 *uav)
Definition: glsl.c:1736
static void shader_glsl_generate_cbv_declaration(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_descriptor_info1 *cbv)
Definition: glsl.c:1863
unsigned int coord_size
Definition: glsl_shader.c:50
enum wined3d_data_type data_type
Definition: glsl_shader.c:71
static const struct @335 resource_type_info[]
static int reg
Definition: i386-dis.c:1290
enum vkd3d_result vsir_program_transform(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
Definition: ir.c:8324
#define d
Definition: ke_i.h:81
#define e
Definition: ke_i.h:82
#define resource
Definition: kernel32.h:9
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define MESSAGE
Definition: options.h:86
static RPC_BINDING_HANDLE binding
Definition: server.c:166
int load
Definition: msacm.c:1365
#define uint32_t
Definition: nsiface.idl:61
const WCHAR * str
descriptor
Definition: scsi.h:3997
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
enum vkd3d_shader_sysval_semantic sysval
Definition: spirv.c:4839
Definition: match.c:390
Definition: undname.c:54
Definition: cache.c:41
Definition: inflate.c:139
Definition: dsound.c:943
Definition: glsl.c:40
const struct vkd3d_shader_dst_param * vsir
Definition: glsl.c:41
struct vkd3d_string_buffer * register_name
Definition: glsl.c:42
struct vkd3d_string_buffer * mask
Definition: glsl.c:43
const char * type_suffix
Definition: glsl.c:31
Definition: glsl.c:35
struct vkd3d_string_buffer * str
Definition: glsl.c:36
Definition: send.c:48
Definition: wave.c:25
struct vkd3d_glsl_generator::shader_limits limits
struct vkd3d_shader_message_context * message_context
Definition: glsl.c:52
struct vsir_program * program
Definition: glsl.c:48
struct vkd3d_string_buffer_cache string_buffers
Definition: glsl.c:49
const struct vkd3d_shader_scan_descriptor_info1 * descriptor_info
Definition: glsl.c:67
bool interstage_output
Definition: glsl.c:63
struct vkd3d_string_buffer * buffer
Definition: glsl.c:50
const struct vkd3d_shader_interface_info * interface_info
Definition: glsl.c:65
const struct vkd3d_shader_scan_combined_resource_sampler_info * combined_sampler_info
Definition: glsl.c:68
struct vkd3d_shader_location location
Definition: glsl.c:51
bool interstage_input
Definition: glsl.c:62
const struct vkd3d_shader_descriptor_offset_info * offset_info
Definition: glsl.c:66
unsigned int indent
Definition: glsl.c:53
const char * prefix
Definition: glsl.c:54
enum vkd3d_shader_resource_data_type resource_data_type
enum vkd3d_shader_resource_type resource_type
struct vkd3d_shader_register reg
struct vkd3d_shader_instruction * elements
struct vkd3d_shader_src_param * src
struct vkd3d_shader_location location
struct vkd3d_shader_texel_offset texel_offset
struct vkd3d_shader_indexable_temp indexable_temp
union vkd3d_shader_instruction::@6020 declaration
enum vkd3d_shader_opcode opcode
struct vkd3d_shader_dst_param * dst
struct vkd3d_shader_combined_resource_sampler_info * combined_samplers
struct vkd3d_shader_register reg
enum vkd3d_shader_src_modifier modifiers
Character const *const prefix
Definition: tempnam.cpp:195
#define VKD3D_PRINTF_FUNC(fmt, args)
Definition: vkd3d_common.h:114
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
static void * vkd3d_malloc(size_t size)
Definition: vkd3d_memory.h:28
VKD3D_SHADER_API const char * vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ
@ VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE
vkd3d_shader_sysval_semantic
@ VKD3D_SHADER_SV_VERTEX_ID
@ VKD3D_SHADER_SV_TARGET
@ VKD3D_SHADER_SV_NONE
@ VKD3D_SHADER_SV_IS_FRONT_FACE
@ VKD3D_SHADER_SV_SAMPLE_INDEX
@ VKD3D_SHADER_SV_POSITION
#define VKD3D_SHADER_DUMMY_SAMPLER_INDEX
Definition: vkd3d_shader.h:964
vkd3d_shader_visibility
Definition: vkd3d_shader.h:383
@ VKD3D_SHADER_VISIBILITY_DOMAIN
Definition: vkd3d_shader.h:391
@ VKD3D_SHADER_VISIBILITY_COMPUTE
Definition: vkd3d_shader.h:398
@ VKD3D_SHADER_VISIBILITY_PIXEL
Definition: vkd3d_shader.h:395
@ VKD3D_SHADER_VISIBILITY_ALL
Definition: vkd3d_shader.h:385
@ VKD3D_SHADER_VISIBILITY_GEOMETRY
Definition: vkd3d_shader.h:393
@ VKD3D_SHADER_VISIBILITY_VERTEX
Definition: vkd3d_shader.h:387
@ VKD3D_SHADER_VISIBILITY_HULL
Definition: vkd3d_shader.h:389
vkd3d_shader_component_type
@ VKD3D_SHADER_COMPONENT_INT
@ VKD3D_SHADER_COMPONENT_UINT
@ VKD3D_SHADER_COMPONENT_FLOAT
vkd3d_shader_descriptor_type
Definition: vkd3d_shader.h:420
@ VKD3D_SHADER_DESCRIPTOR_TYPE_UAV
Definition: vkd3d_shader.h:430
@ VKD3D_SHADER_DESCRIPTOR_TYPE_CBV
Definition: vkd3d_shader.h:435
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER
Definition: vkd3d_shader.h:440
@ VKD3D_SHADER_DESCRIPTOR_TYPE_SRV
Definition: vkd3d_shader.h:425
vkd3d_shader_resource_type
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DMS
@ VKD3D_SHADER_RESOURCE_BUFFER
@ VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY
@ VKD3D_SHADER_RESOURCE_TEXTURE_2D
vkd3d_shader_binding_flag
Definition: vkd3d_shader.h:467
@ VKD3D_SHADER_BINDING_FLAG_IMAGE
Definition: vkd3d_shader.h:469
@ VKD3D_SHADER_BINDING_FLAG_BUFFER
Definition: vkd3d_shader.h:468
@ VKD3D_SHADER_MINIMUM_PRECISION_NONE
int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args)
struct vkd3d_string_buffer * vkd3d_string_buffer_get(struct vkd3d_string_buffer_cache *cache)
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location, enum vkd3d_shader_error error, const char *format, va_list args)
void vkd3d_string_buffer_release(struct vkd3d_string_buffer_cache *cache, struct vkd3d_string_buffer *buffer)
void vkd3d_string_buffer_cache_init(struct vkd3d_string_buffer_cache *cache)
void vkd3d_string_buffer_cache_cleanup(struct vkd3d_string_buffer_cache *cache)
int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer, const char *format,...)
#define vkd3d_find_struct(c, t)
#define VKD3DSI_PRECISE_XYZW
static enum vkd3d_shader_component_type vkd3d_component_type_from_resource_data_type(enum vkd3d_shader_resource_data_type data_type)
@ VKD3DSPSM_ABS
@ VKD3DSPSM_NONE
@ VKD3DSPSM_NEG
static bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_shader_instruction *ins)
vsir_global_flags
@ VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL
vkd3d_shader_type
@ VKD3D_SHADER_TYPE_VERTEX
@ VKD3D_SHADER_TYPE_HULL
@ VKD3D_SHADER_TYPE_GEOMETRY
@ VKD3D_SHADER_TYPE_COMPUTE
@ VKD3D_SHADER_TYPE_PIXEL
@ VKD3D_SHADER_TYPE_DOMAIN
vkd3d_shader_interpolation_mode
@ VKD3DSIM_CONSTANT
@ VKD3DSIM_NONE
@ VKD3DSIM_LINEAR
#define VKD3DSP_WRITEMASK_3
static unsigned int vsir_write_mask_component_count(uint32_t write_mask)
@ VKD3DSPR_IMMCONST
@ VKD3DSPR_NULL
@ VKD3DSPR_CONSTBUFFER
@ VKD3DSPR_DEPTHOUT
@ VKD3DSPR_TEMP
@ VKD3DSPR_IDXTEMP
@ VKD3DSPR_THREADID
@ VKD3DSPR_OUTPUT
@ VKD3DSPR_INPUT
vkd3d_shader_error
@ VKD3D_SHADER_ERROR_GLSL_BINDING_NOT_FOUND
@ VKD3D_SHADER_ERROR_GLSL_UNSUPPORTED
@ VKD3D_SHADER_ERROR_GLSL_INTERNAL
static unsigned int vkd3d_write_mask_from_component_count(unsigned int component_count)
#define VKD3DSP_WRITEMASK_ALL
@ VSIR_DIMENSION_SCALAR
@ VSIR_DIMENSION_VEC4
@ VKD3D_DATA_SNORM
@ VKD3D_DATA_INT
@ VKD3D_DATA_UINT
@ VKD3D_DATA_UNORM
@ VKD3D_DATA_FLOAT
@ VSIR_FULLY_NORMALISED_IO
static unsigned int vsir_swizzle_get_component(uint32_t swizzle, unsigned int idx)
@ VKD3DSIH_NOP
@ VKD3DSIH_ENDSWITCH
@ VKD3DSIH_DP2
@ VKD3DSIH_AND
@ VKD3DSIH_ISHL
@ VKD3DSIH_SAMPLE_C_LZ
@ VKD3DSIH_IMUL
@ VKD3DSIH_LOOP
@ VKD3DSIH_ROUND_PI
@ VKD3DSIH_DCL_INPUT_PS
@ VKD3DSIH_SWITCH
@ VKD3DSIH_IADD
@ VKD3DSIH_DP4
@ VKD3DSIH_DIV
@ VKD3DSIH_STORE_UAV_TYPED
@ VKD3DSIH_IEQ
@ VKD3DSIH_DCL_OUTPUT
@ VKD3DSIH_LD_UAV_TYPED
@ VKD3DSIH_SAMPLE
@ VKD3DSIH_UMAX
@ VKD3DSIH_DCL_OUTPUT_SIV
@ VKD3DSIH_SAMPLE_C
@ VKD3DSIH_ISHR
@ VKD3DSIH_NEU
@ VKD3DSIH_DCL_INPUT_SGV
@ VKD3DSIH_GATHER4_PO
@ VKD3DSIH_ROUND_NE
@ VKD3DSIH_MUL
@ VKD3DSIH_BREAK
@ VKD3DSIH_LD2DMS
@ VKD3DSIH_EXP
@ VKD3DSIH_SAMPLE_LOD
@ VKD3DSIH_CASE
@ VKD3DSIH_MIN
@ VKD3DSIH_CONTINUE
@ VKD3DSIH_IF
@ VKD3DSIH_RSQ
@ VKD3DSIH_ENDIF
@ VKD3DSIH_IMAX
@ VKD3DSIH_FTOI
@ VKD3DSIH_DCL_INPUT
@ VKD3DSIH_LOG
@ VKD3DSIH_ROUND_NI
@ VKD3DSIH_EQO
@ VKD3DSIH_DCL_INPUT_PS_SIV
@ VKD3DSIH_UTOF
@ VKD3DSIH_LTO
@ VKD3DSIH_NOT
@ VKD3DSIH_SAMPLE_B
@ VKD3DSIH_MAD
@ VKD3DSIH_ADD
@ VKD3DSIH_INE
@ VKD3DSIH_MOVC
@ VKD3DSIH_MOV
@ VKD3DSIH_MAX
@ VKD3DSIH_ULT
@ VKD3DSIH_FTOU
@ VKD3DSIH_OR
@ VKD3DSIH_ILT
@ VKD3DSIH_USHR
@ VKD3DSIH_ENDLOOP
@ VKD3DSIH_FRC
@ VKD3DSIH_SAMPLE_GRAD
@ VKD3DSIH_ELSE
@ VKD3DSIH_DCL_INPUT_PS_SGV
@ VKD3DSIH_LD
@ VKD3DSIH_DCL_INDEXABLE_TEMP
@ VKD3DSIH_GEO
@ VKD3DSIH_INEG
@ VKD3DSIH_ITOF
@ VKD3DSIH_ROUND_Z
@ VKD3DSIH_IGE
@ VKD3DSIH_DEFAULT
@ VKD3DSIH_UMIN
@ VKD3DSIH_RET
@ VKD3DSIH_DP3
@ VKD3DSIH_GATHER4
@ VKD3DSIH_SQRT
#define vkd3d_string_buffer_trace(buffer)
static enum vkd3d_data_type vkd3d_data_type_from_component_type(enum vkd3d_shader_component_type component_type)
@ VKD3D_SHADER_CONDITIONAL_OP_NZ
@ VKD3DSPDM_SATURATE
#define VKD3DSP_WRITEMASK_0
#define VKD3DSP_WRITEMASK_1
#define SIGNATURE_TARGET_LOCATION_UNUSED
#define VKD3DSP_WRITEMASK_2
#define VKD3D_VEC4_SIZE
@ VKD3D_ERROR_INVALID_SHADER
Definition: vkd3d_types.h:53
@ VKD3D_OK
Definition: vkd3d_types.h:43
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
static size_t align(size_t addr, size_t alignment)
#define const
Definition: zconf.h:233