1 // 2 // Copyright 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_HLSL_UTILSHLSL_H_ 11 #define COMPILER_TRANSLATOR_HLSL_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 namespace sh 20 { 21 22 class TFunction; 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_MS_ARRAY, 44 HLSL_TEXTURE_2D_INT4, 45 HLSL_TEXTURE_3D_INT4, 46 HLSL_TEXTURE_2D_ARRAY_INT4, 47 HLSL_TEXTURE_2D_MS_INT4, 48 HLSL_TEXTURE_2D_MS_ARRAY_INT4, 49 HLSL_TEXTURE_2D_UINT4, 50 HLSL_TEXTURE_3D_UINT4, 51 HLSL_TEXTURE_2D_ARRAY_UINT4, 52 HLSL_TEXTURE_2D_MS_UINT4, 53 HLSL_TEXTURE_2D_MS_ARRAY_UINT4, 54 55 HLSL_TEXTURE_BUFFER, 56 HLSL_TEXTURE_BUFFER_UNORM, 57 HLSL_TEXTURE_BUFFER_SNORM, 58 HLSL_TEXTURE_BUFFER_UINT4, 59 HLSL_TEXTURE_BUFFER_INT4, 60 61 // Comparison samplers 62 63 HLSL_TEXTURE_2D_COMPARISON, 64 HLSL_TEXTURE_CUBE_COMPARISON, 65 HLSL_TEXTURE_2D_ARRAY_COMPARISON, 66 67 HLSL_COMPARISON_SAMPLER_GROUP_BEGIN = HLSL_TEXTURE_2D_COMPARISON, 68 HLSL_COMPARISON_SAMPLER_GROUP_END = HLSL_TEXTURE_2D_ARRAY_COMPARISON, 69 70 HLSL_TEXTURE_UNKNOWN, 71 HLSL_TEXTURE_MAX = HLSL_TEXTURE_UNKNOWN 72 }; 73 74 // HLSL RWTexture type for GLSL read and write image type. 75 enum HLSLRWTextureGroup 76 { 77 // read/write resource 78 HLSL_RWTEXTURE_2D_FLOAT4, 79 HLSL_RWTEXTURE_MIN = HLSL_RWTEXTURE_2D_FLOAT4, 80 HLSL_RWTEXTURE_2D_ARRAY_FLOAT4, 81 HLSL_RWTEXTURE_3D_FLOAT4, 82 HLSL_RWTEXTURE_2D_UNORM, 83 HLSL_RWTEXTURE_2D_ARRAY_UNORN, 84 HLSL_RWTEXTURE_3D_UNORM, 85 HLSL_RWTEXTURE_2D_SNORM, 86 HLSL_RWTEXTURE_2D_ARRAY_SNORM, 87 HLSL_RWTEXTURE_3D_SNORM, 88 HLSL_RWTEXTURE_2D_UINT4, 89 HLSL_RWTEXTURE_2D_ARRAY_UINT4, 90 HLSL_RWTEXTURE_3D_UINT4, 91 HLSL_RWTEXTURE_2D_INT4, 92 HLSL_RWTEXTURE_2D_ARRAY_INT4, 93 HLSL_RWTEXTURE_3D_INT4, 94 95 HLSL_RWTEXTURE_BUFFER_FLOAT4, 96 HLSL_RWTEXTURE_BUFFER_UNORM, 97 HLSL_RWTEXTURE_BUFFER_SNORM, 98 HLSL_RWTEXTURE_BUFFER_UINT4, 99 HLSL_RWTEXTURE_BUFFER_INT4, 100 101 HLSL_RWTEXTURE_UNKNOWN, 102 HLSL_RWTEXTURE_MAX = HLSL_RWTEXTURE_UNKNOWN 103 }; 104 105 HLSLTextureGroup TextureGroup(const TBasicType type, 106 TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); 107 const char *TextureString(const HLSLTextureGroup textureGroup); 108 const char *TextureString(const TBasicType type, 109 TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); 110 const char *TextureGroupSuffix(const HLSLTextureGroup type); 111 const char *TextureGroupSuffix(const TBasicType type, 112 TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); 113 const char *TextureTypeSuffix(const TBasicType type, 114 TLayoutImageInternalFormat imageInternalFormat = EiifUnspecified); 115 HLSLRWTextureGroup RWTextureGroup(const TBasicType type, 116 TLayoutImageInternalFormat imageInternalFormat); 117 const char *RWTextureString(const HLSLRWTextureGroup textureGroup); 118 const char *RWTextureString(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat); 119 const char *RWTextureGroupSuffix(const HLSLRWTextureGroup type); 120 const char *RWTextureGroupSuffix(const TBasicType type, 121 TLayoutImageInternalFormat imageInternalFormat); 122 const char *RWTextureTypeSuffix(const TBasicType type, 123 TLayoutImageInternalFormat imageInternalFormat); 124 125 const char *SamplerString(const TBasicType type); 126 const char *SamplerString(HLSLTextureGroup type); 127 128 // Adds a prefix to user-defined names to avoid naming clashes. 129 TString Decorate(const ImmutableString &string); 130 TString DecorateVariableIfNeeded(const TVariable &variable); 131 TString DecorateFunctionIfNeeded(const TFunction *func); 132 TString DecorateField(const ImmutableString &string, const TStructure &structure); 133 TString DecoratePrivate(const ImmutableString &privateText); 134 TString TypeString(const TType &type); 135 TString StructNameString(const TStructure &structure); 136 TString QualifiedStructNameString(const TStructure &structure, 137 bool useHLSLRowMajorPacking, 138 bool useStd140Packing, 139 bool forcePackingEnd); 140 const char *InterpolationString(TQualifier qualifier); 141 const char *QualifierString(TQualifier qualifier); 142 // Parameters may need to be included in function names to disambiguate between overloaded 143 // functions. 144 TString DisambiguateFunctionName(const TFunction *func); 145 TString DisambiguateFunctionName(const TIntermSequence *args); 146 } // namespace sh 147 148 #endif // COMPILER_TRANSLATOR_HLSL_UTILSHLSL_H_ 149