Commit b433e872 by Geoff Lang Committed by Commit Bot

Change robust resource init into a context creation attribute.

Enabled support on OpenGL even through the extension is not fully implemented so that testing with Chromium/Passthrough commmand decoder is still possible. BUG=angleproject:1635 Change-Id: Ia417b1779aace1eae19514325701a79cd33f4ef3 Reviewed-on: https://chromium-review.googlesource.com/678479 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent a87121f9
Name Name
ANGLE_robust_resource_initialization.txt ANGLE_robust_resource_initialization
Name Strings Name Strings
ANGLE_robust_resource_intialization GL_ANGLE_robust_resource_intialization
Contributors Contributors
...@@ -21,7 +21,7 @@ Status ...@@ -21,7 +21,7 @@ Status
Version Version
Version 1, January 7, 2015 Version 3, September 19, 2017
Number Number
...@@ -34,7 +34,7 @@ Dependencies ...@@ -34,7 +34,7 @@ Dependencies
This extension is written against the wording of the OpenGL ES This extension is written against the wording of the OpenGL ES
3.1 specification. 3.1 specification.
EGL_ANGLE_create_context_robust_initialization is required to request a EGL_ANGLE_robust_initialization is required to request a
context that supports this extension, and resource initialization. context that supports this extension, and resource initialization.
Overview Overview
...@@ -57,7 +57,7 @@ New Tokens ...@@ -57,7 +57,7 @@ New Tokens
Accepted by the <value> parameter of GetBooleanv, GetIntegerv, Accepted by the <value> parameter of GetBooleanv, GetIntegerv,
GetFloatv, GetDoublev, GetInteger64v, and IsEnabled: GetFloatv, GetDoublev, GetInteger64v, and IsEnabled:
CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93A7 ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x93A7
Additions to Chapter 6 of the OpenGL ES 3.1 Specification (Buffer Additions to Chapter 6 of the OpenGL ES 3.1 Specification (Buffer
Objects) Objects)
...@@ -141,3 +141,4 @@ Revision History ...@@ -141,3 +141,4 @@ Revision History
Version 1, 2015/01/07 - first draft. Version 1, 2015/01/07 - first draft.
Version 2, 2017/03/07 - fixed EGL naming and added IsEnabled. Version 2, 2017/03/07 - fixed EGL naming and added IsEnabled.
Version 3, 2017/09/19 - name cleanup.
Name Name
EGL_ANGLE_display_robust_resource_initialization.txt ANGLE_robust_resource_initialization
Name Strings Name Strings
EGL_ANGLE_display_robust_resource_initialization EGL_ANGLE_robust_resource_initialization
Contributors Contributors
...@@ -21,7 +21,7 @@ Status ...@@ -21,7 +21,7 @@ Status
Version Version
Version 1, January 7, 2015 Version 4, September 19, 2017
Number Number
...@@ -35,13 +35,10 @@ Dependencies ...@@ -35,13 +35,10 @@ 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 initializing an OpenGL ES Display supporting This extension allows creating an OpenGL ES context or EGL surface
robust resource initialization. supporting robust resource initialization.
New Types New Types
...@@ -53,40 +50,72 @@ New Procedures and Functions ...@@ -53,40 +50,72 @@ New Procedures and Functions
New Tokens New Tokens
Accepted as an attribute name in the <*attrib_list> argument to Accepted as an attribute name by eglCreateContext, eglQueryContext,
eglGetPlatformDisplay: eglCreateWindowSurface, eglCreatePbufferSurface, eglCreatePixmapSurface,
and eglQuerySurface:
EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453 EGL_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.2: to section 3.7.1:
"If the attribute EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE "If the attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE
is set to EGL_TRUE, a Display supporting <robust resource initialization> is set to EGL_TRUE, a context supporting <robust resource initialization>
will be returned. OpenGL ES contexts created on this display must support will be created. OpenGL ES contexts must support the
the ANGLE_robust_resource_initialization extension, or equivalent core API ANGLE_robust_resource_initialization extension, or equivalent core API
functionality. functionality. This attribute is supported only for OpenGL ES contexts.
If the implementation does not support robust resource initialization, The default value of EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE
and EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE is EGL_TRUE,
EGL_NO_DISPLAY will be returned.
The default value of EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE
is EGL_FALSE." is EGL_FALSE."
Add a new paragraph to section 3.7.4 "Context Queries" under
eglQueryContext:
"Querying EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE returns if
the context was created using robust initialization."
Add a new paragrah to section 3.5.1 "Creating On-Screen Rendering
Surfaces" and section 3.5.2 "Creating Off-Screen Rendering Surfaces":
"EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE specifies if the pixel
values of the surface are initialized. If its value is EGL_TRUE then all
pixel values in the surface are initialized to zero, otherwise the contents
are undefined. The default value of
EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE is EGL_FALSE."
Add a new paragrah to section 3.5.6 "Surface Attributes" under
eglQuerySurface:
"Querying EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE returns if
the surface was created using robust initialization."
Modify the 2nd paragraph of section 3.10.1 "Posting to a Window":
"... The contents of the color buffer are undefined if the value of the
EGL_SWAP_BEHAVIOR attribute of surface is not EGL_BUFFER_PRESERVED and
the value of the EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE is
EGL_FALSE. ..."
Issues Issues
(1) Should this be a Display or Context creation extension? (1) Should this be a Display or Context creation extension?
RESOLVED: Making this a Context creation extension has complications in RESOLVED (3): Making this a Context creation extension has complications in
the implementation - what happens to resources shared between Contexts the implementation - what happens to resources shared between Contexts
with and without the extension enabled? Also for display-created resources, 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 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 we want them robustly initialized. Hence it is clearer to specify this
extension as a Display extension. extension as a Display extension.
RESOLVED (4): This extension has been moved back to a context/surface
creation attribute. This makes the extension much easier to detect before
the GL context is created.
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. Version 3, 2017/05/31 - renamed extension and made into display extension.
\ No newline at end of file Version 4, 2017/09/19 - renamed extension and changed into a
context/surface creation attribute.
\ No newline at end of file
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
// clang-format off // clang-format off
#ifndef EGL_ANGLE_display_robust_resource_initialization #ifndef EGL_ANGLE_robust_resource_initialization
#define EGL_ANGLE_display_robust_resource_initialization 1 #define EGL_ANGLE_robust_resource_initialization 1
#define EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453 #define EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE 0x3453
#endif /* EGL_ANGLE_display_robust_resource_initialization */ #endif /* EGL_ANGLE_robust_resource_initialization */
#ifndef EGL_ANGLE_keyed_mutex #ifndef EGL_ANGLE_keyed_mutex
#define EGL_ANGLE_keyed_mutex 1 #define EGL_ANGLE_keyed_mutex 1
......
...@@ -29,7 +29,7 @@ GL_APICALL void GL_APIENTRY glRequestExtensionANGLE (const GLchar *name); ...@@ -29,7 +29,7 @@ GL_APICALL void 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 0x93AB #define GL_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
......
...@@ -1087,7 +1087,8 @@ DisplayExtensions::DisplayExtensions() ...@@ -1087,7 +1087,8 @@ DisplayExtensions::DisplayExtensions()
surfacelessContext(false), surfacelessContext(false),
displayTextureShareGroup(false), displayTextureShareGroup(false),
createContextClientArrays(false), createContextClientArrays(false),
programCacheControl(false) programCacheControl(false),
robustResourceInitialization(false)
{ {
} }
...@@ -1131,6 +1132,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -1131,6 +1132,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
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_program_cache_control", programCacheControl, &extensionStrings); InsertExtensionString("EGL_ANGLE_program_cache_control", programCacheControl, &extensionStrings);
InsertExtensionString("EGL_ANGLE_robust_resource_initialization", robustResourceInitialization, &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
...@@ -1165,8 +1167,7 @@ ClientExtensions::ClientExtensions() ...@@ -1165,8 +1167,7 @@ ClientExtensions::ClientExtensions()
deviceCreationD3D11(false), deviceCreationD3D11(false),
x11Visual(false), x11Visual(false),
experimentalPresentPath(false), experimentalPresentPath(false),
clientGetAllProcAddresses(false), clientGetAllProcAddresses(false)
displayRobustResourceInitialization(false)
{ {
} }
...@@ -1189,7 +1190,6 @@ std::vector<std::string> ClientExtensions::getStrings() const ...@@ -1189,7 +1190,6 @@ 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;
......
...@@ -672,6 +672,9 @@ struct DisplayExtensions ...@@ -672,6 +672,9 @@ struct DisplayExtensions
// EGL_ANGLE_program_cache_control // EGL_ANGLE_program_cache_control
bool programCacheControl; bool programCacheControl;
// EGL_ANGLE_robust_resource_initialization
bool robustResourceInitialization;
}; };
struct DeviceExtensions struct DeviceExtensions
...@@ -730,9 +733,6 @@ struct ClientExtensions ...@@ -730,9 +733,6 @@ 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
......
...@@ -210,6 +210,11 @@ bool GetClientArraysEnabled(const egl::AttributeMap &attribs) ...@@ -210,6 +210,11 @@ 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_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;
...@@ -257,8 +262,7 @@ Context::Context(rx::EGLImplFactory *implFactory, ...@@ -257,8 +262,7 @@ Context::Context(rx::EGLImplFactory *implFactory,
TextureManager *shareTextures, TextureManager *shareTextures,
MemoryProgramCache *memoryProgramCache, MemoryProgramCache *memoryProgramCache,
const egl::AttributeMap &attribs, const egl::AttributeMap &attribs,
const egl::DisplayExtensions &displayExtensions, const egl::DisplayExtensions &displayExtensions)
bool robustResourceInit)
: ValidationContext(shareContext, : ValidationContext(shareContext,
shareTextures, shareTextures,
...@@ -289,7 +293,8 @@ Context::Context(rx::EGLImplFactory *implFactory, ...@@ -289,7 +293,8 @@ Context::Context(rx::EGLImplFactory *implFactory,
{ {
mImplementation->setMemoryProgramCache(memoryProgramCache); mImplementation->setMemoryProgramCache(memoryProgramCache);
initCaps(displayExtensions); bool robustResourceInit = GetRobustResourceInit(attribs);
initCaps(displayExtensions, robustResourceInit);
initWorkarounds(); initWorkarounds();
mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs), mGLState.initialize(this, GetDebug(attribs), GetBindGeneratesResource(attribs),
...@@ -2618,7 +2623,7 @@ bool Context::hasActiveTransformFeedback(GLuint program) const ...@@ -2618,7 +2623,7 @@ bool Context::hasActiveTransformFeedback(GLuint program) const
return false; return false;
} }
void Context::initCaps(const egl::DisplayExtensions &displayExtensions) void Context::initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit)
{ {
mCaps = mImplementation->getNativeCaps(); mCaps = mImplementation->getNativeCaps();
...@@ -2666,8 +2671,7 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions) ...@@ -2666,8 +2671,7 @@ void Context::initCaps(const egl::DisplayExtensions &displayExtensions)
mExtensions.robustClientMemory = true; mExtensions.robustClientMemory = true;
// Determine robust resource init availability from EGL. // Determine robust resource init availability from EGL.
mExtensions.robustResourceInitialization = mExtensions.robustResourceInitialization = robustResourceInit;
egl::Display::GetClientExtensions().displayRobustResourceInitialization;
// mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
// supports it. // supports it.
......
...@@ -69,8 +69,7 @@ class Context final : public ValidationContext ...@@ -69,8 +69,7 @@ class Context final : public ValidationContext
TextureManager *shareTextures, TextureManager *shareTextures,
MemoryProgramCache *memoryProgramCache, MemoryProgramCache *memoryProgramCache,
const egl::AttributeMap &attribs, const egl::AttributeMap &attribs,
const egl::DisplayExtensions &displayExtensions, const egl::DisplayExtensions &displayExtensions);
bool robustResourceInit);
egl::Error onDestroy(const egl::Display *display); egl::Error onDestroy(const egl::Display *display);
~Context() override; ~Context() override;
...@@ -973,7 +972,7 @@ class Context final : public ValidationContext ...@@ -973,7 +972,7 @@ class Context final : public ValidationContext
void initVersionStrings(); void initVersionStrings();
void initExtensionStrings(); void initExtensionStrings();
void initCaps(const egl::DisplayExtensions &displayExtensions); void initCaps(const egl::DisplayExtensions &displayExtensions, bool robustResourceInit);
void updateCaps(); void updateCaps();
void initWorkarounds(); void initWorkarounds();
......
...@@ -451,7 +451,7 @@ bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsign ...@@ -451,7 +451,7 @@ bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsign
} }
if (getExtensions().robustResourceInitialization && if (getExtensions().robustResourceInitialization &&
pname == GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE) pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
{ {
*type = GL_BOOL; *type = GL_BOOL;
*numParams = 1; *numParams = 1;
......
...@@ -493,7 +493,7 @@ Error Display::initialize() ...@@ -493,7 +493,7 @@ Error Display::initialize()
mProxyContext.reset(nullptr); mProxyContext.reset(nullptr);
gl::Context *proxyContext = new gl::Context(mImplementation, nullptr, nullptr, nullptr, nullptr, gl::Context *proxyContext = new gl::Context(mImplementation, nullptr, nullptr, nullptr, nullptr,
egl::AttributeMap(), mDisplayExtensions, false); egl::AttributeMap(), mDisplayExtensions);
mProxyContext.reset(proxyContext); mProxyContext.reset(proxyContext);
mInitialized = true; mInitialized = true;
...@@ -757,7 +757,7 @@ Error Display::createContext(const Config *configuration, ...@@ -757,7 +757,7 @@ Error Display::createContext(const Config *configuration,
gl::Context *context = gl::Context *context =
new gl::Context(mImplementation, configuration, shareContext, shareTextures, cachePointer, new gl::Context(mImplementation, configuration, shareContext, shareTextures, cachePointer,
attribs, mDisplayExtensions, isRobustResourceInitEnabled()); attribs, mDisplayExtensions);
ASSERT(context != nullptr); ASSERT(context != nullptr);
mContextSet.insert(context); mContextSet.insert(context);
...@@ -980,9 +980,6 @@ static ClientExtensions GenerateClientExtensions() ...@@ -980,9 +980,6 @@ 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;
} }
...@@ -1119,12 +1116,6 @@ gl::Version Display::getMaxSupportedESVersion() const ...@@ -1119,12 +1116,6 @@ 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);
}
EGLint Display::programCacheGetAttrib(EGLenum attrib) const EGLint Display::programCacheGetAttrib(EGLenum attrib) const
{ {
switch (attrib) switch (attrib)
......
...@@ -158,8 +158,6 @@ class Display final : angle::NonCopyable ...@@ -158,8 +158,6 @@ class Display final : angle::NonCopyable
const DisplayState &getState() const { return mState; } const DisplayState &getState() const { return mState; }
bool isRobustResourceInitEnabled() const;
gl::Context *getProxyContext() const { return mProxyContext.get(); } gl::Context *getProxyContext() const { return mProxyContext.get(); }
private: private:
......
...@@ -728,7 +728,7 @@ bool State::getEnableFeature(GLenum feature) const ...@@ -728,7 +728,7 @@ bool State::getEnableFeature(GLenum feature) const
return areClientArraysEnabled(); return areClientArraysEnabled();
case GL_FRAMEBUFFER_SRGB_EXT: case GL_FRAMEBUFFER_SRGB_EXT:
return getFramebufferSRGB(); return getFramebufferSRGB();
case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE: case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
return mRobustResourceInit; return mRobustResourceInit;
case GL_PROGRAM_CACHE_ENABLED_ANGLE: case GL_PROGRAM_CACHE_ENABLED_ANGLE:
return mProgramBinaryCacheEnabled; return mProgramBinaryCacheEnabled;
...@@ -1735,7 +1735,7 @@ void State::getBooleanv(GLenum pname, GLboolean *params) ...@@ -1735,7 +1735,7 @@ void State::getBooleanv(GLenum pname, GLboolean *params)
case GL_FRAMEBUFFER_SRGB_EXT: case GL_FRAMEBUFFER_SRGB_EXT:
*params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE; *params = getFramebufferSRGB() ? GL_TRUE : GL_FALSE;
break; break;
case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE: case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
*params = mRobustResourceInit ? GL_TRUE : GL_FALSE; *params = mRobustResourceInit ? GL_TRUE : GL_FALSE;
break; break;
case GL_PROGRAM_CACHE_ENABLED_ANGLE: case GL_PROGRAM_CACHE_ENABLED_ANGLE:
......
...@@ -80,6 +80,9 @@ Surface::Surface(EGLint surfaceType, const egl::Config *config, const AttributeM ...@@ -80,6 +80,9 @@ Surface::Surface(EGLint surfaceType, const egl::Config *config, const AttributeM
mDirectComposition = (attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE); mDirectComposition = (attributes.get(EGL_DIRECT_COMPOSITION_ANGLE, EGL_FALSE) == EGL_TRUE);
mRobustResourceInitialization =
(attributes.get(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE, EGL_FALSE) == EGL_TRUE);
mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE); mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE);
if (mFixedSize) if (mFixedSize)
{ {
......
...@@ -123,6 +123,8 @@ class Surface : public gl::FramebufferAttachmentObject ...@@ -123,6 +123,8 @@ class Surface : public gl::FramebufferAttachmentObject
gl::InitState initState(const gl::ImageIndex &imageIndex) const override; gl::InitState initState(const gl::ImageIndex &imageIndex) const override;
void setInitState(const gl::ImageIndex &imageIndex, gl::InitState initState) override; void setInitState(const gl::ImageIndex &imageIndex, gl::InitState initState) override;
bool isRobustResourceInitEnabled() const { return mRobustResourceInitialization; }
protected: protected:
Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes); Surface(EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes);
virtual ~Surface(); virtual ~Surface();
...@@ -160,6 +162,8 @@ class Surface : public gl::FramebufferAttachmentObject ...@@ -160,6 +162,8 @@ class Surface : public gl::FramebufferAttachmentObject
bool mDirectComposition; bool mDirectComposition;
bool mRobustResourceInitialization;
EGLenum mTextureFormat; EGLenum mTextureFormat;
EGLenum mTextureTarget; EGLenum mTextureTarget;
......
...@@ -1605,6 +1605,9 @@ void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *va ...@@ -1605,6 +1605,9 @@ void QueryContextAttrib(const gl::Context *context, EGLint attribute, EGLint *va
case EGL_RENDER_BUFFER: case EGL_RENDER_BUFFER:
*value = context->getRenderBuffer(); *value = context->getRenderBuffer();
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
*value = context->isRobustResourceInitEnabled();
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
...@@ -1701,6 +1704,9 @@ void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value) ...@@ -1701,6 +1704,9 @@ void QuerySurfaceAttrib(const Surface *surface, EGLint attribute, EGLint *value)
case EGL_DIRECT_COMPOSITION_ANGLE: case EGL_DIRECT_COMPOSITION_ANGLE:
*value = surface->directComposition(); *value = surface->directComposition();
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
*value = surface->isRobustResourceInitEnabled();
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
...@@ -1214,6 +1214,9 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions ...@@ -1214,6 +1214,9 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions
// D3D11 can be used without a swap chain // D3D11 can be used without a swap chain
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
// All D3D feature levels support robust resource init
outExtensions->robustResourceInitialization = true;
} }
gl::Error Renderer11::flush() gl::Error Renderer11::flush()
......
...@@ -577,6 +577,8 @@ void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions) ...@@ -577,6 +577,8 @@ void Renderer9::generateDisplayExtensions(egl::DisplayExtensions *outExtensions)
// D3D9 can be used without an output surface // D3D9 can be used without an output surface
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
outExtensions->robustResourceInitialization = true;
} }
void Renderer9::startScene() void Renderer9::startScene()
......
...@@ -109,6 +109,13 @@ gl::Version DisplayGL::getMaxSupportedESVersion() const ...@@ -109,6 +109,13 @@ gl::Version DisplayGL::getMaxSupportedESVersion() const
return mRenderer->getMaxSupportedESVersion(); return mRenderer->getMaxSupportedESVersion();
} }
void DisplayGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
{
// Advertise robust resource initialization on all OpenGL backends for testing even though it is
// not fully implemented.
outExtensions->robustResourceInitialization = true;
}
egl::Error DisplayGL::makeCurrentSurfaceless(gl::Context *context) egl::Error DisplayGL::makeCurrentSurfaceless(gl::Context *context)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
......
...@@ -48,6 +48,8 @@ class DisplayGL : public DisplayImpl ...@@ -48,6 +48,8 @@ class DisplayGL : public DisplayImpl
protected: protected:
RendererGL *getRenderer() const { return mRenderer; }; RendererGL *getRenderer() const { return mRenderer; };
void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
private: private:
virtual const FunctionsGL *getFunctionsGL() const = 0; virtual const FunctionsGL *getFunctionsGL() const = 0;
virtual egl::Error makeCurrentSurfaceless(gl::Context *context); virtual egl::Error makeCurrentSurfaceless(gl::Context *context);
......
...@@ -249,6 +249,8 @@ void DisplayCGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -249,6 +249,8 @@ void DisplayCGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
// Contexts are virtualized so textures can be shared globally // Contexts are virtualized so textures can be shared globally
outExtensions->displayTextureShareGroup = true; outExtensions->displayTextureShareGroup = true;
DisplayGL::generateExtensions(outExtensions);
} }
void DisplayCGL::generateCaps(egl::Caps *outCaps) const void DisplayCGL::generateCaps(egl::Caps *outCaps) const
......
...@@ -110,6 +110,8 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -110,6 +110,8 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
// Surfaceless contexts are emulated even if there is no native support. // Surfaceless contexts are emulated even if there is no native support.
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
DisplayGL::generateExtensions(outExtensions);
} }
void DisplayEGL::generateCaps(egl::Caps *outCaps) const void DisplayEGL::generateCaps(egl::Caps *outCaps) const
......
...@@ -791,6 +791,8 @@ void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -791,6 +791,8 @@ void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->displayTextureShareGroup = true; outExtensions->displayTextureShareGroup = true;
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
DisplayGL::generateExtensions(outExtensions);
} }
void DisplayGLX::generateCaps(egl::Caps *outCaps) const void DisplayGLX::generateCaps(egl::Caps *outCaps) const
......
...@@ -625,6 +625,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -625,6 +625,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->displayTextureShareGroup = true; outExtensions->displayTextureShareGroup = true;
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
DisplayGL::generateExtensions(outExtensions);
} }
void DisplayWGL::generateCaps(egl::Caps *outCaps) const void DisplayWGL::generateCaps(egl::Caps *outCaps) const
......
...@@ -206,6 +206,7 @@ void DisplayNULL::generateExtensions(egl::DisplayExtensions *outExtensions) cons ...@@ -206,6 +206,7 @@ void DisplayNULL::generateExtensions(egl::DisplayExtensions *outExtensions) cons
outExtensions->displayTextureShareGroup = true; outExtensions->displayTextureShareGroup = true;
outExtensions->createContextClientArrays = true; outExtensions->createContextClientArrays = true;
outExtensions->programCacheControl = true; outExtensions->programCacheControl = true;
outExtensions->robustResourceInitialization = true;
} }
void DisplayNULL::generateCaps(egl::Caps *outCaps) const void DisplayNULL::generateCaps(egl::Caps *outCaps) const
......
...@@ -398,21 +398,6 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform, ...@@ -398,21 +398,6 @@ Error ValidateGetPlatformDisplayCommon(EGLenum platform,
} }
break; break;
case EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!clientExtensions.displayRobustResourceInitialization)
{
return EglBadAttribute()
<< "Attribute EGL_DISPLAY_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
"requires EGL_ANGLE_display_robust_resource_initialization.";
}
if (value != EGL_TRUE && value != EGL_FALSE)
{
return EglBadAttribute() << "EGL_DISPLAY_ROBUST_RESOURCE_"
"INITIALIZATION_ANGLE must be either "
"EGL_TRUE or EGL_FALSE.";
}
break;
default: default:
break; break;
} }
...@@ -726,6 +711,19 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context ...@@ -726,6 +711,19 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context
} }
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!display->getExtensions().robustResourceInitialization)
{
return EglBadAttribute() << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
"requires EGL_ANGLE_robust_resource_initialization.";
}
if (value != EGL_TRUE && value != EGL_FALSE)
{
return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
"either EGL_TRUE or EGL_FALSE.";
}
break;
default: default:
return EglBadAttribute() << "Unknown attribute."; return EglBadAttribute() << "Unknown attribute.";
} }
...@@ -875,6 +873,19 @@ Error ValidateCreateWindowSurface(Display *display, Config *config, EGLNativeWin ...@@ -875,6 +873,19 @@ Error ValidateCreateWindowSurface(Display *display, Config *config, EGLNativeWin
} }
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!display->getExtensions().robustResourceInitialization)
{
return EglBadAttribute() << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
"requires EGL_ANGLE_robust_resource_initialization.";
}
if (value != EGL_TRUE && value != EGL_FALSE)
{
return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
"either EGL_TRUE or EGL_FALSE.";
}
break;
default: default:
return EglBadAttribute(); return EglBadAttribute();
} }
...@@ -953,6 +964,19 @@ Error ValidateCreatePbufferSurface(Display *display, Config *config, const Attri ...@@ -953,6 +964,19 @@ Error ValidateCreatePbufferSurface(Display *display, Config *config, const Attri
} }
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!display->getExtensions().robustResourceInitialization)
{
return EglBadAttribute() << "Attribute EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE "
"requires EGL_ANGLE_robust_resource_initialization.";
}
if (value != EGL_TRUE && value != EGL_FALSE)
{
return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE must be "
"either EGL_TRUE or EGL_FALSE.";
}
break;
default: default:
return EglBadAttribute(); return EglBadAttribute();
} }
...@@ -2426,6 +2450,15 @@ Error ValidateQuerySurface(const Display *display, ...@@ -2426,6 +2450,15 @@ Error ValidateQuerySurface(const Display *display,
} }
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!display->getExtensions().robustResourceInitialization)
{
return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
"used without EGL_ANGLE_robust_resource_initialization "
"support.";
}
break;
default: default:
return EglBadAttribute() << "Invalid surface attribute."; return EglBadAttribute() << "Invalid surface attribute.";
} }
...@@ -2449,6 +2482,15 @@ Error ValidateQueryContext(const Display *display, ...@@ -2449,6 +2482,15 @@ Error ValidateQueryContext(const Display *display,
case EGL_RENDER_BUFFER: case EGL_RENDER_BUFFER:
break; break;
case EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
if (!display->getExtensions().robustResourceInitialization)
{
return EglBadAttribute() << "EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE cannot be "
"used without EGL_ANGLE_robust_resource_initialization "
"support.";
}
break;
default: default:
return EglBadAttribute() << "Invalid context attribute."; return EglBadAttribute() << "Invalid context attribute.";
} }
......
...@@ -788,7 +788,7 @@ bool ValidCap(const Context *context, GLenum cap, bool queryOnly) ...@@ -788,7 +788,7 @@ bool ValidCap(const Context *context, GLenum cap, bool queryOnly)
case GL_SAMPLE_MASK: case GL_SAMPLE_MASK:
return context->getClientVersion() >= Version(3, 1); return context->getClientVersion() >= Version(3, 1);
case GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE: case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
return queryOnly && context->getExtensions().robustResourceInitialization; return queryOnly && context->getExtensions().robustResourceInitialization;
default: default:
......
...@@ -210,20 +210,6 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow) ...@@ -210,20 +210,6 @@ 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,
...@@ -291,6 +277,14 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow) ...@@ -291,6 +277,14 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow)
surfaceAttributes.push_back(EGL_TRUE); surfaceAttributes.push_back(EGL_TRUE);
} }
bool hasRobustResourceInit =
strstr(displayExtensions, "EGL_ANGLE_robust_resource_initialization") != nullptr;
if (hasRobustResourceInit && mRobustResourceInit.valid())
{
surfaceAttributes.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
surfaceAttributes.push_back(mRobustResourceInit.value() ? EGL_TRUE : EGL_FALSE);
}
surfaceAttributes.push_back(EGL_NONE); surfaceAttributes.push_back(EGL_NONE);
mSurface = eglCreateWindowSurface(mDisplay, mConfig, osWindow->getNativeWindow(), &surfaceAttributes[0]); mSurface = eglCreateWindowSurface(mDisplay, mConfig, osWindow->getNativeWindow(), &surfaceAttributes[0]);
...@@ -411,6 +405,14 @@ bool EGLWindow::initializeContext() ...@@ -411,6 +405,14 @@ bool EGLWindow::initializeContext()
contextAttributes.push_back(EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE); contextAttributes.push_back(EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE);
contextAttributes.push_back(mContextProgramCacheEnabled.value() ? EGL_TRUE : EGL_FALSE); contextAttributes.push_back(mContextProgramCacheEnabled.value() ? EGL_TRUE : EGL_FALSE);
} }
bool hasRobustResourceInit =
strstr(displayExtensions, "EGL_ANGLE_robust_resource_initialization") != nullptr;
if (hasRobustResourceInit && mRobustResourceInit.valid())
{
contextAttributes.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
contextAttributes.push_back(mRobustResourceInit.value() ? EGL_TRUE : EGL_FALSE);
}
} }
contextAttributes.push_back(EGL_NONE); contextAttributes.push_back(EGL_NONE);
......
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