blob: f6c7497af38de0cb9066cebdcc9b7cf4203a1690 [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
Xinghua Cao711b7a12017-10-09 13:38:12 +0800221TString 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
Xinghua Cao711b7a12017-10-09 13:38:12 +0800280TString 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
Xinghua Cao711b7a12017-10-09 13:38:12 +0800285TString 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
Xinghua Cao711b7a12017-10-09 13:38:12 +0800344TString TextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200345{
Xinghua Cao711b7a12017-10-09 13:38:12 +0800346 return TextureGroupSuffix(TextureGroup(type, imageInternalFormat));
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200347}
348
Xinghua Cao711b7a12017-10-09 13:38:12 +0800349TString TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200350{
351 switch (type)
352 {
353 case EbtISamplerCube:
354 return "Cube_int4_";
355 case EbtUSamplerCube:
356 return "Cube_uint4_";
Geoff Lang28a97ee2016-09-22 13:01:26 -0400357 case EbtSamplerExternalOES:
358 return "_External";
Xinghua Cao711b7a12017-10-09 13:38:12 +0800359 case EbtImageCube:
360 {
361 switch (imageInternalFormat)
362 {
363 case EiifRGBA32F:
364 case EiifRGBA16F:
365 case EiifR32F:
366 return "Cube_float4_";
367 case EiifRGBA8:
368 return "Cube_unorm_float4_";
369 case EiifRGBA8_SNORM:
370 return "Cube_snorm_float4_";
371 default:
372 UNREACHABLE();
373 }
374 }
375 case EbtIImageCube:
376 {
377 switch (imageInternalFormat)
378 {
379 case EiifRGBA32I:
380 case EiifRGBA16I:
381 case EiifRGBA8I:
382 case EiifR32I:
383 return "Cube_int4_";
384 default:
385 UNREACHABLE();
386 }
387 }
388 case EbtUImageCube:
389 {
390 switch (imageInternalFormat)
391 {
392 case EiifRGBA32UI:
393 case EiifRGBA16UI:
394 case EiifRGBA8UI:
395 case EiifR32UI:
396 return "Cube_uint4_";
397 default:
398 UNREACHABLE();
399 }
400 }
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200401 default:
402 // All other types are identified by their group suffix
Xinghua Cao711b7a12017-10-09 13:38:12 +0800403 return TextureGroupSuffix(type, imageInternalFormat);
404 }
405}
406
407HLSLRWTextureGroup RWTextureGroup(const TBasicType type,
408 TLayoutImageInternalFormat imageInternalFormat)
409
410{
411 switch (type)
412 {
413 case EbtImage2D:
414 {
415 switch (imageInternalFormat)
416 {
417 case EiifRGBA32F:
418 case EiifRGBA16F:
419 case EiifR32F:
420 return HLSL_RWTEXTURE_2D_FLOAT4;
421 case EiifRGBA8:
422 return HLSL_RWTEXTURE_2D_UNORM;
423 case EiifRGBA8_SNORM:
424 return HLSL_RWTEXTURE_2D_SNORM;
425 default:
426 UNREACHABLE();
427 }
428 }
429 case EbtIImage2D:
430 {
431 switch (imageInternalFormat)
432 {
433 case EiifRGBA32I:
434 case EiifRGBA16I:
435 case EiifRGBA8I:
436 case EiifR32I:
437 return HLSL_RWTEXTURE_2D_INT4;
438 default:
439 UNREACHABLE();
440 }
441 }
442 case EbtUImage2D:
443 {
444 switch (imageInternalFormat)
445 {
446
447 case EiifRGBA32UI:
448 case EiifRGBA16UI:
449 case EiifRGBA8UI:
450 case EiifR32UI:
451 return HLSL_RWTEXTURE_2D_UINT4;
452 default:
453 UNREACHABLE();
454 }
455 }
456 case EbtImage3D:
457 {
458 switch (imageInternalFormat)
459 {
460 case EiifRGBA32F:
461 case EiifRGBA16F:
462 case EiifR32F:
463 return HLSL_RWTEXTURE_3D_FLOAT4;
464 case EiifRGBA8:
465 return HLSL_RWTEXTURE_3D_UNORM;
466 case EiifRGBA8_SNORM:
467 return HLSL_RWTEXTURE_3D_SNORM;
468 default:
469 UNREACHABLE();
470 }
471 }
472 case EbtIImage3D:
473 {
474 switch (imageInternalFormat)
475 {
476 case EiifRGBA32I:
477 case EiifRGBA16I:
478 case EiifRGBA8I:
479 case EiifR32I:
480 return HLSL_RWTEXTURE_3D_INT4;
481 default:
482 UNREACHABLE();
483 }
484 }
485 case EbtUImage3D:
486 {
487 switch (imageInternalFormat)
488 {
489 case EiifRGBA32UI:
490 case EiifRGBA16UI:
491 case EiifRGBA8UI:
492 case EiifR32UI:
493 return HLSL_RWTEXTURE_3D_UINT4;
494 default:
495 UNREACHABLE();
496 }
497 }
498 case EbtImage2DArray:
499 case EbtImageCube:
500 {
501 switch (imageInternalFormat)
502 {
503 case EiifRGBA32F:
504 case EiifRGBA16F:
505 case EiifR32F:
506 return HLSL_RWTEXTURE_2D_ARRAY_FLOAT4;
507 case EiifRGBA8:
508 return HLSL_RWTEXTURE_2D_ARRAY_UNORN;
509 case EiifRGBA8_SNORM:
510 return HLSL_RWTEXTURE_2D_ARRAY_SNORM;
511 default:
512 UNREACHABLE();
513 }
514 }
515 case EbtIImage2DArray:
516 case EbtIImageCube:
517 {
518 switch (imageInternalFormat)
519 {
520 case EiifRGBA32I:
521 case EiifRGBA16I:
522 case EiifRGBA8I:
523 case EiifR32I:
524 return HLSL_RWTEXTURE_2D_ARRAY_INT4;
525 default:
526 UNREACHABLE();
527 }
528 }
529 case EbtUImage2DArray:
530 case EbtUImageCube:
531 {
532 switch (imageInternalFormat)
533 {
534 case EiifRGBA32UI:
535 case EiifRGBA16UI:
536 case EiifRGBA8UI:
537 case EiifR32UI:
538 return HLSL_RWTEXTURE_2D_ARRAY_UINT4;
539 default:
540 UNREACHABLE();
541 }
542 }
543 default:
544 UNREACHABLE();
545 }
546 return HLSL_RWTEXTURE_UNKNOWN;
547}
548
549TString RWTextureString(const HLSLRWTextureGroup RWTextureGroup)
550{
551 switch (RWTextureGroup)
552 {
553 case HLSL_RWTEXTURE_2D_FLOAT4:
554 return "RWTexture2D<float4>";
555 case HLSL_RWTEXTURE_2D_ARRAY_FLOAT4:
556 return "RWTexture2DArray<float4>";
557 case HLSL_RWTEXTURE_3D_FLOAT4:
558 return "RWTexture3D<float4>";
559 case HLSL_RWTEXTURE_2D_UNORM:
560 return "RWTexture2D<unorm float4>";
561 case HLSL_RWTEXTURE_2D_ARRAY_UNORN:
562 return "RWTexture2DArray<unorm float4>";
563 case HLSL_RWTEXTURE_3D_UNORM:
564 return "RWTexture3D<unorm float4>";
565 case HLSL_RWTEXTURE_2D_SNORM:
566 return "RWTexture2D<snorm float4>";
567 case HLSL_RWTEXTURE_2D_ARRAY_SNORM:
568 return "RWTexture2DArray<snorm float4>";
569 case HLSL_RWTEXTURE_3D_SNORM:
570 return "RWTexture3D<snorm float4>";
571 case HLSL_RWTEXTURE_2D_UINT4:
572 return "RWTexture2D<uint4>";
573 case HLSL_RWTEXTURE_2D_ARRAY_UINT4:
574 return "RWTexture2DArray<uint4>";
575 case HLSL_RWTEXTURE_3D_UINT4:
576 return "RWTexture3D<uint4>";
577 case HLSL_RWTEXTURE_2D_INT4:
578 return "RWTexture2D<int4>";
579 case HLSL_RWTEXTURE_2D_ARRAY_INT4:
580 return "RWTexture2DArray<int4>";
581 case HLSL_RWTEXTURE_3D_INT4:
582 return "RWTexture3D<int4>";
583 default:
584 UNREACHABLE();
585 }
586
587 return "<unknown read and write texture type>";
588}
589
590TString RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
591{
592 return RWTextureString(RWTextureGroup(type, imageInternalFormat));
593}
594
595TString RWTextureGroupSuffix(const HLSLRWTextureGroup type)
596{
597 switch (type)
598 {
599 case HLSL_RWTEXTURE_2D_FLOAT4:
600 return "RW2D_float4_";
601 case HLSL_RWTEXTURE_2D_ARRAY_FLOAT4:
602 return "RW2DArray_float4_";
603 case HLSL_RWTEXTURE_3D_FLOAT4:
604 return "RW3D_float4_";
605 case HLSL_RWTEXTURE_2D_UNORM:
606 return "RW2D_unorm_float4_";
607 case HLSL_RWTEXTURE_2D_ARRAY_UNORN:
608 return "RW2DArray_unorm_float4_";
609 case HLSL_RWTEXTURE_3D_UNORM:
610 return "RW3D_unorm_float4_";
611 case HLSL_RWTEXTURE_2D_SNORM:
612 return "RW2D_snorm_float4_";
613 case HLSL_RWTEXTURE_2D_ARRAY_SNORM:
614 return "RW2DArray_snorm_float4_";
615 case HLSL_RWTEXTURE_3D_SNORM:
616 return "RW3D_snorm_float4_";
617 case HLSL_RWTEXTURE_2D_UINT4:
618 return "RW2D_uint4_";
619 case HLSL_RWTEXTURE_2D_ARRAY_UINT4:
620 return "RW2DArray_uint4_";
621 case HLSL_RWTEXTURE_3D_UINT4:
622 return "RW3D_uint4_";
623 case HLSL_RWTEXTURE_2D_INT4:
624 return "RW2D_int4_";
625 case HLSL_RWTEXTURE_2D_ARRAY_INT4:
626 return "RW2DArray_int4_";
627 case HLSL_RWTEXTURE_3D_INT4:
628 return "RW3D_int4_";
629 default:
630 UNREACHABLE();
631 }
632
633 return "<unknown read and write resource>";
634}
635
636TString RWTextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
637{
638 return RWTextureGroupSuffix(RWTextureGroup(type, imageInternalFormat));
639}
640
641TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat)
642{
643 switch (type)
644 {
645 case EbtImageCube:
646 {
647 switch (imageInternalFormat)
648 {
649 case EiifRGBA32F:
650 case EiifRGBA16F:
651 case EiifR32F:
652 return "RWCube_float4_";
653 case EiifRGBA8:
654 return "RWCube_unorm_float4_";
655 case EiifRGBA8_SNORM:
656 return "RWCube_unorm_float4_";
657 default:
658 UNREACHABLE();
659 }
660 }
661 case EbtIImageCube:
662 {
663 switch (imageInternalFormat)
664 {
665 case EiifRGBA32I:
666 case EiifRGBA16I:
667 case EiifRGBA8I:
668 case EiifR32I:
669 return "RWCube_int4_";
670 default:
671 UNREACHABLE();
672 }
673 }
674 case EbtUImageCube:
675 {
676 switch (imageInternalFormat)
677 {
678 case EiifRGBA32UI:
679 case EiifRGBA16UI:
680 case EiifRGBA8UI:
681 case EiifR32UI:
682 return "RWCube_uint4_";
683 default:
684 UNREACHABLE();
685 }
686 }
687 default:
688 // All other types are identified by their group suffix
689 return TextureGroupSuffix(type, imageInternalFormat);
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200690 }
691}
692
Jamie Madill033dae62014-06-18 12:56:28 -0400693TString DecorateField(const TString &string, const TStructure &structure)
694{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100695 if (structure.symbolType() != SymbolType::BuiltIn)
Jamie Madill033dae62014-06-18 12:56:28 -0400696 {
697 return Decorate(string);
698 }
699
700 return string;
701}
702
703TString DecoratePrivate(const TString &privateText)
704{
705 return "dx_" + privateText;
706}
707
708TString Decorate(const TString &string)
709{
Jamie Madilld5512cd2014-07-10 17:50:08 -0400710 if (string.compare(0, 3, "gl_") != 0)
Jamie Madill033dae62014-06-18 12:56:28 -0400711 {
712 return "_" + string;
713 }
714
715 return string;
716}
717
Olli Etuahoff526f12017-06-30 12:26:54 +0300718TString DecorateVariableIfNeeded(const TName &name)
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300719{
720 if (name.isInternal())
721 {
Olli Etuahoff526f12017-06-30 12:26:54 +0300722 // The name should not have a prefix reserved for user-defined variables or functions.
723 ASSERT(name.getString().compare(0, 2, "f_") != 0);
724 ASSERT(name.getString().compare(0, 1, "_") != 0);
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300725 return name.getString();
726 }
727 else
728 {
729 return Decorate(name.getString());
730 }
731}
732
Olli Etuahoff526f12017-06-30 12:26:54 +0300733TString DecorateFunctionIfNeeded(const TName &name)
734{
735 if (name.isInternal())
736 {
737 // The name should not have a prefix reserved for user-defined variables or functions.
738 ASSERT(name.getString().compare(0, 2, "f_") != 0);
739 ASSERT(name.getString().compare(0, 1, "_") != 0);
740 return name.getString();
741 }
742 ASSERT(name.getString().compare(0, 3, "gl_") != 0);
743 // Add an additional f prefix to functions so that they're always disambiguated from variables.
744 // This is necessary in the corner case where a variable declaration hides a function that it
745 // uses in its initializer.
746 return "f_" + name.getString();
747}
748
Jamie Madill033dae62014-06-18 12:56:28 -0400749TString TypeString(const TType &type)
750{
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500751 const TStructure *structure = type.getStruct();
Jamie Madill033dae62014-06-18 12:56:28 -0400752 if (structure)
753 {
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100754 if (structure->symbolType() != SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400755 {
756 return StructNameString(*structure);
757 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500758 else // Nameless structure, define in place
Jamie Madill033dae62014-06-18 12:56:28 -0400759 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400760 return StructureHLSL::defineNameless(*structure);
Jamie Madill033dae62014-06-18 12:56:28 -0400761 }
762 }
763 else if (type.isMatrix())
764 {
765 int cols = type.getCols();
766 int rows = type.getRows();
767 return "float" + str(cols) + "x" + str(rows);
768 }
769 else
770 {
771 switch (type.getBasicType())
772 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500773 case EbtFloat:
774 switch (type.getNominalSize())
775 {
776 case 1:
777 return "float";
778 case 2:
779 return "float2";
780 case 3:
781 return "float3";
782 case 4:
783 return "float4";
784 }
785 case EbtInt:
786 switch (type.getNominalSize())
787 {
788 case 1:
789 return "int";
790 case 2:
791 return "int2";
792 case 3:
793 return "int3";
794 case 4:
795 return "int4";
796 }
797 case EbtUInt:
798 switch (type.getNominalSize())
799 {
800 case 1:
801 return "uint";
802 case 2:
803 return "uint2";
804 case 3:
805 return "uint3";
806 case 4:
807 return "uint4";
808 }
809 case EbtBool:
810 switch (type.getNominalSize())
811 {
812 case 1:
813 return "bool";
814 case 2:
815 return "bool2";
816 case 3:
817 return "bool3";
818 case 4:
819 return "bool4";
820 }
821 case EbtVoid:
822 return "void";
823 case EbtSampler2D:
824 case EbtISampler2D:
825 case EbtUSampler2D:
826 case EbtSampler2DArray:
827 case EbtISampler2DArray:
828 case EbtUSampler2DArray:
829 return "sampler2D";
830 case EbtSamplerCube:
831 case EbtISamplerCube:
832 case EbtUSamplerCube:
833 return "samplerCUBE";
834 case EbtSamplerExternalOES:
835 return "sampler2D";
jchen104cdac9e2017-05-08 11:01:20 +0800836 case EbtAtomicCounter:
837 return "atomic_uint";
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500838 default:
839 break;
Jamie Madill033dae62014-06-18 12:56:28 -0400840 }
841 }
842
843 UNREACHABLE();
844 return "<unknown type>";
845}
846
847TString StructNameString(const TStructure &structure)
848{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100849 if (structure.symbolType() == SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400850 {
851 return "";
852 }
853
Jamie Madill9b820842015-02-12 10:40:10 -0500854 // For structures at global scope we use a consistent
855 // translation so that we can link between shader stages.
856 if (structure.atGlobalScope())
857 {
858 return Decorate(structure.name());
859 }
860
Olli Etuaho97fa8552017-11-28 16:28:42 +0200861 return "ss" + str(structure.uniqueId().get()) + "_" + structure.name();
Jamie Madill033dae62014-06-18 12:56:28 -0400862}
863
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500864TString QualifiedStructNameString(const TStructure &structure,
865 bool useHLSLRowMajorPacking,
Jamie Madill033dae62014-06-18 12:56:28 -0400866 bool useStd140Packing)
867{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100868 if (structure.symbolType() == SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400869 {
870 return "";
871 }
872
873 TString prefix = "";
874
875 // Structs packed with row-major matrices in HLSL are prefixed with "rm"
876 // GLSL column-major maps to HLSL row-major, and the converse is true
877
878 if (useStd140Packing)
879 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400880 prefix += "std_";
Jamie Madill033dae62014-06-18 12:56:28 -0400881 }
882
883 if (useHLSLRowMajorPacking)
884 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400885 prefix += "rm_";
Jamie Madill033dae62014-06-18 12:56:28 -0400886 }
887
888 return prefix + StructNameString(structure);
889}
890
891TString InterpolationString(TQualifier qualifier)
892{
893 switch (qualifier)
894 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500895 case EvqVaryingIn:
896 return "";
897 case EvqFragmentIn:
898 return "";
899 case EvqSmoothIn:
900 return "linear";
901 case EvqFlatIn:
902 return "nointerpolation";
903 case EvqCentroidIn:
904 return "centroid";
905 case EvqVaryingOut:
906 return "";
907 case EvqVertexOut:
908 return "";
909 case EvqSmoothOut:
910 return "linear";
911 case EvqFlatOut:
912 return "nointerpolation";
913 case EvqCentroidOut:
914 return "centroid";
915 default:
916 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400917 }
918
919 return "";
920}
921
922TString QualifierString(TQualifier qualifier)
923{
924 switch (qualifier)
925 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500926 case EvqIn:
927 return "in";
928 case EvqOut:
929 return "inout"; // 'out' results in an HLSL error if not all fields are written, for
930 // GLSL it's undefined
931 case EvqInOut:
932 return "inout";
933 case EvqConstReadOnly:
934 return "const";
935 default:
936 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400937 }
938
939 return "";
940}
941
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200942TString DisambiguateFunctionName(const TIntermSequence *parameters)
943{
944 TString disambiguatingString;
945 for (auto parameter : *parameters)
946 {
947 const TType &paramType = parameter->getAsTyped()->getType();
Olli Etuaho088031e2017-07-03 15:59:33 +0300948 // Parameter types are only added to function names if they are ambiguous according to the
949 // native HLSL compiler. Other parameter types are not added to function names to avoid
950 // making function names longer.
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200951 if (paramType.getObjectSize() == 4 && paramType.getBasicType() == EbtFloat)
952 {
Olli Etuaho088031e2017-07-03 15:59:33 +0300953 // Disambiguation is needed for float2x2 and float4 parameters. These are the only
954 // built-in types that HLSL thinks are identical. float2x3 and float3x2 are different
955 // types, for example.
956 disambiguatingString += "_" + TypeString(paramType);
957 }
958 else if (paramType.getBasicType() == EbtStruct)
959 {
960 // Disambiguation is needed for struct parameters, since HLSL thinks that structs with
961 // the same fields but a different name are identical.
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100962 ASSERT(paramType.getStruct()->symbolType() != SymbolType::Empty);
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200963 disambiguatingString += "_" + TypeString(paramType);
964 }
965 }
966 return disambiguatingString;
Jamie Madill033dae62014-06-18 12:56:28 -0400967}
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200968
969} // namespace sh