Commit 43915883 by Geoff Lang Committed by Commit Bot

Lazily initialize the D3D device in DisplayWGL.

Change-Id: I3afe4c0619128d7063f49ed8c295d4b814193f84 Reviewed-on: https://chromium-review.googlesource.com/476930Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent 6de51858
...@@ -70,6 +70,7 @@ DisplayWGL::DisplayWGL(const egl::DisplayState &state) ...@@ -70,6 +70,7 @@ DisplayWGL::DisplayWGL(const egl::DisplayState &state)
mPixelFormat(0), mPixelFormat(0),
mWGLContext(nullptr), mWGLContext(nullptr),
mUseDXGISwapChains(false), mUseDXGISwapChains(false),
mHasDXInterop(false),
mDxgiModule(nullptr), mDxgiModule(nullptr),
mD3d11Module(nullptr), mD3d11Module(nullptr),
mD3D11DeviceHandle(nullptr), mD3D11DeviceHandle(nullptr),
...@@ -375,19 +376,20 @@ egl::Error DisplayWGL::initialize(egl::Display *display) ...@@ -375,19 +376,20 @@ egl::Error DisplayWGL::initialize(egl::Display *display)
mUseDXGISwapChains = false; mUseDXGISwapChains = false;
} }
if (mFunctionsWGL->hasExtension("WGL_NV_DX_interop2")) mHasDXInterop = mFunctionsWGL->hasExtension("WGL_NV_DX_interop2");
if (mUseDXGISwapChains)
{ {
egl::Error error = initializeD3DDevice(); if (mHasDXInterop)
if (error.isError())
{ {
return error; ANGLE_TRY(initializeD3DDevice());
} }
} else
else if (mUseDXGISwapChains)
{ {
// Want to use DXGI swap chains but WGL_NV_DX_interop2 is not present, fail initialization // Want to use DXGI swap chains but WGL_NV_DX_interop2 is not present, fail initialization
return egl::Error(EGL_NOT_INITIALIZED, "WGL_NV_DX_interop2 is required but not present."); return egl::Error(EGL_NOT_INITIALIZED, "WGL_NV_DX_interop2 is required but not present.");
} }
}
return DisplayGL::initialize(display); return DisplayGL::initialize(display);
} }
...@@ -441,6 +443,12 @@ SurfaceImpl *DisplayWGL::createWindowSurface(const egl::SurfaceState &state, ...@@ -441,6 +443,12 @@ SurfaceImpl *DisplayWGL::createWindowSurface(const egl::SurfaceState &state,
EGLint orientation = static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0)); EGLint orientation = static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0));
if (mUseDXGISwapChains) if (mUseDXGISwapChains)
{ {
egl::Error error = initializeD3DDevice();
if (error.isError())
{
return nullptr;
}
return new DXGISwapChainWindowSurfaceWGL(state, getRenderer(), window, mD3D11Device, return new DXGISwapChainWindowSurfaceWGL(state, getRenderer(), window, mD3D11Device,
mD3D11DeviceHandle, mWGLContext, mDeviceContext, mD3D11DeviceHandle, mWGLContext, mDeviceContext,
mFunctionsGL, mFunctionsWGL, orientation); mFunctionsGL, mFunctionsWGL, orientation);
...@@ -470,6 +478,12 @@ SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState & ...@@ -470,6 +478,12 @@ SurfaceImpl *DisplayWGL::createPbufferFromClientBuffer(const egl::SurfaceState &
EGLClientBuffer clientBuffer, EGLClientBuffer clientBuffer,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
egl::Error error = initializeD3DDevice();
if (error.isError())
{
return nullptr;
}
return new D3DTextureSurfaceWGL(state, getRenderer(), buftype, clientBuffer, this, mWGLContext, return new D3DTextureSurfaceWGL(state, getRenderer(), buftype, clientBuffer, this, mWGLContext,
mDeviceContext, mD3D11Device, mFunctionsGL, mFunctionsWGL); mDeviceContext, mD3D11Device, mFunctionsGL, mFunctionsWGL);
} }
...@@ -593,6 +607,7 @@ egl::Error DisplayWGL::validateClientBuffer(const egl::Config *configuration, ...@@ -593,6 +607,7 @@ egl::Error DisplayWGL::validateClientBuffer(const egl::Config *configuration,
{ {
case EGL_D3D_TEXTURE_ANGLE: case EGL_D3D_TEXTURE_ANGLE:
case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
ANGLE_TRY(const_cast<DisplayWGL*>(this)->initializeD3DDevice());
return D3DTextureSurfaceWGL::ValidateD3DTextureClientBuffer(buftype, clientBuffer, return D3DTextureSurfaceWGL::ValidateD3DTextureClientBuffer(buftype, clientBuffer,
mD3D11Device); mD3D11Device);
...@@ -665,8 +680,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -665,8 +680,8 @@ void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->createContextRobustness = mHasRobustness; outExtensions->createContextRobustness = mHasRobustness;
outExtensions->d3dTextureClientBuffer = mD3D11Device != nullptr; outExtensions->d3dTextureClientBuffer = mHasDXInterop;
outExtensions->d3dShareHandleClientBuffer = mD3D11Device != nullptr; outExtensions->d3dShareHandleClientBuffer = mHasDXInterop;
outExtensions->surfaceD3DTexture2DShareHandle = true; outExtensions->surfaceD3DTexture2DShareHandle = true;
outExtensions->querySurfacePointer = true; outExtensions->querySurfacePointer = true;
outExtensions->keyedMutex = true; outExtensions->keyedMutex = true;
......
...@@ -86,6 +86,7 @@ class DisplayWGL : public DisplayGL ...@@ -86,6 +86,7 @@ class DisplayWGL : public DisplayGL
HGLRC mWGLContext; HGLRC mWGLContext;
bool mUseDXGISwapChains; bool mUseDXGISwapChains;
bool mHasDXInterop;
HMODULE mDxgiModule; HMODULE mDxgiModule;
HMODULE mD3d11Module; HMODULE mD3d11Module;
HANDLE mD3D11DeviceHandle; HANDLE mD3D11DeviceHandle;
......
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