1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // DisplayMtl.h: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for DisplayMtl, implementing DisplayImpl. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_METAL_DISPLAYMTL_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_METAL_DISPLAYMTL_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/DisplayImpl.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ShareGroupImpl.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_command_buffer.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_context_device.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_format_utils.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_library_cache.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_render_utils.h" 22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_state_cache.h" 23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/metal/mtl_utils.h" 24*8975f5c5SAndroid Build Coastguard Worker #include "platform/autogen/FeaturesMtl_autogen.h" 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker namespace egl 27*8975f5c5SAndroid Build Coastguard Worker { 28*8975f5c5SAndroid Build Coastguard Worker class Surface; 29*8975f5c5SAndroid Build Coastguard Worker } 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker namespace rx 32*8975f5c5SAndroid Build Coastguard Worker { 33*8975f5c5SAndroid Build Coastguard Worker class ShareGroupMtl : public ShareGroupImpl 34*8975f5c5SAndroid Build Coastguard Worker { 35*8975f5c5SAndroid Build Coastguard Worker public: ShareGroupMtl(const egl::ShareGroupState & state)36*8975f5c5SAndroid Build Coastguard Worker ShareGroupMtl(const egl::ShareGroupState &state) : ShareGroupImpl(state) {} 37*8975f5c5SAndroid Build Coastguard Worker }; 38*8975f5c5SAndroid Build Coastguard Worker 39*8975f5c5SAndroid Build Coastguard Worker class ContextMtl; 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker struct DefaultShaderAsyncInfoMtl; 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker class DisplayMtl : public DisplayImpl 44*8975f5c5SAndroid Build Coastguard Worker { 45*8975f5c5SAndroid Build Coastguard Worker public: 46*8975f5c5SAndroid Build Coastguard Worker DisplayMtl(const egl::DisplayState &state); 47*8975f5c5SAndroid Build Coastguard Worker ~DisplayMtl() override; 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker egl::Error initialize(egl::Display *display) override; 50*8975f5c5SAndroid Build Coastguard Worker void terminate() override; 51*8975f5c5SAndroid Build Coastguard Worker getDisplay()52*8975f5c5SAndroid Build Coastguard Worker egl::Display *getDisplay() const { return mDisplay; } 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker bool testDeviceLost() override; 55*8975f5c5SAndroid Build Coastguard Worker egl::Error restoreLostDevice(const egl::Display *display) override; 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker std::string getRendererDescription() override; 58*8975f5c5SAndroid Build Coastguard Worker std::string getVendorString() override; 59*8975f5c5SAndroid Build Coastguard Worker std::string getVersionString(bool includeFullVersion) override; 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker DeviceImpl *createDevice() override; 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker egl::Error waitClient(const gl::Context *context) override; 64*8975f5c5SAndroid Build Coastguard Worker egl::Error waitNative(const gl::Context *context, EGLint engine) override; 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker egl::Error waitUntilWorkScheduled() override; 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *createWindowSurface(const egl::SurfaceState &state, 69*8975f5c5SAndroid Build Coastguard Worker EGLNativeWindowType window, 70*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 71*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state, 72*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 73*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state, 74*8975f5c5SAndroid Build Coastguard Worker EGLenum buftype, 75*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer clientBuffer, 76*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 77*8975f5c5SAndroid Build Coastguard Worker SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state, 78*8975f5c5SAndroid Build Coastguard Worker NativePixmapType nativePixmap, 79*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 80*8975f5c5SAndroid Build Coastguard Worker 81*8975f5c5SAndroid Build Coastguard Worker ImageImpl *createImage(const egl::ImageState &state, 82*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context, 83*8975f5c5SAndroid Build Coastguard Worker EGLenum target, 84*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker ContextImpl *createContext(const gl::State &state, 87*8975f5c5SAndroid Build Coastguard Worker gl::ErrorSet *errorSet, 88*8975f5c5SAndroid Build Coastguard Worker const egl::Config *configuration, 89*8975f5c5SAndroid Build Coastguard Worker const gl::Context *shareContext, 90*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 91*8975f5c5SAndroid Build Coastguard Worker 92*8975f5c5SAndroid Build Coastguard Worker StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType, 93*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker ShareGroupImpl *createShareGroup(const egl::ShareGroupState &state) override; 96*8975f5c5SAndroid Build Coastguard Worker 97*8975f5c5SAndroid Build Coastguard Worker ExternalImageSiblingImpl *createExternalImageSibling(const gl::Context *context, 98*8975f5c5SAndroid Build Coastguard Worker EGLenum target, 99*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer buffer, 100*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 101*8975f5c5SAndroid Build Coastguard Worker gl::Version getMaxSupportedESVersion() const override; 102*8975f5c5SAndroid Build Coastguard Worker gl::Version getMaxConformantESVersion() const override; 103*8975f5c5SAndroid Build Coastguard Worker 104*8975f5c5SAndroid Build Coastguard Worker EGLSyncImpl *createSync() override; 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker egl::Error makeCurrent(egl::Display *display, 107*8975f5c5SAndroid Build Coastguard Worker egl::Surface *drawSurface, 108*8975f5c5SAndroid Build Coastguard Worker egl::Surface *readSurface, 109*8975f5c5SAndroid Build Coastguard Worker gl::Context *context) override; 110*8975f5c5SAndroid Build Coastguard Worker 111*8975f5c5SAndroid Build Coastguard Worker void initializeFrontendFeatures(angle::FrontendFeatures *features) const override; 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker void populateFeatureList(angle::FeatureList *features) override; 114*8975f5c5SAndroid Build Coastguard Worker 115*8975f5c5SAndroid Build Coastguard Worker bool isValidNativeWindow(EGLNativeWindowType window) const override; 116*8975f5c5SAndroid Build Coastguard Worker 117*8975f5c5SAndroid Build Coastguard Worker egl::Error validateClientBuffer(const egl::Config *configuration, 118*8975f5c5SAndroid Build Coastguard Worker EGLenum buftype, 119*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer clientBuffer, 120*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) const override; 121*8975f5c5SAndroid Build Coastguard Worker 122*8975f5c5SAndroid Build Coastguard Worker egl::Error validateImageClientBuffer(const gl::Context *context, 123*8975f5c5SAndroid Build Coastguard Worker EGLenum target, 124*8975f5c5SAndroid Build Coastguard Worker EGLClientBuffer clientBuffer, 125*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) const override; 126*8975f5c5SAndroid Build Coastguard Worker 127*8975f5c5SAndroid Build Coastguard Worker egl::ConfigSet generateConfigs() override; 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard Worker gl::Caps getNativeCaps() const; 130*8975f5c5SAndroid Build Coastguard Worker const gl::TextureCapsMap &getNativeTextureCaps() const; 131*8975f5c5SAndroid Build Coastguard Worker const gl::Extensions &getNativeExtensions() const; 132*8975f5c5SAndroid Build Coastguard Worker const gl::Limitations &getNativeLimitations() const; 133*8975f5c5SAndroid Build Coastguard Worker const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const; getFeatures()134*8975f5c5SAndroid Build Coastguard Worker const angle::FeaturesMtl &getFeatures() const { return mFeatures; } 135*8975f5c5SAndroid Build Coastguard Worker 136*8975f5c5SAndroid Build Coastguard Worker // Check whether either of the specified iOS or Mac GPU family is supported 137*8975f5c5SAndroid Build Coastguard Worker bool supportsEitherGPUFamily(uint8_t iOSFamily, uint8_t macFamily) const; 138*8975f5c5SAndroid Build Coastguard Worker bool supportsAppleGPUFamily(uint8_t iOSFamily) const; 139*8975f5c5SAndroid Build Coastguard Worker bool supportsMacGPUFamily(uint8_t macFamily) const; 140*8975f5c5SAndroid Build Coastguard Worker bool supportsDepth24Stencil8PixelFormat() const; 141*8975f5c5SAndroid Build Coastguard Worker bool supports32BitFloatFiltering() const; 142*8975f5c5SAndroid Build Coastguard Worker bool supportsBCTextureCompression() const; 143*8975f5c5SAndroid Build Coastguard Worker bool isAMD() const; 144*8975f5c5SAndroid Build Coastguard Worker bool isAMDBronzeDriver() const; 145*8975f5c5SAndroid Build Coastguard Worker bool isAMDFireProDevice() const; 146*8975f5c5SAndroid Build Coastguard Worker bool isIntel() const; 147*8975f5c5SAndroid Build Coastguard Worker bool isNVIDIA() const; 148*8975f5c5SAndroid Build Coastguard Worker bool isSimulator() const; 149*8975f5c5SAndroid Build Coastguard Worker getMetalDevice()150*8975f5c5SAndroid Build Coastguard Worker id<MTLDevice> getMetalDevice() const { return mMetalDevice; } 151*8975f5c5SAndroid Build Coastguard Worker cmdQueue()152*8975f5c5SAndroid Build Coastguard Worker mtl::CommandQueue &cmdQueue() { return mCmdQueue; } getFormatTable()153*8975f5c5SAndroid Build Coastguard Worker const mtl::FormatTable &getFormatTable() const { return mFormatTable; } getUtils()154*8975f5c5SAndroid Build Coastguard Worker mtl::RenderUtils &getUtils() { return *mUtils; } getStateCache()155*8975f5c5SAndroid Build Coastguard Worker mtl::StateCache &getStateCache() { return mStateCache; } getLibraryCache()156*8975f5c5SAndroid Build Coastguard Worker mtl::LibraryCache &getLibraryCache() { return mLibraryCache; } getMaxColorTargetBits()157*8975f5c5SAndroid Build Coastguard Worker uint32_t getMaxColorTargetBits() { return mMaxColorTargetBits; } hasFragmentMemoryBarriers()158*8975f5c5SAndroid Build Coastguard Worker bool hasFragmentMemoryBarriers() const { return mHasFragmentMemoryBarriers; } 159*8975f5c5SAndroid Build Coastguard Worker 160*8975f5c5SAndroid Build Coastguard Worker id<MTLLibrary> getDefaultShadersLib(); 161*8975f5c5SAndroid Build Coastguard Worker getPixelFormat(angle::FormatID angleFormatId)162*8975f5c5SAndroid Build Coastguard Worker const mtl::Format &getPixelFormat(angle::FormatID angleFormatId) const 163*8975f5c5SAndroid Build Coastguard Worker { 164*8975f5c5SAndroid Build Coastguard Worker return mFormatTable.getPixelFormat(angleFormatId); 165*8975f5c5SAndroid Build Coastguard Worker } getNativeFormatCaps(MTLPixelFormat mtlFormat)166*8975f5c5SAndroid Build Coastguard Worker const mtl::FormatCaps &getNativeFormatCaps(MTLPixelFormat mtlFormat) const 167*8975f5c5SAndroid Build Coastguard Worker { 168*8975f5c5SAndroid Build Coastguard Worker return mFormatTable.getNativeFormatCaps(mtlFormat); 169*8975f5c5SAndroid Build Coastguard Worker } 170*8975f5c5SAndroid Build Coastguard Worker 171*8975f5c5SAndroid Build Coastguard Worker // See mtl::FormatTable::getVertexFormat() getVertexFormat(angle::FormatID angleFormatId,bool tightlyPacked)172*8975f5c5SAndroid Build Coastguard Worker const mtl::VertexFormat &getVertexFormat(angle::FormatID angleFormatId, 173*8975f5c5SAndroid Build Coastguard Worker bool tightlyPacked) const 174*8975f5c5SAndroid Build Coastguard Worker { 175*8975f5c5SAndroid Build Coastguard Worker return mFormatTable.getVertexFormat(angleFormatId, tightlyPacked); 176*8975f5c5SAndroid Build Coastguard Worker } 177*8975f5c5SAndroid Build Coastguard Worker 178*8975f5c5SAndroid Build Coastguard Worker mtl::AutoObjCObj<MTLSharedEventListener> getOrCreateSharedEventListener(); 179*8975f5c5SAndroid Build Coastguard Worker 180*8975f5c5SAndroid Build Coastguard Worker protected: 181*8975f5c5SAndroid Build Coastguard Worker void generateExtensions(egl::DisplayExtensions *outExtensions) const override; 182*8975f5c5SAndroid Build Coastguard Worker void generateCaps(egl::Caps *outCaps) const override; 183*8975f5c5SAndroid Build Coastguard Worker 184*8975f5c5SAndroid Build Coastguard Worker private: 185*8975f5c5SAndroid Build Coastguard Worker angle::Result initializeImpl(egl::Display *display); 186*8975f5c5SAndroid Build Coastguard Worker void ensureCapsInitialized() const; 187*8975f5c5SAndroid Build Coastguard Worker void initializeCaps() const; 188*8975f5c5SAndroid Build Coastguard Worker void initializeExtensions() const; 189*8975f5c5SAndroid Build Coastguard Worker void initializeTextureCaps() const; 190*8975f5c5SAndroid Build Coastguard Worker void initializeFeatures(); 191*8975f5c5SAndroid Build Coastguard Worker void initializeLimitations(); 192*8975f5c5SAndroid Build Coastguard Worker EGLenum EGLDrawingBufferTextureTarget(); 193*8975f5c5SAndroid Build Coastguard Worker mtl::AutoObjCPtr<id<MTLDevice>> getMetalDeviceMatchingAttribute( 194*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs); 195*8975f5c5SAndroid Build Coastguard Worker angle::Result initializeShaderLibrary(); 196*8975f5c5SAndroid Build Coastguard Worker 197*8975f5c5SAndroid Build Coastguard Worker egl::Display *mDisplay; 198*8975f5c5SAndroid Build Coastguard Worker 199*8975f5c5SAndroid Build Coastguard Worker mtl::AutoObjCPtr<id<MTLDevice>> mMetalDevice = nil; 200*8975f5c5SAndroid Build Coastguard Worker uint32_t mMetalDeviceVendorId = 0; 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard Worker // Expensive-to-compute AMD Bronze driver detection 203*8975f5c5SAndroid Build Coastguard Worker mutable bool mComputedAMDBronze = false; 204*8975f5c5SAndroid Build Coastguard Worker mutable bool mIsAMDBronze = false; 205*8975f5c5SAndroid Build Coastguard Worker 206*8975f5c5SAndroid Build Coastguard Worker mtl::CommandQueue mCmdQueue; 207*8975f5c5SAndroid Build Coastguard Worker 208*8975f5c5SAndroid Build Coastguard Worker mutable mtl::FormatTable mFormatTable; 209*8975f5c5SAndroid Build Coastguard Worker mtl::StateCache mStateCache; 210*8975f5c5SAndroid Build Coastguard Worker mtl::LibraryCache mLibraryCache; 211*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<mtl::RenderUtils> mUtils; 212*8975f5c5SAndroid Build Coastguard Worker 213*8975f5c5SAndroid Build Coastguard Worker // Built-in Shaders 214*8975f5c5SAndroid Build Coastguard Worker mtl::AutoObjCPtr<id<MTLLibrary>> mDefaultShaders; 215*8975f5c5SAndroid Build Coastguard Worker mtl::AutoObjCObj<MTLSharedEventListener> mSharedEventListener; 216*8975f5c5SAndroid Build Coastguard Worker 217*8975f5c5SAndroid Build Coastguard Worker mutable bool mCapsInitialized; 218*8975f5c5SAndroid Build Coastguard Worker mutable gl::TextureCapsMap mNativeTextureCaps; 219*8975f5c5SAndroid Build Coastguard Worker mutable gl::Extensions mNativeExtensions; 220*8975f5c5SAndroid Build Coastguard Worker mutable gl::Caps mNativeCaps; 221*8975f5c5SAndroid Build Coastguard Worker mutable gl::Limitations mNativeLimitations; 222*8975f5c5SAndroid Build Coastguard Worker mutable ShPixelLocalStorageOptions mNativePLSOptions; 223*8975f5c5SAndroid Build Coastguard Worker mutable uint32_t mMaxColorTargetBits = 0; 224*8975f5c5SAndroid Build Coastguard Worker mutable bool mHasFragmentMemoryBarriers; 225*8975f5c5SAndroid Build Coastguard Worker 226*8975f5c5SAndroid Build Coastguard Worker angle::FeaturesMtl mFeatures; 227*8975f5c5SAndroid Build Coastguard Worker }; 228*8975f5c5SAndroid Build Coastguard Worker 229*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 230*8975f5c5SAndroid Build Coastguard Worker 231*8975f5c5SAndroid Build Coastguard Worker #endif /* LIBANGLE_RENDERER_METAL_DISPLAYMTL_H_ */ 232