Commit 192199a7 by Jamie Madill Committed by Commit Bot

ResourceManager11: Store resource sizes 64-bit.

This prevents possible size count overflow when in 32-bit mode with a lot of very large resources. Issue originally reported via Mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=1412554 BUG=angleproject:2234 Change-Id: Idacfda98356c13bf22bc493ef7aa2bff1a287f97 Reviewed-on: https://chromium-review.googlesource.com/769749 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 6226b8df
...@@ -23,54 +23,56 @@ constexpr FLOAT kDebugColorInitClearValue[4] = {0.3f, 0.5f, 0.7f, 0.5f}; ...@@ -23,54 +23,56 @@ constexpr FLOAT kDebugColorInitClearValue[4] = {0.3f, 0.5f, 0.7f, 0.5f};
constexpr FLOAT kDebugDepthInitValue = 0.2f; constexpr FLOAT kDebugDepthInitValue = 0.2f;
constexpr UINT8 kDebugStencilInitValue = 3; constexpr UINT8 kDebugStencilInitValue = 3;
size_t ComputeMippedMemoryUsage(unsigned int width, uint64_t ComputeMippedMemoryUsage(unsigned int width,
unsigned int height, unsigned int height,
unsigned int depth, unsigned int depth,
size_t pixelSize, uint64_t pixelSize,
unsigned int mipLevels) unsigned int mipLevels)
{ {
size_t sizeSum = 0; uint64_t sizeSum = 0;
for (unsigned int level = 0; level < mipLevels; ++level) for (unsigned int level = 0; level < mipLevels; ++level)
{ {
unsigned int mipWidth = std::max(width >> level, 1u); unsigned int mipWidth = std::max(width >> level, 1u);
unsigned int mipHeight = std::max(height >> level, 1u); unsigned int mipHeight = std::max(height >> level, 1u);
unsigned int mipDepth = std::max(depth >> level, 1u); unsigned int mipDepth = std::max(depth >> level, 1u);
sizeSum += static_cast<size_t>(mipWidth * mipHeight * mipDepth) * pixelSize; sizeSum += static_cast<uint64_t>(mipWidth * mipHeight * mipDepth) * pixelSize;
} }
return sizeSum; return sizeSum;
} }
size_t ComputeMemoryUsage(const D3D11_TEXTURE2D_DESC *desc) uint64_t ComputeMemoryUsage(const D3D11_TEXTURE2D_DESC *desc)
{ {
ASSERT(desc); ASSERT(desc);
size_t pixelBytes = static_cast<size_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes); uint64_t pixelBytes =
static_cast<uint64_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes);
return ComputeMippedMemoryUsage(desc->Width, desc->Height, 1, pixelBytes, desc->MipLevels); return ComputeMippedMemoryUsage(desc->Width, desc->Height, 1, pixelBytes, desc->MipLevels);
} }
size_t ComputeMemoryUsage(const D3D11_TEXTURE3D_DESC *desc) uint64_t ComputeMemoryUsage(const D3D11_TEXTURE3D_DESC *desc)
{ {
ASSERT(desc); ASSERT(desc);
size_t pixelBytes = static_cast<size_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes); uint64_t pixelBytes =
static_cast<uint64_t>(d3d11::GetDXGIFormatSizeInfo(desc->Format).pixelBytes);
return ComputeMippedMemoryUsage(desc->Width, desc->Height, desc->Depth, pixelBytes, return ComputeMippedMemoryUsage(desc->Width, desc->Height, desc->Depth, pixelBytes,
desc->MipLevels); desc->MipLevels);
} }
size_t ComputeMemoryUsage(const D3D11_BUFFER_DESC *desc) uint64_t ComputeMemoryUsage(const D3D11_BUFFER_DESC *desc)
{ {
ASSERT(desc); ASSERT(desc);
return static_cast<size_t>(desc->ByteWidth); return static_cast<uint64_t>(desc->ByteWidth);
} }
template <typename T> template <typename T>
size_t ComputeMemoryUsage(const T *desc) uint64_t ComputeMemoryUsage(const T *desc)
{ {
return 0; return 0;
} }
template <ResourceType ResourceT> template <ResourceType ResourceT>
size_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource) uint64_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource)
{ {
auto *typedResource = static_cast<GetD3D11Type<ResourceT> *>(genericResource); auto *typedResource = static_cast<GetD3D11Type<ResourceT> *>(genericResource);
GetDescType<ResourceT> desc; GetDescType<ResourceT> desc;
...@@ -78,7 +80,7 @@ size_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource) ...@@ -78,7 +80,7 @@ size_t ComputeGenericMemoryUsage(ID3D11DeviceChild *genericResource)
return ComputeMemoryUsage(&desc); return ComputeMemoryUsage(&desc);
} }
size_t ComputeGenericMemoryUsage(ResourceType resourceType, ID3D11DeviceChild *resource) uint64_t ComputeGenericMemoryUsage(ResourceType resourceType, ID3D11DeviceChild *resource)
{ {
switch (resourceType) switch (resourceType)
{ {
...@@ -346,7 +348,7 @@ ResourceManager11::~ResourceManager11() ...@@ -346,7 +348,7 @@ ResourceManager11::~ResourceManager11()
ASSERT(count == 0); ASSERT(count == 0);
} }
for (size_t memorySize : mAllocatedResourceDeviceMemory) for (uint64_t memorySize : mAllocatedResourceDeviceMemory)
{ {
ASSERT(memorySize == 0); ASSERT(memorySize == 0);
} }
...@@ -391,18 +393,26 @@ gl::Error ResourceManager11::allocate(Renderer11 *renderer, ...@@ -391,18 +393,26 @@ gl::Error ResourceManager11::allocate(Renderer11 *renderer,
return gl::NoError(); return gl::NoError();
} }
void ResourceManager11::incrResource(ResourceType resourceType, size_t memorySize) void ResourceManager11::incrResource(ResourceType resourceType, uint64_t memorySize)
{ {
mAllocatedResourceCounts[ResourceTypeIndex(resourceType)]++; size_t typeIndex = ResourceTypeIndex(resourceType);
mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] += memorySize;
mAllocatedResourceCounts[typeIndex]++;
mAllocatedResourceDeviceMemory[typeIndex] += memorySize;
// This checks for integer overflow.
ASSERT(mAllocatedResourceCounts[typeIndex] > 0);
ASSERT(mAllocatedResourceDeviceMemory[typeIndex] >= memorySize);
} }
void ResourceManager11::decrResource(ResourceType resourceType, size_t memorySize) void ResourceManager11::decrResource(ResourceType resourceType, uint64_t memorySize)
{ {
ASSERT(mAllocatedResourceCounts[ResourceTypeIndex(resourceType)] > 0); size_t typeIndex = ResourceTypeIndex(resourceType);
mAllocatedResourceCounts[ResourceTypeIndex(resourceType)]--;
ASSERT(mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] >= memorySize); ASSERT(mAllocatedResourceCounts[typeIndex] > 0);
mAllocatedResourceDeviceMemory[ResourceTypeIndex(resourceType)] -= memorySize; mAllocatedResourceCounts[typeIndex]--;
ASSERT(mAllocatedResourceDeviceMemory[typeIndex] >= memorySize);
mAllocatedResourceDeviceMemory[typeIndex] -= memorySize;
} }
void ResourceManager11::onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource) void ResourceManager11::onReleaseGeneric(ResourceType resourceType, ID3D11DeviceChild *resource)
...@@ -423,7 +433,7 @@ const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Te ...@@ -423,7 +433,7 @@ const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Te
return nullptr; return nullptr;
} }
size_t requiredSize = ComputeMemoryUsage(desc); size_t requiredSize = static_cast<size_t>(ComputeMemoryUsage(desc));
if (mZeroMemory.size() < requiredSize) if (mZeroMemory.size() < requiredSize)
{ {
mZeroMemory.resize(requiredSize); mZeroMemory.resize(requiredSize);
...@@ -469,7 +479,7 @@ const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Te ...@@ -469,7 +479,7 @@ const D3D11_SUBRESOURCE_DATA *ResourceManager11::createInitDataIfNeeded<ID3D11Te
return nullptr; return nullptr;
} }
size_t requiredSize = ComputeMemoryUsage(desc); size_t requiredSize = static_cast<size_t>(ComputeMemoryUsage(desc));
if (mZeroMemory.size() < requiredSize) if (mZeroMemory.size() < requiredSize)
{ {
mZeroMemory.resize(requiredSize); mZeroMemory.resize(requiredSize);
......
...@@ -320,8 +320,8 @@ class ResourceManager11 final : angle::NonCopyable ...@@ -320,8 +320,8 @@ class ResourceManager11 final : angle::NonCopyable
void setAllocationsInitialized(bool initialize); void setAllocationsInitialized(bool initialize);
private: private:
void incrResource(ResourceType resourceType, size_t memorySize); void incrResource(ResourceType resourceType, uint64_t memorySize);
void decrResource(ResourceType resourceType, size_t memorySize); void decrResource(ResourceType resourceType, uint64_t memorySize);
template <typename T> template <typename T>
GetInitDataFromD3D11<T> *createInitDataIfNeeded(const GetDescFromD3D11<T> *desc); GetInitDataFromD3D11<T> *createInitDataIfNeeded(const GetDescFromD3D11<T> *desc);
...@@ -329,7 +329,7 @@ class ResourceManager11 final : angle::NonCopyable ...@@ -329,7 +329,7 @@ class ResourceManager11 final : angle::NonCopyable
bool mInitializeAllocations; bool mInitializeAllocations;
std::array<size_t, NumResourceTypes> mAllocatedResourceCounts; std::array<size_t, NumResourceTypes> mAllocatedResourceCounts;
std::array<size_t, NumResourceTypes> mAllocatedResourceDeviceMemory; std::array<uint64_t, NumResourceTypes> mAllocatedResourceDeviceMemory;
angle::MemoryBuffer mZeroMemory; angle::MemoryBuffer mZeroMemory;
std::vector<D3D11_SUBRESOURCE_DATA> mShadowInitData; std::vector<D3D11_SUBRESOURCE_DATA> mShadowInitData;
......
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