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 @@
#include <algorithm>
#include <map>
#include <vector>
#include <sstream>
#include "common/debug.h"
#include "common/mathutil.h"
......@@ -112,7 +113,7 @@ bool Display::initialize()
return false;
}
initExtensionString();
initDisplayExtensionString();
initVendorString();
return true;
......@@ -500,48 +501,58 @@ bool Display::hasExistingWindowSurface(HWND window)
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
mExtensionString += "EGL_EXT_create_context_robustness ";
extensions.push_back("EGL_EXT_create_context_robustness");
// 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 ";
mExtensionString += "EGL_ANGLE_window_fixed_size ";
if (shareHandleSupported)
{
mExtensionString += "EGL_ANGLE_surface_d3d_texture_2d_share_handle ";
}
extensions.push_back("EGL_ANGLE_query_surface_pointer");
extensions.push_back("EGL_ANGLE_window_fixed_size");
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
mExtensionString += "EGL_KHR_create_context ";
extensions.push_back("EGL_KHR_create_context");
std::string::size_type end = mExtensionString.find_last_not_of(' ');
if (end != std::string::npos)
{
mExtensionString.resize(end+1);
}
std::ostringstream stream;
std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
mDisplayExtensionString = stream.str();
}
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()
......
......@@ -35,6 +35,8 @@ class Display
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 getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
......@@ -82,9 +84,12 @@ class Display
rx::Renderer *mRenderer;
void initExtensionString();
static std::string generateClientExtensionString();
void initDisplayExtensionString();
std::string mDisplayExtensionString;
void initVendorString();
std::string mExtensionString;
std::string mVendorString;
};
}
......
......@@ -169,8 +169,7 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name)
try
{
egl::Display *display = static_cast<egl::Display*>(dpy);
if (!validateDisplay(display))
if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) && !validateDisplay(display))
{
return NULL;
}
......@@ -180,15 +179,15 @@ const char *__stdcall eglQueryString(EGLDisplay dpy, EGLint name)
case EGL_CLIENT_APIS:
return egl::success("OpenGL_ES");
case EGL_EXTENSIONS:
return egl::success(display->getExtensionString());
return egl::success(egl::Display::getExtensionString(display));
case EGL_VENDOR:
return egl::success(display->getVendorString());
case EGL_VERSION:
return egl::success("1.4 (ANGLE " ANGLE_VERSION_STRING ")");
}
default:
return egl::error(EGL_BAD_PARAMETER, (const char*)NULL);
}
}
catch (...)
{
return egl::error(EGL_BAD_ALLOC, (const char*)NULL);
......
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