blob: f21598e05f1c93d541912accee233b6e64c986b1 [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 Etuaho12c03762018-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 Etuaho12c03762018-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 Etuaho12c03762018-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 Etuaho12c03762018-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
Olli Etuahofbb1c792018-01-19 16:26:59 +0200350const char *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
Olli Etuahofbb1c792018-01-19 16:26:59 +0200596const char *RWTextureGroupSuffix(const HLSLRWTextureGroup type)
Xinghua Cao711b7a12017-10-09 13:38:12 +0800597{
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
Olli Etuahofbb1c792018-01-19 16:26:59 +0200637const char *RWTextureGroupSuffix(const TBasicType type,
638 TLayoutImageInternalFormat imageInternalFormat)
Xinghua Cao711b7a12017-10-09 13:38:12 +0800639{
640 return RWTextureGroupSuffix(RWTextureGroup(type, imageInternalFormat));
641}
642
Olli Etuahofbb1c792018-01-19 16:26:59 +0200643const char *RWTextureTypeSuffix(const TBasicType type,
644 TLayoutImageInternalFormat imageInternalFormat)
Xinghua Cao711b7a12017-10-09 13:38:12 +0800645{
646 switch (type)
647 {
648 case EbtImageCube:
649 {
650 switch (imageInternalFormat)
651 {
652 case EiifRGBA32F:
653 case EiifRGBA16F:
654 case EiifR32F:
655 return "RWCube_float4_";
656 case EiifRGBA8:
657 return "RWCube_unorm_float4_";
658 case EiifRGBA8_SNORM:
659 return "RWCube_unorm_float4_";
660 default:
661 UNREACHABLE();
662 }
663 }
664 case EbtIImageCube:
665 {
666 switch (imageInternalFormat)
667 {
668 case EiifRGBA32I:
669 case EiifRGBA16I:
670 case EiifRGBA8I:
671 case EiifR32I:
672 return "RWCube_int4_";
673 default:
674 UNREACHABLE();
675 }
676 }
677 case EbtUImageCube:
678 {
679 switch (imageInternalFormat)
680 {
681 case EiifRGBA32UI:
682 case EiifRGBA16UI:
683 case EiifRGBA8UI:
684 case EiifR32UI:
685 return "RWCube_uint4_";
686 default:
687 UNREACHABLE();
688 }
689 }
690 default:
691 // All other types are identified by their group suffix
692 return TextureGroupSuffix(type, imageInternalFormat);
Olli Etuaho9b4e8622015-12-22 15:53:22 +0200693 }
694}
695
Olli Etuahofbb1c792018-01-19 16:26:59 +0200696TString DecorateField(const ImmutableString &string, const TStructure &structure)
Jamie Madill033dae62014-06-18 12:56:28 -0400697{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100698 if (structure.symbolType() != SymbolType::BuiltIn)
Jamie Madill033dae62014-06-18 12:56:28 -0400699 {
700 return Decorate(string);
701 }
702
Olli Etuahofbb1c792018-01-19 16:26:59 +0200703 return TString(string.data());
Jamie Madill033dae62014-06-18 12:56:28 -0400704}
705
Olli Etuahofbb1c792018-01-19 16:26:59 +0200706TString DecoratePrivate(const ImmutableString &privateText)
Jamie Madill033dae62014-06-18 12:56:28 -0400707{
Olli Etuahofbb1c792018-01-19 16:26:59 +0200708 return "dx_" + TString(privateText.data());
Jamie Madill033dae62014-06-18 12:56:28 -0400709}
710
Olli Etuahofbb1c792018-01-19 16:26:59 +0200711TString Decorate(const ImmutableString &string)
Jamie Madill033dae62014-06-18 12:56:28 -0400712{
Olli Etuahofbb1c792018-01-19 16:26:59 +0200713 if (!string.beginsWith("gl_"))
Jamie Madill033dae62014-06-18 12:56:28 -0400714 {
Olli Etuahofbb1c792018-01-19 16:26:59 +0200715 return "_" + TString(string.data());
Jamie Madill033dae62014-06-18 12:56:28 -0400716 }
717
Olli Etuahofbb1c792018-01-19 16:26:59 +0200718 return TString(string.data());
Jamie Madill033dae62014-06-18 12:56:28 -0400719}
720
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200721TString DecorateVariableIfNeeded(const TVariable &variable)
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300722{
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200723 if (variable.symbolType() == SymbolType::AngleInternal)
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300724 {
Olli Etuahofbb1c792018-01-19 16:26:59 +0200725 const ImmutableString &name = variable.name();
Olli Etuahoff526f12017-06-30 12:26:54 +0300726 // The name should not have a prefix reserved for user-defined variables or functions.
Olli Etuahofbb1c792018-01-19 16:26:59 +0200727 ASSERT(!name.beginsWith("f_"));
728 ASSERT(!name.beginsWith("_"));
729 return TString(name.data());
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300730 }
731 else
732 {
Olli Etuaho8b5e8fd2017-12-15 14:59:15 +0200733 return Decorate(variable.name());
Olli Etuahof5cfc8d2015-08-06 16:36:39 +0300734 }
735}
736
Olli Etuahobeb6dc72017-12-14 16:03:03 +0200737TString DecorateFunctionIfNeeded(const TFunction *func)
Olli Etuahoff526f12017-06-30 12:26:54 +0300738{
Olli Etuahobeb6dc72017-12-14 16:03:03 +0200739 if (func->symbolType() == SymbolType::AngleInternal)
Olli Etuahoff526f12017-06-30 12:26:54 +0300740 {
741 // The name should not have a prefix reserved for user-defined variables or functions.
Olli Etuahofbb1c792018-01-19 16:26:59 +0200742 ASSERT(!func->name().beginsWith("f_"));
743 ASSERT(!func->name().beginsWith("_"));
744 return TString(func->name().data());
Olli Etuahoff526f12017-06-30 12:26:54 +0300745 }
Olli Etuahofbb1c792018-01-19 16:26:59 +0200746 ASSERT(!func->name().beginsWith("gl_"));
Olli Etuahoff526f12017-06-30 12:26:54 +0300747 // Add an additional f prefix to functions so that they're always disambiguated from variables.
748 // This is necessary in the corner case where a variable declaration hides a function that it
749 // uses in its initializer.
Olli Etuahofbb1c792018-01-19 16:26:59 +0200750 return "f_" + TString(func->name().data());
Olli Etuahoff526f12017-06-30 12:26:54 +0300751}
752
Jamie Madill033dae62014-06-18 12:56:28 -0400753TString TypeString(const TType &type)
754{
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500755 const TStructure *structure = type.getStruct();
Jamie Madill033dae62014-06-18 12:56:28 -0400756 if (structure)
757 {
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100758 if (structure->symbolType() != SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400759 {
760 return StructNameString(*structure);
761 }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500762 else // Nameless structure, define in place
Jamie Madill033dae62014-06-18 12:56:28 -0400763 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400764 return StructureHLSL::defineNameless(*structure);
Jamie Madill033dae62014-06-18 12:56:28 -0400765 }
766 }
767 else if (type.isMatrix())
768 {
769 int cols = type.getCols();
770 int rows = type.getRows();
771 return "float" + str(cols) + "x" + str(rows);
772 }
773 else
774 {
775 switch (type.getBasicType())
776 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500777 case EbtFloat:
778 switch (type.getNominalSize())
779 {
780 case 1:
781 return "float";
782 case 2:
783 return "float2";
784 case 3:
785 return "float3";
786 case 4:
787 return "float4";
788 }
789 case EbtInt:
790 switch (type.getNominalSize())
791 {
792 case 1:
793 return "int";
794 case 2:
795 return "int2";
796 case 3:
797 return "int3";
798 case 4:
799 return "int4";
800 }
801 case EbtUInt:
802 switch (type.getNominalSize())
803 {
804 case 1:
805 return "uint";
806 case 2:
807 return "uint2";
808 case 3:
809 return "uint3";
810 case 4:
811 return "uint4";
812 }
813 case EbtBool:
814 switch (type.getNominalSize())
815 {
816 case 1:
817 return "bool";
818 case 2:
819 return "bool2";
820 case 3:
821 return "bool3";
822 case 4:
823 return "bool4";
824 }
825 case EbtVoid:
826 return "void";
827 case EbtSampler2D:
828 case EbtISampler2D:
829 case EbtUSampler2D:
830 case EbtSampler2DArray:
831 case EbtISampler2DArray:
832 case EbtUSampler2DArray:
833 return "sampler2D";
834 case EbtSamplerCube:
835 case EbtISamplerCube:
836 case EbtUSamplerCube:
837 return "samplerCUBE";
838 case EbtSamplerExternalOES:
839 return "sampler2D";
jchen104cdac9e2017-05-08 11:01:20 +0800840 case EbtAtomicCounter:
841 return "atomic_uint";
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500842 default:
843 break;
Jamie Madill033dae62014-06-18 12:56:28 -0400844 }
845 }
846
847 UNREACHABLE();
848 return "<unknown type>";
849}
850
851TString StructNameString(const TStructure &structure)
852{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100853 if (structure.symbolType() == SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400854 {
855 return "";
856 }
857
Jamie Madill9b820842015-02-12 10:40:10 -0500858 // For structures at global scope we use a consistent
859 // translation so that we can link between shader stages.
860 if (structure.atGlobalScope())
861 {
Olli Etuahobed35d72017-12-20 16:36:26 +0200862 return Decorate(structure.name());
Jamie Madill9b820842015-02-12 10:40:10 -0500863 }
864
Olli Etuahofbb1c792018-01-19 16:26:59 +0200865 return "ss" + str(structure.uniqueId().get()) + "_" + TString(structure.name().data());
Jamie Madill033dae62014-06-18 12:56:28 -0400866}
867
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500868TString QualifiedStructNameString(const TStructure &structure,
869 bool useHLSLRowMajorPacking,
Jamie Madill033dae62014-06-18 12:56:28 -0400870 bool useStd140Packing)
871{
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100872 if (structure.symbolType() == SymbolType::Empty)
Jamie Madill033dae62014-06-18 12:56:28 -0400873 {
874 return "";
875 }
876
877 TString prefix = "";
878
879 // Structs packed with row-major matrices in HLSL are prefixed with "rm"
880 // GLSL column-major maps to HLSL row-major, and the converse is true
881
882 if (useStd140Packing)
883 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400884 prefix += "std_";
Jamie Madill033dae62014-06-18 12:56:28 -0400885 }
886
887 if (useHLSLRowMajorPacking)
888 {
Jamie Madill8daaba12014-06-13 10:04:33 -0400889 prefix += "rm_";
Jamie Madill033dae62014-06-18 12:56:28 -0400890 }
891
892 return prefix + StructNameString(structure);
893}
894
895TString InterpolationString(TQualifier qualifier)
896{
897 switch (qualifier)
898 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500899 case EvqVaryingIn:
900 return "";
901 case EvqFragmentIn:
902 return "";
903 case EvqSmoothIn:
904 return "linear";
905 case EvqFlatIn:
906 return "nointerpolation";
907 case EvqCentroidIn:
908 return "centroid";
909 case EvqVaryingOut:
910 return "";
911 case EvqVertexOut:
912 return "";
913 case EvqSmoothOut:
914 return "linear";
915 case EvqFlatOut:
916 return "nointerpolation";
917 case EvqCentroidOut:
918 return "centroid";
919 default:
920 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400921 }
922
923 return "";
924}
925
926TString QualifierString(TQualifier qualifier)
927{
928 switch (qualifier)
929 {
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500930 case EvqIn:
931 return "in";
932 case EvqOut:
933 return "inout"; // 'out' results in an HLSL error if not all fields are written, for
934 // GLSL it's undefined
935 case EvqInOut:
936 return "inout";
937 case EvqConstReadOnly:
938 return "const";
939 default:
940 UNREACHABLE();
Jamie Madill033dae62014-06-18 12:56:28 -0400941 }
942
943 return "";
944}
945
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200946TString DisambiguateFunctionName(const TIntermSequence *parameters)
947{
948 TString disambiguatingString;
949 for (auto parameter : *parameters)
950 {
951 const TType &paramType = parameter->getAsTyped()->getType();
Olli Etuaho088031e2017-07-03 15:59:33 +0300952 // Parameter types are only added to function names if they are ambiguous according to the
953 // native HLSL compiler. Other parameter types are not added to function names to avoid
954 // making function names longer.
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200955 if (paramType.getObjectSize() == 4 && paramType.getBasicType() == EbtFloat)
956 {
Olli Etuaho088031e2017-07-03 15:59:33 +0300957 // Disambiguation is needed for float2x2 and float4 parameters. These are the only
958 // built-in types that HLSL thinks are identical. float2x3 and float3x2 are different
959 // types, for example.
960 disambiguatingString += "_" + TypeString(paramType);
961 }
962 else if (paramType.getBasicType() == EbtStruct)
963 {
964 // Disambiguation is needed for struct parameters, since HLSL thinks that structs with
965 // the same fields but a different name are identical.
Olli Etuaho9d4d7f02017-12-07 17:11:41 +0100966 ASSERT(paramType.getStruct()->symbolType() != SymbolType::Empty);
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200967 disambiguatingString += "_" + TypeString(paramType);
968 }
969 }
970 return disambiguatingString;
Jamie Madill033dae62014-06-18 12:56:28 -0400971}
Olli Etuahobe59c2f2016-03-07 11:32:34 +0200972
973} // namespace sh