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