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