Implement eglQueryContext.
Bug b/37991302
Change-Id: I8a1c28d4a9c8968be3a04da64a19ddd3f5274dd6
Reviewed-on: https://swiftshader-review.googlesource.com/9768
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libEGL/Context.hpp b/src/OpenGL/libEGL/Context.hpp
index da3246c..70a47a6 100644
--- a/src/OpenGL/libEGL/Context.hpp
+++ b/src/OpenGL/libEGL/Context.hpp
@@ -35,7 +35,8 @@
virtual void bindTexImage(Surface *surface) = 0;
virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
- virtual int getClientVersion() const = 0;
+ virtual EGLint getClientVersion() const = 0;
+ virtual EGLint getConfigID() const = 0;
virtual void finish() = 0;
protected:
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index ff30812..b5097ac 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -441,7 +441,7 @@
{
if(libGLES_CM)
{
- context = libGLES_CM->es1CreateContext(this, shareContext);
+ context = libGLES_CM->es1CreateContext(this, shareContext, config);
}
}
else if((clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT) ||
@@ -449,7 +449,7 @@
{
if(libGLESv2)
{
- context = libGLESv2->es2CreateContext(this, shareContext, clientVersion);
+ context = libGLESv2->es2CreateContext(this, shareContext, clientVersion, config);
}
}
else
diff --git a/src/OpenGL/libEGL/libEGL.cpp b/src/OpenGL/libEGL/libEGL.cpp
index 4a1998f..3103abf 100644
--- a/src/OpenGL/libEGL/libEGL.cpp
+++ b/src/OpenGL/libEGL/libEGL.cpp
@@ -871,9 +871,25 @@
return EGL_FALSE;
}
- UNIMPLEMENTED(); // FIXME
+ switch(attribute)
+ {
+ case EGL_CONFIG_ID:
+ *value = context->getConfigID();
+ break;
+ case EGL_CONTEXT_CLIENT_TYPE:
+ *value = egl::getCurrentAPI();
+ break;
+ case EGL_CONTEXT_CLIENT_VERSION:
+ *value = context->getClientVersion();
+ break;
+ case EGL_RENDER_BUFFER:
+ *value = EGL_BACK_BUFFER;
+ break;
+ default:
+ return error(EGL_BAD_ATTRIBUTE, EGL_FALSE);
+ }
- return success(0);
+ return success(EGL_TRUE);
}
EGLBoolean WaitGL(void)
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 1a4ed35..78fcec5 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -37,8 +37,8 @@
namespace es1
{
-Context::Context(egl::Display *const display, const Context *shareContext)
- : egl::Context(display),
+Context::Context(egl::Display *const display, const Context *shareContext, const egl::Config *config)
+ : egl::Context(display), config(config),
modelViewStack(MAX_MODELVIEW_STACK_DEPTH),
projectionStack(MAX_PROJECTION_STACK_DEPTH),
textureStack0(MAX_TEXTURE_STACK_DEPTH),
@@ -321,11 +321,16 @@
markAllStateDirty();
}
-int Context::getClientVersion() const
+EGLint Context::getClientVersion() const
{
return 1;
}
+EGLint Context::getConfigID() const
+{
+ return config->mConfigID;
+}
+
// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw.
void Context::markAllStateDirty()
{
@@ -3470,8 +3475,8 @@
}
-egl::Context *es1CreateContext(egl::Display *display, const egl::Context *shareContext)
+egl::Context *es1CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config)
{
ASSERT(!shareContext || shareContext->getClientVersion() == 1); // Should be checked by eglCreateContext
- return new es1::Context(display, static_cast<const es1::Context*>(shareContext));
+ return new es1::Context(display, static_cast<const es1::Context*>(shareContext), config);
}
diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 24e5a08..63efb74 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -291,14 +291,16 @@
TextureUnit textureUnit[MAX_TEXTURE_UNITS];
};
-class Context : public egl::Context
+class [[clang::lto_visibility_public]] Context : public egl::Context
{
public:
- Context(egl::Display *display, const Context *shareContext);
+ Context(egl::Display *display, const Context *shareContext, const egl::Config *config);
- virtual void makeCurrent(egl::Surface *surface);
- virtual int getClientVersion() const;
- virtual void finish();
+ void makeCurrent(egl::Surface *surface) override;
+ EGLint getClientVersion() const override;
+ EGLint getConfigID() const override;
+
+ void finish() override;
void markAllStateDirty();
@@ -594,6 +596,8 @@
bool cullSkipsDraw(GLenum drawMode);
bool isTriangleMode(GLenum drawMode);
+ const egl::Config *const config;
+
State mState;
gl::BindingPointer<Texture2D> mTexture2DZero;
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
index 08644c6..1c66f18 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.hpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -219,7 +219,7 @@
void (*glDrawTexfOES)(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height);
void (*glDrawTexfvOES)(const GLfloat *coords);
- egl::Context *(*es1CreateContext)(egl::Display *display, const egl::Context *shareContext);
+ egl::Context *(*es1CreateContext)(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
__eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp
index 4840522..036147f 100644
--- a/src/OpenGL/libGLES_CM/main.cpp
+++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -330,7 +330,7 @@
void DrawTexfvOES(const GLfloat *coords);
}
-egl::Context *es1CreateContext(egl::Display *display, const egl::Context *shareContext);
+egl::Context *es1CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 0504a31..00ad92c 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -45,8 +45,8 @@
namespace es2
{
-Context::Context(egl::Display *display, const Context *shareContext, EGLint clientVersion)
- : egl::Context(display), clientVersion(clientVersion)
+Context::Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config)
+ : egl::Context(display), clientVersion(clientVersion), config(config)
{
sw::Context *context = new sw::Context();
device = new es2::Device(context);
@@ -313,6 +313,11 @@
return clientVersion;
}
+EGLint Context::getConfigID() const
+{
+ return config->mConfigID;
+}
+
// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw.
void Context::markAllStateDirty()
{
@@ -4358,8 +4363,8 @@
}
-egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion)
+egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config)
{
ASSERT(!shareContext || shareContext->getClientVersion() == clientVersion); // Should be checked by eglCreateContext
- return new es2::Context(display, static_cast<const es2::Context*>(shareContext), clientVersion);
+ return new es2::Context(display, static_cast<const es2::Context*>(shareContext), clientVersion, config);
}
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index a6c6e71..a8e450a 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -429,10 +429,11 @@
class [[clang::lto_visibility_public]] Context : public egl::Context
{
public:
- Context(egl::Display *display, const Context *shareContext, EGLint clientVersion);
+ Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config);
void makeCurrent(egl::Surface *surface) override;
- virtual EGLint getClientVersion() const;
+ EGLint getClientVersion() const override;
+ EGLint getConfigID() const override;
void markAllStateDirty();
@@ -725,6 +726,7 @@
Query *createQuery(GLuint handle, GLenum type);
const EGLint clientVersion;
+ const egl::Config *const config;
State mState;
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp
index 89811c3..0b9e135 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.hpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -242,7 +242,7 @@
void (*glGenerateMipmapOES)(GLenum target);
void (*glDrawBuffersEXT)(GLsizei n, const GLenum *bufs);
- egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, int clientVersion);
+ egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config);
__eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
diff --git a/src/OpenGL/libGLESv2/main.cpp b/src/OpenGL/libGLESv2/main.cpp
index 28efe8c..de3e7e1 100644
--- a/src/OpenGL/libGLESv2/main.cpp
+++ b/src/OpenGL/libGLESv2/main.cpp
@@ -1338,7 +1338,7 @@
}
}
-egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion);
+egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config);
extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);