1*8975f5c5SAndroid Build Coastguard Worker 2*8975f5c5SAndroid Build Coastguard Worker // 3*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 The ANGLE Project Authors. All rights reserved. 4*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 5*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 6*8975f5c5SAndroid Build Coastguard Worker // 7*8975f5c5SAndroid Build Coastguard Worker // ProgramMtl.h: 8*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for ProgramMtl, implementing ProgramImpl. 9*8975f5c5SAndroid Build Coastguard Worker // 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_METAL_PROGRAMMTL_H_ 12*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_METAL_PROGRAMMTL_H_ 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Worker #import <Metal/Metal.h> 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker #include <array> 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker #include "common/Optional.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ProgramImpl.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/ProgramExecutableMtl.h" 22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/ShaderMtl.h" 23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_context_device.h" 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker namespace rx 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker #define SHADER_ENTRY_NAME @"main0" 28*8975f5c5SAndroid Build Coastguard Worker class ContextMtl; 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker class ProgramMtl : public ProgramImpl 31*8975f5c5SAndroid Build Coastguard Worker { 32*8975f5c5SAndroid Build Coastguard Worker public: 33*8975f5c5SAndroid Build Coastguard Worker ProgramMtl(const gl::ProgramState &state); 34*8975f5c5SAndroid Build Coastguard Worker ~ProgramMtl() override; 35*8975f5c5SAndroid Build Coastguard Worker 36*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker angle::Result load(const gl::Context *context, 39*8975f5c5SAndroid Build Coastguard Worker gl::BinaryInputStream *stream, 40*8975f5c5SAndroid Build Coastguard Worker std::shared_ptr<LinkTask> *loadTaskOut, 41*8975f5c5SAndroid Build Coastguard Worker egl::CacheGetResult *resultOut) override; 42*8975f5c5SAndroid Build Coastguard Worker void save(const gl::Context *context, gl::BinaryOutputStream *stream) override; 43*8975f5c5SAndroid Build Coastguard Worker void setBinaryRetrievableHint(bool retrievable) override; 44*8975f5c5SAndroid Build Coastguard Worker void setSeparable(bool separable) override; 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Worker void prepareForLink(const gl::ShaderMap<ShaderImpl *> &shaders) override; 47*8975f5c5SAndroid Build Coastguard Worker angle::Result link(const gl::Context *context, std::shared_ptr<LinkTask> *linkTaskOut) override; 48*8975f5c5SAndroid Build Coastguard Worker GLboolean validate(const gl::Caps &caps) override; 49*8975f5c5SAndroid Build Coastguard Worker getExecutable()50*8975f5c5SAndroid Build Coastguard Worker const ProgramExecutableMtl *getExecutable() const 51*8975f5c5SAndroid Build Coastguard Worker { 52*8975f5c5SAndroid Build Coastguard Worker return mtl::GetImpl(&mState.getExecutable()); 53*8975f5c5SAndroid Build Coastguard Worker } getExecutable()54*8975f5c5SAndroid Build Coastguard Worker ProgramExecutableMtl *getExecutable() { return mtl::GetImpl(&mState.getExecutable()); } 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker private: 57*8975f5c5SAndroid Build Coastguard Worker class LinkTaskMtl; 58*8975f5c5SAndroid Build Coastguard Worker class LoadTaskMtl; 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker friend class LinkTaskMtl; 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker angle::Result linkJobImpl(mtl::Context *context, 63*8975f5c5SAndroid Build Coastguard Worker const gl::ProgramLinkedResources &resources, 64*8975f5c5SAndroid Build Coastguard Worker std::vector<std::shared_ptr<LinkSubTask>> *subTasksOut); 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker void linkResources(const gl::ProgramLinkedResources &resources); 67*8975f5c5SAndroid Build Coastguard Worker angle::Result compileMslShaderLibs(mtl::Context *context, 68*8975f5c5SAndroid Build Coastguard Worker std::vector<std::shared_ptr<LinkSubTask>> *subTasksOut); 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker gl::ShaderMap<SharedCompiledShaderStateMtl> mAttachedShaders; 71*8975f5c5SAndroid Build Coastguard Worker }; 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker #endif /* LIBANGLE_RENDERER_METAL_PROGRAMMTL_H_ */ 76