xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/DynamicHLSL.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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