xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/ProgramExecutableD3D.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 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 // ProgramExecutableD3D.h: Implementation of ProgramExecutableImpl.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_PROGRAMEXECUTABLED3D_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_PROGRAMEXECUTABLED3D_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/hlsl/blocklayoutHLSL.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ProgramExecutable.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ProgramExecutableImpl.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/DynamicHLSL.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker class RendererD3D;
21*8975f5c5SAndroid Build Coastguard Worker class UniformStorageD3D;
22*8975f5c5SAndroid Build Coastguard Worker class ShaderExecutableD3D;
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker #if !defined(ANGLE_COMPILE_OPTIMIZATION_LEVEL)
25*8975f5c5SAndroid Build Coastguard Worker // WARNING: D3DCOMPILE_OPTIMIZATION_LEVEL3 may lead to a DX9 shader compiler hang.
26*8975f5c5SAndroid Build Coastguard Worker // It should only be used selectively to work around specific bugs.
27*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_COMPILE_OPTIMIZATION_LEVEL D3DCOMPILE_OPTIMIZATION_LEVEL1
28*8975f5c5SAndroid Build Coastguard Worker #endif
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker enum class HLSLRegisterType : uint8_t
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker     None                = 0,
33*8975f5c5SAndroid Build Coastguard Worker     Texture             = 1,
34*8975f5c5SAndroid Build Coastguard Worker     UnorderedAccessView = 2
35*8975f5c5SAndroid Build Coastguard Worker };
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker // Helper struct representing a single shader uniform
38*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Make uniform blocks shared between all programs, so we don't need separate
39*8975f5c5SAndroid Build Coastguard Worker // register indices.
40*8975f5c5SAndroid Build Coastguard Worker struct D3DUniform : private angle::NonCopyable
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker     D3DUniform(GLenum type,
43*8975f5c5SAndroid Build Coastguard Worker                HLSLRegisterType reg,
44*8975f5c5SAndroid Build Coastguard Worker                const std::string &nameIn,
45*8975f5c5SAndroid Build Coastguard Worker                const std::vector<unsigned int> &arraySizesIn,
46*8975f5c5SAndroid Build Coastguard Worker                bool defaultBlock);
47*8975f5c5SAndroid Build Coastguard Worker     ~D3DUniform();
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     bool isSampler() const;
50*8975f5c5SAndroid Build Coastguard Worker     bool isImage() const;
51*8975f5c5SAndroid Build Coastguard Worker     bool isImage2D() const;
isArrayD3DUniform52*8975f5c5SAndroid Build Coastguard Worker     bool isArray() const { return !arraySizes.empty(); }
53*8975f5c5SAndroid Build Coastguard Worker     unsigned int getArraySizeProduct() const;
54*8975f5c5SAndroid Build Coastguard Worker     bool isReferencedByShader(gl::ShaderType shaderType) const;
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     const uint8_t *firstNonNullData() const;
57*8975f5c5SAndroid Build Coastguard Worker     const uint8_t *getDataPtrToElement(size_t elementIndex) const;
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     // Duplicated from the GL layer
60*8975f5c5SAndroid Build Coastguard Worker     const gl::UniformTypeInfo &typeInfo;
61*8975f5c5SAndroid Build Coastguard Worker     std::string name;  // Names of arrays don't include [0], unlike at the GL layer.
62*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned int> arraySizes;
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     // Pointer to a system copies of the data. Separate pointers for each uniform storage type.
65*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<uint8_t *> mShaderData;
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     // Register information.
68*8975f5c5SAndroid Build Coastguard Worker     HLSLRegisterType regType;
69*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<unsigned int> mShaderRegisterIndexes;
70*8975f5c5SAndroid Build Coastguard Worker     unsigned int registerCount;
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     // Register "elements" are used for uniform structs in ES3, to appropriately identify single
73*8975f5c5SAndroid Build Coastguard Worker     // uniforms
74*8975f5c5SAndroid Build Coastguard Worker     // inside aggregate types, which are packed according C-like structure rules.
75*8975f5c5SAndroid Build Coastguard Worker     unsigned int registerElement;
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     // Special buffer for sampler values.
78*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLint> mSamplerData;
79*8975f5c5SAndroid Build Coastguard Worker };
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker struct D3DInterfaceBlock
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker     D3DInterfaceBlock();
84*8975f5c5SAndroid Build Coastguard Worker     D3DInterfaceBlock(const D3DInterfaceBlock &other);
85*8975f5c5SAndroid Build Coastguard Worker 
activeInShaderD3DInterfaceBlock86*8975f5c5SAndroid Build Coastguard Worker     bool activeInShader(gl::ShaderType shaderType) const
87*8975f5c5SAndroid Build Coastguard Worker     {
88*8975f5c5SAndroid Build Coastguard Worker         return mShaderRegisterIndexes[shaderType] != GL_INVALID_INDEX;
89*8975f5c5SAndroid Build Coastguard Worker     }
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<unsigned int> mShaderRegisterIndexes;
92*8975f5c5SAndroid Build Coastguard Worker };
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker struct D3DUniformBlock : D3DInterfaceBlock
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     D3DUniformBlock();
97*8975f5c5SAndroid Build Coastguard Worker     D3DUniformBlock(const D3DUniformBlock &other);
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<bool> mUseStructuredBuffers;
100*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<unsigned int> mByteWidths;
101*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<unsigned int> mStructureByteStrides;
102*8975f5c5SAndroid Build Coastguard Worker };
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker struct ShaderStorageBlock
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker     std::string name;
107*8975f5c5SAndroid Build Coastguard Worker     unsigned int arraySize     = 0;
108*8975f5c5SAndroid Build Coastguard Worker     unsigned int registerIndex = 0;
109*8975f5c5SAndroid Build Coastguard Worker };
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker struct D3DUBOCache
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     unsigned int registerIndex;
114*8975f5c5SAndroid Build Coastguard Worker     int binding;
115*8975f5c5SAndroid Build Coastguard Worker };
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker struct D3DUBOCacheUseSB : D3DUBOCache
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker     unsigned int byteWidth;
120*8975f5c5SAndroid Build Coastguard Worker     unsigned int structureByteStride;
121*8975f5c5SAndroid Build Coastguard Worker };
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker struct D3DVarying final
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     D3DVarying();
126*8975f5c5SAndroid Build Coastguard Worker     D3DVarying(const std::string &semanticNameIn,
127*8975f5c5SAndroid Build Coastguard Worker                unsigned int semanticIndexIn,
128*8975f5c5SAndroid Build Coastguard Worker                unsigned int componentCountIn,
129*8975f5c5SAndroid Build Coastguard Worker                unsigned int outputSlotIn);
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker     D3DVarying(const D3DVarying &)            = default;
132*8975f5c5SAndroid Build Coastguard Worker     D3DVarying &operator=(const D3DVarying &) = default;
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker     std::string semanticName;
135*8975f5c5SAndroid Build Coastguard Worker     unsigned int semanticIndex;
136*8975f5c5SAndroid Build Coastguard Worker     unsigned int componentCount;
137*8975f5c5SAndroid Build Coastguard Worker     unsigned int outputSlot;
138*8975f5c5SAndroid Build Coastguard Worker };
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker using D3DUniformMap = std::map<std::string, D3DUniform *>;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker class D3DVertexExecutable
143*8975f5c5SAndroid Build Coastguard Worker {
144*8975f5c5SAndroid Build Coastguard Worker   public:
145*8975f5c5SAndroid Build Coastguard Worker     enum HLSLAttribType
146*8975f5c5SAndroid Build Coastguard Worker     {
147*8975f5c5SAndroid Build Coastguard Worker         FLOAT,
148*8975f5c5SAndroid Build Coastguard Worker         UNSIGNED_INT,
149*8975f5c5SAndroid Build Coastguard Worker         SIGNED_INT,
150*8975f5c5SAndroid Build Coastguard Worker     };
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     typedef std::vector<HLSLAttribType> Signature;
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker     D3DVertexExecutable(const gl::InputLayout &inputLayout,
155*8975f5c5SAndroid Build Coastguard Worker                         const Signature &signature,
156*8975f5c5SAndroid Build Coastguard Worker                         ShaderExecutableD3D *shaderExecutable);
157*8975f5c5SAndroid Build Coastguard Worker     ~D3DVertexExecutable();
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker     bool matchesSignature(const Signature &signature) const;
160*8975f5c5SAndroid Build Coastguard Worker     static void getSignature(RendererD3D *renderer,
161*8975f5c5SAndroid Build Coastguard Worker                              const gl::InputLayout &inputLayout,
162*8975f5c5SAndroid Build Coastguard Worker                              Signature *signatureOut);
163*8975f5c5SAndroid Build Coastguard Worker 
inputs()164*8975f5c5SAndroid Build Coastguard Worker     const gl::InputLayout &inputs() const { return mInputs; }
signature()165*8975f5c5SAndroid Build Coastguard Worker     const Signature &signature() const { return mSignature; }
shaderExecutable()166*8975f5c5SAndroid Build Coastguard Worker     ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; }
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker   private:
169*8975f5c5SAndroid Build Coastguard Worker     static HLSLAttribType GetAttribType(GLenum type);
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker     gl::InputLayout mInputs;
172*8975f5c5SAndroid Build Coastguard Worker     Signature mSignature;
173*8975f5c5SAndroid Build Coastguard Worker     ShaderExecutableD3D *mShaderExecutable;
174*8975f5c5SAndroid Build Coastguard Worker };
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker class D3DPixelExecutable
177*8975f5c5SAndroid Build Coastguard Worker {
178*8975f5c5SAndroid Build Coastguard Worker   public:
179*8975f5c5SAndroid Build Coastguard Worker     D3DPixelExecutable(const std::vector<GLenum> &outputSignature,
180*8975f5c5SAndroid Build Coastguard Worker                        const gl::ImageUnitTextureTypeMap &image2DSignature,
181*8975f5c5SAndroid Build Coastguard Worker                        ShaderExecutableD3D *shaderExecutable);
182*8975f5c5SAndroid Build Coastguard Worker     ~D3DPixelExecutable();
183*8975f5c5SAndroid Build Coastguard Worker 
matchesSignature(const std::vector<GLenum> & outputSignature,const gl::ImageUnitTextureTypeMap & image2DSignature)184*8975f5c5SAndroid Build Coastguard Worker     bool matchesSignature(const std::vector<GLenum> &outputSignature,
185*8975f5c5SAndroid Build Coastguard Worker                           const gl::ImageUnitTextureTypeMap &image2DSignature) const
186*8975f5c5SAndroid Build Coastguard Worker     {
187*8975f5c5SAndroid Build Coastguard Worker         return mOutputSignature == outputSignature && mImage2DSignature == image2DSignature;
188*8975f5c5SAndroid Build Coastguard Worker     }
189*8975f5c5SAndroid Build Coastguard Worker 
outputSignature()190*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLenum> &outputSignature() const { return mOutputSignature; }
191*8975f5c5SAndroid Build Coastguard Worker 
image2DSignature()192*8975f5c5SAndroid Build Coastguard Worker     const gl::ImageUnitTextureTypeMap &image2DSignature() const { return mImage2DSignature; }
193*8975f5c5SAndroid Build Coastguard Worker 
shaderExecutable()194*8975f5c5SAndroid Build Coastguard Worker     ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable; }
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker   private:
197*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLenum> mOutputSignature;
198*8975f5c5SAndroid Build Coastguard Worker     const gl::ImageUnitTextureTypeMap mImage2DSignature;
199*8975f5c5SAndroid Build Coastguard Worker     ShaderExecutableD3D *mShaderExecutable;
200*8975f5c5SAndroid Build Coastguard Worker };
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker class D3DComputeExecutable
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker   public:
205*8975f5c5SAndroid Build Coastguard Worker     D3DComputeExecutable(const gl::ImageUnitTextureTypeMap &signature,
206*8975f5c5SAndroid Build Coastguard Worker                          std::unique_ptr<ShaderExecutableD3D> shaderExecutable);
207*8975f5c5SAndroid Build Coastguard Worker     ~D3DComputeExecutable();
208*8975f5c5SAndroid Build Coastguard Worker 
matchesSignature(const gl::ImageUnitTextureTypeMap & signature)209*8975f5c5SAndroid Build Coastguard Worker     bool matchesSignature(const gl::ImageUnitTextureTypeMap &signature) const
210*8975f5c5SAndroid Build Coastguard Worker     {
211*8975f5c5SAndroid Build Coastguard Worker         return mSignature == signature;
212*8975f5c5SAndroid Build Coastguard Worker     }
213*8975f5c5SAndroid Build Coastguard Worker 
signature()214*8975f5c5SAndroid Build Coastguard Worker     const gl::ImageUnitTextureTypeMap &signature() const { return mSignature; }
shaderExecutable()215*8975f5c5SAndroid Build Coastguard Worker     ShaderExecutableD3D *shaderExecutable() const { return mShaderExecutable.get(); }
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker   private:
218*8975f5c5SAndroid Build Coastguard Worker     gl::ImageUnitTextureTypeMap mSignature;
219*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<ShaderExecutableD3D> mShaderExecutable;
220*8975f5c5SAndroid Build Coastguard Worker };
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker struct D3DSampler
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker     D3DSampler();
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker     bool active;
227*8975f5c5SAndroid Build Coastguard Worker     GLint logicalTextureUnit;
228*8975f5c5SAndroid Build Coastguard Worker     gl::TextureType textureType;
229*8975f5c5SAndroid Build Coastguard Worker };
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker struct D3DImage
232*8975f5c5SAndroid Build Coastguard Worker {
233*8975f5c5SAndroid Build Coastguard Worker     D3DImage();
234*8975f5c5SAndroid Build Coastguard Worker     bool active;
235*8975f5c5SAndroid Build Coastguard Worker     GLint logicalImageUnit;
236*8975f5c5SAndroid Build Coastguard Worker };
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutableD3D : public ProgramExecutableImpl
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker   public:
241*8975f5c5SAndroid Build Coastguard Worker     ProgramExecutableD3D(const gl::ProgramExecutable *executable);
242*8975f5c5SAndroid Build Coastguard Worker     ~ProgramExecutableD3D() override;
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;
247*8975f5c5SAndroid Build Coastguard Worker     void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) override;
248*8975f5c5SAndroid Build Coastguard Worker     void setUniform3fv(GLint location, GLsizei count, const GLfloat *v) override;
249*8975f5c5SAndroid Build Coastguard Worker     void setUniform4fv(GLint location, GLsizei count, const GLfloat *v) override;
250*8975f5c5SAndroid Build Coastguard Worker     void setUniform1iv(GLint location, GLsizei count, const GLint *v) override;
251*8975f5c5SAndroid Build Coastguard Worker     void setUniform2iv(GLint location, GLsizei count, const GLint *v) override;
252*8975f5c5SAndroid Build Coastguard Worker     void setUniform3iv(GLint location, GLsizei count, const GLint *v) override;
253*8975f5c5SAndroid Build Coastguard Worker     void setUniform4iv(GLint location, GLsizei count, const GLint *v) override;
254*8975f5c5SAndroid Build Coastguard Worker     void setUniform1uiv(GLint location, GLsizei count, const GLuint *v) override;
255*8975f5c5SAndroid Build Coastguard Worker     void setUniform2uiv(GLint location, GLsizei count, const GLuint *v) override;
256*8975f5c5SAndroid Build Coastguard Worker     void setUniform3uiv(GLint location, GLsizei count, const GLuint *v) override;
257*8975f5c5SAndroid Build Coastguard Worker     void setUniform4uiv(GLint location, GLsizei count, const GLuint *v) override;
258*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2fv(GLint location,
259*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
260*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
261*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
262*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3fv(GLint location,
263*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
264*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
265*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
266*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4fv(GLint location,
267*8975f5c5SAndroid Build Coastguard Worker                              GLsizei count,
268*8975f5c5SAndroid Build Coastguard Worker                              GLboolean transpose,
269*8975f5c5SAndroid Build Coastguard Worker                              const GLfloat *value) override;
270*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2x3fv(GLint location,
271*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
272*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
273*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
274*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3x2fv(GLint location,
275*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
276*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
277*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
278*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix2x4fv(GLint location,
279*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
280*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
281*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
282*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4x2fv(GLint location,
283*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
284*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
285*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
286*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix3x4fv(GLint location,
287*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
288*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
289*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
290*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrix4x3fv(GLint location,
291*8975f5c5SAndroid Build Coastguard Worker                                GLsizei count,
292*8975f5c5SAndroid Build Coastguard Worker                                GLboolean transpose,
293*8975f5c5SAndroid Build Coastguard Worker                                const GLfloat *value) override;
294*8975f5c5SAndroid Build Coastguard Worker 
295*8975f5c5SAndroid Build Coastguard Worker     void getUniformfv(const gl::Context *context, GLint location, GLfloat *params) const override;
296*8975f5c5SAndroid Build Coastguard Worker     void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override;
297*8975f5c5SAndroid Build Coastguard Worker     void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override;
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker     void updateCachedInputLayoutFromShader(RendererD3D *renderer,
300*8975f5c5SAndroid Build Coastguard Worker                                            const gl::SharedCompiledShaderState &vertexShader);
301*8975f5c5SAndroid Build Coastguard Worker     void updateCachedOutputLayoutFromShader();
302*8975f5c5SAndroid Build Coastguard Worker     void updateCachedImage2DBindLayoutFromShader(gl::ShaderType shaderType);
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker     void updateCachedInputLayout(RendererD3D *renderer,
305*8975f5c5SAndroid Build Coastguard Worker                                  UniqueSerial associatedSerial,
306*8975f5c5SAndroid Build Coastguard Worker                                  const gl::State &state);
307*8975f5c5SAndroid Build Coastguard Worker     void updateCachedOutputLayout(const gl::Context *context, const gl::Framebuffer *framebuffer);
308*8975f5c5SAndroid Build Coastguard Worker     void updateCachedImage2DBindLayout(const gl::Context *context, const gl::ShaderType shaderType);
309*8975f5c5SAndroid Build Coastguard Worker     void updateUniformBufferCache(const gl::Caps &caps);
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker     // Checks if we need to recompile certain shaders.
312*8975f5c5SAndroid Build Coastguard Worker     bool hasVertexExecutableForCachedInputLayout();
313*8975f5c5SAndroid Build Coastguard Worker     bool hasGeometryExecutableForPrimitiveType(RendererD3D *renderer,
314*8975f5c5SAndroid Build Coastguard Worker                                                const gl::State &state,
315*8975f5c5SAndroid Build Coastguard Worker                                                gl::PrimitiveMode drawMode);
316*8975f5c5SAndroid Build Coastguard Worker     bool hasPixelExecutableForCachedOutputLayout();
317*8975f5c5SAndroid Build Coastguard Worker     bool hasComputeExecutableForCachedImage2DBindLayout();
318*8975f5c5SAndroid Build Coastguard Worker 
anyShaderUniformsDirty()319*8975f5c5SAndroid Build Coastguard Worker     bool anyShaderUniformsDirty() const { return mShaderUniformsDirty.any(); }
areShaderUniformsDirty(gl::ShaderType shaderType)320*8975f5c5SAndroid Build Coastguard Worker     bool areShaderUniformsDirty(gl::ShaderType shaderType) const
321*8975f5c5SAndroid Build Coastguard Worker     {
322*8975f5c5SAndroid Build Coastguard Worker         return mShaderUniformsDirty[shaderType];
323*8975f5c5SAndroid Build Coastguard Worker     }
324*8975f5c5SAndroid Build Coastguard Worker     void dirtyAllUniforms();
325*8975f5c5SAndroid Build Coastguard Worker     void markUniformsClean();
326*8975f5c5SAndroid Build Coastguard Worker 
getPixelShaderKey()327*8975f5c5SAndroid Build Coastguard Worker     const std::vector<PixelShaderOutputVariable> &getPixelShaderKey() { return mPixelShaderKey; }
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     void assignImage2DRegisters(gl::ShaderType shaderType,
330*8975f5c5SAndroid Build Coastguard Worker                                 unsigned int startImageIndex,
331*8975f5c5SAndroid Build Coastguard Worker                                 int startLogicalImageUnit,
332*8975f5c5SAndroid Build Coastguard Worker                                 bool readonly);
333*8975f5c5SAndroid Build Coastguard Worker 
getD3DUniforms()334*8975f5c5SAndroid Build Coastguard Worker     const std::vector<D3DUniform *> &getD3DUniforms() const { return mD3DUniforms; }
getShaderUniformStorage(gl::ShaderType shaderType)335*8975f5c5SAndroid Build Coastguard Worker     UniformStorageD3D *getShaderUniformStorage(gl::ShaderType shaderType) const
336*8975f5c5SAndroid Build Coastguard Worker     {
337*8975f5c5SAndroid Build Coastguard Worker         return mShaderUniformStorages[shaderType].get();
338*8975f5c5SAndroid Build Coastguard Worker     }
getAttribLocationToD3DSemantics()339*8975f5c5SAndroid Build Coastguard Worker     const AttribIndexArray &getAttribLocationToD3DSemantics() const
340*8975f5c5SAndroid Build Coastguard Worker     {
341*8975f5c5SAndroid Build Coastguard Worker         return mAttribLocationToD3DSemantic;
342*8975f5c5SAndroid Build Coastguard Worker     }
343*8975f5c5SAndroid Build Coastguard Worker     unsigned int getAtomicCounterBufferRegisterIndex(GLuint binding,
344*8975f5c5SAndroid Build Coastguard Worker                                                      gl::ShaderType shaderType) const;
345*8975f5c5SAndroid Build Coastguard Worker     unsigned int getShaderStorageBufferRegisterIndex(GLuint blockIndex,
346*8975f5c5SAndroid Build Coastguard Worker                                                      gl::ShaderType shaderType) const;
347*8975f5c5SAndroid Build Coastguard Worker     const std::vector<D3DUBOCache> &getShaderUniformBufferCache(gl::ShaderType shaderType) const;
348*8975f5c5SAndroid Build Coastguard Worker     const std::vector<D3DUBOCacheUseSB> &getShaderUniformBufferCacheUseSB(
349*8975f5c5SAndroid Build Coastguard Worker         gl::ShaderType shaderType) const;
350*8975f5c5SAndroid Build Coastguard Worker     GLint getSamplerMapping(gl::ShaderType type,
351*8975f5c5SAndroid Build Coastguard Worker                             unsigned int samplerIndex,
352*8975f5c5SAndroid Build Coastguard Worker                             const gl::Caps &caps) const;
353*8975f5c5SAndroid Build Coastguard Worker     gl::TextureType getSamplerTextureType(gl::ShaderType type, unsigned int samplerIndex) const;
354*8975f5c5SAndroid Build Coastguard Worker     gl::RangeUI getUsedSamplerRange(gl::ShaderType type) const;
355*8975f5c5SAndroid Build Coastguard Worker 
isSamplerMappingDirty()356*8975f5c5SAndroid Build Coastguard Worker     bool isSamplerMappingDirty() const { return mDirtySamplerMapping; }
357*8975f5c5SAndroid Build Coastguard Worker     void updateSamplerMapping();
358*8975f5c5SAndroid Build Coastguard Worker 
359*8975f5c5SAndroid Build Coastguard Worker     GLint getImageMapping(gl::ShaderType type,
360*8975f5c5SAndroid Build Coastguard Worker                           unsigned int imageIndex,
361*8975f5c5SAndroid Build Coastguard Worker                           bool readonly,
362*8975f5c5SAndroid Build Coastguard Worker                           const gl::Caps &caps) const;
363*8975f5c5SAndroid Build Coastguard Worker     gl::RangeUI getUsedImageRange(gl::ShaderType type, bool readonly) const;
364*8975f5c5SAndroid Build Coastguard Worker 
usesPointSize()365*8975f5c5SAndroid Build Coastguard Worker     bool usesPointSize() const { return mUsesPointSize; }
366*8975f5c5SAndroid Build Coastguard Worker     bool usesPointSpriteEmulation(RendererD3D *renderer) const;
367*8975f5c5SAndroid Build Coastguard Worker     bool usesGeometryShader(RendererD3D *renderer,
368*8975f5c5SAndroid Build Coastguard Worker                             const gl::ProvokingVertexConvention provokingVertex,
369*8975f5c5SAndroid Build Coastguard Worker                             gl::PrimitiveMode drawMode) const;
370*8975f5c5SAndroid Build Coastguard Worker     bool usesGeometryShaderForPointSpriteEmulation(RendererD3D *renderer) const;
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker     angle::Result getVertexExecutableForCachedInputLayout(d3d::Context *context,
373*8975f5c5SAndroid Build Coastguard Worker                                                           RendererD3D *renderer,
374*8975f5c5SAndroid Build Coastguard Worker                                                           ShaderExecutableD3D **outExectuable,
375*8975f5c5SAndroid Build Coastguard Worker                                                           gl::InfoLog *infoLog);
376*8975f5c5SAndroid Build Coastguard Worker     angle::Result getGeometryExecutableForPrimitiveType(
377*8975f5c5SAndroid Build Coastguard Worker         d3d::Context *errContext,
378*8975f5c5SAndroid Build Coastguard Worker         RendererD3D *renderer,
379*8975f5c5SAndroid Build Coastguard Worker         const gl::Caps &caps,
380*8975f5c5SAndroid Build Coastguard Worker         gl::ProvokingVertexConvention provokingVertex,
381*8975f5c5SAndroid Build Coastguard Worker         gl::PrimitiveMode drawMode,
382*8975f5c5SAndroid Build Coastguard Worker         ShaderExecutableD3D **outExecutable,
383*8975f5c5SAndroid Build Coastguard Worker         gl::InfoLog *infoLog);
384*8975f5c5SAndroid Build Coastguard Worker     angle::Result getPixelExecutableForCachedOutputLayout(d3d::Context *context,
385*8975f5c5SAndroid Build Coastguard Worker                                                           RendererD3D *renderer,
386*8975f5c5SAndroid Build Coastguard Worker                                                           ShaderExecutableD3D **outExectuable,
387*8975f5c5SAndroid Build Coastguard Worker                                                           gl::InfoLog *infoLog);
388*8975f5c5SAndroid Build Coastguard Worker     angle::Result getComputeExecutableForImage2DBindLayout(d3d::Context *context,
389*8975f5c5SAndroid Build Coastguard Worker                                                            RendererD3D *renderer,
390*8975f5c5SAndroid Build Coastguard Worker                                                            ShaderExecutableD3D **outExecutable,
391*8975f5c5SAndroid Build Coastguard Worker                                                            gl::InfoLog *infoLog);
392*8975f5c5SAndroid Build Coastguard Worker 
hasShaderStage(gl::ShaderType shaderType)393*8975f5c5SAndroid Build Coastguard Worker     bool hasShaderStage(gl::ShaderType shaderType) const
394*8975f5c5SAndroid Build Coastguard Worker     {
395*8975f5c5SAndroid Build Coastguard Worker         return mExecutable->getLinkedShaderStages()[shaderType];
396*8975f5c5SAndroid Build Coastguard Worker     }
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     bool hasNamedUniform(const std::string &name);
399*8975f5c5SAndroid Build Coastguard Worker 
usesVertexID()400*8975f5c5SAndroid Build Coastguard Worker     bool usesVertexID() const { return mUsesVertexID; }
401*8975f5c5SAndroid Build Coastguard Worker 
402*8975f5c5SAndroid Build Coastguard Worker     angle::Result loadBinaryShaderExecutables(d3d::Context *contextD3D,
403*8975f5c5SAndroid Build Coastguard Worker                                               RendererD3D *renderer,
404*8975f5c5SAndroid Build Coastguard Worker                                               gl::BinaryInputStream *stream);
405*8975f5c5SAndroid Build Coastguard Worker 
getSerial()406*8975f5c5SAndroid Build Coastguard Worker     unsigned int getSerial() const { return mSerial; }
407*8975f5c5SAndroid Build Coastguard Worker 
408*8975f5c5SAndroid Build Coastguard Worker   private:
409*8975f5c5SAndroid Build Coastguard Worker     friend class ProgramD3D;
410*8975f5c5SAndroid Build Coastguard Worker 
411*8975f5c5SAndroid Build Coastguard Worker     bool load(const gl::Context *context, RendererD3D *renderer, gl::BinaryInputStream *stream);
412*8975f5c5SAndroid Build Coastguard Worker     void save(const gl::Context *context, RendererD3D *renderer, gl::BinaryOutputStream *stream);
413*8975f5c5SAndroid Build Coastguard Worker 
414*8975f5c5SAndroid Build Coastguard Worker     template <typename DestT>
415*8975f5c5SAndroid Build Coastguard Worker     void getUniformInternal(GLint location, DestT *dataOut) const;
416*8975f5c5SAndroid Build Coastguard Worker 
417*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
418*8975f5c5SAndroid Build Coastguard Worker     void setUniformImpl(D3DUniform *targetUniform,
419*8975f5c5SAndroid Build Coastguard Worker                         const gl::VariableLocation &locationInfo,
420*8975f5c5SAndroid Build Coastguard Worker                         GLsizei count,
421*8975f5c5SAndroid Build Coastguard Worker                         const T *v,
422*8975f5c5SAndroid Build Coastguard Worker                         uint8_t *targetData,
423*8975f5c5SAndroid Build Coastguard Worker                         GLenum uniformType);
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
426*8975f5c5SAndroid Build Coastguard Worker     void setUniformInternal(GLint location, GLsizei count, const T *v, GLenum uniformType);
427*8975f5c5SAndroid Build Coastguard Worker 
428*8975f5c5SAndroid Build Coastguard Worker     template <int cols, int rows>
429*8975f5c5SAndroid Build Coastguard Worker     void setUniformMatrixfvInternal(GLint location,
430*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei count,
431*8975f5c5SAndroid Build Coastguard Worker                                     GLboolean transpose,
432*8975f5c5SAndroid Build Coastguard Worker                                     const GLfloat *value);
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker     void initAttribLocationsToD3DSemantic(const gl::SharedCompiledShaderState &vertexShader);
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker     void reset();
437*8975f5c5SAndroid Build Coastguard Worker     void initializeUniformBlocks();
438*8975f5c5SAndroid Build Coastguard Worker     void initializeShaderStorageBlocks(const gl::ShaderMap<gl::SharedCompiledShaderState> &shaders);
439*8975f5c5SAndroid Build Coastguard Worker     void initializeUniformStorage(RendererD3D *renderer,
440*8975f5c5SAndroid Build Coastguard Worker                                   const gl::ShaderBitSet &availableShaderStages);
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker     void updateCachedVertexExecutableIndex();
443*8975f5c5SAndroid Build Coastguard Worker     void updateCachedPixelExecutableIndex();
444*8975f5c5SAndroid Build Coastguard Worker     void updateCachedComputeExecutableIndex();
445*8975f5c5SAndroid Build Coastguard Worker 
446*8975f5c5SAndroid Build Coastguard Worker     void defineUniformsAndAssignRegisters(
447*8975f5c5SAndroid Build Coastguard Worker         RendererD3D *renderer,
448*8975f5c5SAndroid Build Coastguard Worker         const gl::ShaderMap<gl::SharedCompiledShaderState> &shaders);
449*8975f5c5SAndroid Build Coastguard Worker     void defineUniformBase(gl::ShaderType shaderType,
450*8975f5c5SAndroid Build Coastguard Worker                            const sh::ShaderVariable &uniform,
451*8975f5c5SAndroid Build Coastguard Worker                            D3DUniformMap *uniformMap);
452*8975f5c5SAndroid Build Coastguard Worker     void assignAllSamplerRegisters(const gl::ShaderMap<gl::SharedCompiledShaderState> &shaders);
453*8975f5c5SAndroid Build Coastguard Worker     void assignSamplerRegisters(const gl::ShaderMap<gl::SharedCompiledShaderState> &shaders,
454*8975f5c5SAndroid Build Coastguard Worker                                 size_t uniformIndex);
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker     static void AssignSamplers(unsigned int startSamplerIndex,
457*8975f5c5SAndroid Build Coastguard Worker                                const gl::UniformTypeInfo &typeInfo,
458*8975f5c5SAndroid Build Coastguard Worker                                unsigned int samplerCount,
459*8975f5c5SAndroid Build Coastguard Worker                                std::vector<D3DSampler> &outSamplers,
460*8975f5c5SAndroid Build Coastguard Worker                                gl::RangeUI *outUsedRange);
461*8975f5c5SAndroid Build Coastguard Worker 
462*8975f5c5SAndroid Build Coastguard Worker     void assignAllImageRegisters();
463*8975f5c5SAndroid Build Coastguard Worker     void assignAllAtomicCounterRegisters();
464*8975f5c5SAndroid Build Coastguard Worker     void assignImageRegisters(size_t uniformIndex);
465*8975f5c5SAndroid Build Coastguard Worker     static void AssignImages(unsigned int startImageIndex,
466*8975f5c5SAndroid Build Coastguard Worker                              int startLogicalImageUnit,
467*8975f5c5SAndroid Build Coastguard Worker                              unsigned int imageCount,
468*8975f5c5SAndroid Build Coastguard Worker                              std::vector<D3DImage> &outImages,
469*8975f5c5SAndroid Build Coastguard Worker                              gl::RangeUI *outUsedRange);
470*8975f5c5SAndroid Build Coastguard Worker 
471*8975f5c5SAndroid Build Coastguard Worker     void gatherTransformFeedbackVaryings(
472*8975f5c5SAndroid Build Coastguard Worker         RendererD3D *renderer,
473*8975f5c5SAndroid Build Coastguard Worker         const gl::VaryingPacking &varyings,
474*8975f5c5SAndroid Build Coastguard Worker         const std::vector<std::string> &transformFeedbackVaryingNames,
475*8975f5c5SAndroid Build Coastguard Worker         const BuiltinInfo &builtins);
476*8975f5c5SAndroid Build Coastguard Worker     D3DUniform *getD3DUniformFromLocation(const gl::VariableLocation &locationInfo);
477*8975f5c5SAndroid Build Coastguard Worker     const D3DUniform *getD3DUniformFromLocation(const gl::VariableLocation &locationInfo) const;
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<SharedCompiledShaderStateD3D> mAttachedShaders;
480*8975f5c5SAndroid Build Coastguard Worker 
481*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::unique_ptr<D3DVertexExecutable>> mVertexExecutables;
482*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::unique_ptr<D3DPixelExecutable>> mPixelExecutables;
483*8975f5c5SAndroid Build Coastguard Worker     angle::PackedEnumMap<gl::PrimitiveMode, std::unique_ptr<ShaderExecutableD3D>>
484*8975f5c5SAndroid Build Coastguard Worker         mGeometryExecutables;
485*8975f5c5SAndroid Build Coastguard Worker     std::vector<std::unique_ptr<D3DComputeExecutable>> mComputeExecutables;
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::string> mShaderHLSL;
488*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<CompilerWorkaroundsD3D> mShaderWorkarounds;
489*8975f5c5SAndroid Build Coastguard Worker 
490*8975f5c5SAndroid Build Coastguard Worker     FragDepthUsage mFragDepthUsage;
491*8975f5c5SAndroid Build Coastguard Worker     bool mUsesSampleMask;
492*8975f5c5SAndroid Build Coastguard Worker     bool mHasMultiviewEnabled;
493*8975f5c5SAndroid Build Coastguard Worker     bool mUsesVertexID;
494*8975f5c5SAndroid Build Coastguard Worker     bool mUsesViewID;
495*8975f5c5SAndroid Build Coastguard Worker     std::vector<PixelShaderOutputVariable> mPixelShaderKey;
496*8975f5c5SAndroid Build Coastguard Worker 
497*8975f5c5SAndroid Build Coastguard Worker     // Common code for all dynamic geometry shaders. Consists mainly of the GS input and output
498*8975f5c5SAndroid Build Coastguard Worker     // structures, built from the linked varying info. We store the string itself instead of the
499*8975f5c5SAndroid Build Coastguard Worker     // packed varyings for simplicity.
500*8975f5c5SAndroid Build Coastguard Worker     std::string mGeometryShaderPreamble;
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     bool mUsesPointSize;
503*8975f5c5SAndroid Build Coastguard Worker     bool mUsesFlatInterpolation;
504*8975f5c5SAndroid Build Coastguard Worker 
505*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::unique_ptr<UniformStorageD3D>> mShaderUniformStorages;
506*8975f5c5SAndroid Build Coastguard Worker 
507*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<D3DSampler>> mShaderSamplers;
508*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<gl::RangeUI> mUsedShaderSamplerRanges;
509*8975f5c5SAndroid Build Coastguard Worker     bool mDirtySamplerMapping;
510*8975f5c5SAndroid Build Coastguard Worker 
511*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<D3DImage>> mImages;
512*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<D3DImage>> mReadonlyImages;
513*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<gl::RangeUI> mUsedImageRange;
514*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<gl::RangeUI> mUsedReadonlyImageRange;
515*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<gl::RangeUI> mUsedAtomicCounterRange;
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker     // Cache for pixel shader output layout to save reallocations.
518*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLenum> mPixelShaderOutputLayoutCache;
519*8975f5c5SAndroid Build Coastguard Worker     Optional<size_t> mCachedPixelExecutableIndex;
520*8975f5c5SAndroid Build Coastguard Worker 
521*8975f5c5SAndroid Build Coastguard Worker     AttribIndexArray mAttribLocationToD3DSemantic;
522*8975f5c5SAndroid Build Coastguard Worker 
523*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<D3DUBOCache>> mShaderUBOCaches;
524*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<D3DUBOCacheUseSB>> mShaderUBOCachesUseSB;
525*8975f5c5SAndroid Build Coastguard Worker     D3DVertexExecutable::Signature mCachedVertexSignature;
526*8975f5c5SAndroid Build Coastguard Worker     gl::InputLayout mCachedInputLayout;
527*8975f5c5SAndroid Build Coastguard Worker     Optional<size_t> mCachedVertexExecutableIndex;
528*8975f5c5SAndroid Build Coastguard Worker 
529*8975f5c5SAndroid Build Coastguard Worker     std::vector<D3DVarying> mStreamOutVaryings;
530*8975f5c5SAndroid Build Coastguard Worker     std::vector<D3DUniform *> mD3DUniforms;
531*8975f5c5SAndroid Build Coastguard Worker     std::map<std::string, int> mImageBindingMap;
532*8975f5c5SAndroid Build Coastguard Worker     std::map<std::string, int> mAtomicBindingMap;
533*8975f5c5SAndroid Build Coastguard Worker     std::vector<D3DUniformBlock> mD3DUniformBlocks;
534*8975f5c5SAndroid Build Coastguard Worker     std::vector<D3DInterfaceBlock> mD3DShaderStorageBlocks;
535*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<ShaderStorageBlock>> mShaderStorageBlocks;
536*8975f5c5SAndroid Build Coastguard Worker     std::array<unsigned int, gl::IMPLEMENTATION_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS>
537*8975f5c5SAndroid Build Coastguard Worker         mComputeAtomicCounterBufferRegisterIndices;
538*8975f5c5SAndroid Build Coastguard Worker 
539*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<std::vector<sh::ShaderVariable>> mImage2DUniforms;
540*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderMap<gl::ImageUnitTextureTypeMap> mImage2DBindLayoutCache;
541*8975f5c5SAndroid Build Coastguard Worker     Optional<size_t> mCachedComputeExecutableIndex;
542*8975f5c5SAndroid Build Coastguard Worker 
543*8975f5c5SAndroid Build Coastguard Worker     gl::ShaderBitSet mShaderUniformsDirty;
544*8975f5c5SAndroid Build Coastguard Worker 
545*8975f5c5SAndroid Build Coastguard Worker     UniqueSerial mCurrentVertexArrayStateSerial;
546*8975f5c5SAndroid Build Coastguard Worker 
547*8975f5c5SAndroid Build Coastguard Worker     unsigned int mSerial;
548*8975f5c5SAndroid Build Coastguard Worker 
549*8975f5c5SAndroid Build Coastguard Worker     static unsigned int issueSerial();
550*8975f5c5SAndroid Build Coastguard Worker     static unsigned int mCurrentSerial;
551*8975f5c5SAndroid Build Coastguard Worker };
552*8975f5c5SAndroid Build Coastguard Worker 
553*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_D3D_PROGRAMEXECUTABLED3D_H_
556