summaryrefslogtreecommitdiffstats
path: root/src/angle/patches/0012-ANGLE-Improve-error-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'src/angle/patches/0012-ANGLE-Improve-error-handling.patch')
-rw-r--r--src/angle/patches/0012-ANGLE-Improve-error-handling.patch363
1 files changed, 363 insertions, 0 deletions
diff --git a/src/angle/patches/0012-ANGLE-Improve-error-handling.patch b/src/angle/patches/0012-ANGLE-Improve-error-handling.patch
new file mode 100644
index 0000000000..ccaa0cb108
--- /dev/null
+++ b/src/angle/patches/0012-ANGLE-Improve-error-handling.patch
@@ -0,0 +1,363 @@
+From f414290e880e459ab587753fee6c20d8c35e7579 Mon Sep 17 00:00:00 2001
+From: Oliver Wolff <oliver.wolff@qt.io>
+Date: Fri, 5 May 2017 10:01:19 +0200
+Subject: [PATCH] ANGLE: Improve error handling
+
+This patch backports ab4fd98fac0cbc30cfc578a06c068519ee2df2e1 from
+ANGLE proper. It greatly improves error handling in important places and
+thus avoids crashes.
+
+Task-number: QTBUG-48970
+Change-Id: Idcdc54396731323ebf4587b73b3360d5f3d17506
+---
+ .../src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp | 11 +++-
+ .../renderer/d3d/d3d11/DebugAnnotator11.cpp | 9 +--
+ .../src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp | 73 +++++++++++++++-------
+ .../libANGLE/renderer/d3d/d3d11/SwapChain11.cpp | 15 +++--
+ .../libANGLE/renderer/d3d/d3d11/renderer11_utils.h | 53 +++++++++-------
+ .../d3d/d3d11/winrt/InspectableNativeWindow.cpp | 8 ++-
+ 6 files changed, 114 insertions(+), 55 deletions(-)
+
+diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+index d56b0ea..ad2ba57 100644
+--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
++++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+@@ -724,8 +724,12 @@ bool Buffer11::NativeStorage::copyFromStorage(BufferStorage *source, size_t sour
+
+ D3D11_MAPPED_SUBRESOURCE mappedResource;
+ HRESULT hr = context->Map(mNativeStorage, 0, D3D11_MAP_WRITE, 0, &mappedResource);
+- UNUSED_ASSERTION_VARIABLE(hr);
+ ASSERT(SUCCEEDED(hr));
++ if (FAILED(hr))
++ {
++ source->unmap();
++ return false;
++ }
+
+ uint8_t *destPointer = static_cast<uint8_t *>(mappedResource.pData) + destOffset;
+
+@@ -863,8 +867,11 @@ uint8_t *Buffer11::NativeStorage::map(size_t offset, size_t length, GLbitfield a
+ UINT d3dMapFlag = ((access & GL_MAP_UNSYNCHRONIZED_BIT) != 0 ? D3D11_MAP_FLAG_DO_NOT_WAIT : 0);
+
+ HRESULT result = context->Map(mNativeStorage, 0, d3dMapType, d3dMapFlag, &mappedResource);
+- UNUSED_ASSERTION_VARIABLE(result);
+ ASSERT(SUCCEEDED(result));
++ if (FAILED(result))
++ {
++ return nullptr;
++ }
+
+ return static_cast<uint8_t*>(mappedResource.pData) + offset;
+ }
+diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
+index f1fe2bb..276f3c8 100644
+--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
++++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
+@@ -105,14 +105,15 @@ void DebugAnnotator11::initializeDevice()
+ ASSERT(SUCCEEDED(hr));
+
+ #if defined(ANGLE_ENABLE_D3D11_1)
+- mUserDefinedAnnotation = d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context);
+- ASSERT(mUserDefinedAnnotation != nullptr);
++ if (SUCCEEDED(hr)) {
++ mUserDefinedAnnotation = d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context);
++ ASSERT(mUserDefinedAnnotation != nullptr);
++ mInitialized = true;
++ }
+ #endif
+
+ SafeRelease(device);
+ SafeRelease(context);
+-
+- mInitialized = true;
+ }
+ }
+
+diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+index dd554f4..cf094fa 100644
+--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
++++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+@@ -265,6 +265,8 @@ Renderer11::Renderer11(egl::Display *display)
+
+ mAppliedNumXFBBindings = static_cast<size_t>(-1);
+
++ ZeroMemory(&mAdapterDescription, sizeof(mAdapterDescription));
++
+ const auto &attributes = mDisplay->getAttributeMap();
+
+ EGLint requestedMajorVersion = attributes.get(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, EGL_DONT_CARE);
+@@ -504,25 +506,33 @@ egl::Error Renderer11::initialize()
+ if (mFeatureLevel <= D3D_FEATURE_LEVEL_9_3 && dxgiAdapter2 != NULL)
+ {
+ DXGI_ADAPTER_DESC2 adapterDesc2 = {0};
+- dxgiAdapter2->GetDesc2(&adapterDesc2);
+-
+- // Copy the contents of the DXGI_ADAPTER_DESC2 into mAdapterDescription (a DXGI_ADAPTER_DESC).
+- memcpy(mAdapterDescription.Description, adapterDesc2.Description, sizeof(mAdapterDescription.Description));
+- mAdapterDescription.VendorId = adapterDesc2.VendorId;
+- mAdapterDescription.DeviceId = adapterDesc2.DeviceId;
+- mAdapterDescription.SubSysId = adapterDesc2.SubSysId;
+- mAdapterDescription.Revision = adapterDesc2.Revision;
+- mAdapterDescription.DedicatedVideoMemory = adapterDesc2.DedicatedVideoMemory;
+- mAdapterDescription.DedicatedSystemMemory = adapterDesc2.DedicatedSystemMemory;
+- mAdapterDescription.SharedSystemMemory = adapterDesc2.SharedSystemMemory;
+- mAdapterDescription.AdapterLuid = adapterDesc2.AdapterLuid;
++ result = dxgiAdapter2->GetDesc2(&adapterDesc2);
++ if (SUCCEEDED(result)) {
++ // Copy the contents of the DXGI_ADAPTER_DESC2 into mAdapterDescription (a DXGI_ADAPTER_DESC).
++ memcpy(mAdapterDescription.Description, adapterDesc2.Description, sizeof(mAdapterDescription.Description));
++ mAdapterDescription.VendorId = adapterDesc2.VendorId;
++ mAdapterDescription.DeviceId = adapterDesc2.DeviceId;
++ mAdapterDescription.SubSysId = adapterDesc2.SubSysId;
++ mAdapterDescription.Revision = adapterDesc2.Revision;
++ mAdapterDescription.DedicatedVideoMemory = adapterDesc2.DedicatedVideoMemory;
++ mAdapterDescription.DedicatedSystemMemory = adapterDesc2.DedicatedSystemMemory;
++ mAdapterDescription.SharedSystemMemory = adapterDesc2.SharedSystemMemory;
++ mAdapterDescription.AdapterLuid = adapterDesc2.AdapterLuid;
++ }
+ }
+ else
+ {
+- mDxgiAdapter->GetDesc(&mAdapterDescription);
++ result = mDxgiAdapter->GetDesc(&mAdapterDescription);
+ }
+
+ SafeRelease(dxgiAdapter2);
++
++ if (FAILED(result))
++ {
++ return egl::Error(EGL_NOT_INITIALIZED,
++ D3D11_INIT_OTHER_ERROR,
++ "Could not read DXGI adaptor description.");
++ }
+ #endif
+
+ memset(mDescription, 0, sizeof(mDescription));
+@@ -2056,9 +2066,14 @@ gl::Error Renderer11::applyUniforms(const ProgramImpl &program, const std::vecto
+ constantBufferDescription.StructureByteStride = 0;
+
+ HRESULT result = mDevice->CreateBuffer(&constantBufferDescription, NULL, &mDriverConstantBufferVS);
+- UNUSED_ASSERTION_VARIABLE(result);
+ ASSERT(SUCCEEDED(result));
+
++ if (FAILED(result))
++ {
++ return gl::Error(GL_OUT_OF_MEMORY, "Failed to create vertex shader constant buffer, result: 0x%X.", result);
++ }
++
++
+ mDeviceContext->VSSetConstantBuffers(1, 1, &mDriverConstantBufferVS);
+ }
+
+@@ -2073,22 +2088,34 @@ gl::Error Renderer11::applyUniforms(const ProgramImpl &program, const std::vecto
+ constantBufferDescription.StructureByteStride = 0;
+
+ HRESULT result = mDevice->CreateBuffer(&constantBufferDescription, NULL, &mDriverConstantBufferPS);
+- UNUSED_ASSERTION_VARIABLE(result);
+ ASSERT(SUCCEEDED(result));
+
++ if (FAILED(result))
++ {
++ return gl::Error(GL_OUT_OF_MEMORY, "Failed to create pixel shader constant buffer, result: 0x%X.", result);
++ }
++
+ mDeviceContext->PSSetConstantBuffers(1, 1, &mDriverConstantBufferPS);
+ }
+
+ if (memcmp(&mVertexConstants, &mAppliedVertexConstants, sizeof(dx_VertexConstants)) != 0)
+ {
+- mDeviceContext->UpdateSubresource(mDriverConstantBufferVS, 0, NULL, &mVertexConstants, 16, 0);
+- memcpy(&mAppliedVertexConstants, &mVertexConstants, sizeof(dx_VertexConstants));
++ ASSERT(mDriverConstantBufferVS != nullptr);
++ if (mDriverConstantBufferVS)
++ {
++ mDeviceContext->UpdateSubresource(mDriverConstantBufferVS, 0, NULL, &mVertexConstants, 16, 0);
++ memcpy(&mAppliedVertexConstants, &mVertexConstants, sizeof(dx_VertexConstants));
++ }
+ }
+
+ if (memcmp(&mPixelConstants, &mAppliedPixelConstants, sizeof(dx_PixelConstants)) != 0)
+ {
+- mDeviceContext->UpdateSubresource(mDriverConstantBufferPS, 0, NULL, &mPixelConstants, 16, 0);
+- memcpy(&mAppliedPixelConstants, &mPixelConstants, sizeof(dx_PixelConstants));
++ ASSERT(mDriverConstantBufferPS != nullptr);
++ if (mDriverConstantBufferPS)
++ {
++ mDeviceContext->UpdateSubresource(mDriverConstantBufferPS, 0, NULL, &mPixelConstants, 16, 0);
++ memcpy(&mAppliedPixelConstants, &mPixelConstants, sizeof(dx_PixelConstants));
++ }
+ }
+
+ // GSSetConstantBuffers triggers device removal on 9_3, so we should only call it if necessary
+@@ -2097,8 +2124,12 @@ gl::Error Renderer11::applyUniforms(const ProgramImpl &program, const std::vecto
+ // needed for the point sprite geometry shader
+ if (mCurrentGeometryConstantBuffer != mDriverConstantBufferPS)
+ {
+- mDeviceContext->GSSetConstantBuffers(0, 1, &mDriverConstantBufferPS);
+- mCurrentGeometryConstantBuffer = mDriverConstantBufferPS;
++ ASSERT(mDriverConstantBufferPS != nullptr);
++ if (mDriverConstantBufferPS)
++ {
++ mDeviceContext->GSSetConstantBuffers(0, 1, &mDriverConstantBufferPS);
++ mCurrentGeometryConstantBuffer = mDriverConstantBufferPS;
++ }
+ }
+ }
+
+diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
+index 0af2cf1..2667109 100644
+--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
++++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
+@@ -345,9 +345,16 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
+
+ // Resize swap chain
+ DXGI_SWAP_CHAIN_DESC desc;
+- mSwapChain->GetDesc(&desc);
++ HRESULT result = mSwapChain->GetDesc(&desc);
++ if (FAILED(result))
++ {
++ ERR("Error reading swap chain description: 0x%08X", result);
++ release();
++ return EGL_BAD_ALLOC;
++ }
++
+ const d3d11::TextureFormat &backbufferFormatInfo = d3d11::GetTextureFormatInfo(mBackBufferFormat, mRenderer->getFeatureLevel());
+- HRESULT result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0);
++ result = mSwapChain->ResizeBuffers(desc.BufferCount, backbufferWidth, backbufferHeight, backbufferFormatInfo.texFormat, 0);
+
+ if (FAILED(result))
+ {
+@@ -369,10 +376,10 @@ EGLint SwapChain11::resize(EGLint backbufferWidth, EGLint backbufferHeight)
+ if (SUCCEEDED(result))
+ {
+ d3d11::SetDebugName(mBackBufferTexture, "Back buffer texture");
++ result = device->CreateRenderTargetView(mBackBufferTexture, NULL, &mBackBufferRTView);
++ ASSERT(SUCCEEDED(result));
+ }
+
+- result = device->CreateRenderTargetView(mBackBufferTexture, NULL, &mBackBufferRTView);
+- ASSERT(SUCCEEDED(result));
+ if (SUCCEEDED(result))
+ {
+ d3d11::SetDebugName(mBackBufferRTView, "Back buffer render target");
+diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
+index 207e6b5..34d998c 100644
+--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
++++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.h
+@@ -136,34 +136,43 @@ inline bool isDeviceLostError(HRESULT errorCode)
+ template <unsigned int N>
+ inline ID3D11VertexShader *CompileVS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
+ {
+- ID3D11VertexShader *vs = NULL;
+- HRESULT result = device->CreateVertexShader(byteCode, N, NULL, &vs);
+- UNUSED_ASSERTION_VARIABLE(result);
++ ID3D11VertexShader *vs = nullptr;
++ HRESULT result = device->CreateVertexShader(byteCode, N, nullptr, &vs);
+ ASSERT(SUCCEEDED(result));
+- SetDebugName(vs, name);
+- return vs;
++ if (SUCCEEDED(result))
++ {
++ SetDebugName(vs, name);
++ return vs;
++ }
++ return nullptr;
+ }
+
+ template <unsigned int N>
+ inline ID3D11GeometryShader *CompileGS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
+ {
+- ID3D11GeometryShader *gs = NULL;
+- HRESULT result = device->CreateGeometryShader(byteCode, N, NULL, &gs);
+- UNUSED_ASSERTION_VARIABLE(result);
++ ID3D11GeometryShader *gs = nullptr;
++ HRESULT result = device->CreateGeometryShader(byteCode, N, nullptr, &gs);
+ ASSERT(SUCCEEDED(result));
+- SetDebugName(gs, name);
+- return gs;
++ if (SUCCEEDED(result))
++ {
++ SetDebugName(gs, name);
++ return gs;
++ }
++ return nullptr;
+ }
+
+ template <unsigned int N>
+ inline ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE (&byteCode)[N], const char *name)
+ {
+- ID3D11PixelShader *ps = NULL;
+- HRESULT result = device->CreatePixelShader(byteCode, N, NULL, &ps);
+- UNUSED_ASSERTION_VARIABLE(result);
++ ID3D11PixelShader *ps = nullptr;
++ HRESULT result = device->CreatePixelShader(byteCode, N, nullptr, &ps);
+ ASSERT(SUCCEEDED(result));
+- SetDebugName(ps, name);
+- return ps;
++ if (SUCCEEDED(result))
++ {
++ SetDebugName(ps, name);
++ return ps;
++ }
++ return nullptr;
+ }
+
+ // Copy data to small D3D11 buffers, such as for small constant buffers, which use one struct to
+@@ -171,12 +180,14 @@ inline ID3D11PixelShader *CompilePS(ID3D11Device *device, const BYTE (&byteCode)
+ template <class T>
+ inline void SetBufferData(ID3D11DeviceContext *context, ID3D11Buffer *constantBuffer, const T &value)
+ {
+- D3D11_MAPPED_SUBRESOURCE mappedResource;
+- context->Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+-
+- memcpy(mappedResource.pData, &value, sizeof(T));
+-
+- context->Unmap(constantBuffer, 0);
++ D3D11_MAPPED_SUBRESOURCE mappedResource = {};
++ HRESULT result = context->Map(constantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
++ ASSERT(SUCCEEDED(result));
++ if (SUCCEEDED(result))
++ {
++ memcpy(mappedResource.pData, &value, sizeof(T));
++ context->Unmap(constantBuffer, 0);
++ }
+ }
+
+ gl::Error GetAttachmentRenderTarget(const gl::FramebufferAttachment *attachment, RenderTarget11 **outRT);
+diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp
+index e83f479..2455e55 100644
+--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp
++++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp
+@@ -233,7 +233,7 @@ HRESULT GetOptionalSizePropertyValue(const ComPtr<ABI::Windows::Foundation::Coll
+ {
+ if (!propertyMap || !propertyName || !value || !valueExists)
+ {
+- return false;
++ return E_INVALIDARG;
+ }
+
+ // Assume that the value does not exist
+@@ -292,16 +292,18 @@ HRESULT GetOptionalSizePropertyValue(const ComPtr<ABI::Windows::Foundation::Coll
+ static float GetLogicalDpi()
+ {
+ ComPtr<ABI::Windows::Graphics::Display::IDisplayPropertiesStatics> displayProperties;
+- float dpi = 96.0f;
+
+ if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Graphics_Display_DisplayProperties).Get(), displayProperties.GetAddressOf())))
+ {
++ float dpi = 96.0f;
+ if (SUCCEEDED(displayProperties->get_LogicalDpi(&dpi)))
+ {
+ return dpi;
+ }
+ }
+- return dpi;
++
++ // Return 96 dpi as a default if display properties cannot be obtained.
++ return 96.0f;
+ }
+
+ long ConvertDipsToPixels(float dips)
+--
+2.10.2.windows.1
+