Commit 2b5f3b36 by Geoff Lang

Add support for EGL_EXT_client_extensions.

BUG=angle:490 Change-Id: Iafc476cef7a3d11b3bb3640e673c28c6df3cf2a1 Reviewed-on: https://chromium-review.googlesource.com/204566Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 8747afee
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <algorithm> #include <algorithm>
#include <map> #include <map>
#include <vector> #include <vector>
#include <sstream>
#include "common/debug.h" #include "common/debug.h"
#include "common/mathutil.h" #include "common/mathutil.h"
...@@ -112,7 +113,7 @@ bool Display::initialize() ...@@ -112,7 +113,7 @@ bool Display::initialize()
return false; return false;
} }
initExtensionString(); initDisplayExtensionString();
initVendorString(); initVendorString();
return true; return true;
...@@ -500,48 +501,58 @@ bool Display::hasExistingWindowSurface(HWND window) ...@@ -500,48 +501,58 @@ bool Display::hasExistingWindowSurface(HWND window)
return false; return false;
} }
void Display::initExtensionString() std::string Display::generateClientExtensionString()
{ {
bool shareHandleSupported = mRenderer->getShareHandleSupport(); std::vector<std::string> extensions;
mExtensionString = ""; extensions.push_back("EGL_EXT_client_extensions");
std::ostringstream stream;
std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
return stream.str();
}
void Display::initDisplayExtensionString()
{
std::vector<std::string> extensions;
// Multi-vendor (EXT) extensions // Multi-vendor (EXT) extensions
mExtensionString += "EGL_EXT_create_context_robustness "; extensions.push_back("EGL_EXT_create_context_robustness");
// ANGLE-specific extensions // ANGLE-specific extensions
if (shareHandleSupported) if (mRenderer->getShareHandleSupport())
{ {
mExtensionString += "EGL_ANGLE_d3d_share_handle_client_buffer "; extensions.push_back("EGL_ANGLE_d3d_share_handle_client_buffer");
extensions.push_back("EGL_ANGLE_surface_d3d_texture_2d_share_handle");
} }
mExtensionString += "EGL_ANGLE_query_surface_pointer "; extensions.push_back("EGL_ANGLE_query_surface_pointer");
extensions.push_back("EGL_ANGLE_window_fixed_size");
mExtensionString += "EGL_ANGLE_window_fixed_size ";
if (shareHandleSupported)
{
mExtensionString += "EGL_ANGLE_surface_d3d_texture_2d_share_handle ";
}
if (mRenderer->getPostSubBufferSupport()) if (mRenderer->getPostSubBufferSupport())
{ {
mExtensionString += "EGL_NV_post_sub_buffer "; extensions.push_back("EGL_NV_post_sub_buffer");
} }
// TODO: complete support for the EGL_KHR_create_context extension // TODO: complete support for the EGL_KHR_create_context extension
mExtensionString += "EGL_KHR_create_context "; extensions.push_back("EGL_KHR_create_context");
std::string::size_type end = mExtensionString.find_last_not_of(' '); std::ostringstream stream;
if (end != std::string::npos) std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
{ mDisplayExtensionString = stream.str();
mExtensionString.resize(end+1);
}
} }
const char *Display::getExtensionString() const const char *Display::getExtensionString(egl::Display *display)
{ {
return mExtensionString.c_str(); if (display != EGL_NO_DISPLAY)
{
return display->mDisplayExtensionString.c_str();
}
else
{
static std::string clientExtensions = generateClientExtensionString();
return clientExtensions.c_str();
}
} }
void Display::initVendorString() void Display::initVendorString()
......
...@@ -35,6 +35,8 @@ class Display ...@@ -35,6 +35,8 @@ class Display
static egl::Display *getDisplay(EGLNativeDisplayType displayId); static egl::Display *getDisplay(EGLNativeDisplayType displayId);
static const char *getExtensionString(egl::Display *display);
bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig); bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value); bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
...@@ -82,9 +84,12 @@ class Display ...@@ -82,9 +84,12 @@ class Display
rx::Renderer *mRenderer; rx::Renderer *mRenderer;
void initExtensionString(); static std::string generateClientExtensionString();
void initDisplayExtensionString();
std::string mDisplayExtensionString;
void initVendorString(); void initVendorString();
std::string mExtensionString;
std::string mVendorString; std::string mVendorString;
}; };
} }
......
...@@ -169,8 +169,7 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name) ...@@ -169,8 +169,7 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name)
try try
{ {
egl::Display *display = static_cast<egl::Display*>(dpy); egl::Display *display = static_cast<egl::Display*>(dpy);
if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) && !validateDisplay(display))
if (!validateDisplay(display))
{ {
return NULL; return NULL;
} }
...@@ -180,14 +179,14 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name) ...@@ -180,14 +179,14 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name)
case EGL_CLIENT_APIS: case EGL_CLIENT_APIS:
return egl::success("OpenGL_ES"); return egl::success("OpenGL_ES");
case EGL_EXTENSIONS: case EGL_EXTENSIONS:
return egl::success(display->getExtensionString()); return egl::success(egl::Display::getExtensionString(display));
case EGL_VENDOR: case EGL_VENDOR:
return egl::success(display->getVendorString()); return egl::success(display->getVendorString());
case EGL_VERSION: case EGL_VERSION:
return egl::success("1.4 (ANGLE " ANGLE_VERSION_STRING ")"); return egl::success("1.4 (ANGLE " ANGLE_VERSION_STRING ")");
default:
return egl::error(EGL_BAD_PARAMETER, (const char*)NULL);
} }
return egl::error(EGL_BAD_PARAMETER, (const char*)NULL);
} }
catch (...) catch (...)
{ {
......
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