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