• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2014 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 
7 // DisplayImpl.h: Implementation methods of egl::Display
8 
9 #ifndef LIBANGLE_RENDERER_DISPLAYIMPL_H_
10 #define LIBANGLE_RENDERER_DISPLAYIMPL_H_
11 
12 #include "common/Optional.h"
13 #include "common/angleutils.h"
14 #include "libANGLE/Caps.h"
15 #include "libANGLE/Config.h"
16 #include "libANGLE/Error.h"
17 #include "libANGLE/Observer.h"
18 #include "libANGLE/Stream.h"
19 #include "libANGLE/Version.h"
20 #include "libANGLE/renderer/EGLImplFactory.h"
21 #include "platform/Feature.h"
22 
23 #include <set>
24 #include <vector>
25 
26 namespace angle
27 {
28 struct FrontendFeatures;
29 }  // namespace angle
30 
31 namespace egl
32 {
33 class AttributeMap;
34 class BlobCache;
35 class Display;
36 struct DisplayState;
37 struct Config;
38 class Surface;
39 class ImageSibling;
40 class Thread;
41 }  // namespace egl
42 
43 namespace gl
44 {
45 class Context;
46 }  // namespace gl
47 
48 namespace rx
49 {
50 class SurfaceImpl;
51 class ImageImpl;
52 struct ConfigDesc;
53 class DeviceImpl;
54 class StreamProducerImpl;
55 
56 class DisplayImpl : public EGLImplFactory, public angle::Subject
57 {
58   public:
59     DisplayImpl(const egl::DisplayState &state);
60     ~DisplayImpl() override;
61 
62     virtual egl::Error initialize(egl::Display *display) = 0;
63     virtual void terminate()                             = 0;
64     virtual egl::Error prepareForCall();
65     virtual egl::Error releaseThread();
66 
67     virtual egl::Error makeCurrent(egl::Display *display,
68                                    egl::Surface *drawSurface,
69                                    egl::Surface *readSurface,
70                                    gl::Context *context) = 0;
71 
72     virtual egl::ConfigSet generateConfigs() = 0;
73 
74     virtual bool testDeviceLost()                                     = 0;
75     virtual egl::Error restoreLostDevice(const egl::Display *display) = 0;
76 
77     virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0;
78     virtual egl::Error validateClientBuffer(const egl::Config *configuration,
79                                             EGLenum buftype,
80                                             EGLClientBuffer clientBuffer,
81                                             const egl::AttributeMap &attribs) const;
82     virtual egl::Error validateImageClientBuffer(const gl::Context *context,
83                                                  EGLenum target,
84                                                  EGLClientBuffer clientBuffer,
85                                                  const egl::AttributeMap &attribs) const;
86     virtual egl::Error validatePixmap(const egl::Config *config,
87                                       EGLNativePixmapType pixmap,
88                                       const egl::AttributeMap &attributes) const;
89 
90     virtual std::string getRendererDescription()                  = 0;
91     virtual std::string getVendorString()                         = 0;
92     virtual std::string getVersionString(bool includeFullVersion) = 0;
93 
94     virtual DeviceImpl *createDevice();
95 
96     virtual egl::Error waitClient(const gl::Context *context)                = 0;
97     virtual egl::Error waitNative(const gl::Context *context, EGLint engine) = 0;
98     virtual gl::Version getMaxSupportedESVersion() const                     = 0;
99     virtual gl::Version getMaxConformantESVersion() const                    = 0;
100     const egl::Caps &getCaps() const;
101 
setBlobCacheFuncs(EGLSetBlobFuncANDROID set,EGLGetBlobFuncANDROID get)102     virtual void setBlobCacheFuncs(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get) {}
103 
104     const egl::DisplayExtensions &getExtensions() const;
105 
setBlobCache(egl::BlobCache * blobCache)106     void setBlobCache(egl::BlobCache *blobCache) { mBlobCache = blobCache; }
getBlobCache()107     egl::BlobCache *getBlobCache() const { return mBlobCache; }
108 
initializeFrontendFeatures(angle::FrontendFeatures * features)109     virtual void initializeFrontendFeatures(angle::FrontendFeatures *features) const {}
110 
111     virtual void populateFeatureList(angle::FeatureList *features) = 0;
112 
getState()113     const egl::DisplayState &getState() const { return mState; }
114 
115     virtual egl::Error handleGPUSwitch();
116     virtual egl::Error forceGPUSwitch(EGLint gpuIDHigh, EGLint gpuIDLow);
117 
118     virtual egl::Error waitUntilWorkScheduled();
119 
lockVulkanQueue()120     virtual void lockVulkanQueue() { UNREACHABLE(); }
unlockVulkanQueue()121     virtual void unlockVulkanQueue() { UNREACHABLE(); }
122 
123     virtual angle::NativeWindowSystem getWindowSystem() const;
124 
125     virtual bool supportsDmaBufFormat(EGLint format) const;
126     virtual egl::Error queryDmaBufFormats(EGLint max_formats, EGLint *formats, EGLint *num_formats);
127     virtual egl::Error queryDmaBufModifiers(EGLint format,
128                                             EGLint max_modifiers,
129                                             EGLuint64KHR *modifiers,
130                                             EGLBoolean *external_only,
131                                             EGLint *num_modifiers);
132 
133     virtual egl::Error querySupportedCompressionRates(const egl::Config *configuration,
134                                                       const egl::AttributeMap &attributes,
135                                                       EGLint *rates,
136                                                       EGLint rate_size,
137                                                       EGLint *num_rates) const;
138 
139   protected:
140     const egl::DisplayState &mState;
141 
142   private:
143     virtual void generateExtensions(egl::DisplayExtensions *outExtensions) const = 0;
144     virtual void generateCaps(egl::Caps *outCaps) const                          = 0;
145 
146     mutable bool mExtensionsInitialized;
147     mutable egl::DisplayExtensions mExtensions;
148 
149     mutable bool mCapsInitialized;
150     mutable egl::Caps mCaps;
151 
152     egl::BlobCache *mBlobCache;
153 };
154 
155 }  // namespace rx
156 
157 #endif  // LIBANGLE_RENDERER_DISPLAYIMPL_H_
158