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 // ProgramD3D.h: Defines the rx::ProgramD3D class which implements rx::ProgramImpl. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include <string> 13*8975f5c5SAndroid Build Coastguard Worker #include <vector> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/hlsl/blocklayoutHLSL.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Constants.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ProgramImpl.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ProgramExecutableD3D.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/RendererD3D.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/ShaderD3D.h" 22*8975f5c5SAndroid Build Coastguard Worker #include "platform/autogen/FeaturesD3D_autogen.h" 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker namespace rx 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker class RendererD3D; 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Worker class ProgramD3DMetadata final : angle::NonCopyable 29*8975f5c5SAndroid Build Coastguard Worker { 30*8975f5c5SAndroid Build Coastguard Worker public: 31*8975f5c5SAndroid Build Coastguard Worker ProgramD3DMetadata(RendererD3D *renderer, 32*8975f5c5SAndroid Build Coastguard Worker const gl::SharedCompiledShaderState &fragmentShader, 33*8975f5c5SAndroid Build Coastguard Worker const gl::ShaderMap<SharedCompiledShaderStateD3D> &attachedShaders, 34*8975f5c5SAndroid Build Coastguard Worker int shaderVersion); 35*8975f5c5SAndroid Build Coastguard Worker ~ProgramD3DMetadata(); 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker int getRendererMajorShaderModel() const; 38*8975f5c5SAndroid Build Coastguard Worker bool usesBroadcast(const gl::Version &clientVersion) const; 39*8975f5c5SAndroid Build Coastguard Worker bool usesSecondaryColor() const; 40*8975f5c5SAndroid Build Coastguard Worker bool usesPointCoord() const; 41*8975f5c5SAndroid Build Coastguard Worker bool usesFragCoord() const; 42*8975f5c5SAndroid Build Coastguard Worker bool usesPointSize() const; 43*8975f5c5SAndroid Build Coastguard Worker bool usesInsertedPointCoordValue() const; 44*8975f5c5SAndroid Build Coastguard Worker bool usesViewScale() const; 45*8975f5c5SAndroid Build Coastguard Worker bool hasMultiviewEnabled() const; 46*8975f5c5SAndroid Build Coastguard Worker bool usesVertexID() const; 47*8975f5c5SAndroid Build Coastguard Worker bool usesViewID() const; 48*8975f5c5SAndroid Build Coastguard Worker bool canSelectViewInVertexShader() const; 49*8975f5c5SAndroid Build Coastguard Worker bool addsPointCoordToVertexShader() const; 50*8975f5c5SAndroid Build Coastguard Worker bool usesTransformFeedbackGLPosition() const; 51*8975f5c5SAndroid Build Coastguard Worker bool usesSystemValuePointSize() const; 52*8975f5c5SAndroid Build Coastguard Worker bool usesMultipleFragmentOuts() const; 53*8975f5c5SAndroid Build Coastguard Worker bool usesCustomOutVars() const; 54*8975f5c5SAndroid Build Coastguard Worker bool usesSampleMask() const; 55*8975f5c5SAndroid Build Coastguard Worker const gl::SharedCompiledShaderState &getFragmentShader() const; 56*8975f5c5SAndroid Build Coastguard Worker FragDepthUsage getFragDepthUsage() const; 57*8975f5c5SAndroid Build Coastguard Worker uint8_t getClipDistanceArraySize() const; 58*8975f5c5SAndroid Build Coastguard Worker uint8_t getCullDistanceArraySize() const; 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker private: 61*8975f5c5SAndroid Build Coastguard Worker const int mRendererMajorShaderModel; 62*8975f5c5SAndroid Build Coastguard Worker const std::string mShaderModelSuffix; 63*8975f5c5SAndroid Build Coastguard Worker const bool mUsesViewScale; 64*8975f5c5SAndroid Build Coastguard Worker const bool mCanSelectViewInVertexShader; 65*8975f5c5SAndroid Build Coastguard Worker gl::SharedCompiledShaderState mFragmentShader; 66*8975f5c5SAndroid Build Coastguard Worker const gl::ShaderMap<SharedCompiledShaderStateD3D> &mAttachedShaders; 67*8975f5c5SAndroid Build Coastguard Worker int mShaderVersion; 68*8975f5c5SAndroid Build Coastguard Worker }; 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker class ProgramD3D : public ProgramImpl 71*8975f5c5SAndroid Build Coastguard Worker { 72*8975f5c5SAndroid Build Coastguard Worker public: 73*8975f5c5SAndroid Build Coastguard Worker ProgramD3D(const gl::ProgramState &data, RendererD3D *renderer); 74*8975f5c5SAndroid Build Coastguard Worker ~ProgramD3D() override; 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker angle::Result load(const gl::Context *context, 79*8975f5c5SAndroid Build Coastguard Worker gl::BinaryInputStream *stream, 80*8975f5c5SAndroid Build Coastguard Worker std::shared_ptr<LinkTask> *loadTaskOut, 81*8975f5c5SAndroid Build Coastguard Worker egl::CacheGetResult *resultOut) override; 82*8975f5c5SAndroid Build Coastguard Worker void save(const gl::Context *context, gl::BinaryOutputStream *stream) override; 83*8975f5c5SAndroid Build Coastguard Worker void setBinaryRetrievableHint(bool retrievable) override; 84*8975f5c5SAndroid Build Coastguard Worker void setSeparable(bool separable) override; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker void prepareForLink(const gl::ShaderMap<ShaderImpl *> &shaders) override; 87*8975f5c5SAndroid Build Coastguard Worker angle::Result link(const gl::Context *context, std::shared_ptr<LinkTask> *linkTaskOut) override; 88*8975f5c5SAndroid Build Coastguard Worker GLboolean validate(const gl::Caps &caps) override; 89*8975f5c5SAndroid Build Coastguard Worker getState()90*8975f5c5SAndroid Build Coastguard Worker const gl::ProgramState &getState() const { return mState; } 91*8975f5c5SAndroid Build Coastguard Worker getExecutable()92*8975f5c5SAndroid Build Coastguard Worker const ProgramExecutableD3D *getExecutable() const 93*8975f5c5SAndroid Build Coastguard Worker { 94*8975f5c5SAndroid Build Coastguard Worker return GetImplAs<ProgramExecutableD3D>(&mState.getExecutable()); 95*8975f5c5SAndroid Build Coastguard Worker } getExecutable()96*8975f5c5SAndroid Build Coastguard Worker ProgramExecutableD3D *getExecutable() 97*8975f5c5SAndroid Build Coastguard Worker { 98*8975f5c5SAndroid Build Coastguard Worker return GetImplAs<ProgramExecutableD3D>(&mState.getExecutable()); 99*8975f5c5SAndroid Build Coastguard Worker } 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Worker private: 102*8975f5c5SAndroid Build Coastguard Worker class GetVertexExecutableTask; 103*8975f5c5SAndroid Build Coastguard Worker class GetPixelExecutableTask; 104*8975f5c5SAndroid Build Coastguard Worker class GetGeometryExecutableTask; 105*8975f5c5SAndroid Build Coastguard Worker class GetComputeExecutableTask; 106*8975f5c5SAndroid Build Coastguard Worker class LinkLoadTaskD3D; 107*8975f5c5SAndroid Build Coastguard Worker class LinkTaskD3D; 108*8975f5c5SAndroid Build Coastguard Worker class LoadTaskD3D; 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker friend class LinkTaskD3D; 111*8975f5c5SAndroid Build Coastguard Worker friend class LoadTaskD3D; 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker angle::Result linkJobImpl(d3d::Context *context, 114*8975f5c5SAndroid Build Coastguard Worker const gl::Caps &caps, 115*8975f5c5SAndroid Build Coastguard Worker const gl::Version &clientVersion, 116*8975f5c5SAndroid Build Coastguard Worker const gl::ProgramLinkedResources &resources, 117*8975f5c5SAndroid Build Coastguard Worker const gl::ProgramMergedVaryings &mergedVaryings); getAttachedShader(gl::ShaderType shaderType)118*8975f5c5SAndroid Build Coastguard Worker const SharedCompiledShaderStateD3D &getAttachedShader(gl::ShaderType shaderType) 119*8975f5c5SAndroid Build Coastguard Worker { 120*8975f5c5SAndroid Build Coastguard Worker return getExecutable()->mAttachedShaders[shaderType]; 121*8975f5c5SAndroid Build Coastguard Worker } 122*8975f5c5SAndroid Build Coastguard Worker 123*8975f5c5SAndroid Build Coastguard Worker void linkResources(const gl::ProgramLinkedResources &resources); 124*8975f5c5SAndroid Build Coastguard Worker 125*8975f5c5SAndroid Build Coastguard Worker RendererD3D *mRenderer; 126*8975f5c5SAndroid Build Coastguard Worker }; 127*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_D3D_PROGRAMD3D_H_ 130