xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/metal/DisplayMtl.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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