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// DynamicHLSL.h: Interface for link and run-time HLSL generation
7//
8
9#ifndef LIBGLESV2_RENDERER_DYNAMIC_HLSL_H_
10#define LIBGLESV2_RENDERER_DYNAMIC_HLSL_H_
11
12#include "common/angleutils.h"
13#include "libGLESv2/constants.h"
14
15#include "angle_gl.h"
16
17#include <vector>
18#include <map>
19
20namespace rx
21{
22class Renderer;
23}
24
25namespace sh
26{
27struct Attribute;
28struct ShaderVariable;
29}
30
31namespace gl
32{
33class InfoLog;
34struct VariableLocation;
35struct LinkedVarying;
36struct VertexAttribute;
37struct VertexFormat;
38struct PackedVarying;
39}
40
41namespace rx
42{
43class Renderer;
44class ShaderD3D;
45
46typedef const gl::PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
47
48struct PixelShaderOutputVariable
49{
50    GLenum type;
51    std::string name;
52    std::string source;
53    size_t outputIndex;
54};
55
56class DynamicHLSL
57{
58  public:
59    explicit DynamicHLSL(rx::Renderer *const renderer);
60
61    int packVaryings(gl::InfoLog &infoLog, VaryingPacking packing, rx::ShaderD3D *fragmentShader,
62                     rx::ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings);
63    std::string generateVertexShaderForInputLayout(const std::string &sourceShader, const gl::VertexFormat inputLayout[],
64                                                   const sh::Attribute shaderAttributes[]) const;
65    std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables,
66                                                      bool usesFragDepth, const std::vector<GLenum> &outputLayout) const;
67    bool generateShaderLinkHLSL(gl::InfoLog &infoLog, int registers, const VaryingPacking packing,
68                                std::string& pixelHLSL, std::string& vertexHLSL,
69                                rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader,
70                                const std::vector<std::string>& transformFeedbackVaryings,
71                                std::vector<gl::LinkedVarying> *linkedVaryings,
72                                std::map<int, gl::VariableLocation> *programOutputVars,
73                                std::vector<PixelShaderOutputVariable> *outPixelShaderKey,
74                                bool *outUsesFragDepth) const;
75
76    std::string generateGeometryShaderHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const;
77    void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
78
79  private:
80    DISALLOW_COPY_AND_ASSIGN(DynamicHLSL);
81
82    rx::Renderer *const mRenderer;
83
84    struct SemanticInfo;
85
86    std::string getVaryingSemantic(bool pointSize) const;
87    SemanticInfo getSemanticInfo(int startRegisters, bool fragCoord, bool pointCoord, bool pointSize,
88                                        bool pixelShader) const;
89    std::string generateVaryingLinkHLSL(const SemanticInfo &info, const std::string &varyingHLSL) const;
90    std::string generateVaryingHLSL(const ShaderD3D *shader) const;
91    void storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader, std::vector<gl::LinkedVarying> *linkedVaryings) const;
92    void storeBuiltinLinkedVaryings(const SemanticInfo &info, std::vector<gl::LinkedVarying> *linkedVaryings) const;
93    void defineOutputVariables(rx::ShaderD3D *fragmentShader, std::map<int, gl::VariableLocation> *programOutputVars) const;
94    std::string generatePointSpriteHLSL(int registers, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader) const;
95
96    // Prepend an underscore
97    static std::string decorateVariable(const std::string &name);
98
99    std::string generateAttributeConversionHLSL(const gl::VertexFormat &vertexFormat, const sh::ShaderVariable &shaderAttrib) const;
100};
101
102}
103
104#endif // LIBGLESV2_RENDERER_DYNAMIC_HLSL_H_
105