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>
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;
......
......@@ -28,7 +28,9 @@ bool MemoryBuffer::resize(size_t size)
{
if (size == 0)
{
clear();
free(mData);
mData = NULL;
mSize = 0;
}
else
{
......@@ -67,11 +69,4 @@ uint8_t *MemoryBuffer::data()
return mData;
}
void MemoryBuffer::clear()
{
free(mData);
mData = NULL;
mSize = 0;
}
}
......@@ -21,13 +21,10 @@ class MemoryBuffer
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;
......
......@@ -162,9 +162,7 @@ Buffer11::Buffer11(Renderer11 *renderer)
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 @@ Buffer11 *Buffer11::makeBuffer11(BufferImpl *buffer)
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 @@ gl::Error Buffer11::setSubData(const void *data, size_t size, size_t offset)
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
{
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
// 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))
// 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 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);
......@@ -331,7 +310,7 @@ gl::Error Buffer11::copySubData(BufferImpl* source, GLintptr sourceOffset, GLint
{
if (copySource->getUsage() == BUFFER_USAGE_STAGING)
{
copySource = getBufferStorage(BUFFER_USAGE_VERTEX);
copySource = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
}
else
{
......@@ -398,7 +377,7 @@ gl::Error Buffer11::unmap()
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 @@ gl::Error Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource,
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 @@ Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage
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 @@ 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();
if (latestBuffer && latestBuffer->getDataRevision() > directBuffer->getDataRevision())
{
......@@ -787,8 +726,7 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren
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 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren
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();
}
......
......@@ -20,16 +20,11 @@ class Renderer11;
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 Buffer11 : public BufferD3D
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 @@ class Buffer11 : public BufferD3D
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;
};
}
......
......@@ -195,7 +195,7 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M
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();
}
......
......@@ -975,7 +975,7 @@ void Renderer11::applyTransformFeedbackBuffers(gl::Buffer *transformFeedbackBuff
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;
......
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