Revert "Optimize dynamic buffers."
This reverts commit 3e3813f787ee5e8bb7808eed539a606a4e2e3fd3.
Conflicts:
src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
Change-Id: I6470059672d3b377ce0fafbc8b637318a91f62c8
Reviewed-on: https://chromium-review.googlesource.com/217106
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/common/mathutil.h b/src/common/mathutil.h
index 9e7a8de..ffcb908 100644
--- a/src/common/mathutil.h
+++ b/src/common/mathutil.h
@@ -507,12 +507,12 @@
struct Range
{
Range() {}
- Range(T lo, T hi) : start(lo), end(hi) { }
+ Range(T lo, T hi) : start(lo), end(hi) { ASSERT(lo <= hi); }
T start;
T end;
- T length() const { return (end > start ? (end - start) : 0); }
+ T length() const { return end - start; }
};
typedef Range<int> RangeI;
diff --git a/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp b/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp
index 4634a34..301bbe8 100644
--- a/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp
+++ b/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp
@@ -28,7 +28,9 @@
{
if (size == 0)
{
- clear();
+ free(mData);
+ mData = NULL;
+ mSize = 0;
}
else
{
@@ -67,11 +69,4 @@
return mData;
}
-void MemoryBuffer::clear()
-{
- free(mData);
- mData = NULL;
- mSize = 0;
-}
-
}
diff --git a/src/libGLESv2/renderer/d3d/MemoryBuffer.h b/src/libGLESv2/renderer/d3d/MemoryBuffer.h
index 47b5772..2484c07 100644
--- a/src/libGLESv2/renderer/d3d/MemoryBuffer.h
+++ b/src/libGLESv2/renderer/d3d/MemoryBuffer.h
@@ -21,13 +21,10 @@
bool resize(size_t size);
size_t size() const;
- void clear();
const uint8_t *data() const;
uint8_t *data();
- bool empty() const { return (mSize == 0); }
-
private:
size_t mSize;
uint8_t *mData;
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
index 3fee3fd..ea6660e 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
@@ -162,9 +162,7 @@
mSize(0),
mMappedStorage(NULL),
mResolvedDataRevision(0),
- mReadUsageCount(0),
- mDynamicUsage(0),
- mDynamicDirtyRange(std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::min())
+ mReadUsageCount(0)
{}
Buffer11::~Buffer11()
@@ -183,16 +181,6 @@
gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage)
{
- mDynamicUsage = (usage == GL_DYNAMIC_DRAW);
-
- if (mDynamicUsage)
- {
- if (!mDynamicData.resize(size))
- {
- return gl::Error(GL_OUT_OF_MEMORY);
- }
- }
-
gl::Error error = setSubData(data, size, 0);
if (error.isError())
{
@@ -254,39 +242,30 @@
if (data && size > 0)
{
- if (mDynamicUsage)
+ NativeBuffer11 *stagingBuffer = getStagingBuffer();
+
+ if (!stagingBuffer)
{
- mDynamicDirtyRange.start = std::min(mDynamicDirtyRange.start, offset);
- mDynamicDirtyRange.end = std::max(mDynamicDirtyRange.end, size + offset);
- memcpy(mDynamicData.data() + offset, data, size);
+ return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
}
- else
+
+ // Explicitly resize the staging buffer, preserving data if the new data will not
+ // completely fill the buffer
+ if (stagingBuffer->getSize() < requiredSize)
{
- NativeBuffer11 *stagingBuffer = getStagingBuffer();
-
- if (!stagingBuffer)
+ bool preserveData = (offset > 0);
+ if (!stagingBuffer->resize(requiredSize, preserveData))
{
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
+ return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal staging buffer.");
}
-
- // Explicitly resize the staging buffer, preserving data if the new data will not
- // completely fill the buffer
- if (stagingBuffer->getSize() < requiredSize)
- {
- bool preserveData = (offset > 0);
- if (!stagingBuffer->resize(requiredSize, preserveData))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal staging buffer.");
- }
- }
-
- if (!stagingBuffer->setData(D3D11_MAP_WRITE, reinterpret_cast<const uint8_t *>(data), size, offset))
- {
- return gl::Error(GL_OUT_OF_MEMORY, "Failed to set data on internal staging buffer.");
- }
-
- stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1);
}
+
+ if (!stagingBuffer->setData(D3D11_MAP_WRITE, reinterpret_cast<const uint8_t *>(data), size, offset))
+ {
+ return gl::Error(GL_OUT_OF_MEMORY, "Failed to set data on internal staging buffer.");
+ }
+
+ stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1);
}
mSize = std::max(mSize, requiredSize);
@@ -331,7 +310,7 @@
{
if (copySource->getUsage() == BUFFER_USAGE_STAGING)
{
- copySource = getBufferStorage(BUFFER_USAGE_VERTEX);
+ copySource = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
}
else
{
@@ -398,7 +377,7 @@
void Buffer11::markTransformFeedbackUsage()
{
- BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_TRANSFORM_FEEDBACK);
+ BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
if (transformFeedbackStorage)
{
@@ -510,38 +489,10 @@
return gl::Error(GL_NO_ERROR);
}
-Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage)
+Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage usage)
{
- ASSERT(requestedUsage != BUFFER_USAGE_VERTEX_DYNAMIC);
- ASSERT(requestedUsage != BUFFER_USAGE_INDEX_DYNAMIC);
-
- BufferUsage internalUsage = requestedUsage;
-
- if (mDynamicUsage)
- {
- if (requestedUsage == BUFFER_USAGE_VERTEX)
- {
- internalUsage = BUFFER_USAGE_VERTEX_DYNAMIC;
- }
- else if (requestedUsage == BUFFER_USAGE_INDEX)
- {
- internalUsage = BUFFER_USAGE_INDEX_DYNAMIC;
- }
- else
- {
- // Convert out of dynamic usage
- setData(mDynamicData.data(), mDynamicData.size(), GL_STATIC_DRAW);
- }
- }
-
- // Internally we share the same NativeBuffer11 for stream out and vertex data
- if (requestedUsage == BUFFER_USAGE_TRANSFORM_FEEDBACK)
- {
- internalUsage = BUFFER_USAGE_VERTEX;
- }
-
BufferStorage11 *directBuffer = NULL;
- auto directBufferIt = mBufferStorages.find(internalUsage);
+ auto directBufferIt = mBufferStorages.find(usage);
if (directBufferIt != mBufferStorages.end())
{
directBuffer = directBufferIt->second;
@@ -549,17 +500,17 @@
if (!directBuffer)
{
- if (internalUsage == BUFFER_USAGE_PIXEL_PACK)
+ if (usage == BUFFER_USAGE_PIXEL_PACK)
{
directBuffer = new PackStorage11(mRenderer);
}
else
{
// buffer is not allocated, create it
- directBuffer = new NativeBuffer11(mRenderer, internalUsage);
+ directBuffer = new NativeBuffer11(mRenderer, usage);
}
- mBufferStorages.insert(std::make_pair(internalUsage, directBuffer));
+ mBufferStorages.insert(std::make_pair(usage, directBuffer));
}
// resize buffer
@@ -572,18 +523,6 @@
}
}
- if (mDynamicUsage)
- {
- if (!mDynamicData.empty() && mDynamicDirtyRange.length() > 0)
- {
- ASSERT(HAS_DYNAMIC_TYPE(NativeBuffer11*, directBuffer));
- NativeBuffer11 *dynamicBuffer = static_cast<NativeBuffer11*>(directBuffer);
- dynamicBuffer->setData(D3D11_MAP_WRITE_NO_OVERWRITE, mDynamicData.data(), mDynamicDirtyRange.length(), mDynamicDirtyRange.start);
- }
-
- return directBuffer;
- }
-
BufferStorage11 *latestBuffer = getLatestBufferStorage();
if (latestBuffer && latestBuffer->getDataRevision() > directBuffer->getDataRevision())
{
@@ -787,8 +726,7 @@
bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
break;
- case BUFFER_USAGE_VERTEX:
- case BUFFER_USAGE_TRANSFORM_FEEDBACK:
+ case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
bufferDesc->Usage = D3D11_USAGE_DEFAULT;
bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_OUTPUT;
bufferDesc->CPUAccessFlags = 0;
@@ -817,18 +755,6 @@
bufferDesc->ByteWidth = std::min<UINT>(bufferDesc->ByteWidth, renderer->getRendererCaps().maxUniformBlockSize);
break;
- case BUFFER_USAGE_VERTEX_DYNAMIC:
- bufferDesc->Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- break;
-
- case BUFFER_USAGE_INDEX_DYNAMIC:
- bufferDesc->Usage = D3D11_USAGE_DYNAMIC;
- bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER;
- bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- break;
-
default:
UNREACHABLE();
}
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
index 70449bb..5740566 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
+++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
@@ -20,16 +20,11 @@
enum BufferUsage
{
BUFFER_USAGE_STAGING,
- BUFFER_USAGE_VERTEX,
- BUFFER_USAGE_TRANSFORM_FEEDBACK,
+ BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
BUFFER_USAGE_INDEX,
BUFFER_USAGE_PIXEL_UNPACK,
BUFFER_USAGE_PIXEL_PACK,
BUFFER_USAGE_UNIFORM,
-
- // Internal flags
- BUFFER_USAGE_VERTEX_DYNAMIC,
- BUFFER_USAGE_INDEX_DYNAMIC
};
struct PackPixelsParams
@@ -83,13 +78,6 @@
class NativeBuffer11;
class PackStorage11;
- void markBufferUsage();
- NativeBuffer11 *getStagingBuffer();
- PackStorage11 *getPackStorage();
-
- BufferStorage11 *getBufferStorage(BufferUsage usage);
- BufferStorage11 *getLatestBufferStorage() const;
-
rx::Renderer11 *mRenderer;
size_t mSize;
@@ -104,9 +92,12 @@
DataRevision mResolvedDataRevision;
unsigned int mReadUsageCount;
- MemoryBuffer mDynamicData;
- bool mDynamicUsage;
- Range<size_t> mDynamicDirtyRange;
+ void markBufferUsage();
+ NativeBuffer11 *getStagingBuffer();
+ PackStorage11 *getPackStorage();
+
+ BufferStorage11 *getBufferStorage(BufferUsage usage);
+ BufferStorage11 *getLatestBufferStorage() const;
};
}
diff --git a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
index 3050a49..b06526e 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
@@ -195,7 +195,7 @@
VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer);
Buffer11 *bufferStorage = attributes[i].storage ? Buffer11::makeBuffer11(attributes[i].storage) : NULL;
- buffer = bufferStorage ? bufferStorage->getBuffer(BUFFER_USAGE_VERTEX)
+ buffer = bufferStorage ? bufferStorage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK)
: vertexBuffer->getBuffer();
}
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
index 1a652fd..fba179f 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
@@ -975,7 +975,7 @@
if (transformFeedbackBuffers[i])
{
Buffer11 *storage = Buffer11::makeBuffer11(transformFeedbackBuffers[i]->getImplementation());
- ID3D11Buffer *buffer = storage->getBuffer(BUFFER_USAGE_TRANSFORM_FEEDBACK);
+ ID3D11Buffer *buffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
d3dBuffers[i] = buffer;
d3dOffsets[i] = (mAppliedTFBuffers[i] != buffer) ? static_cast<UINT>(offsets[i]) : -1;