Commit 591e6afe by Geoff Lang

Add support for ANGLE_platform_angle.

BUG=angle:490 Change-Id: If3c897a9ae3d27b96e4b9bf9475a9ac23a1090ba Reviewed-on: https://chromium-review.googlesource.com/185396Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 78b1acdb
......@@ -438,6 +438,26 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu
#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */
#ifndef EGL_ANGLE_platform_angle
#define EGL_ANGLE_platform_angle 1
#define EGL_PLATFORM_ANGLE_ANGLE 0x3201
#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3202
#define EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE 0x3203
#endif /* EGL_ANGLE_platform_angle */
#ifndef EGL_ANGLE_platform_angle_d3d
#define EGL_ANGLE_platform_angle_d3d 1
#define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3204
#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3205
#define EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE 0x3206
#endif /* EGL_ANGLE_platform_angle_d3d */
#ifndef EGL_ANGLE_platform_angle_opengl
#define EGL_ANGLE_platform_angle_opengl 1
#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x3207
#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x3208
#endif /* EGL_ANGLE_platform_angle_opengl */
#ifndef EGL_ARM_pixmap_multisample_discard
#define EGL_ARM_pixmap_multisample_discard 1
#define EGL_DISCARD_SAMPLES_ARM 0x3286
......
......@@ -46,7 +46,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<MinimalRebuild>false</MinimalRebuild>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;_HAS_EXCEPTIONS=0;NOMINMAX;GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;ANGLE_ENABLE_PERF;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;_HAS_EXCEPTIONS=0;NOMINMAX;GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;ANGLE_ENABLE_D3D9;ANGLE_ENABLE_D3D11;ANGLE_ENABLE_PERF;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<TreatWarningAsError>true</TreatWarningAsError>
......@@ -70,7 +70,7 @@
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\src;..\..\include;..\..\src\libGLESv2;$(OutDir)obj\global_intermediate\angle;C:\Program Files (x86)\Windows Kits\8.0\Include\shared;C:\Program Files (x86)\Windows Kits\8.0\Include\um;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;ANGLE_ENABLE_PERF;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;ANGLE_ENABLE_D3D9;ANGLE_ENABLE_D3D11;ANGLE_ENABLE_PERF;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
......@@ -83,7 +83,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<MinimalRebuild>false</MinimalRebuild>
<Optimization>MaxSpeed</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;_HAS_EXCEPTIONS=0;NOMINMAX;GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_WARNINGS;_HAS_EXCEPTIONS=0;NOMINMAX;GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;ANGLE_ENABLE_D3D9;ANGLE_ENABLE_D3D11;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<TreatWarningAsError>true</TreatWarningAsError>
......@@ -107,7 +107,7 @@
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\src;..\..\include;..\..\src\libGLESv2;$(OutDir)obj\global_intermediate\angle;C:\Program Files (x86)\Windows Kits\8.0\Include\shared;C:\Program Files (x86)\Windows Kits\8.0\Include\um;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>GL_APICALL=;GL_GLEXT_PROTOTYPES=;EGLAPI=;ANGLE_ENABLE_D3D9;ANGLE_ENABLE_D3D11;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
......
......@@ -5,6 +5,8 @@
{
'variables':
{
'angle_enable_d3d9%': 1,
'angle_enable_d3d11%': 1,
# This file list is shared with the GN build.
'angle_libegl_sources':
[
......@@ -80,6 +82,23 @@
'GL_GLEXT_PROTOTYPES=',
'EGLAPI=',
],
'conditions':
[
['angle_enable_d3d9==1',
{
'defines':
[
'ANGLE_ENABLE_D3D9',
],
}],
['angle_enable_d3d11==1',
{
'defines':
[
'ANGLE_ENABLE_D3D11',
],
}],
],
'includes': [ '../build/common_defines.gypi', ],
'msvs_settings':
{
......
......@@ -26,42 +26,47 @@
namespace egl
{
namespace
typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
static DisplayMap *GetDisplayMap()
{
typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
DisplayMap displays;
static DisplayMap displays;
return &displays;
}
egl::Display *Display::getDisplay(EGLNativeDisplayType displayId)
egl::Display *Display::getDisplay(EGLNativeDisplayType displayId, EGLint displayType)
{
if (displays.find(displayId) != displays.end())
DisplayMap *displays = GetDisplayMap();
DisplayMap::const_iterator iter = displays->find(displayId);
if (iter != displays->end())
{
return displays[displayId];
return iter->second;
}
// FIXME: Check if displayId is a valid display device context
egl::Display *display = new egl::Display(displayId, (HDC)displayId);
egl::Display *display = new egl::Display(displayId, displayType);
displays->insert(std::make_pair(displayId, display));
displays[displayId] = display;
return display;
}
Display::Display(EGLNativeDisplayType displayId, HDC deviceContext) : mDc(deviceContext)
Display::Display(EGLNativeDisplayType displayId, EGLint displayType)
: mDisplayId(displayId),
mRequestedDisplayType(displayType),
mRenderer(NULL)
{
mDisplayId = displayId;
mRenderer = NULL;
}
Display::~Display()
{
terminate();
DisplayMap::iterator thisDisplay = displays.find(mDisplayId);
if (thisDisplay != displays.end())
DisplayMap *displays = GetDisplayMap();
DisplayMap::iterator iter = displays->find(mDisplayId);
if (iter != displays->end())
{
displays.erase(thisDisplay);
displays->erase(iter);
}
}
......@@ -72,8 +77,8 @@ bool Display::initialize()
return true;
}
mRenderer = glCreateRenderer(this, mDc, mDisplayId);
mRenderer = glCreateRenderer(this, mDisplayId, mRequestedDisplayType);
if (!mRenderer)
{
terminate();
......@@ -507,6 +512,18 @@ std::string Display::generateClientExtensionString()
extensions.push_back("EGL_EXT_client_extensions");
extensions.push_back("ANGLE_platform_angle");
if (supportsPlatformD3D())
{
extensions.push_back("ANGLE_platform_angle_d3d");
}
if (supportsPlatformOpenGL())
{
extensions.push_back("ANGLE_platform_angle_opengl");
}
std::ostringstream stream;
std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
return stream.str();
......@@ -555,6 +572,20 @@ const char *Display::getExtensionString(egl::Display *display)
}
}
bool Display::supportsPlatformD3D()
{
#if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
return true;
#else
return false;
#endif
}
bool Display::supportsPlatformOpenGL()
{
return false;
}
void Display::initVendorString()
{
mVendorString = "Google Inc.";
......
......@@ -33,10 +33,13 @@ class Display
bool initialize();
void terminate();
static egl::Display *getDisplay(EGLNativeDisplayType displayId);
static egl::Display *getDisplay(EGLNativeDisplayType displayId, EGLint displayType);
static const char *getExtensionString(egl::Display *display);
static bool supportsPlatformD3D();
static bool supportsPlatformOpenGL();
bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
......@@ -65,15 +68,13 @@ class Display
private:
DISALLOW_COPY_AND_ASSIGN(Display);
Display(EGLNativeDisplayType displayId, HDC deviceContext);
Display(EGLNativeDisplayType displayId, EGLint displayType);
bool restoreLostDevice();
EGLNativeDisplayType mDisplayId;
const HDC mDc;
EGLint mRequestedDisplayType;
bool mSoftwareDevice;
typedef std::set<Surface*> SurfaceSet;
SurfaceSet mSurfaceSet;
......
......@@ -101,7 +101,82 @@ EGLDisplay __stdcall eglGetDisplay(EGLNativeDisplayType display_id)
ANGLE_TRY
{
return egl::Display::getDisplay(display_id);
return egl::Display::getDisplay(display_id, EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE);
}
ANGLE_CATCH_ALL
{
return egl::error(EGL_BAD_ALLOC, EGL_NO_DISPLAY);
}
}
EGLDisplay __stdcall eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
{
EVENT("(EGLenum platform = %d, void* native_display = 0x%0.8p, const EGLint* attrib_list = 0x%0.8p)",
platform, native_display, attrib_list);
ANGLE_TRY
{
switch (platform)
{
case EGL_PLATFORM_ANGLE_ANGLE:
break;
default:
return egl::error(EGL_BAD_CONFIG, EGL_NO_DISPLAY);
}
EGLNativeDisplayType displayId = static_cast<EGLNativeDisplayType>(native_display);
// Validate the display device context
if (WindowFromDC(displayId) == NULL)
{
return egl::success(EGL_NO_DISPLAY);
}
EGLint requestedDisplayType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
if (attrib_list)
{
for (const EGLint *curAttrib = attrib_list; curAttrib[0] != EGL_NONE; curAttrib += 2)
{
switch (curAttrib[0])
{
case EGL_PLATFORM_ANGLE_TYPE_ANGLE:
requestedDisplayType = curAttrib[1];
break;
default:
break;
}
}
}
switch (requestedDisplayType)
{
case EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE:
break;
case EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE:
case EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE:
case EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE:
if (!egl::Display::supportsPlatformD3D())
{
return egl::success(EGL_NO_DISPLAY);
}
break;
case EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE:
case EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE:
if (!egl::Display::supportsPlatformOpenGL())
{
return egl::success(EGL_NO_DISPLAY);
}
break;
default:
return egl::success(EGL_NO_DISPLAY);
}
return egl::Display::getDisplay(displayId, requestedDisplayType);
}
ANGLE_CATCH_ALL
{
......@@ -1178,9 +1253,10 @@ __eglMustCastToProperFunctionPointerType __stdcall eglGetProcAddress(const char
static const Extension eglExtensions[] =
{
{"eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)eglQuerySurfacePointerANGLE},
{"eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)eglPostSubBufferNV},
{"", NULL},
{ "eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)eglQuerySurfacePointerANGLE },
{ "eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)eglPostSubBufferNV },
{ "eglGetPlatformDisplayEXT", (__eglMustCastToProperFunctionPointerType)eglGetPlatformDisplayEXT },
{ "", NULL },
};
for (unsigned int ext = 0; ext < ArraySize(eglExtensions); ext++)
......
......@@ -34,3 +34,6 @@ EXPORTS
eglWaitClient @16
eglWaitGL @30
eglWaitNative @31
; Extensions
eglGetPlatformDisplayEXT @35
......@@ -57,7 +57,7 @@ gl::Context *glCreateContext(int clientVersion, const gl::Context *shareContext,
void glDestroyContext(gl::Context *context);
void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface);
gl::Context *glGetCurrentContext();
rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayType displayId);
rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType);
void glDestroyRenderer(rx::Renderer *renderer);
__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname);
......
......@@ -8,6 +8,7 @@
#include "angle_gl.h"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <assert.h>
#include <cstddef>
......
......@@ -76,45 +76,77 @@ const gl::Extensions &Renderer::getRendererExtensions() const
return mExtensions;
}
typedef Renderer *(*CreateRendererFunction)(egl::Display*, EGLNativeDisplayType, EGLint);
template <typename RendererType>
Renderer *CreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
{
return new RendererType(display, nativeDisplay, requestedDisplayType);
}
}
extern "C"
{
rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, EGLNativeDisplayType displayId)
rx::Renderer *glCreateRenderer(egl::Display *display, EGLNativeDisplayType nativeDisplay, EGLint requestedDisplayType)
{
#if defined(ANGLE_ENABLE_D3D11)
if (ANGLE_DEFAULT_D3D11 ||
displayId == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
displayId == EGL_D3D11_ONLY_DISPLAY_ANGLE)
{
rx::Renderer11 *renderer = new rx::Renderer11(display, hDc);
if (renderer->initialize() == EGL_SUCCESS)
std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
# if defined(ANGLE_ENABLE_D3D11)
if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE ||
requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE)
{
return renderer;
rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
}
else
# endif
# if defined(ANGLE_ENABLE_D3D9)
if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
{
// Failed to create a D3D11 renderer, try D3D9
SafeDelete(renderer);
rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
}
# endif
if (nativeDisplay != EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE &&
nativeDisplay != EGL_D3D11_ONLY_DISPLAY_ANGLE &&
requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE)
{
// The default display is requested, try the D3D9 and D3D11 renderers, order them using
// the definition of ANGLE_DEFAULT_D3D11
# if ANGLE_DEFAULT_D3D11
# if defined(ANGLE_ENABLE_D3D11)
rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
# endif
# if defined(ANGLE_ENABLE_D3D9)
rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
# endif
# else
# if defined(ANGLE_ENABLE_D3D9)
rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
# endif
# if defined(ANGLE_ENABLE_D3D11)
rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer11>);
# endif
# endif
}
#endif
#if defined(ANGLE_ENABLE_D3D9)
if (displayId != EGL_D3D11_ONLY_DISPLAY_ANGLE)
for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
{
rx::Renderer9 *renderer = new rx::Renderer9(display, hDc);
rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
if (renderer->initialize() == EGL_SUCCESS)
{
return renderer;
}
else
{
// Failed to create the renderer, try the next
SafeDelete(renderer);
}
}
#endif
return NULL;
}
......
......@@ -68,7 +68,10 @@ enum
MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 = 16
};
Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(hDc)
Renderer11::Renderer11(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay)
: Renderer(display),
mDc(hDc),
mRequestedDisplay(requestedDisplay)
{
mVertexDataManager = NULL;
mIndexDataManager = NULL;
......@@ -152,11 +155,17 @@ EGLint Renderer11::initialize()
D3D_FEATURE_LEVEL_10_0,
};
D3D_DRIVER_TYPE driverType = D3D_DRIVER_TYPE_HARDWARE;
if (mRequestedDisplay == EGL_PLATFORM_ANGLE_TYPE_D3D11_WARP_ANGLE)
{
driverType = D3D_DRIVER_TYPE_WARP;
}
HRESULT result = S_OK;
#ifdef _DEBUG
result = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE_HARDWARE,
driverType,
NULL,
D3D11_CREATE_DEVICE_DEBUG,
featureLevels,
......@@ -175,7 +184,7 @@ EGLint Renderer11::initialize()
#endif
{
result = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE_HARDWARE,
driverType,
NULL,
0,
featureLevels,
......
......@@ -44,7 +44,7 @@ enum
class Renderer11 : public Renderer
{
public:
Renderer11(egl::Display *display, HDC hDc);
Renderer11(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay);
virtual ~Renderer11();
static Renderer11 *makeRenderer11(Renderer *renderer);
......@@ -238,6 +238,7 @@ class Renderer11 : public Renderer
HMODULE mD3d11Module;
HMODULE mDxgiModule;
HDC mDc;
EGLint mRequestedDisplay;
HLSLCompiler mCompiler;
......
......@@ -94,7 +94,9 @@ enum
MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4
};
Renderer9::Renderer9(egl::Display *display, HDC hDc) : Renderer(display), mDc(hDc)
Renderer9::Renderer9(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay)
: Renderer(display),
mDc(hDc)
{
mD3d9Module = NULL;
......
......@@ -33,7 +33,7 @@ class Blit9;
class Renderer9 : public Renderer
{
public:
Renderer9(egl::Display *display, HDC hDc);
Renderer9(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay);
virtual ~Renderer9();
static Renderer9 *makeRenderer9(Renderer *renderer);
......
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