Create a Direct3D 11 device, if enabled and available.

TRAC #21925 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1399 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent ae4f4d4b
...@@ -72,7 +72,7 @@ Display::~Display() ...@@ -72,7 +72,7 @@ Display::~Display()
if (thisDisplay != displays.end()) if (thisDisplay != displays.end())
{ {
displays.erase(thisDisplay); displays.erase(thisDisplay);
} }
} }
...@@ -84,13 +84,11 @@ bool Display::initialize() ...@@ -84,13 +84,11 @@ bool Display::initialize()
} }
mRenderer = glCreateRenderer(this, mDc, mSoftwareDevice); mRenderer = glCreateRenderer(this, mDc, mSoftwareDevice);
EGLint status = EGL_BAD_ALLOC;
if (mRenderer) if (!mRenderer)
status = mRenderer->initialize();
if (status != EGL_SUCCESS)
{ {
terminate(); terminate();
return error(status, false); return error(EGL_NOT_INITIALIZED, false);
} }
EGLint minSwapInterval = mRenderer->getMinSwapInterval(); EGLint minSwapInterval = mRenderer->getMinSwapInterval();
......
...@@ -8,13 +8,51 @@ ...@@ -8,13 +8,51 @@
#include "libGLESv2/renderer/Renderer.h" #include "libGLESv2/renderer/Renderer.h"
#include "libGLESv2/renderer/Renderer9.h" #include "libGLESv2/renderer/Renderer9.h"
#include "libGLESv2/renderer/Renderer11.h"
#if !defined(ANGLE_ENABLE_D3D11)
// Enables use of the Direct3D 11 API, when available
#define ANGLE_ENABLE_D3D11 0
#endif
extern "C" extern "C"
{ {
rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, bool softwareDevice) rx::Renderer *glCreateRenderer(egl::Display *display, HDC hDc, bool softwareDevice)
{ {
return new rx::Renderer9(display, hDc, softwareDevice); rx::Renderer *renderer = NULL;
EGLint status = EGL_BAD_ALLOC;
#if ANGLE_ENABLE_D3D11
renderer = new rx::Renderer11(display, hDc);
if (renderer)
{
status = renderer->initialize();
}
if (status == EGL_SUCCESS)
{
return renderer;
}
// Failed to create a D3D11 renderer, try creating a D3D9 renderer
delete renderer;
#endif
renderer = new rx::Renderer9(display, hDc, softwareDevice);
if (renderer)
{
status = renderer->initialize();
}
if (status == EGL_SUCCESS)
{
return renderer;
}
return NULL;
} }
void glDestroyRenderer(rx::Renderer *renderer) void glDestroyRenderer(rx::Renderer *renderer)
......
...@@ -43,31 +43,55 @@ Renderer11::~Renderer11() ...@@ -43,31 +43,55 @@ Renderer11::~Renderer11()
if (mD3d11Module) if (mD3d11Module)
{ {
FreeLibrary(mD3d11Module);
mD3d11Module = NULL; mD3d11Module = NULL;
} }
if (mDxgiModule) if (mDxgiModule)
{ {
FreeLibrary(mDxgiModule);
mDxgiModule = NULL; mDxgiModule = NULL;
} }
} }
EGLint Renderer11::initialize() EGLint Renderer11::initialize()
{ {
mDxgiModule = LoadLibrary(TEXT("dxgi.dll"));
mDxgiModule = GetModuleHandle(TEXT("dxgi.dll")); mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
mD3d11Module = GetModuleHandle(TEXT("d3d11.dll"));
if (mD3d11Module == NULL || mDxgiModule == NULL) if (mD3d11Module == NULL || mDxgiModule == NULL)
{ {
ERR("No D3D11 or DXGI module found - aborting!\n"); ERR("Could not load D3D11 or DXGI library - aborting!\n");
return EGL_NOT_INITIALIZED; return EGL_NOT_INITIALIZED;
} }
// TODO: device creation, any one-time setup. PFN_D3D11_CREATE_DEVICE D3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
UNIMPLEMENTED();
if (D3D11CreateDevice == NULL)
{
ERR("Could not retrieve D3D11CreateDevice address - aborting!\n");
return EGL_NOT_INITIALIZED;
}
D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_10_0;
HRESULT result = D3D11CreateDevice(NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
NULL,
&featureLevel,
1,
D3D11_SDK_VERSION,
&mD3d11,
NULL,
&mDeviceContext);
if (!mD3d11 || FAILED(result))
{
ERR("Could not create D3D11 device - aborting!\n");
return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer
}
initializeDevice(); initializeDevice();
return EGL_SUCCESS; return EGL_SUCCESS;
...@@ -80,7 +104,7 @@ void Renderer11::initializeDevice() ...@@ -80,7 +104,7 @@ void Renderer11::initializeDevice()
{ {
// Permanent non-default states // Permanent non-default states
// TODO // TODO
UNIMPLEMENTED(); // UNIMPLEMENTED();
} }
...@@ -128,7 +152,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur ...@@ -128,7 +152,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur
void Renderer11::releaseDeviceResources() void Renderer11::releaseDeviceResources()
{ {
// TODO // TODO
UNIMPLEMENTED(); // UNIMPLEMENTED();
} }
void Renderer11::markDeviceLost() void Renderer11::markDeviceLost()
......
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