Home | History | Annotate | Download | only in translator
      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.cpp:
      7 //   Utility methods for GLSL to HLSL translation.
      8 //
      9 
     10 #include "compiler/translator/UtilsHLSL.h"
     11 #include "compiler/translator/StructureHLSL.h"
     12 #include "compiler/translator/SymbolTable.h"
     13 
     14 namespace sh
     15 {
     16 
     17 TString SamplerString(const TType &type)
     18 {
     19     if (IsShadowSampler(type.getBasicType()))
     20     {
     21         return "SamplerComparisonState";
     22     }
     23     else
     24     {
     25         return "SamplerState";
     26     }
     27 }
     28 
     29 TString TextureString(const TType &type)
     30 {
     31     switch (type.getBasicType())
     32     {
     33       case EbtSampler2D:            return "Texture2D";
     34       case EbtSamplerCube:          return "TextureCube";
     35       case EbtSamplerExternalOES:   return "Texture2D";
     36       case EbtSampler2DArray:       return "Texture2DArray";
     37       case EbtSampler3D:            return "Texture3D";
     38       case EbtISampler2D:           return "Texture2D<int4>";
     39       case EbtISampler3D:           return "Texture3D<int4>";
     40       case EbtISamplerCube:         return "Texture2DArray<int4>";
     41       case EbtISampler2DArray:      return "Texture2DArray<int4>";
     42       case EbtUSampler2D:           return "Texture2D<uint4>";
     43       case EbtUSampler3D:           return "Texture3D<uint4>";
     44       case EbtUSamplerCube:         return "Texture2DArray<uint4>";
     45       case EbtUSampler2DArray:      return "Texture2DArray<uint4>";
     46       case EbtSampler2DShadow:      return "Texture2D";
     47       case EbtSamplerCubeShadow:    return "TextureCube";
     48       case EbtSampler2DArrayShadow: return "Texture2DArray";
     49       default: UNREACHABLE();
     50     }
     51 
     52     return "<unknown texture type>";
     53 }
     54 
     55 TString DecorateUniform(const TString &string, const TType &type)
     56 {
     57     if (type.getBasicType() == EbtSamplerExternalOES)
     58     {
     59         return "ex_" + string;
     60     }
     61 
     62     return Decorate(string);
     63 }
     64 
     65 TString DecorateField(const TString &string, const TStructure &structure)
     66 {
     67     if (structure.name().compare(0, 3, "gl_") != 0)
     68     {
     69         return Decorate(string);
     70     }
     71 
     72     return string;
     73 }
     74 
     75 TString DecoratePrivate(const TString &privateText)
     76 {
     77     return "dx_" + privateText;
     78 }
     79 
     80 TString Decorate(const TString &string)
     81 {
     82     if (string.compare(0, 3, "gl_") != 0)
     83     {
     84         return "_" + string;
     85     }
     86 
     87     return string;
     88 }
     89 
     90 TString TypeString(const TType &type)
     91 {
     92     const TStructure* structure = type.getStruct();
     93     if (structure)
     94     {
     95         const TString& typeName = structure->name();
     96         if (typeName != "")
     97         {
     98             return StructNameString(*structure);
     99         }
    100         else   // Nameless structure, define in place
    101         {
    102             return StructureHLSL::defineNameless(*structure);
    103         }
    104     }
    105     else if (type.isMatrix())
    106     {
    107         int cols = type.getCols();
    108         int rows = type.getRows();
    109         return "float" + str(cols) + "x" + str(rows);
    110     }
    111     else
    112     {
    113         switch (type.getBasicType())
    114         {
    115           case EbtFloat:
    116             switch (type.getNominalSize())
    117             {
    118               case 1: return "float";
    119               case 2: return "float2";
    120               case 3: return "float3";
    121               case 4: return "float4";
    122             }
    123           case EbtInt:
    124             switch (type.getNominalSize())
    125             {
    126               case 1: return "int";
    127               case 2: return "int2";
    128               case 3: return "int3";
    129               case 4: return "int4";
    130             }
    131           case EbtUInt:
    132             switch (type.getNominalSize())
    133             {
    134               case 1: return "uint";
    135               case 2: return "uint2";
    136               case 3: return "uint3";
    137               case 4: return "uint4";
    138             }
    139           case EbtBool:
    140             switch (type.getNominalSize())
    141             {
    142               case 1: return "bool";
    143               case 2: return "bool2";
    144               case 3: return "bool3";
    145               case 4: return "bool4";
    146             }
    147           case EbtVoid:
    148             return "void";
    149           case EbtSampler2D:
    150           case EbtISampler2D:
    151           case EbtUSampler2D:
    152           case EbtSampler2DArray:
    153           case EbtISampler2DArray:
    154           case EbtUSampler2DArray:
    155             return "sampler2D";
    156           case EbtSamplerCube:
    157           case EbtISamplerCube:
    158           case EbtUSamplerCube:
    159             return "samplerCUBE";
    160           case EbtSamplerExternalOES:
    161             return "sampler2D";
    162           default:
    163             break;
    164         }
    165     }
    166 
    167     UNREACHABLE();
    168     return "<unknown type>";
    169 }
    170 
    171 TString StructNameString(const TStructure &structure)
    172 {
    173     if (structure.name().empty())
    174     {
    175         return "";
    176     }
    177 
    178     return "ss" + str(structure.uniqueId()) + "_" + structure.name();
    179 }
    180 
    181 TString QualifiedStructNameString(const TStructure &structure, bool useHLSLRowMajorPacking,
    182                                   bool useStd140Packing)
    183 {
    184     if (structure.name() == "")
    185     {
    186         return "";
    187     }
    188 
    189     TString prefix = "";
    190 
    191     // Structs packed with row-major matrices in HLSL are prefixed with "rm"
    192     // GLSL column-major maps to HLSL row-major, and the converse is true
    193 
    194     if (useStd140Packing)
    195     {
    196         prefix += "std_";
    197     }
    198 
    199     if (useHLSLRowMajorPacking)
    200     {
    201         prefix += "rm_";
    202     }
    203 
    204     return prefix + StructNameString(structure);
    205 }
    206 
    207 TString InterpolationString(TQualifier qualifier)
    208 {
    209     switch (qualifier)
    210     {
    211       case EvqVaryingIn:           return "";
    212       case EvqFragmentIn:          return "";
    213       case EvqInvariantVaryingIn:  return "";
    214       case EvqSmoothIn:            return "linear";
    215       case EvqFlatIn:              return "nointerpolation";
    216       case EvqCentroidIn:          return "centroid";
    217       case EvqVaryingOut:          return "";
    218       case EvqVertexOut:           return "";
    219       case EvqInvariantVaryingOut: return "";
    220       case EvqSmoothOut:           return "linear";
    221       case EvqFlatOut:             return "nointerpolation";
    222       case EvqCentroidOut:         return "centroid";
    223       default: UNREACHABLE();
    224     }
    225 
    226     return "";
    227 }
    228 
    229 TString QualifierString(TQualifier qualifier)
    230 {
    231     switch (qualifier)
    232     {
    233       case EvqIn:            return "in";
    234       case EvqOut:           return "inout"; // 'out' results in an HLSL error if not all fields are written, for GLSL it's undefined
    235       case EvqInOut:         return "inout";
    236       case EvqConstReadOnly: return "const";
    237       default: UNREACHABLE();
    238     }
    239 
    240     return "";
    241 }
    242 
    243 }
    244