• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2019 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // DisplayMtl.h:
7 //    Defines the class interface for DisplayMtl, implementing DisplayImpl.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_METAL_DISPLAYMTL_H_
11 #define LIBANGLE_RENDERER_METAL_DISPLAYMTL_H_
12 
13 #include "common/PackedEnums.h"
14 #include "libANGLE/angletypes.h"
15 #include "libANGLE/renderer/DisplayImpl.h"
16 #include "libANGLE/renderer/metal/mtl_command_buffer.h"
17 #include "libANGLE/renderer/metal/mtl_format_utils.h"
18 #include "libANGLE/renderer/metal/mtl_render_utils.h"
19 #include "libANGLE/renderer/metal/mtl_state_cache.h"
20 #include "libANGLE/renderer/metal/mtl_utils.h"
21 #include "platform/FeaturesMtl.h"
22 
23 namespace egl
24 {
25 class Surface;
26 }
27 
28 namespace rx
29 {
30 class ShareGroupMtl : public ShareGroupImpl
31 {};
32 
33 class ContextMtl;
34 
35 class DisplayMtl : public DisplayImpl
36 {
37   public:
38     DisplayMtl(const egl::DisplayState &state);
39     ~DisplayMtl() override;
40 
41     egl::Error initialize(egl::Display *display) override;
42     void terminate() override;
43 
44     bool testDeviceLost() override;
45     egl::Error restoreLostDevice(const egl::Display *display) override;
46 
47     std::string getVendorString() const override;
48 
49     DeviceImpl *createDevice() override;
50 
51     egl::Error waitClient(const gl::Context *context) override;
52     egl::Error waitNative(const gl::Context *context, EGLint engine) override;
53 
54     SurfaceImpl *createWindowSurface(const egl::SurfaceState &state,
55                                      EGLNativeWindowType window,
56                                      const egl::AttributeMap &attribs) override;
57     SurfaceImpl *createPbufferSurface(const egl::SurfaceState &state,
58                                       const egl::AttributeMap &attribs) override;
59     SurfaceImpl *createPbufferFromClientBuffer(const egl::SurfaceState &state,
60                                                EGLenum buftype,
61                                                EGLClientBuffer clientBuffer,
62                                                const egl::AttributeMap &attribs) override;
63     SurfaceImpl *createPixmapSurface(const egl::SurfaceState &state,
64                                      NativePixmapType nativePixmap,
65                                      const egl::AttributeMap &attribs) override;
66 
67     ImageImpl *createImage(const egl::ImageState &state,
68                            const gl::Context *context,
69                            EGLenum target,
70                            const egl::AttributeMap &attribs) override;
71 
72     ContextImpl *createContext(const gl::State &state,
73                                gl::ErrorSet *errorSet,
74                                const egl::Config *configuration,
75                                const gl::Context *shareContext,
76                                const egl::AttributeMap &attribs) override;
77 
78     StreamProducerImpl *createStreamProducerD3DTexture(egl::Stream::ConsumerType consumerType,
79                                                        const egl::AttributeMap &attribs) override;
80 
81     ShareGroupImpl *createShareGroup() override;
82 
83     gl::Version getMaxSupportedESVersion() const override;
84     gl::Version getMaxConformantESVersion() const override;
85 
86     EGLSyncImpl *createSync(const egl::AttributeMap &attribs) override;
87 
88     egl::Error makeCurrent(egl::Surface *drawSurface,
89                            egl::Surface *readSurface,
90                            gl::Context *context) override;
91 
92     void populateFeatureList(angle::FeatureList *features) override;
93 
94     bool isValidNativeWindow(EGLNativeWindowType window) const override;
95 
96     egl::ConfigSet generateConfigs() override;
97 
98     std::string getRendererDescription() const;
99     gl::Caps getNativeCaps() const;
100     const gl::TextureCapsMap &getNativeTextureCaps() const;
101     const gl::Extensions &getNativeExtensions() const;
getNativeLimitations()102     const gl::Limitations &getNativeLimitations() const { return mNativeLimitations; }
getFeatures()103     const angle::FeaturesMtl &getFeatures() const { return mFeatures; }
104 
getMetalDevice()105     id<MTLDevice> getMetalDevice() const { return mMetalDevice; }
106 
cmdQueue()107     mtl::CommandQueue &cmdQueue() { return mCmdQueue; }
getFormatTable()108     const mtl::FormatTable &getFormatTable() const { return mFormatTable; }
getUtils()109     mtl::RenderUtils &getUtils() { return mUtils; }
getStateCache()110     mtl::StateCache &getStateCache() { return mStateCache; }
111 
getDefaultShadersLib()112     id<MTLLibrary> getDefaultShadersLib() const { return mDefaultShaders; }
113 
getDepthStencilState(const mtl::DepthStencilDesc & desc)114     id<MTLDepthStencilState> getDepthStencilState(const mtl::DepthStencilDesc &desc)
115     {
116         return mStateCache.getDepthStencilState(getMetalDevice(), desc);
117     }
getSamplerState(const mtl::SamplerDesc & desc)118     id<MTLSamplerState> getSamplerState(const mtl::SamplerDesc &desc)
119     {
120         return mStateCache.getSamplerState(getMetalDevice(), desc);
121     }
122 
getPixelFormat(angle::FormatID angleFormatId)123     const mtl::Format &getPixelFormat(angle::FormatID angleFormatId) const
124     {
125         return mFormatTable.getPixelFormat(angleFormatId);
126     }
127 
128     // See mtl::FormatTable::getVertexFormat()
getVertexFormat(angle::FormatID angleFormatId,bool tightlyPacked)129     const mtl::VertexFormat &getVertexFormat(angle::FormatID angleFormatId,
130                                              bool tightlyPacked) const
131     {
132         return mFormatTable.getVertexFormat(angleFormatId, tightlyPacked);
133     }
134 
135   protected:
136     void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
137     void generateCaps(egl::Caps *outCaps) const override;
138 
139   private:
140     angle::Result initializeImpl(egl::Display *display);
141     void ensureCapsInitialized() const;
142     void initializeCaps() const;
143     void initializeExtensions() const;
144     void initializeTextureCaps() const;
145     void initializeFeatures();
146     angle::Result initializeShaderLibrary();
147 
148     mtl::AutoObjCPtr<id<MTLDevice>> mMetalDevice = nil;
149 
150     mtl::CommandQueue mCmdQueue;
151 
152     mtl::FormatTable mFormatTable;
153     mtl::StateCache mStateCache;
154     mtl::RenderUtils mUtils;
155 
156     // Built-in Shaders
157     mtl::AutoObjCPtr<id<MTLLibrary>> mDefaultShaders = nil;
158 
159     mutable bool mCapsInitialized;
160     mutable gl::TextureCapsMap mNativeTextureCaps;
161     mutable gl::Extensions mNativeExtensions;
162     mutable gl::Caps mNativeCaps;
163     mutable gl::Limitations mNativeLimitations;
164 
165     angle::FeaturesMtl mFeatures;
166 
167     // track whether we initialized (or released) glslang
168     bool mGlslangInitialized;
169 };
170 
171 }  // namespace rx
172 
173 #endif /* LIBANGLE_RENDERER_METAL_DISPLAYMTL_H_ */
174