tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DynamicHLSL.h (7229B)


      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 // DynamicHLSL.h: Interface for link and run-time HLSL generation
      7 //
      8 
      9 #ifndef LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
     10 #define LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
     11 
     12 #include <map>
     13 #include <vector>
     14 
     15 #include "angle_gl.h"
     16 #include "common/angleutils.h"
     17 #include "libANGLE/Constants.h"
     18 #include "libANGLE/Program.h"
     19 #include "libANGLE/angletypes.h"
     20 #include "libANGLE/formatutils.h"
     21 #include "libANGLE/renderer/d3d/DynamicImage2DHLSL.h"
     22 #include "libANGLE/renderer/d3d/RendererD3D.h"
     23 
     24 namespace sh
     25 {
     26 struct ShaderVariable;
     27 }  // namespace sh
     28 
     29 namespace gl
     30 {
     31 class InfoLog;
     32 struct VariableLocation;
     33 class VaryingPacking;
     34 struct VertexAttribute;
     35 }  // namespace gl
     36 
     37 namespace rx
     38 {
     39 class ProgramD3DMetadata;
     40 class ShaderD3D;
     41 struct ShaderStorageBlock;
     42 
     43 // This class needs to match OutputHLSL::decorate
     44 class DecorateVariable final : angle::NonCopyable
     45 {
     46  public:
     47    explicit DecorateVariable(const std::string &str) : mName(str) {}
     48    const std::string &getName() const { return mName; }
     49 
     50  private:
     51    const std::string &mName;
     52 };
     53 
     54 inline std::ostream &operator<<(std::ostream &o, const DecorateVariable &dv)
     55 {
     56    if (dv.getName().compare(0, 3, "gl_") != 0)
     57    {
     58        o << "_";
     59    }
     60    o << dv.getName();
     61    return o;
     62 }
     63 
     64 struct PixelShaderOutputVariable
     65 {
     66    PixelShaderOutputVariable() {}
     67    PixelShaderOutputVariable(GLenum typeIn,
     68                              const std::string &nameIn,
     69                              const std::string &sourceIn,
     70                              size_t outputLocationIn,
     71                              size_t outputIndexIn)
     72        : type(typeIn),
     73          name(nameIn),
     74          source(sourceIn),
     75          outputLocation(outputLocationIn),
     76          outputIndex(outputIndexIn)
     77    {}
     78 
     79    GLenum type = GL_NONE;
     80    std::string name;
     81    std::string source;
     82    size_t outputLocation = 0;
     83    size_t outputIndex    = 0;
     84 };
     85 
     86 struct BuiltinVarying final : private angle::NonCopyable
     87 {
     88    BuiltinVarying();
     89 
     90    std::string str() const;
     91    void enableSystem(const std::string &systemValueSemantic);
     92    void enable(const std::string &semanticVal, unsigned int indexVal);
     93 
     94    bool enabled;
     95    std::string semantic;
     96    unsigned int index;
     97    bool systemValue;
     98 };
     99 
    100 struct BuiltinInfo
    101 {
    102    BuiltinInfo();
    103    ~BuiltinInfo();
    104 
    105    BuiltinVarying dxPosition;
    106    BuiltinVarying glPosition;
    107    BuiltinVarying glFragCoord;
    108    BuiltinVarying glPointCoord;
    109    BuiltinVarying glPointSize;
    110    BuiltinVarying glViewIDOVR;
    111    BuiltinVarying glViewportIndex;
    112    BuiltinVarying glLayer;
    113 };
    114 
    115 inline std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize)
    116 {
    117    // SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
    118    // In D3D11 we manually compute gl_PointCoord in the GS.
    119    return ((programUsesPointSize && majorShaderModel < 4) ? "COLOR" : "TEXCOORD");
    120 }
    121 
    122 class BuiltinVaryingsD3D
    123 {
    124  public:
    125    BuiltinVaryingsD3D(const ProgramD3DMetadata &metadata, const gl::VaryingPacking &packing);
    126    ~BuiltinVaryingsD3D();
    127 
    128    bool usesPointSize() const { return mBuiltinInfo[gl::ShaderType::Vertex].glPointSize.enabled; }
    129 
    130    const BuiltinInfo &operator[](gl::ShaderType shaderType) const
    131    {
    132        return mBuiltinInfo[shaderType];
    133    }
    134    BuiltinInfo &operator[](gl::ShaderType shaderType) { return mBuiltinInfo[shaderType]; }
    135 
    136  private:
    137    void updateBuiltins(gl::ShaderType shaderType,
    138                        const ProgramD3DMetadata &metadata,
    139                        const gl::VaryingPacking &packing);
    140 
    141    gl::ShaderMap<BuiltinInfo> mBuiltinInfo;
    142 };
    143 
    144 class DynamicHLSL : angle::NonCopyable
    145 {
    146  public:
    147    explicit DynamicHLSL(RendererD3D *const renderer);
    148 
    149    std::string generateVertexShaderForInputLayout(
    150        const std::string &sourceShader,
    151        const gl::InputLayout &inputLayout,
    152        const std::vector<sh::ShaderVariable> &shaderAttributes,
    153        const std::vector<rx::ShaderStorageBlock> &shaderStorageBlocks,
    154        size_t baseUAVRegister) const;
    155    std::string generatePixelShaderForOutputSignature(
    156        const std::string &sourceShader,
    157        const std::vector<PixelShaderOutputVariable> &outputVariables,
    158        bool usesFragDepth,
    159        const std::vector<GLenum> &outputLayout,
    160        const std::vector<rx::ShaderStorageBlock> &shaderStorageBlocks,
    161        size_t baseUAVRegister) const;
    162    std::string generateShaderForImage2DBindSignature(
    163        ProgramD3D &programD3D,
    164        const gl::ProgramState &programData,
    165        gl::ShaderType shaderType,
    166        const std::string &shaderHLSL,
    167        std::vector<sh::ShaderVariable> &image2DUniforms,
    168        const gl::ImageUnitTextureTypeMap &image2DBindLayout,
    169        unsigned int baseUAVRegister) const;
    170    void generateShaderLinkHLSL(const gl::Context *context,
    171                                const gl::Caps &caps,
    172                                const gl::ProgramState &programData,
    173                                const ProgramD3DMetadata &programMetadata,
    174                                const gl::VaryingPacking &varyingPacking,
    175                                const BuiltinVaryingsD3D &builtinsD3D,
    176                                gl::ShaderMap<std::string> *shaderHLSL) const;
    177 
    178    std::string generateGeometryShaderPreamble(const gl::VaryingPacking &varyingPacking,
    179                                               const BuiltinVaryingsD3D &builtinsD3D,
    180                                               const bool hasANGLEMultiviewEnabled,
    181                                               const bool selectViewInVS) const;
    182 
    183    std::string generateGeometryShaderHLSL(const gl::Caps &caps,
    184                                           gl::PrimitiveMode primitiveType,
    185                                           const gl::ProgramState &programData,
    186                                           const bool useViewScale,
    187                                           const bool hasANGLEMultiviewEnabled,
    188                                           const bool selectViewInVS,
    189                                           const bool pointSpriteEmulation,
    190                                           const std::string &preambleString) const;
    191 
    192    void getPixelShaderOutputKey(const gl::State &data,
    193                                 const gl::ProgramState &programData,
    194                                 const ProgramD3DMetadata &metadata,
    195                                 std::vector<PixelShaderOutputVariable> *outPixelShaderKey);
    196 
    197  private:
    198    RendererD3D *const mRenderer;
    199 
    200    void generateVaryingLinkHLSL(const gl::VaryingPacking &varyingPacking,
    201                                 const BuiltinInfo &builtins,
    202                                 bool programUsesPointSize,
    203                                 std::ostringstream &hlslStream) const;
    204 
    205    static void GenerateAttributeConversionHLSL(angle::FormatID vertexFormatID,
    206                                                const sh::ShaderVariable &shaderAttrib,
    207                                                std::ostringstream &outStream);
    208 };
    209 
    210 }  // namespace rx
    211 
    212 #endif  // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_