Commit 948bbe51 by Jamie Madill Committed by Commit Bot

Redesign robust resource init as a display extension.

Also correct the enum allocation to values that are available to ANGLE. BUG=angleproject:1635 Change-Id: I443f5654aa6a5049b4a1ae4c253cd6473b4e446e Reviewed-on: https://chromium-review.googlesource.com/520002 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent cae72d6a
Name Name
EGL_ANGLE_create_context_robust_resource_initialization.txt EGL_ANGLE_display_robust_resource_initialization.txt
Name Strings Name Strings
EGL_ANGLE_create_context_robust_resource_initialization EGL_ANGLE_display_robust_resource_initialization
Contributors Contributors
...@@ -35,9 +35,12 @@ Dependencies ...@@ -35,9 +35,12 @@ Dependencies
An OpenGL ES implementation supporting ANGLE_robust_resource_initialization An OpenGL ES implementation supporting ANGLE_robust_resource_initialization
or an implementation supporting equivalent functionality is required. or an implementation supporting equivalent functionality is required.
For EGL 1.4 contexts, requires EGL_EXT_client_extensions and
EGL_EXT_platform_base, but funtionality is identical.
Overview Overview
This extension allows creating an OpenGL ES context supporting This extension allows initializing an OpenGL ES Display supporting
robust resource initialization. robust resource initialization.
New Types New Types
...@@ -51,31 +54,39 @@ New Procedures and Functions ...@@ -51,31 +54,39 @@ New Procedures and Functions
New Tokens New Tokens
Accepted as an attribute name in the <*attrib_list> argument to Accepted as an attribute name in the <*attrib_list> argument to
eglCreateContext: eglGetPlatformDisplay:
EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x320F EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453
Additions to the EGL 1.5 Specification Additions to the EGL 1.5 Specification
Add a new section entitled "OpenGL ES Robust Resource Initialization" Add a new section entitled "OpenGL ES Robust Resource Initialization"
to section 3.7.1: to section 3.2:
"If the attribute EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE "If the attribute EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE
is set to EGL_TRUE, a context supporting <robust resource initialization> is set to EGL_TRUE, a Display supporting <robust resource initialization>
will be created. OpenGL ES contexts must support the will be returned. OpenGL ES contexts created on this display must support
ANGLE_robust_resource_initialization extension, or equivalent core API the ANGLE_robust_resource_initialization extension, or equivalent core API
functionality. functionality.
This attribute is supported only for OpenGL ES contexts. If the If the implementation does not support robust resource initialization,
implementation does not support robust resource initialization, and EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE is EGL_TRUE,
context creation will fail. EGL_NO_DISPLAY will be returned.
The default value of EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE The default value of EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE
is EGL_FALSE." is EGL_FALSE."
Issues Issues
None (1) Should this be a Display or Context creation extension?
RESOLVED: Making this a Context creation extension has complications in
the implementation - what happens to resources shared between Contexts
with and without the extension enabled? Also for display-created resources,
such as those used in the D3D11 SwapChain, there's no way to specify if
we want them robustly initialized. Hence it is clearer to specify this
extension as a Display extension.
Revision History Revision History
Version 1, 2015/01/07 - first draft. Version 1, 2015/01/07 - first draft.
Version 2, 2017/03/01 - renamed extension and enum. Version 2, 2017/03/01 - renamed extension and enum.
Version 3, 2017/05/31 - renamed extension and made into display extension.
\ No newline at end of file
...@@ -517,10 +517,10 @@ EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSur ...@@ -517,10 +517,10 @@ EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSur
#define EGL_RECORDABLE_ANDROID 0x3142 #define EGL_RECORDABLE_ANDROID 0x3142
#endif /* EGL_ANDROID_recordable */ #endif /* EGL_ANDROID_recordable */
#ifndef EGL_ANGLE_create_context_robust_resource_initialization #ifndef EGL_ANGLE_display_robust_resource_initialization
#define EGL_ANGLE_create_context_robust_resource_initialization 1 #define EGL_ANGLE_display_robust_resource_initialization 1
#define EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x320F #define EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453
#endif /* EGL_ANGLE_create_context_robust_resource_initialization */ #endif /* EGL_ANGLE_display_robust_resource_initialization */
#ifndef EGL_ANGLE_d3d_share_handle_client_buffer #ifndef EGL_ANGLE_d3d_share_handle_client_buffer
#define EGL_ANGLE_d3d_share_handle_client_buffer 1 #define EGL_ANGLE_d3d_share_handle_client_buffer 1
......
...@@ -874,7 +874,7 @@ GL_APICALL GLboolean GL_APIENTRY glRequestExtensionANGLE (const GLchar *name); ...@@ -874,7 +874,7 @@ GL_APICALL GLboolean GL_APIENTRY glRequestExtensionANGLE (const GLchar *name);
#ifndef GL_ANGLE_robust_resource_initialization #ifndef GL_ANGLE_robust_resource_initialization
#define GL_ANGLE_robust_resource_initialization 1 #define GL_ANGLE_robust_resource_initialization 1
#define GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93A7 #define GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93AB
#endif /* GL_ANGLE_robust_resource_initialization */ #endif /* GL_ANGLE_robust_resource_initialization */
#ifndef GL_CHROMIUM_framebuffer_mixed_samples #ifndef GL_CHROMIUM_framebuffer_mixed_samples
......
...@@ -1075,8 +1075,7 @@ DisplayExtensions::DisplayExtensions() ...@@ -1075,8 +1075,7 @@ DisplayExtensions::DisplayExtensions()
pixelFormatFloat(false), pixelFormatFloat(false),
surfacelessContext(false), surfacelessContext(false),
displayTextureShareGroup(false), displayTextureShareGroup(false),
createContextClientArrays(false), createContextClientArrays(false)
createContextRobustResourceInitialization(false)
{ {
} }
...@@ -1119,7 +1118,6 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -1119,7 +1118,6 @@ std::vector<std::string> DisplayExtensions::getStrings() const
InsertExtensionString("EGL_KHR_surfaceless_context", surfacelessContext, &extensionStrings); InsertExtensionString("EGL_KHR_surfaceless_context", surfacelessContext, &extensionStrings);
InsertExtensionString("EGL_ANGLE_display_texture_share_group", displayTextureShareGroup, &extensionStrings); InsertExtensionString("EGL_ANGLE_display_texture_share_group", displayTextureShareGroup, &extensionStrings);
InsertExtensionString("EGL_ANGLE_create_context_client_arrays", createContextClientArrays, &extensionStrings); InsertExtensionString("EGL_ANGLE_create_context_client_arrays", createContextClientArrays, &extensionStrings);
InsertExtensionString("EGL_ANGLE_create_context_robust_resource_initialization", createContextRobustResourceInitialization, &extensionStrings);
// TODO(jmadill): Enable this when complete. // TODO(jmadill): Enable this when complete.
//InsertExtensionString("KHR_create_context_no_error", createContextNoError, &extensionStrings); //InsertExtensionString("KHR_create_context_no_error", createContextNoError, &extensionStrings);
// clang-format on // clang-format on
...@@ -1154,7 +1152,8 @@ ClientExtensions::ClientExtensions() ...@@ -1154,7 +1152,8 @@ ClientExtensions::ClientExtensions()
deviceCreationD3D11(false), deviceCreationD3D11(false),
x11Visual(false), x11Visual(false),
experimentalPresentPath(false), experimentalPresentPath(false),
clientGetAllProcAddresses(false) clientGetAllProcAddresses(false),
displayRobustResourceInitialization(false)
{ {
} }
...@@ -1177,9 +1176,10 @@ std::vector<std::string> ClientExtensions::getStrings() const ...@@ -1177,9 +1176,10 @@ std::vector<std::string> ClientExtensions::getStrings() const
InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings); InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings);
InsertExtensionString("EGL_ANGLE_experimental_present_path", experimentalPresentPath, &extensionStrings); InsertExtensionString("EGL_ANGLE_experimental_present_path", experimentalPresentPath, &extensionStrings);
InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings); InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings);
InsertExtensionString("EGL_ANGLE_display_robust_resource_initialization", displayRobustResourceInitialization, &extensionStrings);
// clang-format on // clang-format on
return extensionStrings; return extensionStrings;
} }
} } // namespace egl
...@@ -667,9 +667,6 @@ struct DisplayExtensions ...@@ -667,9 +667,6 @@ struct DisplayExtensions
// EGL_ANGLE_create_context_client_arrays // EGL_ANGLE_create_context_client_arrays
bool createContextClientArrays; bool createContextClientArrays;
// EGL_ANGLE_create_context_robust_resource_initialization
bool createContextRobustResourceInitialization;
}; };
struct DeviceExtensions struct DeviceExtensions
...@@ -728,6 +725,9 @@ struct ClientExtensions ...@@ -728,6 +725,9 @@ struct ClientExtensions
// EGL_KHR_client_get_all_proc_addresses // EGL_KHR_client_get_all_proc_addresses
bool clientGetAllProcAddresses; bool clientGetAllProcAddresses;
// EGL_ANGLE_display_robust_resource_initialization
bool displayRobustResourceInitialization;
}; };
} // namespace egl } // namespace egl
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "common/version.h" #include "common/version.h"
#include "libANGLE/Buffer.h" #include "libANGLE/Buffer.h"
#include "libANGLE/Compiler.h" #include "libANGLE/Compiler.h"
#include "libANGLE/Display.h"
#include "libANGLE/Fence.h" #include "libANGLE/Fence.h"
#include "libANGLE/Framebuffer.h" #include "libANGLE/Framebuffer.h"
#include "libANGLE/FramebufferAttachment.h" #include "libANGLE/FramebufferAttachment.h"
...@@ -203,11 +204,6 @@ bool GetClientArraysEnabled(const egl::AttributeMap &attribs) ...@@ -203,11 +204,6 @@ bool GetClientArraysEnabled(const egl::AttributeMap &attribs)
return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE); return (attribs.get(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE, EGL_TRUE) == EGL_TRUE);
} }
bool GetRobustResourceInit(const egl::AttributeMap &attribs)
{
return (attribs.get(EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
}
std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label) std::string GetObjectLabelFromPointer(GLsizei length, const GLchar *label)
{ {
std::string labelName; std::string labelName;
...@@ -248,7 +244,8 @@ Context::Context(rx::EGLImplFactory *implFactory, ...@@ -248,7 +244,8 @@ Context::Context(rx::EGLImplFactory *implFactory,
const Context *shareContext, const Context *shareContext,
TextureManager *shareTextures, TextureManager *shareTextures,
const egl::AttributeMap &attribs, const egl::AttributeMap &attribs,
const egl::DisplayExtensions &displayExtensions) const egl::DisplayExtensions &displayExtensions,
bool robustResourceInit)
: ValidationContext(shareContext, : ValidationContext(shareContext,
shareTextures, shareTextures,
...@@ -284,7 +281,7 @@ Context::Context(rx::EGLImplFactory *implFactory, ...@@ -284,7 +281,7 @@ Context::Context(rx::EGLImplFactory *implFactory,
mGLState.initialize(mCaps, mExtensions, getClientVersion(), GetDebug(attribs), mGLState.initialize(mCaps, mExtensions, getClientVersion(), GetDebug(attribs),
GetBindGeneratesResource(attribs), GetClientArraysEnabled(attribs), GetBindGeneratesResource(attribs), GetClientArraysEnabled(attribs),
GetRobustResourceInit(attribs)); robustResourceInit);
mFenceNVHandleAllocator.setBaseHandle(0); mFenceNVHandleAllocator.setBaseHandle(0);
...@@ -2670,7 +2667,7 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions) ...@@ -2670,7 +2667,7 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions)
// Determine robust resource init availability from EGL. // Determine robust resource init availability from EGL.
mExtensions.robustResourceInitialization = mExtensions.robustResourceInitialization =
displayExtensions.createContextRobustResourceInitialization; egl::Display::GetClientExtensions().displayRobustResourceInitialization;
// Apply implementation limits // Apply implementation limits
mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS); mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
......
...@@ -64,7 +64,8 @@ class Context final : public ValidationContext ...@@ -64,7 +64,8 @@ class Context final : public ValidationContext
const Context *shareContext, const Context *shareContext,
TextureManager *shareTextures, TextureManager *shareTextures,
const egl::AttributeMap &attribs, const egl::AttributeMap &attribs,
const egl::DisplayExtensions &displayExtensions); const egl::DisplayExtensions &displayExtensions,
bool robustResourceInit);
void destroy(egl::Display *display); void destroy(egl::Display *display);
~Context() override; ~Context() override;
......
...@@ -268,13 +268,14 @@ void ANGLESetDefaultDisplayPlatform(angle::EGLDisplayType display) ...@@ -268,13 +268,14 @@ void ANGLESetDefaultDisplayPlatform(angle::EGLDisplayType display)
} // anonymous namespace } // anonymous namespace
// static
Display *Display::GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay, Display *Display::GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
const AttributeMap &attribMap) const AttributeMap &attribMap)
{ {
Display *display = nullptr; Display *display = nullptr;
ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap(); ANGLEPlatformDisplayMap *displays = GetANGLEPlatformDisplayMap();
ANGLEPlatformDisplayMap::const_iterator iter = displays->find(nativeDisplay); const auto &iter = displays->find(nativeDisplay);
if (iter != displays->end()) if (iter != displays->end())
{ {
display = iter->second; display = iter->second;
...@@ -308,7 +309,8 @@ Display *Display::GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay ...@@ -308,7 +309,8 @@ Display *Display::GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay
return display; return display;
} }
Display *Display::GetDisplayFromDevice(Device *device) // static
Display *Display::GetDisplayFromDevice(Device *device, const AttributeMap &attribMap)
{ {
Display *display = nullptr; Display *display = nullptr;
...@@ -330,7 +332,7 @@ Display *Display::GetDisplayFromDevice(Device *device) ...@@ -330,7 +332,7 @@ Display *Display::GetDisplayFromDevice(Device *device)
if (display == nullptr) if (display == nullptr)
{ {
// See if the eglDevice is in use by a Display created using the DEVICE platform // See if the eglDevice is in use by a Display created using the DEVICE platform
DevicePlatformDisplayMap::const_iterator iter = devicePlatformDisplays->find(device); const auto &iter = devicePlatformDisplays->find(device);
if (iter != devicePlatformDisplays->end()) if (iter != devicePlatformDisplays->end())
{ {
display = iter->second; display = iter->second;
...@@ -348,7 +350,7 @@ Display *Display::GetDisplayFromDevice(Device *device) ...@@ -348,7 +350,7 @@ Display *Display::GetDisplayFromDevice(Device *device)
if (!display->isInitialized()) if (!display->isInitialized())
{ {
rx::DisplayImpl *impl = CreateDisplayFromDevice(device, display->getState()); rx::DisplayImpl *impl = CreateDisplayFromDevice(device, display->getState());
display->setAttributes(impl, egl::AttributeMap()); display->setAttributes(impl, attribMap);
} }
return display; return display;
...@@ -714,8 +716,9 @@ Error Display::createContext(const Config *configuration, gl::Context *shareCont ...@@ -714,8 +716,9 @@ Error Display::createContext(const Config *configuration, gl::Context *shareCont
shareTextures = mTextureManager; shareTextures = mTextureManager;
} }
gl::Context *context = new gl::Context(mImplementation, configuration, shareContext, gl::Context *context =
shareTextures, attribs, mDisplayExtensions); new gl::Context(mImplementation, configuration, shareContext, shareTextures, attribs,
mDisplayExtensions, isRobustResourceInitEnabled());
ASSERT(context != nullptr); ASSERT(context != nullptr);
mContextSet.insert(context); mContextSet.insert(context);
...@@ -934,6 +937,9 @@ static ClientExtensions GenerateClientExtensions() ...@@ -934,6 +937,9 @@ static ClientExtensions GenerateClientExtensions()
extensions.clientGetAllProcAddresses = true; extensions.clientGetAllProcAddresses = true;
// TODO(jmadill): Not fully implemented yet, but exposed everywhere.
extensions.displayRobustResourceInitialization = true;
return extensions; return extensions;
} }
...@@ -947,15 +953,18 @@ static std::string GenerateExtensionsString(const T &extensions) ...@@ -947,15 +953,18 @@ static std::string GenerateExtensionsString(const T &extensions)
return stream.str(); return stream.str();
} }
const ClientExtensions &Display::getClientExtensions() // static
const ClientExtensions &Display::GetClientExtensions()
{ {
static const ClientExtensions clientExtensions = GenerateClientExtensions(); static const ClientExtensions clientExtensions = GenerateClientExtensions();
return clientExtensions; return clientExtensions;
} }
const std::string &Display::getClientExtensionString() // static
const std::string &Display::GetClientExtensionString()
{ {
static const std::string clientExtensionsString = GenerateExtensionsString(getClientExtensions()); static const std::string clientExtensionsString =
GenerateExtensionsString(GetClientExtensions());
return clientExtensionsString; return clientExtensionsString;
} }
...@@ -1063,4 +1072,11 @@ gl::Version Display::getMaxSupportedESVersion() const ...@@ -1063,4 +1072,11 @@ gl::Version Display::getMaxSupportedESVersion() const
{ {
return mImplementation->getMaxSupportedESVersion(); return mImplementation->getMaxSupportedESVersion();
} }
bool Display::isRobustResourceInitEnabled() const
{
return (mAttributeMap.get(EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) ==
EGL_TRUE);
}
} // namespace egl } // namespace egl
...@@ -54,12 +54,12 @@ class Display final : angle::NonCopyable ...@@ -54,12 +54,12 @@ class Display final : angle::NonCopyable
Error initialize(); Error initialize();
void terminate(); void terminate();
static egl::Display *GetDisplayFromDevice(Device *device); static egl::Display *GetDisplayFromDevice(Device *device, const AttributeMap &attribMap);
static egl::Display *GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay, static egl::Display *GetDisplayFromNativeDisplay(EGLNativeDisplayType nativeDisplay,
const AttributeMap &attribMap); const AttributeMap &attribMap);
static const ClientExtensions &getClientExtensions(); static const ClientExtensions &GetClientExtensions();
static const std::string &getClientExtensionString(); static const std::string &GetClientExtensionString();
std::vector<const Config*> getConfigs(const egl::AttributeMap &attribs) const; std::vector<const Config*> getConfigs(const egl::AttributeMap &attribs) const;
...@@ -133,6 +133,8 @@ class Display final : angle::NonCopyable ...@@ -133,6 +133,8 @@ class Display final : angle::NonCopyable
const DisplayState &getState() const { return mState; } const DisplayState &getState() const { return mState; }
bool isRobustResourceInitEnabled() const;
private: private:
Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice); Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
......
...@@ -1147,8 +1147,6 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions ...@@ -1147,8 +1147,6 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions
// Contexts are virtualized so textures can be shared globally // Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true; outExtensions->displayTextureShareGroup = true;
outExtensions->createContextRobustResourceInitialization = true;
// getSyncValues requires direct composition. // getSyncValues requires direct composition.
outExtensions->getSyncValues = outExtensions->directComposition; outExtensions->getSyncValues = outExtensions->directComposition;
} }
......
...@@ -275,7 +275,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -275,7 +275,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
void *native_display, void *native_display,
const AttributeMap &attribMap) const AttributeMap &attribMap)
{ {
const ClientExtensions &clientExtensions = Display::getClientExtensions(); const ClientExtensions &clientExtensions = Display::GetClientExtensions();
switch (platform) switch (platform)
{ {
...@@ -308,31 +308,33 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -308,31 +308,33 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
for (const auto &curAttrib : attribMap) for (const auto &curAttrib : attribMap)
{ {
const EGLAttrib value = curAttrib.second;
switch (curAttrib.first) switch (curAttrib.first)
{ {
case EGL_PLATFORM_ANGLE_TYPE_ANGLE: case EGL_PLATFORM_ANGLE_TYPE_ANGLE:
{ {
ANGLE_TRY(ValidatePlatformType(clientExtensions, curAttrib.second)); ANGLE_TRY(ValidatePlatformType(clientExtensions, value));
platformType = curAttrib.second; platformType = value;
break; break;
} }
case EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE: case EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE:
if (curAttrib.second != EGL_DONT_CARE) if (value != EGL_DONT_CARE)
{ {
majorVersion = curAttrib.second; majorVersion = value;
} }
break; break;
case EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE: case EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE:
if (curAttrib.second != EGL_DONT_CARE) if (value != EGL_DONT_CARE)
{ {
minorVersion = curAttrib.second; minorVersion = value;
} }
break; break;
case EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE: case EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE:
switch (curAttrib.second) switch (value)
{ {
case EGL_TRUE: case EGL_TRUE:
case EGL_FALSE: case EGL_FALSE:
...@@ -350,7 +352,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -350,7 +352,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
"EGL_ANGLE_experimental_present_path extension not active"); "EGL_ANGLE_experimental_present_path extension not active");
} }
switch (curAttrib.second) switch (value)
{ {
case EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE: case EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE:
case EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE: case EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE:
...@@ -363,7 +365,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -363,7 +365,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
break; break;
case EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE: case EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE:
switch (curAttrib.second) switch (value)
{ {
case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE: case EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE:
case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE: case EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE:
...@@ -381,7 +383,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -381,7 +383,7 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
"EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE " "EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE "
"attrib"); "attrib");
} }
deviceType = curAttrib.second; deviceType = value;
break; break;
case EGL_PLATFORM_ANGLE_ENABLE_VALIDATION_LAYER_ANGLE: case EGL_PLATFORM_ANGLE_ENABLE_VALIDATION_LAYER_ANGLE:
...@@ -395,13 +397,28 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -395,13 +397,28 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
return Error(EGL_BAD_ATTRIBUTE, return Error(EGL_BAD_ATTRIBUTE,
"Validation can only be enabled for the Vulkan back-end."); "Validation can only be enabled for the Vulkan back-end.");
} }
if (curAttrib.second != EGL_TRUE && curAttrib.second != EGL_FALSE) if (value != EGL_TRUE && value != EGL_FALSE)
{ {
return Error(EGL_BAD_ATTRIBUTE, return Error(EGL_BAD_ATTRIBUTE,
"Validation layer attribute must be EGL_TRUE or EGL_FALSE."); "Validation layer attribute must be EGL_TRUE or EGL_FALSE.");
} }
break; break;
case EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!clientExtensions.displayRobustResourceInitialization)
{
return Error(EGL_BAD_ATTRIBUTE,
"Attribute EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
"requires EGL_ANGLE_display_robust_resource_initialization.");
}
if (value != EGL_TRUE && value != EGL_FALSE)
{
return Error(EGL_BAD_ATTRIBUTE,
"EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
"either EGL_TRUE or EGL_FALSE.");
}
break;
default: default:
break; break;
} }
...@@ -710,21 +727,6 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context ...@@ -710,21 +727,6 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context
} }
break; break;
case EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!display->getExtensions().createContextRobustResourceInitialization)
{
return Error(EGL_BAD_ATTRIBUTE,
"Attribute EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
"requires EGL_ANGLE_create_context_robust_resource_initialization.");
}
if (value != EGL_TRUE && value != EGL_FALSE)
{
return Error(EGL_BAD_ATTRIBUTE,
"EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
"either EGL_TRUE or EGL_FALSE.");
}
break;
default: default:
return Error(EGL_BAD_ATTRIBUTE, "Unknown attribute."); return Error(EGL_BAD_ATTRIBUTE, "Unknown attribute.");
} }
...@@ -1533,7 +1535,7 @@ Error ValidateCreateDeviceANGLE(EGLint device_type, ...@@ -1533,7 +1535,7 @@ Error ValidateCreateDeviceANGLE(EGLint device_type,
void *native_device, void *native_device,
const EGLAttrib *attrib_list) const EGLAttrib *attrib_list)
{ {
const ClientExtensions &clientExtensions = Display::getClientExtensions(); const ClientExtensions &clientExtensions = Display::GetClientExtensions();
if (!clientExtensions.deviceCreation) if (!clientExtensions.deviceCreation)
{ {
return Error(EGL_BAD_ACCESS, "Device creation extension not active"); return Error(EGL_BAD_ACCESS, "Device creation extension not active");
...@@ -1561,7 +1563,7 @@ Error ValidateCreateDeviceANGLE(EGLint device_type, ...@@ -1561,7 +1563,7 @@ Error ValidateCreateDeviceANGLE(EGLint device_type,
Error ValidateReleaseDeviceANGLE(Device *device) Error ValidateReleaseDeviceANGLE(Device *device)
{ {
const ClientExtensions &clientExtensions = Display::getClientExtensions(); const ClientExtensions &clientExtensions = Display::GetClientExtensions();
if (!clientExtensions.deviceCreation) if (!clientExtensions.deviceCreation)
{ {
return Error(EGL_BAD_ACCESS, "Device creation extension not active"); return Error(EGL_BAD_ACCESS, "Device creation extension not active");
......
...@@ -149,7 +149,7 @@ const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name) ...@@ -149,7 +149,7 @@ const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name)
case EGL_EXTENSIONS: case EGL_EXTENSIONS:
if (display == EGL_NO_DISPLAY) if (display == EGL_NO_DISPLAY)
{ {
result = Display::getClientExtensionString().c_str(); result = Display::GetClientExtensionString().c_str();
} }
else else
{ {
...@@ -1203,16 +1203,16 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplay(EGLenum platform, ...@@ -1203,16 +1203,16 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplay(EGLenum platform,
return EGL_NO_DISPLAY; return EGL_NO_DISPLAY;
} }
const auto &attribMap = AttributeMap::CreateFromAttribArray(attrib_list);
if (platform == EGL_PLATFORM_ANGLE_ANGLE) if (platform == EGL_PLATFORM_ANGLE_ANGLE)
{ {
return Display::GetDisplayFromNativeDisplay( return Display::GetDisplayFromNativeDisplay(
gl::bitCast<EGLNativeDisplayType>(native_display), gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
AttributeMap::CreateFromAttribArray(attrib_list));
} }
else if (platform == EGL_PLATFORM_DEVICE_EXT) else if (platform == EGL_PLATFORM_DEVICE_EXT)
{ {
Device *eglDevice = reinterpret_cast<Device *>(native_display); Device *eglDevice = reinterpret_cast<Device *>(native_display);
return Display::GetDisplayFromDevice(eglDevice); return Display::GetDisplayFromDevice(eglDevice, attribMap);
} }
else else
{ {
......
...@@ -145,16 +145,16 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp ...@@ -145,16 +145,16 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp
return EGL_NO_DISPLAY; return EGL_NO_DISPLAY;
} }
const auto &attribMap = AttributeMap::CreateFromIntArray(attrib_list);
if (platform == EGL_PLATFORM_ANGLE_ANGLE) if (platform == EGL_PLATFORM_ANGLE_ANGLE)
{ {
return Display::GetDisplayFromNativeDisplay( return Display::GetDisplayFromNativeDisplay(
gl::bitCast<EGLNativeDisplayType>(native_display), gl::bitCast<EGLNativeDisplayType>(native_display), attribMap);
AttributeMap::CreateFromIntArray(attrib_list));
} }
else if (platform == EGL_PLATFORM_DEVICE_EXT) else if (platform == EGL_PLATFORM_DEVICE_EXT)
{ {
Device *eglDevice = reinterpret_cast<Device *>(native_display); Device *eglDevice = reinterpret_cast<Device *>(native_display);
return Display::GetDisplayFromDevice(eglDevice); return Display::GetDisplayFromDevice(eglDevice, attribMap);
} }
else else
{ {
......
...@@ -23,21 +23,15 @@ class RobustResourceInitTest : public ANGLETest ...@@ -23,21 +23,15 @@ class RobustResourceInitTest : public ANGLETest
setConfigGreenBits(8); setConfigGreenBits(8);
setConfigBlueBits(8); setConfigBlueBits(8);
setConfigAlphaBits(8); setConfigAlphaBits(8);
// Defer context init until the test body.
setDeferContextInit(true);
setRobustResourceInit(true);
} }
bool hasEGLExtension() bool hasEGLExtension()
{ {
EGLDisplay display = getEGLWindow()->getDisplay(); return eglClientExtensionEnabled("EGL_ANGLE_display_robust_resource_initialization");
ASSERT(display != EGL_NO_DISPLAY);
return (eglDisplayExtensionEnabled(
display, "EGL_ANGLE_create_context_robust_resource_initialization"));
} }
bool hasGLExtension() { return extensionEnabled("GL_ANGLE_robust_resource_initialization"); }
bool setup() bool setup()
{ {
if (!hasEGLExtension()) if (!hasEGLExtension())
...@@ -45,27 +39,22 @@ class RobustResourceInitTest : public ANGLETest ...@@ -45,27 +39,22 @@ class RobustResourceInitTest : public ANGLETest
return false; return false;
} }
if (!getEGLWindow()->initializeContext()) TearDown();
{ setRobustResourceInit(true);
EXPECT_TRUE(false); SetUp();
return false;
}
return true; return true;
} }
}; };
// Context creation should fail if EGL_ANGLE_create_context_robust_resource_initialization // Display creation should fail if EGL_ANGLE_display_robust_resource_initialization
// is not available, and succeed otherwise. // is not available, and succeed otherwise.
TEST_P(RobustResourceInitTest, ExtensionInit) TEST_P(RobustResourceInitTest, ExtensionInit)
{ {
if (hasEGLExtension()) if (setup())
{ {
// Context creation shold succeed with robust resource init enabled.
EXPECT_TRUE(getEGLWindow()->initializeContext());
// Robust resource init extension should be available. // Robust resource init extension should be available.
EXPECT_TRUE(extensionEnabled("GL_ANGLE_robust_resource_initialization")); EXPECT_TRUE(hasGLExtension());
// Querying the state value should return true. // Querying the state value should return true.
GLboolean enabled = 0; GLboolean enabled = 0;
...@@ -77,15 +66,8 @@ TEST_P(RobustResourceInitTest, ExtensionInit) ...@@ -77,15 +66,8 @@ TEST_P(RobustResourceInitTest, ExtensionInit)
} }
else else
{ {
// Context creation should fail with robust resource init enabled.
EXPECT_FALSE(getEGLWindow()->initializeContext());
// Context creation should succeed with robust resource init disabled.
setRobustResourceInit(false);
ASSERT_TRUE(getEGLWindow()->initializeGL(GetOSWindow()));
// If context extension string exposed, check queries. // If context extension string exposed, check queries.
if (extensionEnabled("GL_ANGLE_robust_resource_initialization")) if (hasGLExtension())
{ {
GLboolean enabled = 0; GLboolean enabled = 0;
glGetBooleanv(GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE, &enabled); glGetBooleanv(GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE, &enabled);
...@@ -115,11 +97,8 @@ TEST_P(RobustResourceInitTest, QueriesOnNonRobustContext) ...@@ -115,11 +97,8 @@ TEST_P(RobustResourceInitTest, QueriesOnNonRobustContext)
return; return;
} }
setRobustResourceInit(false);
EXPECT_TRUE(getEGLWindow()->initializeContext());
// If context extension string exposed, check queries. // If context extension string exposed, check queries.
ASSERT_TRUE(extensionEnabled("GL_ANGLE_robust_resource_initialization")); ASSERT_TRUE(hasGLExtension());
// Querying robust resource init should return INVALID_ENUM. // Querying robust resource init should return INVALID_ENUM.
GLboolean enabled = 0; GLboolean enabled = 0;
......
...@@ -590,33 +590,26 @@ void ANGLETest::checkD3D11SDKLayersMessages() ...@@ -590,33 +590,26 @@ void ANGLETest::checkD3D11SDKLayersMessages()
#endif #endif
} }
static bool checkExtensionExists(const char *allExtensions, const std::string &extName)
{
const std::string paddedExtensions = std::string(" ") + allExtensions + std::string(" ");
return paddedExtensions.find(std::string(" ") + extName + std::string(" ")) !=
std::string::npos;
}
bool ANGLETest::extensionEnabled(const std::string &extName) bool ANGLETest::extensionEnabled(const std::string &extName)
{ {
return checkExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)), return CheckExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),
extName); extName);
} }
bool ANGLETest::extensionRequestable(const std::string &extName) bool ANGLETest::extensionRequestable(const std::string &extName)
{ {
return checkExtensionExists( return CheckExtensionExists(
reinterpret_cast<const char *>(glGetString(GL_REQUESTABLE_EXTENSIONS_ANGLE)), extName); reinterpret_cast<const char *>(glGetString(GL_REQUESTABLE_EXTENSIONS_ANGLE)), extName);
} }
bool ANGLETest::eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName) bool ANGLETest::eglDisplayExtensionEnabled(EGLDisplay display, const std::string &extName)
{ {
return checkExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName); return CheckExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName);
} }
bool ANGLETest::eglClientExtensionEnabled(const std::string &extName) bool ANGLETest::eglClientExtensionEnabled(const std::string &extName)
{ {
return checkExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName); return EGLWindow::ClientExtensionEnabled(extName);
} }
bool ANGLETest::eglDeviceExtensionEnabled(EGLDeviceEXT device, const std::string &extName) bool ANGLETest::eglDeviceExtensionEnabled(EGLDeviceEXT device, const std::string &extName)
...@@ -624,7 +617,7 @@ bool ANGLETest::eglDeviceExtensionEnabled(EGLDeviceEXT device, const std::string ...@@ -624,7 +617,7 @@ bool ANGLETest::eglDeviceExtensionEnabled(EGLDeviceEXT device, const std::string
PFNEGLQUERYDEVICESTRINGEXTPROC eglQueryDeviceStringEXT = PFNEGLQUERYDEVICESTRINGEXTPROC eglQueryDeviceStringEXT =
reinterpret_cast<PFNEGLQUERYDEVICESTRINGEXTPROC>( reinterpret_cast<PFNEGLQUERYDEVICESTRINGEXTPROC>(
eglGetProcAddress("eglQueryDeviceStringEXT")); eglGetProcAddress("eglQueryDeviceStringEXT"));
return checkExtensionExists(eglQueryDeviceStringEXT(device, EGL_EXTENSIONS), extName); return CheckExtensionExists(eglQueryDeviceStringEXT(device, EGL_EXTENSIONS), extName);
} }
void ANGLETest::setWindowWidth(int width) void ANGLETest::setWindowWidth(int width)
......
...@@ -119,7 +119,7 @@ EGLWindow::EGLWindow(EGLint glesMajorVersion, ...@@ -119,7 +119,7 @@ EGLWindow::EGLWindow(EGLint glesMajorVersion,
mWebGLCompatibility(false), mWebGLCompatibility(false),
mBindGeneratesResource(true), mBindGeneratesResource(true),
mClientArraysEnabled(true), mClientArraysEnabled(true),
mRobustResourceInit(false), mRobustResourceInit(),
mSwapInterval(-1), mSwapInterval(-1),
mSamples(-1), mSamples(-1),
mPlatformMethods(nullptr) mPlatformMethods(nullptr)
...@@ -207,6 +207,20 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow) ...@@ -207,6 +207,20 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow)
displayAttributes.push_back(reinterpret_cast<EGLAttrib>(mPlatformMethods)); displayAttributes.push_back(reinterpret_cast<EGLAttrib>(mPlatformMethods));
} }
if (mRobustResourceInit.valid() &&
!ClientExtensionEnabled("EGL_ANGLE_display_robust_resource_initialization"))
{
// Non-default state requested without the extension present
destroyGL();
return false;
}
if (mRobustResourceInit.valid())
{
displayAttributes.push_back(EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
displayAttributes.push_back(mRobustResourceInit.value() ? EGL_TRUE : EGL_FALSE);
}
displayAttributes.push_back(EGL_NONE); displayAttributes.push_back(EGL_NONE);
mDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE, mDisplay = eglGetPlatformDisplay(EGL_PLATFORM_ANGLE_ANGLE,
...@@ -324,16 +338,6 @@ bool EGLWindow::initializeContext() ...@@ -324,16 +338,6 @@ bool EGLWindow::initializeContext()
return false; return false;
} }
bool hasRobustResourceInit =
strstr(displayExtensions, "EGL_ANGLE_create_context_robust_resource_initialization") !=
nullptr;
if (mRobustResourceInit && !hasRobustResourceInit)
{
// Non-default state requested without the extension present
destroyGL();
return false;
}
eglBindAPI(EGL_OPENGL_ES_API); eglBindAPI(EGL_OPENGL_ES_API);
if (eglGetError() != EGL_SUCCESS) if (eglGetError() != EGL_SUCCESS)
{ {
...@@ -377,12 +381,6 @@ bool EGLWindow::initializeContext() ...@@ -377,12 +381,6 @@ bool EGLWindow::initializeContext()
contextAttributes.push_back(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE); contextAttributes.push_back(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE);
contextAttributes.push_back(mClientArraysEnabled ? EGL_TRUE : EGL_FALSE); contextAttributes.push_back(mClientArraysEnabled ? EGL_TRUE : EGL_FALSE);
} }
if (hasRobustResourceInit)
{
contextAttributes.push_back(EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
contextAttributes.push_back(mRobustResourceInit ? EGL_TRUE : EGL_FALSE);
}
} }
contextAttributes.push_back(EGL_NONE); contextAttributes.push_back(EGL_NONE);
...@@ -476,3 +474,16 @@ EGLBoolean EGLWindow::FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, E ...@@ -476,3 +474,16 @@ EGLBoolean EGLWindow::FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, E
return EGL_FALSE; return EGL_FALSE;
} }
// static
bool EGLWindow::ClientExtensionEnabled(const std::string &extName)
{
return CheckExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName);
}
bool CheckExtensionExists(const char *allExtensions, const std::string &extName)
{
const std::string paddedExtensions = std::string(" ") + allExtensions + std::string(" ");
return paddedExtensions.find(std::string(" ") + extName + std::string(" ")) !=
std::string::npos;
}
...@@ -127,6 +127,8 @@ class ANGLE_EXPORT EGLWindow : angle::NonCopyable ...@@ -127,6 +127,8 @@ class ANGLE_EXPORT EGLWindow : angle::NonCopyable
void destroyGL(); void destroyGL();
bool isGLInitialized() const; bool isGLInitialized() const;
static bool ClientExtensionEnabled(const std::string &extName);
private: private:
EGLConfig mConfig; EGLConfig mConfig;
EGLDisplay mDisplay; EGLDisplay mDisplay;
...@@ -151,11 +153,13 @@ class ANGLE_EXPORT EGLWindow : angle::NonCopyable ...@@ -151,11 +153,13 @@ class ANGLE_EXPORT EGLWindow : angle::NonCopyable
bool mWebGLCompatibility; bool mWebGLCompatibility;
bool mBindGeneratesResource; bool mBindGeneratesResource;
bool mClientArraysEnabled; bool mClientArraysEnabled;
bool mRobustResourceInit; Optional<bool> mRobustResourceInit;
EGLint mSwapInterval; EGLint mSwapInterval;
EGLint mSamples; EGLint mSamples;
Optional<bool> mVulkanLayersEnabled; Optional<bool> mVulkanLayersEnabled;
angle::PlatformMethods *mPlatformMethods; angle::PlatformMethods *mPlatformMethods;
}; };
ANGLE_EXPORT bool CheckExtensionExists(const char *allExtensions, const std::string &extName);
#endif // UTIL_EGLWINDOW_H_ #endif // UTIL_EGLWINDOW_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment