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 ...@@ -438,6 +438,26 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSu
#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 #define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ #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 #ifndef EGL_ARM_pixmap_multisample_discard
#define EGL_ARM_pixmap_multisample_discard 1 #define EGL_ARM_pixmap_multisample_discard 1
#define EGL_DISCARD_SAMPLES_ARM 0x3286 #define EGL_DISCARD_SAMPLES_ARM 0x3286
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<Optimization>Disabled</Optimization> <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> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo> <RuntimeTypeInfo>true</RuntimeTypeInfo>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
...@@ -70,7 +70,7 @@ ...@@ -70,7 +70,7 @@
<ResourceCompile> <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> <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> <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> </ResourceCompile>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<Optimization>MaxSpeed</Optimization> <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> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo> <RuntimeTypeInfo>true</RuntimeTypeInfo>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
...@@ -107,7 +107,7 @@ ...@@ -107,7 +107,7 @@
<ResourceCompile> <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> <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> <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> </ResourceCompile>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
{ {
'variables': 'variables':
{ {
'angle_enable_d3d9%': 1,
'angle_enable_d3d11%': 1,
# This file list is shared with the GN build. # This file list is shared with the GN build.
'angle_libegl_sources': 'angle_libegl_sources':
[ [
...@@ -80,6 +82,23 @@ ...@@ -80,6 +82,23 @@
'GL_GLEXT_PROTOTYPES=', 'GL_GLEXT_PROTOTYPES=',
'EGLAPI=', 'EGLAPI=',
], ],
'conditions':
[
['angle_enable_d3d9==1',
{
'defines':
[
'ANGLE_ENABLE_D3D9',
],
}],
['angle_enable_d3d11==1',
{
'defines':
[
'ANGLE_ENABLE_D3D11',
],
}],
],
'includes': [ '../build/common_defines.gypi', ], 'includes': [ '../build/common_defines.gypi', ],
'msvs_settings': 'msvs_settings':
{ {
......
...@@ -26,42 +26,47 @@ ...@@ -26,42 +26,47 @@
namespace egl namespace egl
{ {
namespace
typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
static DisplayMap *GetDisplayMap()
{ {
typedef std::map<EGLNativeDisplayType, Display*> DisplayMap; static DisplayMap displays;
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 // 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; 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() Display::~Display()
{ {
terminate(); terminate();
DisplayMap::iterator thisDisplay = displays.find(mDisplayId); DisplayMap *displays = GetDisplayMap();
DisplayMap::iterator iter = displays->find(mDisplayId);
if (thisDisplay != displays.end()) if (iter != displays->end())
{ {
displays.erase(thisDisplay); displays->erase(iter);
} }
} }
...@@ -72,8 +77,8 @@ bool Display::initialize() ...@@ -72,8 +77,8 @@ bool Display::initialize()
return true; return true;
} }
mRenderer = glCreateRenderer(this, mDc, mDisplayId); mRenderer = glCreateRenderer(this, mDisplayId, mRequestedDisplayType);
if (!mRenderer) if (!mRenderer)
{ {
terminate(); terminate();
...@@ -507,6 +512,18 @@ std::string Display::generateClientExtensionString() ...@@ -507,6 +512,18 @@ std::string Display::generateClientExtensionString()
extensions.push_back("EGL_EXT_client_extensions"); 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::ostringstream stream;
std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " ")); std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
return stream.str(); return stream.str();
...@@ -555,6 +572,20 @@ const char *Display::getExtensionString(egl::Display *display) ...@@ -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() void Display::initVendorString()
{ {
mVendorString = "Google Inc."; mVendorString = "Google Inc.";
......
...@@ -33,10 +33,13 @@ class Display ...@@ -33,10 +33,13 @@ class Display
bool initialize(); bool initialize();
void terminate(); void terminate();
static egl::Display *getDisplay(EGLNativeDisplayType displayId); static egl::Display *getDisplay(EGLNativeDisplayType displayId, EGLint displayType);
static const char *getExtensionString(egl::Display *display); 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 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);
...@@ -65,15 +68,13 @@ class Display ...@@ -65,15 +68,13 @@ class Display
private: private:
DISALLOW_COPY_AND_ASSIGN(Display); DISALLOW_COPY_AND_ASSIGN(Display);
Display(EGLNativeDisplayType displayId, HDC deviceContext); Display(EGLNativeDisplayType displayId, EGLint displayType);
bool restoreLostDevice(); bool restoreLostDevice();
EGLNativeDisplayType mDisplayId; EGLNativeDisplayType mDisplayId;
const HDC mDc; EGLint mRequestedDisplayType;
bool mSoftwareDevice;
typedef std::set<Surface*> SurfaceSet; typedef std::set<Surface*> SurfaceSet;
SurfaceSet mSurfaceSet; SurfaceSet mSurfaceSet;
......
...@@ -101,7 +101,82 @@ EGLDisplay __stdcall eglGetDisplay(EGLNativeDisplayType display_id) ...@@ -101,7 +101,82 @@ EGLDisplay __stdcall eglGetDisplay(EGLNativeDisplayType display_id)
ANGLE_TRY 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 ANGLE_CATCH_ALL
{ {
...@@ -1178,9 +1253,10 @@ __eglMustCastToProperFunctionPointerType __stdcall eglGetProcAddress(const char ...@@ -1178,9 +1253,10 @@ __eglMustCastToProperFunctionPointerType __stdcall eglGetProcAddress(const char
static const Extension eglExtensions[] = static const Extension eglExtensions[] =
{ {
{"eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)eglQuerySurfacePointerANGLE}, { "eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)eglQuerySurfacePointerANGLE },
{"eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)eglPostSubBufferNV}, { "eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)eglPostSubBufferNV },
{"", NULL}, { "eglGetPlatformDisplayEXT", (__eglMustCastToProperFunctionPointerType)eglGetPlatformDisplayEXT },
{ "", NULL },
}; };
for (unsigned int ext = 0; ext < ArraySize(eglExtensions); ext++) for (unsigned int ext = 0; ext < ArraySize(eglExtensions); ext++)
......
...@@ -34,3 +34,6 @@ EXPORTS ...@@ -34,3 +34,6 @@ EXPORTS
eglWaitClient @16 eglWaitClient @16
eglWaitGL @30 eglWaitGL @30
eglWaitNative @31 eglWaitNative @31
; Extensions
eglGetPlatformDisplayEXT @35
...@@ -57,7 +57,7 @@ gl::Context *glCreateContext(int clientVersion, const gl::Context *shareContext, ...@@ -57,7 +57,7 @@ gl::Context *glCreateContext(int clientVersion, const gl::Context *shareContext,
void glDestroyContext(gl::Context *context); void glDestroyContext(gl::Context *context);
void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface); void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface);
gl::Context *glGetCurrentContext(); 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); void glDestroyRenderer(rx::Renderer *renderer);
__eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname); __eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname);
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "angle_gl.h" #include "angle_gl.h"
#include <EGL/egl.h> #include <EGL/egl.h>
#include <EGL/eglext.h>
#include <assert.h> #include <assert.h>
#include <cstddef> #include <cstddef>
......
...@@ -76,45 +76,77 @@ const gl::Extensions &Renderer::getRendererExtensions() const ...@@ -76,45 +76,77 @@ const gl::Extensions &Renderer::getRendererExtensions() const
return mExtensions; 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" 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) std::vector<rx::CreateRendererFunction> rendererCreationFunctions;
if (ANGLE_DEFAULT_D3D11 ||
displayId == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE || # if defined(ANGLE_ENABLE_D3D11)
displayId == EGL_D3D11_ONLY_DISPLAY_ANGLE) if (nativeDisplay == EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ||
{ nativeDisplay == EGL_D3D11_ONLY_DISPLAY_ANGLE ||
rx::Renderer11 *renderer = new rx::Renderer11(display, hDc); requestedDisplayType == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE ||
if (renderer->initialize() == EGL_SUCCESS) 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 rendererCreationFunctions.push_back(rx::CreateRenderer<rx::Renderer9>);
SafeDelete(renderer);
} }
# 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) for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
if (displayId != EGL_D3D11_ONLY_DISPLAY_ANGLE)
{ {
rx::Renderer9 *renderer = new rx::Renderer9(display, hDc); rx::Renderer *renderer = rendererCreationFunctions[i](display, nativeDisplay, requestedDisplayType);
if (renderer->initialize() == EGL_SUCCESS) if (renderer->initialize() == EGL_SUCCESS)
{ {
return renderer; return renderer;
} }
else else
{ {
// Failed to create the renderer, try the next
SafeDelete(renderer); SafeDelete(renderer);
} }
} }
#endif
return NULL; return NULL;
} }
......
...@@ -68,7 +68,10 @@ enum ...@@ -68,7 +68,10 @@ enum
MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 = 16 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; mVertexDataManager = NULL;
mIndexDataManager = NULL; mIndexDataManager = NULL;
...@@ -152,11 +155,17 @@ EGLint Renderer11::initialize() ...@@ -152,11 +155,17 @@ EGLint Renderer11::initialize()
D3D_FEATURE_LEVEL_10_0, 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; HRESULT result = S_OK;
#ifdef _DEBUG #ifdef _DEBUG
result = D3D11CreateDevice(NULL, result = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE_HARDWARE, driverType,
NULL, NULL,
D3D11_CREATE_DEVICE_DEBUG, D3D11_CREATE_DEVICE_DEBUG,
featureLevels, featureLevels,
...@@ -175,7 +184,7 @@ EGLint Renderer11::initialize() ...@@ -175,7 +184,7 @@ EGLint Renderer11::initialize()
#endif #endif
{ {
result = D3D11CreateDevice(NULL, result = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE_HARDWARE, driverType,
NULL, NULL,
0, 0,
featureLevels, featureLevels,
......
...@@ -44,7 +44,7 @@ enum ...@@ -44,7 +44,7 @@ enum
class Renderer11 : public Renderer class Renderer11 : public Renderer
{ {
public: public:
Renderer11(egl::Display *display, HDC hDc); Renderer11(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay);
virtual ~Renderer11(); virtual ~Renderer11();
static Renderer11 *makeRenderer11(Renderer *renderer); static Renderer11 *makeRenderer11(Renderer *renderer);
...@@ -238,6 +238,7 @@ class Renderer11 : public Renderer ...@@ -238,6 +238,7 @@ class Renderer11 : public Renderer
HMODULE mD3d11Module; HMODULE mD3d11Module;
HMODULE mDxgiModule; HMODULE mDxgiModule;
HDC mDc; HDC mDc;
EGLint mRequestedDisplay;
HLSLCompiler mCompiler; HLSLCompiler mCompiler;
......
...@@ -94,7 +94,9 @@ enum ...@@ -94,7 +94,9 @@ enum
MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4 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; mD3d9Module = NULL;
......
...@@ -33,7 +33,7 @@ class Blit9; ...@@ -33,7 +33,7 @@ class Blit9;
class Renderer9 : public Renderer class Renderer9 : public Renderer
{ {
public: public:
Renderer9(egl::Display *display, HDC hDc); Renderer9(egl::Display *display, EGLNativeDisplayType hDc, EGLint requestedDisplay);
virtual ~Renderer9(); virtual ~Renderer9();
static Renderer9 *makeRenderer9(Renderer *renderer); 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