Commit cc00239d by Jamie Madill

Revert "Optimize dynamic buffers."

This reverts commit 3e3813f7. Conflicts: src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp Change-Id: I6470059672d3b377ce0fafbc8b637318a91f62c8 Reviewed-on: https://chromium-review.googlesource.com/217106Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 5ac5ae86
...@@ -507,12 +507,12 @@ template <typename T> ...@@ -507,12 +507,12 @@ template <typename T>
struct Range struct Range
{ {
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 start;
T end; T end;
T length() const { return (end > start ? (end - start) : 0); } T length() const { return end - start; }
}; };
typedef Range<int> RangeI; typedef Range<int> RangeI;
......
...@@ -28,7 +28,9 @@ bool MemoryBuffer::resize(size_t size) ...@@ -28,7 +28,9 @@ bool MemoryBuffer::resize(size_t size)
{ {
if (size == 0) if (size == 0)
{ {
clear(); free(mData);
mData = NULL;
mSize = 0;
} }
else else
{ {
...@@ -67,11 +69,4 @@ uint8_t *MemoryBuffer::data() ...@@ -67,11 +69,4 @@ uint8_t *MemoryBuffer::data()
return mData; return mData;
} }
void MemoryBuffer::clear()
{
free(mData);
mData = NULL;
mSize = 0;
}
} }
...@@ -21,13 +21,10 @@ class MemoryBuffer ...@@ -21,13 +21,10 @@ class MemoryBuffer
bool resize(size_t size); bool resize(size_t size);
size_t size() const; size_t size() const;
void clear();
const uint8_t *data() const; const uint8_t *data() const;
uint8_t *data(); uint8_t *data();
bool empty() const { return (mSize == 0); }
private: private:
size_t mSize; size_t mSize;
uint8_t *mData; uint8_t *mData;
......
...@@ -162,9 +162,7 @@ Buffer11::Buffer11(Renderer11 *renderer) ...@@ -162,9 +162,7 @@ Buffer11::Buffer11(Renderer11 *renderer)
mSize(0), mSize(0),
mMappedStorage(NULL), mMappedStorage(NULL),
mResolvedDataRevision(0), mResolvedDataRevision(0),
mReadUsageCount(0), mReadUsageCount(0)
mDynamicUsage(0),
mDynamicDirtyRange(std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::min())
{} {}
Buffer11::~Buffer11() Buffer11::~Buffer11()
...@@ -183,16 +181,6 @@ Buffer11 *Buffer11::makeBuffer11(BufferImpl *buffer) ...@@ -183,16 +181,6 @@ Buffer11 *Buffer11::makeBuffer11(BufferImpl *buffer)
gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage) 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); gl::Error error = setSubData(data, size, 0);
if (error.isError()) if (error.isError())
{ {
...@@ -254,39 +242,30 @@ gl::Error Buffer11::setSubData(const void *data, size_t size, size_t offset) ...@@ -254,39 +242,30 @@ gl::Error Buffer11::setSubData(const void *data, size_t size, size_t offset)
if (data && size > 0) if (data && size > 0)
{ {
if (mDynamicUsage) NativeBuffer11 *stagingBuffer = getStagingBuffer();
if (!stagingBuffer)
{ {
mDynamicDirtyRange.start = std::min(mDynamicDirtyRange.start, offset); return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
mDynamicDirtyRange.end = std::max(mDynamicDirtyRange.end, size + offset);
memcpy(mDynamicData.data() + offset, data, size);
} }
else
{
NativeBuffer11 *stagingBuffer = getStagingBuffer();
if (!stagingBuffer)
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
}
// Explicitly resize the staging buffer, preserving data if the new data will not // Explicitly resize the staging buffer, preserving data if the new data will not
// completely fill the buffer // completely fill the buffer
if (stagingBuffer->getSize() < requiredSize) if (stagingBuffer->getSize() < requiredSize)
{ {
bool preserveData = (offset > 0); bool preserveData = (offset > 0);
if (!stagingBuffer->resize(requiredSize, preserveData)) 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."); return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize 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); mSize = std::max(mSize, requiredSize);
...@@ -331,7 +310,7 @@ gl::Error Buffer11::copySubData(BufferImpl* source, GLintptr sourceOffset, GLint ...@@ -331,7 +310,7 @@ gl::Error Buffer11::copySubData(BufferImpl* source, GLintptr sourceOffset, GLint
{ {
if (copySource->getUsage() == BUFFER_USAGE_STAGING) if (copySource->getUsage() == BUFFER_USAGE_STAGING)
{ {
copySource = getBufferStorage(BUFFER_USAGE_VERTEX); copySource = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
} }
else else
{ {
...@@ -398,7 +377,7 @@ gl::Error Buffer11::unmap() ...@@ -398,7 +377,7 @@ gl::Error Buffer11::unmap()
void Buffer11::markTransformFeedbackUsage() void Buffer11::markTransformFeedbackUsage()
{ {
BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_TRANSFORM_FEEDBACK); BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
if (transformFeedbackStorage) if (transformFeedbackStorage)
{ {
...@@ -510,38 +489,10 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource, ...@@ -510,38 +489,10 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource,
return gl::Error(GL_NO_ERROR); 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; BufferStorage11 *directBuffer = NULL;
auto directBufferIt = mBufferStorages.find(internalUsage); auto directBufferIt = mBufferStorages.find(usage);
if (directBufferIt != mBufferStorages.end()) if (directBufferIt != mBufferStorages.end())
{ {
directBuffer = directBufferIt->second; directBuffer = directBufferIt->second;
...@@ -549,17 +500,17 @@ Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage ...@@ -549,17 +500,17 @@ Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage
if (!directBuffer) if (!directBuffer)
{ {
if (internalUsage == BUFFER_USAGE_PIXEL_PACK) if (usage == BUFFER_USAGE_PIXEL_PACK)
{ {
directBuffer = new PackStorage11(mRenderer); directBuffer = new PackStorage11(mRenderer);
} }
else else
{ {
// buffer is not allocated, create it // 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 // resize buffer
...@@ -572,18 +523,6 @@ Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage ...@@ -572,18 +523,6 @@ Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage
} }
} }
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(); BufferStorage11 *latestBuffer = getLatestBufferStorage();
if (latestBuffer && latestBuffer->getDataRevision() > directBuffer->getDataRevision()) if (latestBuffer && latestBuffer->getDataRevision() > directBuffer->getDataRevision())
{ {
...@@ -787,8 +726,7 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren ...@@ -787,8 +726,7 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren
bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
break; break;
case BUFFER_USAGE_VERTEX: case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
case BUFFER_USAGE_TRANSFORM_FEEDBACK:
bufferDesc->Usage = D3D11_USAGE_DEFAULT; bufferDesc->Usage = D3D11_USAGE_DEFAULT;
bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_OUTPUT; bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_OUTPUT;
bufferDesc->CPUAccessFlags = 0; bufferDesc->CPUAccessFlags = 0;
...@@ -817,18 +755,6 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren ...@@ -817,18 +755,6 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren
bufferDesc->ByteWidth = std::min<UINT>(bufferDesc->ByteWidth, renderer->getRendererCaps().maxUniformBlockSize); bufferDesc->ByteWidth = std::min<UINT>(bufferDesc->ByteWidth, renderer->getRendererCaps().maxUniformBlockSize);
break; 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: default:
UNREACHABLE(); UNREACHABLE();
} }
......
...@@ -20,16 +20,11 @@ class Renderer11; ...@@ -20,16 +20,11 @@ class Renderer11;
enum BufferUsage enum BufferUsage
{ {
BUFFER_USAGE_STAGING, BUFFER_USAGE_STAGING,
BUFFER_USAGE_VERTEX, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
BUFFER_USAGE_TRANSFORM_FEEDBACK,
BUFFER_USAGE_INDEX, BUFFER_USAGE_INDEX,
BUFFER_USAGE_PIXEL_UNPACK, BUFFER_USAGE_PIXEL_UNPACK,
BUFFER_USAGE_PIXEL_PACK, BUFFER_USAGE_PIXEL_PACK,
BUFFER_USAGE_UNIFORM, BUFFER_USAGE_UNIFORM,
// Internal flags
BUFFER_USAGE_VERTEX_DYNAMIC,
BUFFER_USAGE_INDEX_DYNAMIC
}; };
struct PackPixelsParams struct PackPixelsParams
...@@ -83,13 +78,6 @@ class Buffer11 : public BufferD3D ...@@ -83,13 +78,6 @@ class Buffer11 : public BufferD3D
class NativeBuffer11; class NativeBuffer11;
class PackStorage11; class PackStorage11;
void markBufferUsage();
NativeBuffer11 *getStagingBuffer();
PackStorage11 *getPackStorage();
BufferStorage11 *getBufferStorage(BufferUsage usage);
BufferStorage11 *getLatestBufferStorage() const;
rx::Renderer11 *mRenderer; rx::Renderer11 *mRenderer;
size_t mSize; size_t mSize;
...@@ -104,9 +92,12 @@ class Buffer11 : public BufferD3D ...@@ -104,9 +92,12 @@ class Buffer11 : public BufferD3D
DataRevision mResolvedDataRevision; DataRevision mResolvedDataRevision;
unsigned int mReadUsageCount; unsigned int mReadUsageCount;
MemoryBuffer mDynamicData; void markBufferUsage();
bool mDynamicUsage; NativeBuffer11 *getStagingBuffer();
Range<size_t> mDynamicDirtyRange; PackStorage11 *getPackStorage();
BufferStorage11 *getBufferStorage(BufferUsage usage);
BufferStorage11 *getLatestBufferStorage() const;
}; };
} }
......
...@@ -195,7 +195,7 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M ...@@ -195,7 +195,7 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M
VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer); VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer);
Buffer11 *bufferStorage = attributes[i].storage ? Buffer11::makeBuffer11(attributes[i].storage) : NULL; 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(); : vertexBuffer->getBuffer();
} }
......
...@@ -975,7 +975,7 @@ void Renderer11::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuff ...@@ -975,7 +975,7 @@ void Renderer11::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuff
if (transformFeedbackBuffers[i]) if (transformFeedbackBuffers[i])
{ {
Buffer11 *storage = Buffer11::makeBuffer11(transformFeedbackBuffers[i]->getImplementation()); 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; d3dBuffers[i] = buffer;
d3dOffsets[i] = (mAppliedTFBuffers[i] != buffer) ? static_cast<UINT>(offsets[i]) : -1; d3dOffsets[i] = (mAppliedTFBuffers[i] != buffer) ? static_cast<UINT>(offsets[i]) : -1;
......
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