blob: 14ba35349484df28569ae5e0b1a534e5572fd9eb [file] [log] [blame]
Jamie Madill033dae62014-06-18 12:56:28 -04001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// UtilsHLSL.cpp:
7// Utility methods for GLSL to HLSL translation.
8//
9
10#include "compiler/translator/UtilsHLSL.h"
Olli Etuahof5cfc8d2015-08-06 16:36:39 +030011#include "compiler/translator/IntermNode.h"
Jamie Madill8daaba12014-06-13 10:04:33 -040012#include "compiler/translator/StructureHLSL.h"
Jamie Madill033dae62014-06-18 12:56:28 -040013#include "compiler/translator/SymbolTable.h"
14
15namespace sh
16{
17
Olli Etuaho9b4e8622015-12-22 15:53:22 +020018TString SamplerString(const TBasicType type)
Jamie Madill033dae62014-06-18 12:56:28 -040019{
Olli Etuaho9b4e8622015-12-22 15:53:22 +020020 if (IsShadowSampler(type))
Jamie Madill033dae62014-06-18 12:56:28 -040021 {
22 return "SamplerComparisonState";
23 }
24 else
25 {
26 return "SamplerState";
27 }
28}
29
Xinghua Cao711b7a12017-10-09 13:38:12 +080030TString SamplerString(HLSLTextureGroup type)
Jamie Madill033dae62014-06-18 12:56:28 -040031{
Olli Etuaho9b4e8622015-12-22 15:53:22 +020032 if (type >= HLSL_COMPARISON_SAMPLER_GROUP_BEGIN && type <= HLSL_COMPARISON_SAMPLER_GROUP_END)
Jamie Madill033dae62014-06-18 12:56:28 -040033 {
Olli Etuaho9b4e8622015-12-22 15:53:22 +020034 return "SamplerComparisonState";
35 }
36 else
37 {
38 return "SamplerState";
39 }
40}
41
Xinghua Cao711b7a12017-10-09 13:38:12 +080042HLSLTextureGroup TextureGroup(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
43
Olli Etuaho9b4e8622015-12-22 15:53:22 +020044{
45 switch (type)
46 {
47 case EbtSampler2D:
48 return HLSL_TEXTURE_2D;
49 case EbtSamplerCube:
50 return HLSL_TEXTURE_CUBE;
51 case EbtSamplerExternalOES:
52 return HLSL_TEXTURE_2D;
53 case EbtSampler2DArray:
54 return HLSL_TEXTURE_2D_ARRAY;
55 case EbtSampler3D:
56 return HLSL_TEXTURE_3D;
Olli Etuaho92db39e2017-02-15 12:11:04 +000057 case EbtSampler2DMS:
58 return HLSL_TEXTURE_2D_MS;
Olli Etuaho9b4e8622015-12-22 15:53:22 +020059 case EbtISampler2D:
60 return HLSL_TEXTURE_2D_INT4;
61 case EbtISampler3D:
62 return HLSL_TEXTURE_3D_INT4;
63 case EbtISamplerCube:
64 return HLSL_TEXTURE_2D_ARRAY_INT4;
65 case EbtISampler2DArray:
66 return HLSL_TEXTURE_2D_ARRAY_INT4;
Olli Etuaho92db39e2017-02-15 12:11:04 +000067 case EbtISampler2DMS:
68 return HLSL_TEXTURE_2D_MS_INT4;
Olli Etuaho9b4e8622015-12-22 15:53:22 +020069 case EbtUSampler2D:
70 return HLSL_TEXTURE_2D_UINT4;
71 case EbtUSampler3D:
72 return HLSL_TEXTURE_3D_UINT4;
73 case EbtUSamplerCube:
74 return HLSL_TEXTURE_2D_ARRAY_UINT4;
75 case EbtUSampler2DArray:
76 return HLSL_TEXTURE_2D_ARRAY_UINT4;
Olli Etuaho92db39e2017-02-15 12:11:04 +000077 case EbtUSampler2DMS:
78 return HLSL_TEXTURE_2D_MS_UINT4;
Olli Etuaho9b4e8622015-12-22 15:53:22 +020079 case EbtSampler2DShadow:
80 return HLSL_TEXTURE_2D_COMPARISON;
81 case EbtSamplerCubeShadow:
82 return HLSL_TEXTURE_CUBE_COMPARISON;
83 case EbtSampler2DArrayShadow:
84 return HLSL_TEXTURE_2D_ARRAY_COMPARISON;
Xinghua Cao711b7a12017-10-09 13:38:12 +080085 case EbtImage2D:
86 {
87 switch (imageInternalFormat)
88 {
89 case EiifRGBA32F:
90 case EiifRGBA16F:
91 case EiifR32F:
92 return HLSL_TEXTURE_2D;
93 case EiifRGBA8:
94 return HLSL_TEXTURE_2D_UNORM;
95 case EiifRGBA8_SNORM:
96 return HLSL_TEXTURE_2D_SNORM;
97 default:
98 UNREACHABLE();
99 }
100 }
101 case EbtIImage2D:
102 {
103 switch (imageInternalFormat)
104 {
105 case EiifRGBA32I:
106 case EiifRGBA16I:
107 case EiifRGBA8I:
108 case EiifR32I:
109 return HLSL_TEXTURE_2D_INT4;
110 default:
111 UNREACHABLE();
112 }
113 }
114 case EbtUImage2D:
115 {
116 switch (imageInternalFormat)
117 {
118
119 case EiifRGBA32UI:
120 case EiifRGBA16UI:
121 case EiifRGBA8UI:
122 case EiifR32UI:
123 return HLSL_TEXTURE_2D_UINT4;
124 default:
125 UNREACHABLE();
126 }
127 }
128 case EbtImage3D:
129 {
130 switch (imageInternalFormat)
131 {
132 case EiifRGBA32F:
133 case EiifRGBA16F:
134 case EiifR32F:
135 return HLSL_TEXTURE_3D;
136 case EiifRGBA8:
137 return HLSL_TEXTURE_3D_UNORM;
138 case EiifRGBA8_SNORM:
139 return HLSL_TEXTURE_3D_SNORM;
140 default:
141 UNREACHABLE();
142 }
143 }
144 case EbtIImage3D:
145 {
146 switch (imageInternalFormat)
147 {
148 case EiifRGBA32I:
149 case EiifRGBA16I:
150 case EiifRGBA8I:
151 case EiifR32I:
152 return HLSL_TEXTURE_3D_INT4;
153 default:
154 UNREACHABLE();
155 }
156 }
157 case EbtUImage3D:
158 {
159 switch (imageInternalFormat)
160 {
161 case EiifRGBA32UI:
162 case EiifRGBA16UI:
163 case EiifRGBA8UI:
164 case EiifR32UI:
165 return HLSL_TEXTURE_3D_UINT4;
166 default:
167 UNREACHABLE();
168 }
169 }
170 case EbtImage2DArray:
171 case EbtImageCube:
172 {
173 switch (imageInternalFormat)
174 {
175 case EiifRGBA32F:
176 case EiifRGBA16F:
177 case EiifR32F:
178 return HLSL_TEXTURE_2D_ARRAY;
179 case EiifRGBA8:
180 return HLSL_TEXTURE_2D_ARRAY_UNORN;
181 case EiifRGBA8_SNORM:
182 return HLSL_TEXTURE_2D_ARRAY_SNORM;
183 default:
184 UNREACHABLE();
185 }
186 }
187 case EbtIImage2DArray:
188 case EbtIImageCube:
189 {
190 switch (imageInternalFormat)
191 {
192 case EiifRGBA32I:
193 case EiifRGBA16I:
194 case EiifRGBA8I:
195 case EiifR32I:
196 return HLSL_TEXTURE_2D_ARRAY_INT4;
197 default:
198 UNREACHABLE();
199 }
200 }
201 case EbtUImage2DArray:
202 case EbtUImageCube:
203 {
204 switch (imageInternalFormat)
205 {
206 case EiifRGBA32UI:
207 case EiifRGBA16UI:
208 case EiifRGBA8UI:
209 case EiifR32UI:
210 return HLSL_TEXTURE_2D_ARRAY_UINT4;
211 default:
212 UNREACHABLE();
213 }
214 }
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200215 default:
216 UNREACHABLE();
217 }
218 return HLSL_TEXTURE_UNKNOWN;
219}
220
Olli Etuahoc13bda82018-01-25 12:22:33 +0200221const char *TextureString(const HLSLTextureGroup textureGroup)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200222{
Xinghua Cao711b7a12017-10-09 13:38:12 +0800223 switch (textureGroup)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200224 {
225 case HLSL_TEXTURE_2D:
Xinghua Cao711b7a12017-10-09 13:38:12 +0800226 return "Texture2D<float4>";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200227 case HLSL_TEXTURE_CUBE:
Xinghua Cao711b7a12017-10-09 13:38:12 +0800228 return "TextureCube<float4>";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200229 case HLSL_TEXTURE_2D_ARRAY:
Xinghua Cao711b7a12017-10-09 13:38:12 +0800230 return "Texture2DArray<float4>";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200231 case HLSL_TEXTURE_3D:
Xinghua Cao711b7a12017-10-09 13:38:12 +0800232 return "Texture3D<float4>";
233 case HLSL_TEXTURE_2D_UNORM:
234 return "Texture2D<unorm float4>";
235 case HLSL_TEXTURE_CUBE_UNORM:
236 return "TextureCube<unorm float4>";
237 case HLSL_TEXTURE_2D_ARRAY_UNORN:
238 return "Texture2DArray<unorm float4>";
239 case HLSL_TEXTURE_3D_UNORM:
240 return "Texture3D<unorm float4>";
241 case HLSL_TEXTURE_2D_SNORM:
242 return "Texture2D<snorm float4>";
243 case HLSL_TEXTURE_CUBE_SNORM:
244 return "TextureCube<snorm float4>";
245 case HLSL_TEXTURE_2D_ARRAY_SNORM:
246 return "Texture2DArray<snorm float4>";
247 case HLSL_TEXTURE_3D_SNORM:
248 return "Texture3D<snorm float4>";
Olli Etuaho92db39e2017-02-15 12:11:04 +0000249 case HLSL_TEXTURE_2D_MS:
250 return "Texture2DMS<float4>";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200251 case HLSL_TEXTURE_2D_INT4:
252 return "Texture2D<int4>";
253 case HLSL_TEXTURE_3D_INT4:
254 return "Texture3D<int4>";
255 case HLSL_TEXTURE_2D_ARRAY_INT4:
256 return "Texture2DArray<int4>";
Olli Etuaho92db39e2017-02-15 12:11:04 +0000257 case HLSL_TEXTURE_2D_MS_INT4:
258 return "Texture2DMS<int4>";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200259 case HLSL_TEXTURE_2D_UINT4:
260 return "Texture2D<uint4>";
261 case HLSL_TEXTURE_3D_UINT4:
262 return "Texture3D<uint4>";
263 case HLSL_TEXTURE_2D_ARRAY_UINT4:
264 return "Texture2DArray<uint4>";
Olli Etuaho92db39e2017-02-15 12:11:04 +0000265 case HLSL_TEXTURE_2D_MS_UINT4:
266 return "Texture2DMS<uint4>";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200267 case HLSL_TEXTURE_2D_COMPARISON:
268 return "Texture2D";
269 case HLSL_TEXTURE_CUBE_COMPARISON:
270 return "TextureCube";
271 case HLSL_TEXTURE_2D_ARRAY_COMPARISON:
272 return "Texture2DArray";
273 default:
274 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400275 }
276
Xinghua Cao711b7a12017-10-09 13:38:12 +0800277 return "<unknown read texture type>";
Jamie Madill033dae62014-06-18 12:56:28 -0400278}
279
Olli Etuahoc13bda82018-01-25 12:22:33 +0200280const char *TextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200281{
Xinghua Cao711b7a12017-10-09 13:38:12 +0800282 return TextureString(TextureGroup(type, imageInternalFormat));
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200283}
284
Olli Etuahoc13bda82018-01-25 12:22:33 +0200285const char *TextureGroupSuffix(const HLSLTextureGroup type)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200286{
287 switch (type)
288 {
289 case HLSL_TEXTURE_2D:
290 return "2D";
291 case HLSL_TEXTURE_CUBE:
292 return "Cube";
293 case HLSL_TEXTURE_2D_ARRAY:
294 return "2DArray";
295 case HLSL_TEXTURE_3D:
296 return "3D";
Xinghua Cao711b7a12017-10-09 13:38:12 +0800297 case HLSL_TEXTURE_2D_UNORM:
298 return "2D_unorm_float4_";
299 case HLSL_TEXTURE_CUBE_UNORM:
300 return "Cube_unorm_float4_";
301 case HLSL_TEXTURE_2D_ARRAY_UNORN:
302 return "2DArray_unorm_float4_";
303 case HLSL_TEXTURE_3D_UNORM:
304 return "3D_unorm_float4_";
305 case HLSL_TEXTURE_2D_SNORM:
306 return "2D_snorm_float4_";
307 case HLSL_TEXTURE_CUBE_SNORM:
308 return "Cube_snorm_float4_";
309 case HLSL_TEXTURE_2D_ARRAY_SNORM:
310 return "2DArray_snorm_float4_";
311 case HLSL_TEXTURE_3D_SNORM:
312 return "3D_snorm_float4_";
Olli Etuaho92db39e2017-02-15 12:11:04 +0000313 case HLSL_TEXTURE_2D_MS:
314 return "2DMS";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200315 case HLSL_TEXTURE_2D_INT4:
316 return "2D_int4_";
317 case HLSL_TEXTURE_3D_INT4:
318 return "3D_int4_";
319 case HLSL_TEXTURE_2D_ARRAY_INT4:
320 return "2DArray_int4_";
Olli Etuaho92db39e2017-02-15 12:11:04 +0000321 case HLSL_TEXTURE_2D_MS_INT4:
322 return "2DMS_int4_";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200323 case HLSL_TEXTURE_2D_UINT4:
324 return "2D_uint4_";
325 case HLSL_TEXTURE_3D_UINT4:
326 return "3D_uint4_";
327 case HLSL_TEXTURE_2D_ARRAY_UINT4:
328 return "2DArray_uint4_";
Olli Etuaho92db39e2017-02-15 12:11:04 +0000329 case HLSL_TEXTURE_2D_MS_UINT4:
330 return "2DMS_uint4_";
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200331 case HLSL_TEXTURE_2D_COMPARISON:
332 return "2D_comparison";
333 case HLSL_TEXTURE_CUBE_COMPARISON:
334 return "Cube_comparison";
335 case HLSL_TEXTURE_2D_ARRAY_COMPARISON:
336 return "2DArray_comparison";
337 default:
338 UNREACHABLE();
339 }
340
341 return "<unknown texture type>";
342}
343
Olli Etuahoc13bda82018-01-25 12:22:33 +0200344const char *TextureGroupSuffix(const TBasicType type,
345 TLayoutImageInternalFormat imageInternalFormat)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200346{
Xinghua Cao711b7a12017-10-09 13:38:12 +0800347 return TextureGroupSuffix(TextureGroup(type, imageInternalFormat));
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200348}
349
Xinghua Cao711b7a12017-10-09 13:38:12 +0800350TString TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200351{
352 switch (type)
353 {
354 case EbtISamplerCube:
355 return "Cube_int4_";
356 case EbtUSamplerCube:
357 return "Cube_uint4_";
Geoff Lang28a97ee2016-09-22 13:01:26 -0400358 case EbtSamplerExternalOES:
359 return "_External";
Xinghua Cao711b7a12017-10-09 13:38:12 +0800360 case EbtImageCube:
361 {
362 switch (imageInternalFormat)
363 {
364 case EiifRGBA32F:
365 case EiifRGBA16F:
366 case EiifR32F:
367 return "Cube_float4_";
368 case EiifRGBA8:
369 return "Cube_unorm_float4_";
370 case EiifRGBA8_SNORM:
371 return "Cube_snorm_float4_";
372 default:
373 UNREACHABLE();
374 }
375 }
376 case EbtIImageCube:
377 {
378 switch (imageInternalFormat)
379 {
380 case EiifRGBA32I:
381 case EiifRGBA16I:
382 case EiifRGBA8I:
383 case EiifR32I:
384 return "Cube_int4_";
385 default:
386 UNREACHABLE();
387 }
388 }
389 case EbtUImageCube:
390 {
391 switch (imageInternalFormat)
392 {
393 case EiifRGBA32UI:
394 case EiifRGBA16UI:
395 case EiifRGBA8UI:
396 case EiifR32UI:
397 return "Cube_uint4_";
398 default:
399 UNREACHABLE();
400 }
401 }
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200402 default:
403 // All other types are identified by their group suffix
Xinghua Cao711b7a12017-10-09 13:38:12 +0800404 return TextureGroupSuffix(type, imageInternalFormat);
405 }
406}
407
408HLSLRWTextureGroup RWTextureGroup(const TBasicType type,
409 TLayoutImageInternalFormat imageInternalFormat)
410
411{
412 switch (type)
413 {
414 case EbtImage2D:
415 {
416 switch (imageInternalFormat)
417 {
418 case EiifRGBA32F:
419 case EiifRGBA16F:
420 case EiifR32F:
421 return HLSL_RWTEXTURE_2D_FLOAT4;
422 case EiifRGBA8:
423 return HLSL_RWTEXTURE_2D_UNORM;
424 case EiifRGBA8_SNORM:
425 return HLSL_RWTEXTURE_2D_SNORM;
426 default:
427 UNREACHABLE();
428 }
429 }
430 case EbtIImage2D:
431 {
432 switch (imageInternalFormat)
433 {
434 case EiifRGBA32I:
435 case EiifRGBA16I:
436 case EiifRGBA8I:
437 case EiifR32I:
438 return HLSL_RWTEXTURE_2D_INT4;
439 default:
440 UNREACHABLE();
441 }
442 }
443 case EbtUImage2D:
444 {
445 switch (imageInternalFormat)
446 {
447
448 case EiifRGBA32UI:
449 case EiifRGBA16UI:
450 case EiifRGBA8UI:
451 case EiifR32UI:
452 return HLSL_RWTEXTURE_2D_UINT4;
453 default:
454 UNREACHABLE();
455 }
456 }
457 case EbtImage3D:
458 {
459 switch (imageInternalFormat)
460 {
461 case EiifRGBA32F:
462 case EiifRGBA16F:
463 case EiifR32F:
464 return HLSL_RWTEXTURE_3D_FLOAT4;
465 case EiifRGBA8:
466 return HLSL_RWTEXTURE_3D_UNORM;
467 case EiifRGBA8_SNORM:
468 return HLSL_RWTEXTURE_3D_SNORM;
469 default:
470 UNREACHABLE();
471 }
472 }
473 case EbtIImage3D:
474 {
475 switch (imageInternalFormat)
476 {
477 case EiifRGBA32I:
478 case EiifRGBA16I:
479 case EiifRGBA8I:
480 case EiifR32I:
481 return HLSL_RWTEXTURE_3D_INT4;
482 default:
483 UNREACHABLE();
484 }
485 }
486 case EbtUImage3D:
487 {
488 switch (imageInternalFormat)
489 {
490 case EiifRGBA32UI:
491 case EiifRGBA16UI:
492 case EiifRGBA8UI:
493 case EiifR32UI:
494 return HLSL_RWTEXTURE_3D_UINT4;
495 default:
496 UNREACHABLE();
497 }
498 }
499 case EbtImage2DArray:
500 case EbtImageCube:
501 {
502 switch (imageInternalFormat)
503 {
504 case EiifRGBA32F:
505 case EiifRGBA16F:
506 case EiifR32F:
507 return HLSL_RWTEXTURE_2D_ARRAY_FLOAT4;
508 case EiifRGBA8:
509 return HLSL_RWTEXTURE_2D_ARRAY_UNORN;
510 case EiifRGBA8_SNORM:
511 return HLSL_RWTEXTURE_2D_ARRAY_SNORM;
512 default:
513 UNREACHABLE();
514 }
515 }
516 case EbtIImage2DArray:
517 case EbtIImageCube:
518 {
519 switch (imageInternalFormat)
520 {
521 case EiifRGBA32I:
522 case EiifRGBA16I:
523 case EiifRGBA8I:
524 case EiifR32I:
525 return HLSL_RWTEXTURE_2D_ARRAY_INT4;
526 default:
527 UNREACHABLE();
528 }
529 }
530 case EbtUImage2DArray:
531 case EbtUImageCube:
532 {
533 switch (imageInternalFormat)
534 {
535 case EiifRGBA32UI:
536 case EiifRGBA16UI:
537 case EiifRGBA8UI:
538 case EiifR32UI:
539 return HLSL_RWTEXTURE_2D_ARRAY_UINT4;
540 default:
541 UNREACHABLE();
542 }
543 }
544 default:
545 UNREACHABLE();
546 }
547 return HLSL_RWTEXTURE_UNKNOWN;
548}
549
550TString RWTextureString(const HLSLRWTextureGroup RWTextureGroup)
551{
552 switch (RWTextureGroup)
553 {
554 case HLSL_RWTEXTURE_2D_FLOAT4:
555 return "RWTexture2D<float4>";
556 case HLSL_RWTEXTURE_2D_ARRAY_FLOAT4:
557 return "RWTexture2DArray<float4>";
558 case HLSL_RWTEXTURE_3D_FLOAT4:
559 return "RWTexture3D<float4>";
560 case HLSL_RWTEXTURE_2D_UNORM:
561 return "RWTexture2D<unorm float4>";
562 case HLSL_RWTEXTURE_2D_ARRAY_UNORN:
563 return "RWTexture2DArray<unorm float4>";
564 case HLSL_RWTEXTURE_3D_UNORM:
565 return "RWTexture3D<unorm float4>";
566 case HLSL_RWTEXTURE_2D_SNORM:
567 return "RWTexture2D<snorm float4>";
568 case HLSL_RWTEXTURE_2D_ARRAY_SNORM:
569 return "RWTexture2DArray<snorm float4>";
570 case HLSL_RWTEXTURE_3D_SNORM:
571 return "RWTexture3D<snorm float4>";
572 case HLSL_RWTEXTURE_2D_UINT4:
573 return "RWTexture2D<uint4>";
574 case HLSL_RWTEXTURE_2D_ARRAY_UINT4:
575 return "RWTexture2DArray<uint4>";
576 case HLSL_RWTEXTURE_3D_UINT4:
577 return "RWTexture3D<uint4>";
578 case HLSL_RWTEXTURE_2D_INT4:
579 return "RWTexture2D<int4>";
580 case HLSL_RWTEXTURE_2D_ARRAY_INT4:
581 return "RWTexture2DArray<int4>";
582 case HLSL_RWTEXTURE_3D_INT4:
583 return "RWTexture3D<int4>";
584 default:
585 UNREACHABLE();
586 }
587
588 return "<unknown read and write texture type>";
589}
590
591TString RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
592{
593 return RWTextureString(RWTextureGroup(type, imageInternalFormat));
594}
595
596TString RWTextureGroupSuffix(const HLSLRWTextureGroup type)
597{
598 switch (type)
599 {
600 case HLSL_RWTEXTURE_2D_FLOAT4:
601 return "RW2D_float4_";
602 case HLSL_RWTEXTURE_2D_ARRAY_FLOAT4:
603 return "RW2DArray_float4_";
604 case HLSL_RWTEXTURE_3D_FLOAT4:
605 return "RW3D_float4_";
606 case HLSL_RWTEXTURE_2D_UNORM:
607 return "RW2D_unorm_float4_";
608 case HLSL_RWTEXTURE_2D_ARRAY_UNORN:
609 return "RW2DArray_unorm_float4_";
610 case HLSL_RWTEXTURE_3D_UNORM:
611 return "RW3D_unorm_float4_";
612 case HLSL_RWTEXTURE_2D_SNORM:
613 return "RW2D_snorm_float4_";
614 case HLSL_RWTEXTURE_2D_ARRAY_SNORM:
615 return "RW2DArray_snorm_float4_";
616 case HLSL_RWTEXTURE_3D_SNORM:
617 return "RW3D_snorm_float4_";
618 case HLSL_RWTEXTURE_2D_UINT4:
619 return "RW2D_uint4_";
620 case HLSL_RWTEXTURE_2D_ARRAY_UINT4:
621 return "RW2DArray_uint4_";
622 case HLSL_RWTEXTURE_3D_UINT4:
623 return "RW3D_uint4_";
624 case HLSL_RWTEXTURE_2D_INT4:
625 return "RW2D_int4_";
626 case HLSL_RWTEXTURE_2D_ARRAY_INT4:
627 return "RW2DArray_int4_";
628 case HLSL_RWTEXTURE_3D_INT4:
629 return "RW3D_int4_";
630 default:
631 UNREACHABLE();
632 }
633
634 return "<unknown read and write resource>";
635}
636
637TString RWTextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
638{
639 return RWTextureGroupSuffix(RWTextureGroup(type, imageInternalFormat));
640}
641
642TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
643{
644 switch (type)
645 {
646 case EbtImageCube:
647 {
648 switch (imageInternalFormat)
649 {
650 case EiifRGBA32F:
651 case EiifRGBA16F:
652 case EiifR32F:
653 return "RWCube_float4_";
654 case EiifRGBA8:
655 return "RWCube_unorm_float4_";
656 case EiifRGBA8_SNORM:
657 return "RWCube_unorm_float4_";
658 default:
659 UNREACHABLE();
660 }
661 }
662 case EbtIImageCube:
663 {
664 switch (imageInternalFormat)
665 {
666 case EiifRGBA32I:
667 case EiifRGBA16I:
668 case EiifRGBA8I:
669 case EiifR32I:
670 return "RWCube_int4_";
671 default:
672 UNREACHABLE();
673 }
674 }
675 case EbtUImageCube:
676 {
677 switch (imageInternalFormat)
678 {
679 case EiifRGBA32UI:
680 case EiifRGBA16UI:
681 case EiifRGBA8UI:
682 case EiifR32UI:
683 return "RWCube_uint4_";
684 default:
685 UNREACHABLE();
686 }
687 }
688 default:
689 // All other types are identified by their group suffix
690 return TextureGroupSuffix(type, imageInternalFormat);
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200691 }
692}
693
Jamie Madill033dae62014-06-18 12:56:28 -0400694TString DecorateField(const TString &string, const TStructure &structure)
695{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100696 if (structure.symbolType() != SymbolType::BuiltIn)
Jamie Madill033dae62014-06-18 12:56:28 -0400697 {
698 return Decorate(string);
699 }
700
701 return string;
702}
703
704TString DecoratePrivate(const TString &privateText)
705{
706 return "dx_" + privateText;
707}
708
709TString Decorate(const TString &string)
710{
Jamie Madilld5512cd2014-07-10 17:50:08 -0400711 if (string.compare(0, 3, "gl_") != 0)
Jamie Madill033dae62014-06-18 12:56:28 -0400712 {
713 return "_" + string;
714 }
715
716 return string;
717}
718
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200719TString DecorateVariableIfNeeded(const TVariable &variable)
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300720{
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200721 if (variable.symbolType() == SymbolType::AngleInternal)
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300722 {
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200723 const TString &name = variable.name();
Olli Etuahoff526f12017-06-30 12:26:54 +0300724 // The name should not have a prefix reserved for user-defined variables or functions.
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200725 ASSERT(name.compare(0, 2, "f_") != 0);
726 ASSERT(name.compare(0, 1, "_") != 0);
727 return name;
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300728 }
729 else
730 {
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200731 return Decorate(variable.name());
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300732 }
733}
734
Olli Etuahobeb6dc72017-12-14 16:03:03 +0200735TString DecorateFunctionIfNeeded(const TFunction *func)
Olli Etuahoff526f12017-06-30 12:26:54 +0300736{
Olli Etuahobeb6dc72017-12-14 16:03:03 +0200737 if (func->symbolType() == SymbolType::AngleInternal)
Olli Etuahoff526f12017-06-30 12:26:54 +0300738 {
739 // The name should not have a prefix reserved for user-defined variables or functions.
Olli Etuahobed35d72017-12-20 16:36:26 +0200740 ASSERT(func->name().compare(0, 2, "f_") != 0);
741 ASSERT(func->name().compare(0, 1, "_") != 0);
742 return func->name();
Olli Etuahoff526f12017-06-30 12:26:54 +0300743 }
Olli Etuahobed35d72017-12-20 16:36:26 +0200744 ASSERT(func->name().compare(0, 3, "gl_") != 0);
Olli Etuahoff526f12017-06-30 12:26:54 +0300745 // Add an additional f prefix to functions so that they're always disambiguated from variables.
746 // This is necessary in the corner case where a variable declaration hides a function that it
747 // uses in its initializer.
Olli Etuahobed35d72017-12-20 16:36:26 +0200748 return "f_" + func->name();
Olli Etuahoff526f12017-06-30 12:26:54 +0300749}
750
Jamie Madill033dae62014-06-18 12:56:28 -0400751TString TypeString(const TType &type)
752{
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500753 const TStructure *structure = type.getStruct();
Jamie Madill033dae62014-06-18 12:56:28 -0400754 if (structure)
755 {
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100756 if (structure->symbolType() != SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400757 {
758 return StructNameString(*structure);
759 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500760 else // Nameless structure, define in place
Jamie Madill033dae62014-06-18 12:56:28 -0400761 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400762 return StructureHLSL::defineNameless(*structure);
Jamie Madill033dae62014-06-18 12:56:28 -0400763 }
764 }
765 else if (type.isMatrix())
766 {
767 int cols = type.getCols();
768 int rows = type.getRows();
769 return "float" + str(cols) + "x" + str(rows);
770 }
771 else
772 {
773 switch (type.getBasicType())
774 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500775 case EbtFloat:
776 switch (type.getNominalSize())
777 {
778 case 1:
779 return "float";
780 case 2:
781 return "float2";
782 case 3:
783 return "float3";
784 case 4:
785 return "float4";
786 }
787 case EbtInt:
788 switch (type.getNominalSize())
789 {
790 case 1:
791 return "int";
792 case 2:
793 return "int2";
794 case 3:
795 return "int3";
796 case 4:
797 return "int4";
798 }
799 case EbtUInt:
800 switch (type.getNominalSize())
801 {
802 case 1:
803 return "uint";
804 case 2:
805 return "uint2";
806 case 3:
807 return "uint3";
808 case 4:
809 return "uint4";
810 }
811 case EbtBool:
812 switch (type.getNominalSize())
813 {
814 case 1:
815 return "bool";
816 case 2:
817 return "bool2";
818 case 3:
819 return "bool3";
820 case 4:
821 return "bool4";
822 }
823 case EbtVoid:
824 return "void";
825 case EbtSampler2D:
826 case EbtISampler2D:
827 case EbtUSampler2D:
828 case EbtSampler2DArray:
829 case EbtISampler2DArray:
830 case EbtUSampler2DArray:
831 return "sampler2D";
832 case EbtSamplerCube:
833 case EbtISamplerCube:
834 case EbtUSamplerCube:
835 return "samplerCUBE";
836 case EbtSamplerExternalOES:
837 return "sampler2D";
jchen104cdac9e2017-05-08 11:01:20 +0800838 case EbtAtomicCounter:
839 return "atomic_uint";
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500840 default:
841 break;
Jamie Madill033dae62014-06-18 12:56:28 -0400842 }
843 }
844
845 UNREACHABLE();
846 return "<unknown type>";
847}
848
849TString StructNameString(const TStructure &structure)
850{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100851 if (structure.symbolType() == SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400852 {
853 return "";
854 }
855
Jamie Madill9b820842015-02-12 10:40:10 -0500856 // For structures at global scope we use a consistent
857 // translation so that we can link between shader stages.
858 if (structure.atGlobalScope())
859 {
Olli Etuahobed35d72017-12-20 16:36:26 +0200860 return Decorate(structure.name());
Jamie Madill9b820842015-02-12 10:40:10 -0500861 }
862
Olli Etuahobed35d72017-12-20 16:36:26 +0200863 return "ss" + str(structure.uniqueId().get()) + "_" + structure.name();
Jamie Madill033dae62014-06-18 12:56:28 -0400864}
865
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500866TString QualifiedStructNameString(const TStructure &structure,
867 bool useHLSLRowMajorPacking,
Jamie Madill033dae62014-06-18 12:56:28 -0400868 bool useStd140Packing)
869{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100870 if (structure.symbolType() == SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400871 {
872 return "";
873 }
874
875 TString prefix = "";
876
877 // Structs packed with row-major matrices in HLSL are prefixed with "rm"
878 // GLSL column-major maps to HLSL row-major, and the converse is true
879
880 if (useStd140Packing)
881 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400882 prefix += "std_";
Jamie Madill033dae62014-06-18 12:56:28 -0400883 }
884
885 if (useHLSLRowMajorPacking)
886 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400887 prefix += "rm_";
Jamie Madill033dae62014-06-18 12:56:28 -0400888 }
889
890 return prefix + StructNameString(structure);
891}
892
893TString InterpolationString(TQualifier qualifier)
894{
895 switch (qualifier)
896 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500897 case EvqVaryingIn:
898 return "";
899 case EvqFragmentIn:
900 return "";
901 case EvqSmoothIn:
902 return "linear";
903 case EvqFlatIn:
904 return "nointerpolation";
905 case EvqCentroidIn:
906 return "centroid";
907 case EvqVaryingOut:
908 return "";
909 case EvqVertexOut:
910 return "";
911 case EvqSmoothOut:
912 return "linear";
913 case EvqFlatOut:
914 return "nointerpolation";
915 case EvqCentroidOut:
916 return "centroid";
917 default:
918 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400919 }
920
921 return "";
922}
923
924TString QualifierString(TQualifier qualifier)
925{
926 switch (qualifier)
927 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500928 case EvqIn:
929 return "in";
930 case EvqOut:
931 return "inout"; // 'out' results in an HLSL error if not all fields are written, for
932 // GLSL it's undefined
933 case EvqInOut:
934 return "inout";
935 case EvqConstReadOnly:
936 return "const";
937 default:
938 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400939 }
940
941 return "";
942}
943
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200944TString DisambiguateFunctionName(const TIntermSequence *parameters)
945{
946 TString disambiguatingString;
947 for (auto parameter : *parameters)
948 {
949 const TType &paramType = parameter->getAsTyped()->getType();
Olli Etuaho088031e2017-07-03 15:59:33 +0300950 // Parameter types are only added to function names if they are ambiguous according to the
951 // native HLSL compiler. Other parameter types are not added to function names to avoid
952 // making function names longer.
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200953 if (paramType.getObjectSize() == 4 && paramType.getBasicType() == EbtFloat)
954 {
Olli Etuaho088031e2017-07-03 15:59:33 +0300955 // Disambiguation is needed for float2x2 and float4 parameters. These are the only
956 // built-in types that HLSL thinks are identical. float2x3 and float3x2 are different
957 // types, for example.
958 disambiguatingString += "_" + TypeString(paramType);
959 }
960 else if (paramType.getBasicType() == EbtStruct)
961 {
962 // Disambiguation is needed for struct parameters, since HLSL thinks that structs with
963 // the same fields but a different name are identical.
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100964 ASSERT(paramType.getStruct()->symbolType() != SymbolType::Empty);
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200965 disambiguatingString += "_" + TypeString(paramType);
966 }
967 }
968 return disambiguatingString;
Jamie Madill033dae62014-06-18 12:56:28 -0400969}
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200970
971} // namespace sh