1 //
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.h:
7 //   Utility methods for GLSL to HLSL translation.
8 //
9 
10 #ifndef COMPILER_TRANSLATOR_UTILSHLSL_H_
11 #define COMPILER_TRANSLATOR_UTILSHLSL_H_
12 
13 #include <vector>
14 #include "compiler/translator/IntermNode.h"
15 #include "compiler/translator/Types.h"
16 
17 #include "angle_gl.h"
18 
19 class TName;
20 
21 namespace sh
22 {
23 
24 // HLSL Texture type for GLSL sampler type and readonly image type.
25 enum HLSLTextureGroup
26 {
27     // read resources
28     HLSL_TEXTURE_2D,
29     HLSL_TEXTURE_MIN = HLSL_TEXTURE_2D,
30 
31     HLSL_TEXTURE_CUBE,
32     HLSL_TEXTURE_2D_ARRAY,
33     HLSL_TEXTURE_3D,
34     HLSL_TEXTURE_2D_UNORM,
35     HLSL_TEXTURE_CUBE_UNORM,
36     HLSL_TEXTURE_2D_ARRAY_UNORN,
37     HLSL_TEXTURE_3D_UNORM,
38     HLSL_TEXTURE_2D_SNORM,
39     HLSL_TEXTURE_CUBE_SNORM,
40     HLSL_TEXTURE_2D_ARRAY_SNORM,
41     HLSL_TEXTURE_3D_SNORM,
42     HLSL_TEXTURE_2D_MS,
43     HLSL_TEXTURE_2D_INT4,
44     HLSL_TEXTURE_3D_INT4,
45     HLSL_TEXTURE_2D_ARRAY_INT4,
46     HLSL_TEXTURE_2D_MS_INT4,
47     HLSL_TEXTURE_2D_UINT4,
48     HLSL_TEXTURE_3D_UINT4,
49     HLSL_TEXTURE_2D_ARRAY_UINT4,
50     HLSL_TEXTURE_2D_MS_UINT4,
51 
52     // Comparison samplers
53 
54     HLSL_TEXTURE_2D_COMPARISON,
55     HLSL_TEXTURE_CUBE_COMPARISON,
56     HLSL_TEXTURE_2D_ARRAY_COMPARISON,
57 
58     HLSL_COMPARISON_SAMPLER_GROUP_BEGIN = HLSL_TEXTURE_2D_COMPARISON,
59     HLSL_COMPARISON_SAMPLER_GROUP_END   = HLSL_TEXTURE_2D_ARRAY_COMPARISON,
60 
61     HLSL_TEXTURE_UNKNOWN,
62     HLSL_TEXTURE_MAX = HLSL_TEXTURE_UNKNOWN
63 };
64 
65 // HLSL RWTexture type for GLSL read and write image type.
66 enum HLSLRWTextureGroup
67 {
68     // read/write resource
69     HLSL_RWTEXTURE_2D_FLOAT4,
70     HLSL_RWTEXTURE_MIN = HLSL_RWTEXTURE_2D_FLOAT4,
71     HLSL_RWTEXTURE_2D_ARRAY_FLOAT4,
72     HLSL_RWTEXTURE_3D_FLOAT4,
73     HLSL_RWTEXTURE_2D_UNORM,
74     HLSL_RWTEXTURE_2D_ARRAY_UNORN,
75     HLSL_RWTEXTURE_3D_UNORM,
76     HLSL_RWTEXTURE_2D_SNORM,
77     HLSL_RWTEXTURE_2D_ARRAY_SNORM,
78     HLSL_RWTEXTURE_3D_SNORM,
79     HLSL_RWTEXTURE_2D_UINT4,
80     HLSL_RWTEXTURE_2D_ARRAY_UINT4,
81     HLSL_RWTEXTURE_3D_UINT4,
82     HLSL_RWTEXTURE_2D_INT4,
83     HLSL_RWTEXTURE_2D_ARRAY_INT4,
84     HLSL_RWTEXTURE_3D_INT4,
85 
86     HLSL_RWTEXTURE_UNKNOWN,
87     HLSL_RWTEXTURE_MAX = HLSL_RWTEXTURE_UNKNOWN
88 };
89 
90 HLSLTextureGroup TextureGroup(const TBasicType type,
91                               TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified);
92 TString TextureString(const HLSLTextureGroup textureGroup);
93 TString TextureString(const TBasicType type,
94                       TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified);
95 TString TextureGroupSuffix(const HLSLTextureGroup type);
96 TString TextureGroupSuffix(const TBasicType type,
97                            TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified);
98 TString TextureTypeSuffix(const TBasicType type,
99                           TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified);
100 HLSLRWTextureGroup RWTextureGroup(const TBasicType type,
101                                   TLayoutImageInternalFormat imageInternalFormat);
102 TString RWTextureString(const HLSLRWTextureGroup textureGroup);
103 TString RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat);
104 TString RWTextureGroupSuffix(const HLSLRWTextureGroup type);
105 TString RWTextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat);
106 TString RWTextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat);
107 
108 TString SamplerString(const TBasicType type);
109 TString SamplerString(HLSLTextureGroup type);
110 
111 // Adds a prefix to user-defined names to avoid naming clashes.
112 TString Decorate(const TString &string);
113 TString DecorateVariableIfNeeded(const TName &name);
114 TString DecorateFunctionIfNeeded(const TName &name);
115 TString DecorateField(const TString &string, const TStructure &structure);
116 TString DecoratePrivate(const TString &privateText);
117 TString TypeString(const TType &type);
118 TString StructNameString(const TStructure &structure);
119 TString QualifiedStructNameString(const TStructure &structure,
120                                   bool useHLSLRowMajorPacking,
121                                   bool useStd140Packing);
122 TString InterpolationString(TQualifier qualifier);
123 TString QualifierString(TQualifier qualifier);
124 // Parameters may need to be included in function names to disambiguate between overloaded
125 // functions.
126 TString DisambiguateFunctionName(const TIntermSequence *parameters);
127 }
128 
129 #endif  // COMPILER_TRANSLATOR_UTILSHLSL_H_
130