xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/ShaderD3D.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 
7*8975f5c5SAndroid Build Coastguard Worker // ShaderD3D.h: Defines the rx::ShaderD3D class which implements rx::ShaderImpl.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_SHADERD3D_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_SHADERD3D_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ShaderImpl.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <map>
15*8975f5c5SAndroid Build Coastguard Worker #include <memory>
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace angle
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker struct FeaturesD3D;
20*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace gl
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker struct Extensions;
25*8975f5c5SAndroid Build Coastguard Worker }
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker namespace rx
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker class DynamicHLSL;
30*8975f5c5SAndroid Build Coastguard Worker class RendererD3D;
31*8975f5c5SAndroid Build Coastguard Worker struct D3DUniform;
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker // Workarounds attached to each shader. Do not need to expose information about these workarounds so
34*8975f5c5SAndroid Build Coastguard Worker // a simple bool struct suffices.
35*8975f5c5SAndroid Build Coastguard Worker struct CompilerWorkaroundsD3D
36*8975f5c5SAndroid Build Coastguard Worker {
37*8975f5c5SAndroid Build Coastguard Worker     bool skipOptimization = false;
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     bool useMaxOptimization = false;
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker     // IEEE strictness needs to be enabled for NANs to work.
42*8975f5c5SAndroid Build Coastguard Worker     bool enableIEEEStrictness = false;
43*8975f5c5SAndroid Build Coastguard Worker };
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker enum class FragDepthUsage
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     Unused,
48*8975f5c5SAndroid Build Coastguard Worker     Any,
49*8975f5c5SAndroid Build Coastguard Worker     Greater,
50*8975f5c5SAndroid Build Coastguard Worker     Less
51*8975f5c5SAndroid Build Coastguard Worker };
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker struct CompiledShaderStateD3D : angle::NonCopyable
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker     CompiledShaderStateD3D();
56*8975f5c5SAndroid Build Coastguard Worker     ~CompiledShaderStateD3D();
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker     bool hasUniform(const std::string &name) const;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     // Query regular uniforms with their name. Query sampler fields of structs with field selection
61*8975f5c5SAndroid Build Coastguard Worker     // using dot (.) operator.
62*8975f5c5SAndroid Build Coastguard Worker     unsigned int getUniformRegister(const std::string &uniformName) const;
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     unsigned int getUniformBlockRegister(const std::string &blockName) const;
65*8975f5c5SAndroid Build Coastguard Worker     bool shouldUniformBlockUseStructuredBuffer(const std::string &blockName) const;
66*8975f5c5SAndroid Build Coastguard Worker     unsigned int getShaderStorageBlockRegister(const std::string &blockName) const;
67*8975f5c5SAndroid Build Coastguard Worker     bool useImage2DFunction(const std::string &functionName) const;
68*8975f5c5SAndroid Build Coastguard Worker     const std::set<std::string> &getSlowCompilingUniformBlockSet() const;
appendDebugInfoCompiledShaderStateD3D69*8975f5c5SAndroid Build Coastguard Worker     void appendDebugInfo(const std::string &info) { debugInfo += info; }
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     void generateWorkarounds(CompilerWorkaroundsD3D *workarounds) const;
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     ShShaderOutput compilerOutputType;
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     bool usesMultipleRenderTargets;
76*8975f5c5SAndroid Build Coastguard Worker     bool usesFragColor;
77*8975f5c5SAndroid Build Coastguard Worker     bool usesFragData;
78*8975f5c5SAndroid Build Coastguard Worker     bool usesSecondaryColor;
79*8975f5c5SAndroid Build Coastguard Worker     bool usesFragCoord;
80*8975f5c5SAndroid Build Coastguard Worker     bool usesFrontFacing;
81*8975f5c5SAndroid Build Coastguard Worker     bool usesHelperInvocation;
82*8975f5c5SAndroid Build Coastguard Worker     bool usesPointSize;
83*8975f5c5SAndroid Build Coastguard Worker     bool usesPointCoord;
84*8975f5c5SAndroid Build Coastguard Worker     bool usesDepthRange;
85*8975f5c5SAndroid Build Coastguard Worker     bool usesSampleID;
86*8975f5c5SAndroid Build Coastguard Worker     bool usesSamplePosition;
87*8975f5c5SAndroid Build Coastguard Worker     bool usesSampleMaskIn;
88*8975f5c5SAndroid Build Coastguard Worker     bool usesSampleMask;
89*8975f5c5SAndroid Build Coastguard Worker     bool hasMultiviewEnabled;
90*8975f5c5SAndroid Build Coastguard Worker     bool usesVertexID;
91*8975f5c5SAndroid Build Coastguard Worker     bool usesViewID;
92*8975f5c5SAndroid Build Coastguard Worker     bool usesDiscardRewriting;
93*8975f5c5SAndroid Build Coastguard Worker     bool usesNestedBreak;
94*8975f5c5SAndroid Build Coastguard Worker     bool requiresIEEEStrictCompiling;
95*8975f5c5SAndroid Build Coastguard Worker     FragDepthUsage fragDepthUsage;
96*8975f5c5SAndroid Build Coastguard Worker     uint8_t clipDistanceSize;
97*8975f5c5SAndroid Build Coastguard Worker     uint8_t cullDistanceSize;
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker     std::string debugInfo;
100*8975f5c5SAndroid Build Coastguard Worker     std::map<std::string, unsigned int> uniformRegisterMap;
101*8975f5c5SAndroid Build Coastguard Worker     std::map<std::string, unsigned int> uniformBlockRegisterMap;
102*8975f5c5SAndroid Build Coastguard Worker     std::map<std::string, bool> uniformBlockUseStructuredBufferMap;
103*8975f5c5SAndroid Build Coastguard Worker     std::set<std::string> slowCompilingUniformBlockSet;
104*8975f5c5SAndroid Build Coastguard Worker     std::map<std::string, unsigned int> shaderStorageBlockRegisterMap;
105*8975f5c5SAndroid Build Coastguard Worker     unsigned int readonlyImage2DRegisterIndex;
106*8975f5c5SAndroid Build Coastguard Worker     unsigned int image2DRegisterIndex;
107*8975f5c5SAndroid Build Coastguard Worker     std::set<std::string> usedImage2DFunctionNames;
108*8975f5c5SAndroid Build Coastguard Worker };
109*8975f5c5SAndroid Build Coastguard Worker using SharedCompiledShaderStateD3D = std::shared_ptr<CompiledShaderStateD3D>;
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker class ShaderD3D : public ShaderImpl
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker   public:
114*8975f5c5SAndroid Build Coastguard Worker     ShaderD3D(const gl::ShaderState &state, RendererD3D *renderer);
115*8975f5c5SAndroid Build Coastguard Worker     ~ShaderD3D() override;
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<ShaderTranslateTask> compile(const gl::Context *context,
118*8975f5c5SAndroid Build Coastguard Worker                                                  ShCompileOptions *options) override;
119*8975f5c5SAndroid Build Coastguard Worker     std::shared_ptr<ShaderTranslateTask> load(const gl::Context *context,
120*8975f5c5SAndroid Build Coastguard Worker                                               gl::BinaryInputStream *stream) override;
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker     std::string getDebugInfo() const override;
123*8975f5c5SAndroid Build Coastguard Worker 
getCompiledState()124*8975f5c5SAndroid Build Coastguard Worker     const SharedCompiledShaderStateD3D &getCompiledState() const { return mCompiledState; }
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker   private:
127*8975f5c5SAndroid Build Coastguard Worker     RendererD3D *mRenderer;
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker     SharedCompiledShaderStateD3D mCompiledState;
130*8975f5c5SAndroid Build Coastguard Worker };
131*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_D3D_SHADERD3D_H_
134