Commit 6230dd54 by Martin Radev Committed by Commit Bot

Check for OpenGL ES support when creating context

Support for an OpenGL ES version can come either through OpenGL ES, OpenGL core or available extensions. The context creation should fail if the requested OpenGL ES version is not supported. BUG=angleproject:1477 TEST=angle_end2end_tests Change-Id: I810d004a1bd62f75f162d775d3cf92c4283252a3 Reviewed-on: https://chromium-review.googlesource.com/374338Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent ca05a081
...@@ -996,4 +996,8 @@ Device *Display::getDevice() const ...@@ -996,4 +996,8 @@ Device *Display::getDevice() const
return mDevice; return mDevice;
} }
gl::Version Display::getMaxSupportedESVersion() const
{
return mImplementation->getMaxSupportedESVersion();
}
} }
...@@ -14,10 +14,11 @@ ...@@ -14,10 +14,11 @@
#include <set> #include <set>
#include <vector> #include <vector>
#include "libANGLE/Error.h" #include "libANGLE/AttributeMap.h"
#include "libANGLE/Caps.h" #include "libANGLE/Caps.h"
#include "libANGLE/Config.h" #include "libANGLE/Config.h"
#include "libANGLE/AttributeMap.h" #include "libANGLE/Error.h"
#include "libANGLE/Version.h"
namespace gl namespace gl
{ {
...@@ -111,6 +112,8 @@ class Display final : angle::NonCopyable ...@@ -111,6 +112,8 @@ class Display final : angle::NonCopyable
Device *getDevice() const; Device *getDevice() const;
EGLenum getPlatform() const { return mPlatform; } EGLenum getPlatform() const { return mPlatform; }
gl::Version getMaxSupportedESVersion() const;
private: private:
Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice); Display(EGLenum platform, EGLNativeDisplayType displayId, Device *eglDevice);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "libANGLE/Error.h" #include "libANGLE/Error.h"
#include "libANGLE/renderer/EGLImplFactory.h" #include "libANGLE/renderer/EGLImplFactory.h"
#include "libANGLE/Stream.h" #include "libANGLE/Stream.h"
#include "libANGLE/Version.h"
#include <set> #include <set>
#include <vector> #include <vector>
...@@ -67,7 +68,7 @@ class DisplayImpl : public EGLImplFactory ...@@ -67,7 +68,7 @@ class DisplayImpl : public EGLImplFactory
virtual egl::Error waitNative(EGLint engine, virtual egl::Error waitNative(EGLint engine,
egl::Surface *drawSurface, egl::Surface *drawSurface,
egl::Surface *readSurface) const = 0; egl::Surface *readSurface) const = 0;
virtual gl::Version getMaxSupportedESVersion() const = 0;
const egl::Caps &getCaps() const; const egl::Caps &getCaps() const;
typedef std::set<egl::Surface*> SurfaceSet; typedef std::set<egl::Surface*> SurfaceSet;
......
...@@ -345,4 +345,9 @@ egl::Error DisplayD3D::waitNative(EGLint engine, ...@@ -345,4 +345,9 @@ egl::Error DisplayD3D::waitNative(EGLint engine,
return egl::Error(EGL_SUCCESS); return egl::Error(EGL_SUCCESS);
} }
gl::Version DisplayD3D::getMaxSupportedESVersion() const
{
return mRenderer->getMaxSupportedESVersion();
}
} // namespace rx } // namespace rx
...@@ -68,6 +68,7 @@ class DisplayD3D : public DisplayImpl ...@@ -68,6 +68,7 @@ class DisplayD3D : public DisplayImpl
egl::Error waitNative(EGLint engine, egl::Error waitNative(EGLint engine,
egl::Surface *drawSurface, egl::Surface *drawSurface,
egl::Surface *readSurface) const override; egl::Surface *readSurface) const override;
gl::Version getMaxSupportedESVersion() const override;
private: private:
void generateExtensions(egl::DisplayExtensions *outExtensions) const override; void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "libANGLE/renderer/d3d/VertexDataManager.h" #include "libANGLE/renderer/d3d/VertexDataManager.h"
#include "libANGLE/renderer/d3d/formatutilsD3D.h" #include "libANGLE/renderer/d3d/formatutilsD3D.h"
#include "libANGLE/renderer/d3d/WorkaroundsD3D.h" #include "libANGLE/renderer/d3d/WorkaroundsD3D.h"
#include "libANGLE/Version.h"
//FIXME(jmadill): std::array is currently prohibited by Chromium style guide //FIXME(jmadill): std::array is currently prohibited by Chromium style guide
#include <array> #include <array>
...@@ -243,6 +244,8 @@ class RendererD3D : public BufferFactoryD3D ...@@ -243,6 +244,8 @@ class RendererD3D : public BufferFactoryD3D
// Necessary hack for default framebuffers in D3D. // Necessary hack for default framebuffers in D3D.
virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0; virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0;
virtual gl::Version getMaxSupportedESVersion() const = 0;
protected: protected:
virtual bool getLUID(LUID *adapterLuid) const = 0; virtual bool getLUID(LUID *adapterLuid) const = 0;
virtual void generateCaps(gl::Caps *outCaps, virtual void generateCaps(gl::Caps *outCaps,
......
...@@ -4367,6 +4367,11 @@ gl::Error Renderer11::getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer ...@@ -4367,6 +4367,11 @@ gl::Error Renderer11::getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer
return gl::NoError(); return gl::NoError();
} }
gl::Version Renderer11::getMaxSupportedESVersion() const
{
return gl::Version(d3d11_gl::GetMaximumClientVersion(mRenderer11DeviceCaps.featureLevel), 0);
}
gl::DebugAnnotator *Renderer11::getAnnotator() gl::DebugAnnotator *Renderer11::getAnnotator()
{ {
return mAnnotator; return mAnnotator;
......
...@@ -361,6 +361,8 @@ class Renderer11 : public RendererD3D ...@@ -361,6 +361,8 @@ class Renderer11 : public RendererD3D
gl::Error getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer **bufferOut); gl::Error getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer **bufferOut);
gl::Version getMaxSupportedESVersion() const override;
protected: protected:
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override; gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
......
...@@ -2911,4 +2911,9 @@ FramebufferImpl *Renderer9::createDefaultFramebuffer(const gl::FramebufferState ...@@ -2911,4 +2911,9 @@ FramebufferImpl *Renderer9::createDefaultFramebuffer(const gl::FramebufferState
return new Framebuffer9(state, this); return new Framebuffer9(state, this);
} }
gl::Version Renderer9::getMaxSupportedESVersion() const
{
return gl::Version(2, 0);
}
} // namespace rx } // namespace rx
...@@ -330,6 +330,8 @@ class Renderer9 : public RendererD3D ...@@ -330,6 +330,8 @@ class Renderer9 : public RendererD3D
DebugAnnotator9 *getAnnotator() { return &mAnnotator; } DebugAnnotator9 *getAnnotator() { return &mAnnotator; }
gl::Version getMaxSupportedESVersion() const override;
protected: protected:
gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override; gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd) override;
......
...@@ -86,10 +86,9 @@ egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface, egl::Surface *readS ...@@ -86,10 +86,9 @@ egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface, egl::Surface *readS
return glDrawSurface->makeCurrent(); return glDrawSurface->makeCurrent();
} }
const gl::Version &DisplayGL::getMaxSupportedESVersion() const gl::Version DisplayGL::getMaxSupportedESVersion() const
{ {
ASSERT(mRenderer != nullptr); ASSERT(mRenderer != nullptr);
return mRenderer->getMaxSupportedESVersion(); return mRenderer->getMaxSupportedESVersion();
} }
} }
...@@ -39,10 +39,10 @@ class DisplayGL : public DisplayImpl ...@@ -39,10 +39,10 @@ class DisplayGL : public DisplayImpl
egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override; egl::Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context) override;
virtual egl::Error getDriverVersion(std::string *version) const = 0; virtual egl::Error getDriverVersion(std::string *version) const = 0;
gl::Version getMaxSupportedESVersion() const override;
protected: protected:
RendererGL *getRenderer() const { return mRenderer; }; RendererGL *getRenderer() const { return mRenderer; };
const gl::Version &getMaxSupportedESVersion() const;
private: private:
virtual const FunctionsGL *getFunctionsGL() const = 0; virtual const FunctionsGL *getFunctionsGL() const = 0;
......
...@@ -193,8 +193,8 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM ...@@ -193,8 +193,8 @@ void GenerateCaps(const FunctionsGL *functions, gl::Caps *caps, gl::TextureCapsM
} }
} }
// Start by assuming ES3 support and work down // Start by assuming ES3.1 support and work down
*maxSupportedESVersion = gl::Version(3, 0); *maxSupportedESVersion = gl::Version(3, 1);
// Table 6.28, implementation dependent values // Table 6.28, implementation dependent values
if (functions->isAtLeastGL(gl::Version(4, 3)) || functions->hasGLExtension("GL_ARB_ES3_compatibility") || if (functions->isAtLeastGL(gl::Version(4, 3)) || functions->hasGLExtension("GL_ARB_ES3_compatibility") ||
......
...@@ -148,6 +148,12 @@ StreamProducerImpl *DisplayVk::createStreamProducerD3DTextureNV12( ...@@ -148,6 +148,12 @@ StreamProducerImpl *DisplayVk::createStreamProducerD3DTextureNV12(
return static_cast<StreamProducerImpl *>(0); return static_cast<StreamProducerImpl *>(0);
} }
gl::Version DisplayVk::getMaxSupportedESVersion() const
{
UNIMPLEMENTED();
return gl::Version(0, 0);
}
void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
......
...@@ -70,6 +70,7 @@ class DisplayVk : public DisplayImpl ...@@ -70,6 +70,7 @@ class DisplayVk : public DisplayImpl
StreamProducerImpl *createStreamProducerD3DTextureNV12( StreamProducerImpl *createStreamProducerD3DTextureNV12(
egl::Stream::ConsumerType consumerType, egl::Stream::ConsumerType consumerType,
const egl::AttributeMap &attribs) override; const egl::AttributeMap &attribs) override;
gl::Version getMaxSupportedESVersion() const override;
private: private:
void generateExtensions(egl::DisplayExtensions *outExtensions) const override; void generateExtensions(egl::DisplayExtensions *outExtensions) const override;
......
...@@ -349,6 +349,12 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context ...@@ -349,6 +349,12 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context
{ {
return Error(EGL_BAD_CONFIG); return Error(EGL_BAD_CONFIG);
} }
if (display->getMaxSupportedESVersion() <
gl::Version(static_cast<GLuint>(clientMajorVersion),
static_cast<GLuint>(clientMinorVersion)))
{
return Error(EGL_BAD_CONFIG, "Requested GLES version is not supported.");
}
break; break;
default: default:
return Error(EGL_BAD_CONFIG); return Error(EGL_BAD_CONFIG);
...@@ -387,7 +393,8 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context ...@@ -387,7 +393,8 @@ Error ValidateCreateContext(Display *display, Config *configuration, gl::Context
return Error(EGL_BAD_MATCH); return Error(EGL_BAD_MATCH);
} }
if (shareContext->getClientMajorVersion() != clientMajorVersion) if (shareContext->getClientMajorVersion() != clientMajorVersion ||
shareContext->getClientMinorVersion() != clientMinorVersion)
{ {
return Error(EGL_BAD_CONTEXT); return Error(EGL_BAD_CONTEXT);
} }
......
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