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