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)
# endif
}
EGLint result = EGL_NOT_INITIALIZED;
egl::Error result(EGL_NOT_INITIALIZED, "No available renderers.");
for (size_t i = 0; i < rendererCreationFunctions.size(); i++)
{
RendererD3D *renderer = rendererCreationFunctions[i](display);
result = renderer->initialize();
if (result == EGL_SUCCESS)
if (!result.isError())
{
*outRenderer = renderer;
break;
......@@ -114,7 +114,7 @@ egl::Error CreateRendererD3D(egl::Display *display, RendererD3D **outRenderer)
}
}
return egl::Error(result);
return result;
}
DisplayD3D::DisplayD3D()
......
......@@ -54,9 +54,9 @@ class RendererD3D : public Renderer
explicit RendererD3D(egl::Display *display);
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;
......
......@@ -229,11 +229,11 @@ Renderer11 *Renderer11::makeRenderer11(Renderer *renderer)
#define D3D11_MESSAGE_ID_DEVICE_DRAW_RENDERTARGETVIEW_NOT_SET ((D3D11_MESSAGE_ID)3146081)
#endif
EGLint Renderer11::initialize()
egl::Error Renderer11::initialize()
{
if (!mCompiler.initialize())
{
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Failed to initialize compiler.");
}
#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
......@@ -242,8 +242,7 @@ EGLint Renderer11::initialize()
if (mD3d11Module == NULL || mDxgiModule == NULL)
{
ERR("Could not load D3D11 or DXGI library - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Could not load D3D11 or DXGI library.");
}
// create the D3D11 device
......@@ -252,8 +251,7 @@ EGLint Renderer11::initialize()
if (D3D11CreateDevice == NULL)
{
ERR("Could not retrieve D3D11CreateDevice address - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Could not retrieve D3D11CreateDevice address.");
}
#endif
......@@ -291,8 +289,8 @@ EGLint Renderer11::initialize()
if (!mDevice || FAILED(result))
{
ERR("Could not create D3D11 device - aborting!\n");
return EGL_NOT_INITIALIZED; // Cleanup done by destructor through glDestroyRenderer
// Cleanup done by destructor through glDestroyRenderer
return egl::Error(EGL_NOT_INITIALIZED, "Could not create D3D11 device.");
}
}
......@@ -320,8 +318,7 @@ EGLint Renderer11::initialize()
result = mDevice->QueryInterface(__uuidof(IDXGIDevice2), (void**)&dxgiDevice2);
if (FAILED(result))
{
ERR("DXGI 1.2 required to present to HWNDs owned by another process.\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "DXGI 1.2 required to present to HWNDs owned by another process.");
}
SafeRelease(dxgiDevice2);
}
......@@ -338,16 +335,14 @@ EGLint Renderer11::initialize()
if (FAILED(result))
{
ERR("Could not query DXGI device - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Could not query DXGI device.");
}
result = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&mDxgiAdapter);
if (FAILED(result))
{
ERR("Could not retrieve DXGI adapter - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Could not retrieve DXGI adapter");
}
SafeRelease(dxgiDevice);
......@@ -386,8 +381,7 @@ EGLint Renderer11::initialize()
if (!mDxgiFactory || FAILED(result))
{
ERR("Could not create DXGI factory - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Could not create DXGI factory.");
}
// Disable some spurious D3D11 debug warnings to prevent them from flooding the output log
......@@ -413,7 +407,7 @@ EGLint Renderer11::initialize()
initializeDevice();
return EGL_SUCCESS;
return egl::Error(EGL_SUCCESS);
}
// do any one-time device initialization
......@@ -2066,11 +2060,11 @@ bool Renderer11::resetDevice()
{
// recreate everything
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;
}
......
......@@ -54,7 +54,7 @@ class Renderer11 : public RendererD3D
static Renderer11 *makeRenderer11(Renderer *renderer);
virtual EGLint initialize();
egl::Error initialize() override;
virtual bool resetDevice();
egl::ConfigSet generateConfigs() const override;
......
......@@ -160,11 +160,11 @@ Renderer9 *Renderer9::makeRenderer9(Renderer *renderer)
return static_cast<Renderer9*>(renderer);
}
EGLint Renderer9::initialize()
egl::Error Renderer9::initialize()
{
if (!mCompiler.initialize())
{
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Compiler failed to initialize.");
}
TRACE_EVENT0("gpu", "GetModuleHandle_d3d9");
......@@ -172,8 +172,7 @@ EGLint Renderer9::initialize()
if (mD3d9Module == NULL)
{
ERR("No D3D9 module found - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "No D3D9 module found.");
}
typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex**);
......@@ -197,8 +196,7 @@ EGLint Renderer9::initialize()
if (!mD3d9)
{
ERR("Could not create D3D9 device - aborting!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Could not create D3D9 device.");
}
if (mDisplay->getNativeDisplayId() != nullptr)
......@@ -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
{
ERR("failed to get device caps (0x%x)\n", result);
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Failed to get device caps: Error code 0x%x\n", result);
}
}
}
......@@ -238,16 +235,14 @@ EGLint Renderer9::initialize()
if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(minShaderModel, 0))
{
ERR("Renderer does not support PS %u.%u. aborting!\n", minShaderModel, 0);
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Renderer does not support PS %u.%u.aborting!", minShaderModel, 0);
}
// 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.
if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0)
{
ERR("Renderer does not support stretctrect from textures!\n");
return EGL_NOT_INITIALIZED;
return egl::Error(EGL_NOT_INITIALIZED, "Renderer does not support StretctRect from textures.");
}
{
......@@ -272,7 +267,7 @@ EGLint Renderer9::initialize()
}
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))
......@@ -283,7 +278,7 @@ EGLint Renderer9::initialize()
if (FAILED(result))
{
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()
initializeDevice();
return EGL_SUCCESS;
return egl::Error(EGL_SUCCESS);
}
// do any one-time device initialization
......@@ -2403,7 +2398,7 @@ bool Renderer9::resetRemovedDevice()
// adapters and create another Direct3D device. If application continues rendering without
// calling Reset, the rendering calls will succeed. Applies to Direct3D 9Ex only.
release();
return (initialize() == EGL_SUCCESS);
return !initialize().isError();
}
VendorID Renderer9::getVendorId() const
......
......@@ -44,7 +44,7 @@ class Renderer9 : public RendererD3D
static Renderer9 *makeRenderer9(Renderer *renderer);
virtual EGLint initialize();
egl::Error initialize() override;
virtual bool resetDevice();
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