Commit b2a5e342 by Jamie Madill

Return egl::Error from Renderer::initialize.

This extra Error info can be useful for passing back additional info. In the short-term this means we can implement a UMA histogram at some point with a code that represents a more specific reason why the init failed. BUG=436191 Change-Id: If5e099a9ce32e87843754cd4f40d726dd5bad4b8 Reviewed-on: https://chromium-review.googlesource.com/246564Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0fe40534
...@@ -97,12 +97,12 @@ egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer) ...@@ -97,12 +97,12 @@ egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer)
# endif # endif
} }
EGLint result = EGL_NOT_INITIALIZED; egl::Error result(EGL_NOT_INITIALIZED, "No available renderers.");
for (size_t i = 0; i < rendererCreationFunctions.size(); i++) for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
{ {
RendererD3D *renderer = rendererCreationFunctions[i](display); RendererD3D *renderer = rendererCreationFunctions[i](display);
result = renderer->initialize(); result = renderer->initialize();
if (result == EGL_SUCCESS) if (!result.isError())
{ {
*outRenderer = renderer; *outRenderer = renderer;
break; break;
...@@ -114,7 +114,7 @@ egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer) ...@@ -114,7 +114,7 @@ egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer)
} }
} }
return egl::Error(result); return result;
} }
DisplayD3D::DisplayD3D() DisplayD3D::DisplayD3D()
......
...@@ -54,9 +54,9 @@ class RendererD3D : public Renderer ...@@ -54,9 +54,9 @@ class RendererD3D : public Renderer
explicit RendererD3D(egl::Display *display); explicit RendererD3D(egl::Display *display);
virtual ~RendererD3D(); virtual ~RendererD3D();
static RendererD3D *makeRendererD3D(Renderer *renderer); virtual egl::Error initialize() = 0;
virtual EGLint initialize() = 0; static RendererD3D *makeRendererD3D(Renderer *renderer);
virtual egl::ConfigSet generateConfigs() const = 0; virtual egl::ConfigSet generateConfigs() const = 0;
......
...@@ -229,11 +229,11 @@ Renderer11 *Renderer11::makeRenderer11(Renderer *renderer) ...@@ -229,11 +229,11 @@ Renderer11 *Renderer11::makeRenderer11(Renderer *renderer)
#define D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET ((D3D11_MESSAGE_ID)3146081) #define D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET ((D3D11_MESSAGE_ID)3146081)
#endif #endif
EGLint Renderer11::initialize() egl::Error Renderer11::initialize()
{ {
if (!mCompiler.initialize()) if (!mCompiler.initialize())
{ {
return EGL_NOT_INITIALIZED; return egl::Error(EGL_NOT_INITIALIZED, "Failed to initialize compiler.");
} }
#if !defined(ANGLE_ENABLE_WINDOWS_STORE) #if !defined(ANGLE_ENABLE_WINDOWS_STORE)
...@@ -242,8 +242,7 @@ EGLint Renderer11::initialize() ...@@ -242,8 +242,7 @@ EGLint Renderer11::initialize()
if (mD3d11Module == NULL || mDxgiModule == NULL) if (mD3d11Module == NULL || mDxgiModule == NULL)
{ {
ERR("Could not load D3D11 or DXGI library - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Could not load D3D11 or DXGI library.");
return EGL_NOT_INITIALIZED;
} }
// create the D3D11 device // create the D3D11 device
...@@ -252,8 +251,7 @@ EGLint Renderer11::initialize() ...@@ -252,8 +251,7 @@ EGLint Renderer11::initialize()
if (D3D11CreateDevice == NULL) if (D3D11CreateDevice == NULL)
{ {
ERR("Could not retrieve D3D11CreateDevice address - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Could not retrieve D3D11CreateDevice address.");
return EGL_NOT_INITIALIZED;
} }
#endif #endif
...@@ -291,8 +289,8 @@ EGLint Renderer11::initialize() ...@@ -291,8 +289,8 @@ EGLint Renderer11::initialize()
if (!mDevice || FAILED(result)) if (!mDevice || FAILED(result))
{ {
ERR("Could not create D3D11 device - aborting!\n"); // Cleanup done by destructor through glDestroyRenderer
return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer return egl::Error(EGL_NOT_INITIALIZED, "Could not create D3D11 device.");
} }
} }
...@@ -320,8 +318,7 @@ EGLint Renderer11::initialize() ...@@ -320,8 +318,7 @@ EGLint Renderer11::initialize()
result = mDevice->QueryInterface(__uuidof(IDXGIDevice2), (void**)&dxgiDevice2); result = mDevice->QueryInterface(__uuidof(IDXGIDevice2), (void**)&dxgiDevice2);
if (FAILED(result)) if (FAILED(result))
{ {
ERR("DXGI 1.2 required to present to HWNDs owned by another process.\n"); return egl::Error(EGL_NOT_INITIALIZED, "DXGI 1.2 required to present to HWNDs owned by another process.");
return EGL_NOT_INITIALIZED;
} }
SafeRelease(dxgiDevice2); SafeRelease(dxgiDevice2);
} }
...@@ -338,16 +335,14 @@ EGLint Renderer11::initialize() ...@@ -338,16 +335,14 @@ EGLint Renderer11::initialize()
if (FAILED(result)) if (FAILED(result))
{ {
ERR("Could not query DXGI device - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Could not query DXGI device.");
return EGL_NOT_INITIALIZED;
} }
result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&mDxgiAdapter); result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&mDxgiAdapter);
if (FAILED(result)) if (FAILED(result))
{ {
ERR("Could not retrieve DXGI adapter - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Could not retrieve DXGI adapter");
return EGL_NOT_INITIALIZED;
} }
SafeRelease(dxgiDevice); SafeRelease(dxgiDevice);
...@@ -386,8 +381,7 @@ EGLint Renderer11::initialize() ...@@ -386,8 +381,7 @@ EGLint Renderer11::initialize()
if (!mDxgiFactory || FAILED(result)) if (!mDxgiFactory || FAILED(result))
{ {
ERR("Could not create DXGI factory - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Could not create DXGI factory.");
return EGL_NOT_INITIALIZED;
} }
// Disable some spurious D3D11 debug warnings to prevent them from flooding the output log // Disable some spurious D3D11 debug warnings to prevent them from flooding the output log
...@@ -413,7 +407,7 @@ EGLint Renderer11::initialize() ...@@ -413,7 +407,7 @@ EGLint Renderer11::initialize()
initializeDevice(); initializeDevice();
return EGL_SUCCESS; return egl::Error(EGL_SUCCESS);
} }
// do any one-time device initialization // do any one-time device initialization
...@@ -2066,11 +2060,11 @@ bool Renderer11::resetDevice() ...@@ -2066,11 +2060,11 @@ bool Renderer11::resetDevice()
{ {
// recreate everything // recreate everything
release(); release();
EGLint result = initialize(); egl::Error result = initialize();
if (result != EGL_SUCCESS) if (result.isError())
{ {
ERR("Could not reinitialize D3D11 device: %08X", result); ERR("Could not reinitialize D3D11 device: %08X", result.getCode());
return false; return false;
} }
......
...@@ -54,7 +54,7 @@ class Renderer11 : public RendererD3D ...@@ -54,7 +54,7 @@ class Renderer11 : public RendererD3D
static Renderer11 *makeRenderer11(Renderer *renderer); static Renderer11 *makeRenderer11(Renderer *renderer);
virtual EGLint initialize(); egl::Error initialize() override;
virtual bool resetDevice(); virtual bool resetDevice();
egl::ConfigSet generateConfigs() const override; egl::ConfigSet generateConfigs() const override;
......
...@@ -160,11 +160,11 @@ Renderer9 *Renderer9::makeRenderer9(Renderer *renderer) ...@@ -160,11 +160,11 @@ Renderer9 *Renderer9::makeRenderer9(Renderer *renderer)
return static_cast<Renderer9*>(renderer); return static_cast<Renderer9*>(renderer);
} }
EGLint Renderer9::initialize() egl::Error Renderer9::initialize()
{ {
if (!mCompiler.initialize()) if (!mCompiler.initialize())
{ {
return EGL_NOT_INITIALIZED; return egl::Error(EGL_NOT_INITIALIZED, "Compiler failed to initialize.");
} }
TRACE_EVENT0("gpu", "GetModuleHandle_d3d9"); TRACE_EVENT0("gpu", "GetModuleHandle_d3d9");
...@@ -172,8 +172,7 @@ EGLint Renderer9::initialize() ...@@ -172,8 +172,7 @@ EGLint Renderer9::initialize()
if (mD3d9Module == NULL) if (mD3d9Module == NULL)
{ {
ERR("No D3D9 module found - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "No D3D9 module found.");
return EGL_NOT_INITIALIZED;
} }
typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex**); typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex**);
...@@ -197,8 +196,7 @@ EGLint Renderer9::initialize() ...@@ -197,8 +196,7 @@ EGLint Renderer9::initialize()
if (!mD3d9) if (!mD3d9)
{ {
ERR("Could not create D3D9 device - aborting!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Could not create D3D9 device.");
return EGL_NOT_INITIALIZED;
} }
if (mDisplay->getNativeDisplayId() != nullptr) if (mDisplay->getNativeDisplayId() != nullptr)
...@@ -224,8 +222,7 @@ EGLint Renderer9::initialize() ...@@ -224,8 +222,7 @@ EGLint Renderer9::initialize()
} }
else if (FAILED(result)) // D3DERR_OUTOFVIDEOMEMORY, E_OUTOFMEMORY, D3DERR_INVALIDDEVICE, or another error we can't recover from else if (FAILED(result)) // D3DERR_OUTOFVIDEOMEMORY, E_OUTOFMEMORY, D3DERR_INVALIDDEVICE, or another error we can't recover from
{ {
ERR("failed to get device caps (0x%x)\n", result); return egl::Error(EGL_NOT_INITIALIZED, "Failed to get device caps: Error code 0x%x\n", result);
return EGL_NOT_INITIALIZED;
} }
} }
} }
...@@ -238,16 +235,14 @@ EGLint Renderer9::initialize() ...@@ -238,16 +235,14 @@ EGLint Renderer9::initialize()
if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0)) if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0))
{ {
ERR("Renderer does not support PS %u.%u. aborting!\n", minShaderModel, 0); return egl::Error(EGL_NOT_INITIALIZED, "Renderer does not support PS %u.%u.aborting!", minShaderModel, 0);
return EGL_NOT_INITIALIZED;
} }
// When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture to a render target texture is not supported. // When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture to a render target texture is not supported.
// This is required by Texture2D::ensureRenderTarget. // This is required by Texture2D::ensureRenderTarget.
if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0) if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0)
{ {
ERR("Renderer does not support stretctrect from textures!\n"); return egl::Error(EGL_NOT_INITIALIZED, "Renderer does not support StretctRect from textures.");
return EGL_NOT_INITIALIZED;
} }
{ {
...@@ -272,7 +267,7 @@ EGLint Renderer9::initialize() ...@@ -272,7 +267,7 @@ EGLint Renderer9::initialize()
} }
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST) if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DEVICELOST)
{ {
return EGL_BAD_ALLOC; return egl::Error(EGL_BAD_ALLOC, "CreateDevice failed: device lost of out of memory");
} }
if (FAILED(result)) if (FAILED(result))
...@@ -283,7 +278,7 @@ EGLint Renderer9::initialize() ...@@ -283,7 +278,7 @@ EGLint Renderer9::initialize()
if (FAILED(result)) if (FAILED(result))
{ {
ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST); ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_NOTAVAILABLE || result == D3DERR_DEVICELOST);
return EGL_BAD_ALLOC; return egl::Error(EGL_BAD_ALLOC, "CreateDevice2 failed: device lost, not available, or of out of memory");
} }
} }
...@@ -312,7 +307,7 @@ EGLint Renderer9::initialize() ...@@ -312,7 +307,7 @@ EGLint Renderer9::initialize()
initializeDevice(); initializeDevice();
return EGL_SUCCESS; return egl::Error(EGL_SUCCESS);
} }
// do any one-time device initialization // do any one-time device initialization
...@@ -2403,7 +2398,7 @@ bool Renderer9::resetRemovedDevice() ...@@ -2403,7 +2398,7 @@ bool Renderer9::resetRemovedDevice()
// adapters and create another Direct3D device. If application continues rendering without // adapters and create another Direct3D device. If application continues rendering without
// calling Reset, the rendering calls will succeed. Applies to Direct3D 9Ex only. // calling Reset, the rendering calls will succeed. Applies to Direct3D 9Ex only.
release(); release();
return (initialize() == EGL_SUCCESS); return !initialize().isError();
} }
VendorID Renderer9::getVendorId() const VendorID Renderer9::getVendorId() const
......
...@@ -44,7 +44,7 @@ class Renderer9 : public RendererD3D ...@@ -44,7 +44,7 @@ class Renderer9 : public RendererD3D
static Renderer9 *makeRenderer9(Renderer *renderer); static Renderer9 *makeRenderer9(Renderer *renderer);
virtual EGLint initialize(); egl::Error initialize() override;
virtual bool resetDevice(); virtual bool resetDevice();
egl::ConfigSet generateConfigs() const override; egl::ConfigSet generateConfigs() const override;
......
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