Hash :
0d203aef
Author :
Date :
2022-10-16T10:08:01
EGL: Add ID types for egl::Surface and egl::Image. This is in preparation for using resource maps for Context, Surface and EGLImage. The map change will make it much easier to work with the trace fixture. It will also have a small benefit in safety as we will longer be casting raw pointers for these types. As these objects are used in a lot of places, and simplified C can't handle unordered_map, it's necessary to index the maps by simple packed IDs in capture/replay code. Bug: angleproject:7758 Change-Id: Ib1d19622a4f2a6f0458cc28f5bbe30bb9f349b98 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3957163 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
//
// Copyright 2014 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.
//
// DisplayImpl.h: Implementation methods of egl::Display
#ifndef LIBANGLE_RENDERER_DISPLAYIMPL_H_
#define LIBANGLE_RENDERER_DISPLAYIMPL_H_
#include "common/Optional.h"
#include "common/angleutils.h"
#include "libANGLE/Caps.h"
#include "libANGLE/Config.h"
#include "libANGLE/Error.h"
#include "libANGLE/Observer.h"
#include "libANGLE/Stream.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/EGLImplFactory.h"
#include "platform/Feature.h"
#include <set>
#include <vector>
namespace angle
{
struct FrontendFeatures;
} // namespace angle
namespace egl
{
class AttributeMap;
class BlobCache;
class Display;
struct DisplayState;
struct Config;
class Surface;
class ImageSibling;
class Thread;
} // namespace egl
namespace gl
{
class Context;
} // namespace gl
namespace rx
{
class SurfaceImpl;
class ImageImpl;
struct ConfigDesc;
class DeviceImpl;
class StreamProducerImpl;
class ShareGroupImpl : angle::NonCopyable
{
public:
ShareGroupImpl() : mAnyContextWithRobustness(false) {}
virtual ~ShareGroupImpl() {}
virtual void onDestroy(const egl::Display *display) {}
void onRobustContextAdd() { mAnyContextWithRobustness = true; }
bool hasAnyContextWithRobustness() const { return mAnyContextWithRobustness; }
private:
// Whether any context in the share group has robustness enabled. If any context in the share
// group is robust, any program created in any context of the share group must have robustness
// enabled. This is because programs are shared between the share group contexts.
bool mAnyContextWithRobustness;
};
class DisplayImpl : public EGLImplFactory, public angle::Subject
{
public:
DisplayImpl(const egl::DisplayState &state);
~DisplayImpl() override;
virtual egl::Error initialize(egl::Display *display) = 0;
virtual void terminate() = 0;
virtual egl::Error prepareForCall();
virtual egl::Error releaseThread();
virtual egl::Error makeCurrent(egl::Display *display,
egl::Surface *drawSurface,
egl::Surface *readSurface,
gl::Context *context) = 0;
virtual egl::ConfigSet generateConfigs() = 0;
virtual bool testDeviceLost() = 0;
virtual egl::Error restoreLostDevice(const egl::Display *display) = 0;
virtual bool isValidNativeWindow(EGLNativeWindowType window) const = 0;
virtual egl::Error validateClientBuffer(const egl::Config *configuration,
EGLenum buftype,
EGLClientBuffer clientBuffer,
const egl::AttributeMap &attribs) const;
virtual egl::Error validateImageClientBuffer(const gl::Context *context,
EGLenum target,
EGLClientBuffer clientBuffer,
const egl::AttributeMap &attribs) const;
virtual egl::Error validatePixmap(const egl::Config *config,
EGLNativePixmapType pixmap,
const egl::AttributeMap &attributes) const;
virtual std::string getRendererDescription() = 0;
virtual std::string getVendorString() = 0;
virtual std::string getVersionString(bool includeFullVersion) = 0;
virtual DeviceImpl *createDevice();
virtual egl::Error waitClient(const gl::Context *context) = 0;
virtual egl::Error waitNative(const gl::Context *context, EGLint engine) = 0;
virtual gl::Version getMaxSupportedESVersion() const = 0;
virtual gl::Version getMaxConformantESVersion() const = 0;
// If desktop GL is not supported in any capacity for a given backend, this returns None.
virtual Optional<gl::Version> getMaxSupportedDesktopVersion() const = 0;
const egl::Caps &getCaps() const;
virtual void setBlobCacheFuncs(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get) {}
const egl::DisplayExtensions &getExtensions() const;
void setBlobCache(egl::BlobCache *blobCache) { mBlobCache = blobCache; }
egl::BlobCache *getBlobCache() const { return mBlobCache; }
virtual void initializeFrontendFeatures(angle::FrontendFeatures *features) const {}
virtual void populateFeatureList(angle::FeatureList *features) = 0;
const egl::DisplayState &getState() const { return mState; }
virtual egl::Error handleGPUSwitch();
virtual egl::Error forceGPUSwitch(EGLint gpuIDHigh, EGLint gpuIDLow);
virtual bool isX11() const;
virtual bool isWayland() const;
virtual bool isGBM() const;
virtual bool supportsDmaBufFormat(EGLint format) const;
virtual egl::Error queryDmaBufFormats(EGLint max_formats, EGLint *formats, EGLint *num_formats);
virtual egl::Error queryDmaBufModifiers(EGLint format,
EGLint max_modifiers,
EGLuint64KHR *modifiers,
EGLBoolean *external_only,
EGLint *num_modifiers);
protected:
const egl::DisplayState &mState;
private:
virtual void generateExtensions(egl::DisplayExtensions *outExtensions) const = 0;
virtual void generateCaps(egl::Caps *outCaps) const = 0;
mutable bool mExtensionsInitialized;
mutable egl::DisplayExtensions mExtensions;
mutable bool mCapsInitialized;
mutable egl::Caps mCaps;
egl::BlobCache *mBlobCache;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_DISPLAYIMPL_H_