Hash :
8d23f34e
Author :
Date :
2023-01-18T16:20:05
Reland: DisplayEGL should support targeting specific EGL platforms This is a reland of 01c641d58c7b4e4809163e48f570145af89c4acc Updated changes: The value is used only if non-zero and marked as one of the supported platforms. For the moment the only platform listed as supported is EGL_PLATFORM_SURFACELESS_MESA since it's the only relevant platform value that the EGL_ANGLE_platform_angle extension is listing as acceptable value for the EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE attribute. When validated, and with relevant EGL extensions listed in the client EGL extensions list, a display object for the desired EGL platform is retrieved through the eglGetPlatformDisplayEXT entrypoint. Original change's description: > DisplayEGL should support targeting specific EGL platforms > > DisplayEGL should use the EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE > value, if provided, to target specific platforms when constructing the > native EGL display. > > The value is retrieved from the display attributes map and propagated > to FunctionsEGL::initialize(). If non-zero, and if the > eglGetPlatformDisplayEXT entrypoint is successfully loaded, then a > display object for the desired EGL platform is retrieved. > > Bug: angleproject:7942 > Change-Id: I3d8dd70c4c5c80259ae647dce039cfe741b0cf7d > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4152531 > Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> > Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> > Commit-Queue: Jonah Ryan-Davis <jonahr@google.com> Bug: angleproject:7942 Change-Id: I75212b48e0e0edceef92e38bf68791017fb30a56 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4178310 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@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
//
// Copyright 2016 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.
//
// FunctionsEGL.h: Defines the FunctionsEGL class to load functions and data from EGL
#ifndef LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
#define LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <string>
#include <vector>
#include "libANGLE/Error.h"
namespace rx
{
class FunctionsGL;
class FunctionsEGL
{
public:
FunctionsEGL();
virtual ~FunctionsEGL();
int majorVersion;
int minorVersion;
std::string vendorString;
std::string versionString;
egl::Error initialize(EGLAttrib platformType, EGLNativeDisplayType nativeDisplay);
egl::Error terminate();
virtual void *getProcAddress(const char *name) const = 0;
FunctionsGL *makeFunctionsGL() const;
bool hasExtension(const char *extension) const;
bool hasDmaBufImportModifierFunctions() const;
EGLDisplay getDisplay() const;
EGLint getError() const;
EGLBoolean chooseConfig(EGLint const *attrib_list,
EGLConfig *configs,
EGLint config_size,
EGLint *num_config) const;
EGLBoolean getConfigs(EGLConfig *configs, EGLint config_size, EGLint *num_config) const;
EGLBoolean getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value) const;
EGLSurface getCurrentSurface(EGLint readdraw) const;
EGLContext createContext(EGLConfig config,
EGLContext share_context,
EGLint const *attrib_list) const;
EGLSurface createPbufferSurface(EGLConfig config, const EGLint *attrib_list) const;
EGLSurface createWindowSurface(EGLConfig config,
EGLNativeWindowType win,
const EGLint *attrib_list) const;
EGLBoolean destroyContext(EGLContext context) const;
EGLBoolean destroySurface(EGLSurface surface) const;
EGLBoolean makeCurrent(EGLSurface surface, EGLContext context) const;
const char *queryString(EGLint name) const;
EGLBoolean querySurface(EGLSurface surface, EGLint attribute, EGLint *value) const;
EGLBoolean swapBuffers(EGLSurface surface) const;
EGLBoolean bindTexImage(EGLSurface surface, EGLint buffer) const;
EGLBoolean releaseTexImage(EGLSurface surface, EGLint buffer) const;
EGLBoolean surfaceAttrib(EGLSurface surface, EGLint attribute, EGLint value) const;
EGLBoolean swapInterval(EGLint interval) const;
EGLContext getCurrentContext() const;
EGLImageKHR createImageKHR(EGLContext context,
EGLenum target,
EGLClientBuffer buffer,
const EGLint *attrib_list) const;
EGLBoolean destroyImageKHR(EGLImageKHR image) const;
EGLSyncKHR createSyncKHR(EGLenum type, const EGLint *attrib_list) const;
EGLBoolean destroySyncKHR(EGLSyncKHR sync) const;
EGLint clientWaitSyncKHR(EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) const;
EGLBoolean getSyncAttribKHR(EGLSyncKHR sync, EGLint attribute, EGLint *value) const;
EGLint waitSyncKHR(EGLSyncKHR sync, EGLint flags) const;
EGLBoolean swapBuffersWithDamageKHR(EGLSurface surface,
const EGLint *rects,
EGLint n_rects) const;
EGLBoolean presentationTimeANDROID(EGLSurface surface, EGLnsecsANDROID time) const;
void setBlobCacheFuncsANDROID(EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get) const;
EGLBoolean getCompositorTimingSupportedANDROID(EGLSurface surface, EGLint name) const;
EGLBoolean getCompositorTimingANDROID(EGLSurface surface,
EGLint numTimestamps,
const EGLint *names,
EGLnsecsANDROID *values) const;
EGLBoolean getNextFrameIdANDROID(EGLSurface surface, EGLuint64KHR *frameId) const;
EGLBoolean getFrameTimestampSupportedANDROID(EGLSurface surface, EGLint timestamp) const;
EGLBoolean getFrameTimestampsANDROID(EGLSurface surface,
EGLuint64KHR frameId,
EGLint numTimestamps,
const EGLint *timestamps,
EGLnsecsANDROID *values) const;
EGLint dupNativeFenceFDANDROID(EGLSync sync) const;
EGLint queryDmaBufFormatsEXT(EGLint maxFormats, EGLint *formats, EGLint *numFormats) const;
EGLint queryDmaBufModifiersEXT(EGLint format,
EGLint maxModifiers,
EGLuint64KHR *modifiers,
EGLBoolean *externalOnly,
EGLint *numModifiers) const;
EGLBoolean queryDeviceAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value) const;
const char *queryDeviceStringEXT(EGLDeviceEXT device, EGLint name) const;
EGLBoolean queryDisplayAttribEXT(EGLint attribute, EGLAttrib *value) const;
private:
// So as to isolate from angle we do not include angleutils.h and cannot
// use angle::NonCopyable so we replicated it here instead.
FunctionsEGL(const FunctionsEGL &) = delete;
void operator=(const FunctionsEGL &) = delete;
// Helper mechanism for creating a display for the desired platform type.
EGLDisplay getPlatformDisplay(EGLAttrib platformType, EGLNativeDisplayType nativeDisplay);
// Fallback mechanism for creating a display from a native device object.
EGLDisplay getNativeDisplay(int *major, int *minor);
struct EGLDispatchTable;
EGLDispatchTable *mFnPtrs;
EGLDisplay mEGLDisplay;
std::vector<std::string> mExtensions;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_CROS_FUNCTIONSEGL_H_