Commit e9cc78a1 by Corentin Wallez

Make Buffer11::mBuffersStorages an array instead of a map

BUG=angleproject:516 Change-Id: I7f969435a89c0063b504628d2ec3321cc02df7ce Reviewed-on: https://chromium-review.googlesource.com/283243Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent bc3b5e63
...@@ -234,17 +234,18 @@ Buffer11::Buffer11(Renderer11 *renderer) ...@@ -234,17 +234,18 @@ Buffer11::Buffer11(Renderer11 *renderer)
mRenderer(renderer), mRenderer(renderer),
mSize(0), mSize(0),
mMappedStorage(nullptr), mMappedStorage(nullptr),
mBufferStorages(BUFFER_USAGE_COUNT, nullptr),
mConstantBufferStorageAdditionalSize(0), mConstantBufferStorageAdditionalSize(0),
mMaxConstantBufferLruCount(0), mMaxConstantBufferLruCount(0),
mReadUsageCount(0), mReadUsageCount(0)
mHasSystemMemoryStorage(false) {
{} }
Buffer11::~Buffer11() Buffer11::~Buffer11()
{ {
for (auto &p : mBufferStorages) for (auto &storage : mBufferStorages)
{ {
SafeDelete(p.second); SafeDelete(storage);
} }
for (auto &p : mConstantBufferRangeStoragesCache) for (auto &p : mConstantBufferRangeStoragesCache)
...@@ -488,16 +489,12 @@ void Buffer11::markBufferUsage() ...@@ -488,16 +489,12 @@ void Buffer11::markBufferUsage()
// Free the system memory storage if we decide it isn't being used very often. // Free the system memory storage if we decide it isn't being used very often.
const unsigned int usageLimit = 5; const unsigned int usageLimit = 5;
if (mReadUsageCount > usageLimit && mHasSystemMemoryStorage) BufferStorage *&sysMemUsage = mBufferStorages[BUFFER_USAGE_SYSTEM_MEMORY];
if (mReadUsageCount > usageLimit && sysMemUsage != nullptr)
{ {
auto systemMemoryStorageIt = mBufferStorages.find(BUFFER_USAGE_SYSTEM_MEMORY); if (getLatestBufferStorage() != sysMemUsage)
ASSERT(systemMemoryStorageIt != mBufferStorages.end());
if (getLatestBufferStorage() != systemMemoryStorageIt->second)
{ {
SafeDelete(systemMemoryStorageIt->second); SafeDelete(sysMemUsage);
mBufferStorages.erase(systemMemoryStorageIt);
mHasSystemMemoryStorage = false;
} }
} }
} }
...@@ -632,12 +629,8 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource, ...@@ -632,12 +629,8 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource,
Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage) Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage)
{ {
BufferStorage *newStorage = nullptr; ASSERT(0 <= usage && usage < BUFFER_USAGE_COUNT);
auto directBufferIt = mBufferStorages.find(usage); BufferStorage *&newStorage = mBufferStorages[usage];
if (directBufferIt != mBufferStorages.end())
{
newStorage = directBufferIt->second;
}
if (!newStorage) if (!newStorage)
{ {
...@@ -648,7 +641,6 @@ Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage) ...@@ -648,7 +641,6 @@ Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage)
else if (usage == BUFFER_USAGE_SYSTEM_MEMORY) else if (usage == BUFFER_USAGE_SYSTEM_MEMORY)
{ {
newStorage = new SystemMemoryStorage(mRenderer); newStorage = new SystemMemoryStorage(mRenderer);
mHasSystemMemoryStorage = true;
} }
else if (usage == BUFFER_USAGE_EMULATED_INDEXED_VERTEX) else if (usage == BUFFER_USAGE_EMULATED_INDEXED_VERTEX)
{ {
...@@ -659,8 +651,6 @@ Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage) ...@@ -659,8 +651,6 @@ Buffer11::BufferStorage *Buffer11::getBufferStorage(BufferUsage usage)
// buffer is not allocated, create it // buffer is not allocated, create it
newStorage = new NativeStorage(mRenderer, usage); newStorage = new NativeStorage(mRenderer, usage);
} }
mBufferStorages.insert(std::make_pair(usage, newStorage));
} }
// resize buffer // resize buffer
...@@ -772,10 +762,9 @@ Buffer11::BufferStorage *Buffer11::getLatestBufferStorage() const ...@@ -772,10 +762,9 @@ Buffer11::BufferStorage *Buffer11::getLatestBufferStorage() const
// 1 or 2 will be present. // 1 or 2 will be present.
BufferStorage *latestStorage = nullptr; BufferStorage *latestStorage = nullptr;
DataRevision latestRevision = 0; DataRevision latestRevision = 0;
for (auto it = mBufferStorages.begin(); it != mBufferStorages.end(); it++) for (auto &storage : mBufferStorages)
{ {
BufferStorage *storage = it->second; if (storage && (!latestStorage || storage->getDataRevision() > latestRevision))
if (!latestStorage || storage->getDataRevision() > latestRevision)
{ {
latestStorage = storage; latestStorage = storage;
latestRevision = storage->getDataRevision(); latestRevision = storage->getDataRevision();
......
...@@ -30,6 +30,8 @@ enum BufferUsage ...@@ -30,6 +30,8 @@ enum BufferUsage
BUFFER_USAGE_UNIFORM, BUFFER_USAGE_UNIFORM,
BUFFER_USAGE_SYSTEM_MEMORY, BUFFER_USAGE_SYSTEM_MEMORY,
BUFFER_USAGE_EMULATED_INDEXED_VERTEX, BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
BUFFER_USAGE_COUNT,
}; };
struct PackPixelsParams struct PackPixelsParams
...@@ -88,7 +90,7 @@ class Buffer11 : public BufferD3D ...@@ -88,7 +90,7 @@ class Buffer11 : public BufferD3D
BufferStorage *mMappedStorage; BufferStorage *mMappedStorage;
std::map<BufferUsage, BufferStorage*> mBufferStorages; std::vector<BufferStorage*> mBufferStorages;
struct ConstantBufferCacheEntry struct ConstantBufferCacheEntry
{ {
...@@ -110,7 +112,6 @@ class Buffer11 : public BufferD3D ...@@ -110,7 +112,6 @@ class Buffer11 : public BufferD3D
std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews; std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews;
unsigned int mReadUsageCount; unsigned int mReadUsageCount;
bool mHasSystemMemoryStorage;
void markBufferUsage(); void markBufferUsage();
NativeStorage *getStagingStorage(); NativeStorage *getStagingStorage();
......
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