Bug 1412554 - Return GL_OOM if memory counter in ResourceManager11 overflow
MozReview-Commit-ID: AgDd95NlNZq
--- a/gfx/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
+++ b/gfx/angle/src/libANGLE/renderer/d3d/d3d11/ResourceManager11.cpp
@@ -355,16 +355,26 @@ gl::Error ResourceManager11::allocate(Re
T *resource = nullptr;
GetInitDataFromD3D11<T> *shadowInitData = initData;
if (!shadowInitData && renderer->isRobustResourceInitEnabled())
{
shadowInitData = createInitDataIfNeeded<T>(desc);
}
+ // In Windows 32-bit, it's possible that mAllocatedResourceDeviceMemory
+ // exceeds UINT32_MAX leading to a delayed crash when we release
+ // the context, we should prevent that happen
+ const auto resourceSize = ComputeMemoryUsage(desc);
+ if (mAllocatedResourceDeviceMemory[ResourceTypeIndex<T>()] >
+ mAllocatedResourceDeviceMemory[ResourceTypeIndex<T>()] +
+ resourceSize) {
+ return gl::OutOfMemory() << "Error: Internal Memory Counter overflow";
+ }
+
HRESULT hr = CreateResource(device, desc, shadowInitData, &resource);
if (FAILED(hr))
{
ASSERT(!resource);
if (d3d11::isDeviceLostError(hr))
{
renderer->notifyDeviceLost();
}
@@ -374,24 +384,26 @@ gl::Error ResourceManager11::allocate(Re
}
if (!shadowInitData && renderer->isRobustResourceInitEnabled())
{
ANGLE_TRY(ClearResource(renderer, desc, resource));
}
ASSERT(resource);
- incrResource(GetResourceTypeFromD3D11<T>(), ComputeMemoryUsage(desc));
+ incrResource(GetResourceTypeFromD3D11<T>(), resourceSize);
*resourceOut = std::move(Resource11<T>(resource, this));
return gl::NoError();
}
void ResourceManager11::incrResource(ResourceType resourceType, size_t memorySize)
{
mAllocatedResourceCounts[ResourceTypeIndex(resourceType)]++;
+ ASSERT(mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] + memorySize >=
+ mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)]);
mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] += memorySize;
}
void ResourceManager11::decrResource(ResourceType resourceType, size_t memorySize)
{
ASSERT(mAllocatedResourceCounts[ResourceTypeIndex(resourceType)] > 0);
mAllocatedResourceCounts[ResourceTypeIndex(resourceType)]--;
ASSERT(mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] >= memorySize);