summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/libANGLE/Display.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/Display.h')
-rw-r--r--gfx/angle/checkout/src/libANGLE/Display.h369
1 files changed, 369 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/Display.h b/gfx/angle/checkout/src/libANGLE/Display.h
new file mode 100644
index 0000000000..1b4e687977
--- /dev/null
+++ b/gfx/angle/checkout/src/libANGLE/Display.h
@@ -0,0 +1,369 @@
+//
+// Copyright 2002 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Display.h: Defines the egl::Display class, representing the abstract
+// display on which graphics are drawn. Implements EGLDisplay.
+// [EGL 1.4] section 2.1.2 page 3.
+
+#ifndef LIBANGLE_DISPLAY_H_
+#define LIBANGLE_DISPLAY_H_
+
+#include <mutex>
+#include <set>
+#include <vector>
+
+#include "libANGLE/AttributeMap.h"
+#include "libANGLE/BlobCache.h"
+#include "libANGLE/Caps.h"
+#include "libANGLE/Config.h"
+#include "libANGLE/Debug.h"
+#include "libANGLE/Error.h"
+#include "libANGLE/LoggingAnnotator.h"
+#include "libANGLE/MemoryProgramCache.h"
+#include "libANGLE/Observer.h"
+#include "libANGLE/Version.h"
+#include "platform/Feature.h"
+#include "platform/FrontendFeatures.h"
+
+namespace angle
+{
+class FrameCaptureShared;
+} // namespace angle
+
+namespace gl
+{
+class Context;
+class TextureManager;
+class SemaphoreManager;
+} // namespace gl
+
+namespace rx
+{
+class DisplayImpl;
+class EGLImplFactory;
+class ShareGroupImpl;
+} // namespace rx
+
+namespace egl
+{
+class Device;
+class Image;
+class Stream;
+class Surface;
+class Sync;
+class Thread;
+
+using SurfaceSet = std::set<Surface *>;
+
+struct DisplayState final : private angle::NonCopyable
+{
+ DisplayState(EGLNativeDisplayType nativeDisplayId);
+ ~DisplayState();
+
+ EGLLabelKHR label;
+ SurfaceSet surfaceSet;
+ std::vector<std::string> featureOverridesEnabled;
+ std::vector<std::string> featureOverridesDisabled;
+ bool featuresAllDisabled;
+ EGLNativeDisplayType displayId;
+};
+
+class ShareGroup final : angle::NonCopyable
+{
+ public:
+ ShareGroup(rx::EGLImplFactory *factory);
+
+ void addRef();
+
+ void release(const egl::Display *display);
+
+ rx::ShareGroupImpl *getImplementation() const { return mImplementation; }
+
+ rx::Serial generateFramebufferSerial() { return mFramebufferSerialFactory.generate(); }
+
+ angle::FrameCaptureShared *getFrameCaptureShared() { return mFrameCaptureShared.get(); }
+
+ protected:
+ ~ShareGroup();
+
+ private:
+ size_t mRefCount;
+ rx::ShareGroupImpl *mImplementation;
+ rx::SerialFactory mFramebufferSerialFactory;
+
+ // Note: we use a raw pointer here so we can exclude frame capture sources from the build.
+ std::unique_ptr<angle::FrameCaptureShared> mFrameCaptureShared;
+};
+
+// Constant coded here as a reasonable limit.
+constexpr EGLAttrib kProgramCacheSizeAbsoluteMax = 0x4000000;
+
+class Display final : public LabeledObject,
+ public angle::ObserverInterface,
+ public angle::NonCopyable
+{
+ public:
+ ~Display() override;
+
+ void setLabel(EGLLabelKHR label) override;
+ EGLLabelKHR getLabel() const override;
+
+ // Observer implementation.
+ void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
+
+ Error initialize();
+ Error terminate(const Thread *thread);
+ // Called before all display state dependent EGL functions. Backends can set up, for example,
+ // thread-specific backend state through this function. Not called for functions that do not
+ // need the state.
+ Error prepareForCall();
+ // Called on eglReleaseThread. Backends can tear down thread-specific backend state through
+ // this function.
+ Error releaseThread();
+
+ static Display *GetDisplayFromDevice(Device *device, const AttributeMap &attribMap);
+ static Display *GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
+ const AttributeMap &attribMap);
+ static Display *GetExistingDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay);
+
+ static const ClientExtensions &GetClientExtensions();
+ static const std::string &GetClientExtensionString();
+
+ std::vector<const Config *> getConfigs(const AttributeMap &attribs) const;
+ std::vector<const Config *> chooseConfig(const AttributeMap &attribs) const;
+
+ Error createWindowSurface(const Config *configuration,
+ EGLNativeWindowType window,
+ const AttributeMap &attribs,
+ Surface **outSurface);
+ Error createPbufferSurface(const Config *configuration,
+ const AttributeMap &attribs,
+ Surface **outSurface);
+ Error createPbufferFromClientBuffer(const Config *configuration,
+ EGLenum buftype,
+ EGLClientBuffer clientBuffer,
+ const AttributeMap &attribs,
+ Surface **outSurface);
+ Error createPixmapSurface(const Config *configuration,
+ NativePixmapType nativePixmap,
+ const AttributeMap &attribs,
+ Surface **outSurface);
+
+ Error createImage(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer buffer,
+ const AttributeMap &attribs,
+ Image **outImage);
+
+ Error createStream(const AttributeMap &attribs, Stream **outStream);
+
+ Error createContext(const Config *configuration,
+ gl::Context *shareContext,
+ const EGLenum clientType,
+ const AttributeMap &attribs,
+ gl::Context **outContext);
+
+ Error createSync(const gl::Context *currentContext,
+ EGLenum type,
+ const AttributeMap &attribs,
+ Sync **outSync);
+
+ Error makeCurrent(gl::Context *previousContext,
+ Surface *drawSurface,
+ Surface *readSurface,
+ gl::Context *context);
+
+ Error destroySurface(Surface *surface);
+ void destroyImage(Image *image);
+ void destroyStream(Stream *stream);
+ Error destroyContext(const Thread *thread, gl::Context *context);
+ Error destroyContextWithSurfaces(const Thread *thread,
+ gl::Context *context,
+ gl::Context *currentContext,
+ Surface *currentDrawSurface,
+ Surface *currentReadSurface);
+ void destroySync(Sync *sync);
+
+ bool isInitialized() const;
+ bool isValidConfig(const Config *config) const;
+ bool isValidContext(const gl::Context *context) const;
+ bool isValidSurface(const Surface *surface) const;
+ bool isValidImage(const Image *image) const;
+ bool isValidStream(const Stream *stream) const;
+ bool isValidSync(const Sync *sync) const;
+ bool isValidNativeWindow(EGLNativeWindowType window) const;
+
+ Error validateClientBuffer(const Config *configuration,
+ EGLenum buftype,
+ EGLClientBuffer clientBuffer,
+ const AttributeMap &attribs) const;
+ Error validateImageClientBuffer(const gl::Context *context,
+ EGLenum target,
+ EGLClientBuffer clientBuffer,
+ const egl::AttributeMap &attribs) const;
+ Error valdiatePixmap(const Config *config,
+ EGLNativePixmapType pixmap,
+ const AttributeMap &attributes) const;
+
+ static bool isValidDisplay(const Display *display);
+ static bool isValidNativeDisplay(EGLNativeDisplayType display);
+ static bool hasExistingWindowSurface(EGLNativeWindowType window);
+
+ bool isDeviceLost() const;
+ bool testDeviceLost();
+ void notifyDeviceLost();
+
+ void setBlobCacheFuncs(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
+ bool areBlobCacheFuncsSet() const { return mBlobCache.areBlobCacheFuncsSet(); }
+ BlobCache &getBlobCache() { return mBlobCache; }
+
+ static EGLClientBuffer GetNativeClientBuffer(const struct AHardwareBuffer *buffer);
+ static Error CreateNativeClientBuffer(const egl::AttributeMap &attribMap,
+ EGLClientBuffer *eglClientBuffer);
+
+ Error waitClient(const gl::Context *context);
+ Error waitNative(const gl::Context *context, EGLint engine);
+
+ const Caps &getCaps() const;
+
+ const DisplayExtensions &getExtensions() const;
+ const std::string &getExtensionString() const;
+ const std::string &getVendorString() const;
+ const std::string &getVersionString() const;
+
+ std::string getBackendRendererDescription() const;
+ std::string getBackendVendorString() const;
+ std::string getBackendVersionString() const;
+
+ EGLint programCacheGetAttrib(EGLenum attrib) const;
+ Error programCacheQuery(EGLint index,
+ void *key,
+ EGLint *keysize,
+ void *binary,
+ EGLint *binarysize);
+ Error programCachePopulate(const void *key,
+ EGLint keysize,
+ const void *binary,
+ EGLint binarysize);
+ EGLint programCacheResize(EGLint limit, EGLenum mode);
+
+ const AttributeMap &getAttributeMap() const { return mAttributeMap; }
+ EGLNativeDisplayType getNativeDisplayId() const { return mState.displayId; }
+
+ rx::DisplayImpl *getImplementation() const { return mImplementation; }
+ Device *getDevice() const;
+ Surface *getWGLSurface() const;
+ EGLenum getPlatform() const { return mPlatform; }
+
+ gl::Version getMaxSupportedESVersion() const;
+
+ const DisplayState &getState() const { return mState; }
+
+ typedef std::set<gl::Context *> ContextSet;
+ const ContextSet &getContextSet() { return mContextSet; }
+
+ const angle::FrontendFeatures &getFrontendFeatures() { return mFrontendFeatures; }
+ void overrideFrontendFeatures(const std::vector<std::string> &featureNames, bool enabled);
+
+ const angle::FeatureList &getFeatures() const { return mFeatures; }
+
+ const char *queryStringi(const EGLint name, const EGLint index);
+
+ EGLAttrib queryAttrib(const EGLint attribute);
+
+ angle::ScratchBuffer requestScratchBuffer();
+ void returnScratchBuffer(angle::ScratchBuffer scratchBuffer);
+
+ angle::ScratchBuffer requestZeroFilledBuffer();
+ void returnZeroFilledBuffer(angle::ScratchBuffer zeroFilledBuffer);
+
+ egl::Error handleGPUSwitch();
+
+ std::mutex &getDisplayGlobalMutex() { return mDisplayGlobalMutex; }
+ std::mutex &getProgramCacheMutex() { return mProgramCacheMutex; }
+
+ // Installs LoggingAnnotator as the global DebugAnnotator, for back-ends that do not implement
+ // their own DebugAnnotator.
+ void setGlobalDebugAnnotator() { gl::InitializeDebugAnnotations(&mAnnotator); }
+
+ private:
+ Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
+
+ void setAttributes(const AttributeMap &attribMap) { mAttributeMap = attribMap; }
+
+ void setupDisplayPlatform(rx::DisplayImpl *impl);
+
+ void updateAttribsFromEnvironment(const AttributeMap &attribMap);
+
+ Error restoreLostDevice();
+ Error releaseContext(gl::Context *context);
+
+ void initDisplayExtensions();
+ void initVendorString();
+ void initVersionString();
+ void initializeFrontendFeatures();
+
+ angle::ScratchBuffer requestScratchBufferImpl(std::vector<angle::ScratchBuffer> *bufferVector);
+ void returnScratchBufferImpl(angle::ScratchBuffer scratchBuffer,
+ std::vector<angle::ScratchBuffer> *bufferVector);
+
+ DisplayState mState;
+ rx::DisplayImpl *mImplementation;
+ angle::ObserverBinding mGPUSwitchedBinding;
+
+ AttributeMap mAttributeMap;
+
+ ConfigSet mConfigSet;
+
+ ContextSet mContextSet;
+
+ typedef std::set<Image *> ImageSet;
+ ImageSet mImageSet;
+
+ typedef std::set<Stream *> StreamSet;
+ StreamSet mStreamSet;
+
+ typedef std::set<Sync *> SyncSet;
+ SyncSet mSyncSet;
+
+ bool mInitialized;
+ bool mDeviceLost;
+
+ Caps mCaps;
+
+ DisplayExtensions mDisplayExtensions;
+ std::string mDisplayExtensionString;
+
+ std::string mVendorString;
+ std::string mVersionString;
+
+ Device *mDevice;
+ Surface *mSurface;
+ EGLenum mPlatform;
+ angle::LoggingAnnotator mAnnotator;
+
+ gl::TextureManager *mTextureManager;
+ gl::SemaphoreManager *mSemaphoreManager;
+ BlobCache mBlobCache;
+ gl::MemoryProgramCache mMemoryProgramCache;
+ size_t mGlobalTextureShareGroupUsers;
+ size_t mGlobalSemaphoreShareGroupUsers;
+
+ angle::FrontendFeatures mFrontendFeatures;
+
+ angle::FeatureList mFeatures;
+
+ std::mutex mScratchBufferMutex;
+ std::vector<angle::ScratchBuffer> mScratchBuffers;
+ std::vector<angle::ScratchBuffer> mZeroFilledBuffers;
+
+ std::mutex mDisplayGlobalMutex;
+ std::mutex mProgramCacheMutex;
+};
+
+} // namespace egl
+
+#endif // LIBANGLE_DISPLAY_H_