Commit 171ca0ea by Jamie Madill

Refactor direct buffer storage to only create two backing buffers, for constant…

Refactor direct buffer storage to only create two backing buffers, for constant buffers and all other bindings. This simplifies the logic used in retrieving the ID3D11Buffer. TRAC #23844 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods
parent 851a4f66
......@@ -41,9 +41,9 @@ BufferStorage11::~BufferStorage11()
mResolvedData = NULL;
}
for (DirectBufferList::iterator it = mDirectBuffers.begin(); it != mDirectBuffers.end(); it++)
for (size_t bufferIndex = 0; bufferIndex < mDirectBuffers.size(); bufferIndex++)
{
SafeDelete(*it);
SafeDelete(mDirectBuffers[bufferIndex]);
}
}
......@@ -169,9 +169,9 @@ void BufferStorage11::setData(const void* data, unsigned int size, unsigned int
context->Unmap(mStagingBuffer, 0);
}
for (DirectBufferList::iterator it = mDirectBuffers.begin(); it != mDirectBuffers.end(); it++)
for (size_t bufferIndex = 0; bufferIndex < mDirectBuffers.size(); bufferIndex++)
{
(*it)->markDirty();
mDirectBuffers[bufferIndex]->markDirty();
}
mSize = std::max(mSize, requiredStagingBufferSize);
......@@ -233,15 +233,15 @@ void BufferStorage11::markBufferUsage()
}
}
ID3D11Buffer *BufferStorage11::getBuffer(GLenum usage)
ID3D11Buffer *BufferStorage11::getBuffer(bool isConstantBufferUsage)
{
markBufferUsage();
for (DirectBufferList::iterator it = mDirectBuffers.begin(); it != mDirectBuffers.end(); it++)
for (size_t bufferIndex = 0; bufferIndex < mDirectBuffers.size(); bufferIndex++)
{
DirectBufferStorage11 *directBuffer = *it;
DirectBufferStorage11 *directBuffer = mDirectBuffers[bufferIndex];
if (directBuffer->hasTarget(usage))
if (directBuffer->isConstantBufferUsage() == isConstantBufferUsage)
{
if (directBuffer->isDirty())
{
......@@ -257,7 +257,7 @@ ID3D11Buffer *BufferStorage11::getBuffer(GLenum usage)
}
// buffer is not allocated, create it
DirectBufferStorage11 *directBuffer = new DirectBufferStorage11(mRenderer, usage);
DirectBufferStorage11 *directBuffer = new DirectBufferStorage11(mRenderer, isConstantBufferUsage);
directBuffer->updateFromStagingBuffer(mStagingBuffer, mSize, 0);
mDirectBuffers.push_back(directBuffer);
......@@ -271,12 +271,12 @@ ID3D11ShaderResourceView *BufferStorage11::getSRV(DXGI_FORMAT srvFormat)
return NULL;
}
DirectBufferStorage11::DirectBufferStorage11(Renderer11 *renderer, const GLenum target)
: mRenderer(renderer)
, mTarget(target)
, mDirectBuffer(NULL)
, mBufferSize(0)
, mDirty(false)
DirectBufferStorage11::DirectBufferStorage11(Renderer11 *renderer, bool isConstantBufferUsage)
: mRenderer(renderer),
mIsConstantBufferUsage(isConstantBufferUsage),
mDirectBuffer(NULL),
mBufferSize(0),
mDirty(false)
{
}
......@@ -285,20 +285,13 @@ DirectBufferStorage11::~DirectBufferStorage11()
SafeRelease(mDirectBuffer);
}
bool DirectBufferStorage11::hasTarget(const GLenum target) const
bool DirectBufferStorage11::isConstantBufferUsage() const
{
switch (target)
{
case GL_ELEMENT_ARRAY_BUFFER:
case GL_ARRAY_BUFFER:
return mTarget == GL_ELEMENT_ARRAY_BUFFER || mTarget == GL_ARRAY_BUFFER;
default:
return target == mTarget;
}
return mIsConstantBufferUsage;
}
// Returns true if it recreates the direct buffer
bool DirectBufferStorage11::updateFromStagingBuffer(ID3D11Buffer *stagingBuffer, const size_t size, const size_t offset)
bool DirectBufferStorage11::updateFromStagingBuffer(ID3D11Buffer *stagingBuffer, size_t size, size_t offset)
{
ID3D11Device *device = mRenderer->getDevice();
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
......@@ -356,16 +349,14 @@ void DirectBufferStorage11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, unsign
bufferDesc->MiscFlags = 0;
bufferDesc->StructureByteStride = 0;
switch (mTarget)
if (!mIsConstantBufferUsage)
{
case GL_ELEMENT_ARRAY_BUFFER:
case GL_ARRAY_BUFFER:
bufferDesc->Usage = D3D11_USAGE_DEFAULT;
bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER | D3D11_BIND_VERTEX_BUFFER;
bufferDesc->CPUAccessFlags = 0;
break;
case GL_UNIFORM_BUFFER:
}
else
{
bufferDesc->Usage = D3D11_USAGE_DYNAMIC;
bufferDesc->BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
......@@ -374,11 +365,6 @@ void DirectBufferStorage11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, unsign
// For our purposes we ignore any buffer data past the maximum constant buffer size
bufferDesc->ByteWidth = roundUp(bufferDesc->ByteWidth, 16u);
bufferDesc->ByteWidth = std::min(bufferDesc->ByteWidth, mRenderer->getMaxUniformBufferSize());
break;
default:
UNREACHABLE();
break;
}
}
......
......@@ -32,7 +32,7 @@ class BufferStorage11 : public BufferStorage
virtual unsigned int getSize() const;
virtual bool supportsDirectBinding() const;
ID3D11Buffer *getBuffer(GLenum usage);
ID3D11Buffer *getBuffer(bool isConstantBufferUsage);
ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
private:
......@@ -41,8 +41,7 @@ class BufferStorage11 : public BufferStorage
ID3D11Buffer *mStagingBuffer;
unsigned int mStagingBufferSize;
typedef std::vector<DirectBufferStorage11*> DirectBufferList;
DirectBufferList mDirectBuffers;
std::vector<DirectBufferStorage11*> mDirectBuffers;
unsigned int mSize;
void *mResolvedData;
......@@ -62,11 +61,11 @@ class BufferStorage11 : public BufferStorage
class DirectBufferStorage11
{
public:
DirectBufferStorage11(Renderer11 *renderer, const GLenum target);
DirectBufferStorage11(Renderer11 *renderer, bool isConstantBufferUsage);
~DirectBufferStorage11();
bool hasTarget(const GLenum target) const;
bool updateFromStagingBuffer(ID3D11Buffer *stagingBuffer, const size_t size, const size_t offset);
bool isConstantBufferUsage() const;
bool updateFromStagingBuffer(ID3D11Buffer *stagingBuffer, size_t size, size_t offset);
ID3D11Buffer *getD3DBuffer() { return mDirectBuffer; }
bool isDirty() const { return mDirty; }
......@@ -74,7 +73,7 @@ class DirectBufferStorage11
private:
Renderer11 *mRenderer;
const GLenum mTarget;
const bool mIsConstantBufferUsage;
ID3D11Buffer *mDirectBuffer;
size_t mBufferSize;
bool mDirty;
......
......@@ -117,7 +117,7 @@ GLenum InputLayoutCache::applyVertexBuffers(TranslatedAttribute attributes[gl::M
ilKey.elements[ilKey.elementCount].desc.InstanceDataStepRate = attributes[i].divisor;
ilKey.elementCount++;
vertexBuffers[i] = bufferStorage ? bufferStorage->getBuffer(GL_ARRAY_BUFFER) : vertexBuffer->getBuffer();
vertexBuffers[i] = bufferStorage ? bufferStorage->getBuffer(false) : vertexBuffer->getBuffer();
vertexBufferSerials[i] = bufferStorage ? bufferStorage->getSerial() : vertexBuffer->getSerial();
vertexStrides[i] = attributes[i].stride;
vertexOffsets[i] = attributes[i].offset;
......
......@@ -621,7 +621,7 @@ bool Renderer11::setUniformBuffers(const gl::Buffer *vertexUniformBuffers[], con
if (uniformBuffer)
{
BufferStorage11 *bufferStorage = BufferStorage11::makeBufferStorage11(uniformBuffer->getStorage());
ID3D11Buffer *constantBuffer = bufferStorage->getBuffer(GL_UNIFORM_BUFFER);
ID3D11Buffer *constantBuffer = bufferStorage->getBuffer(true);
if (!constantBuffer)
{
......@@ -643,7 +643,7 @@ bool Renderer11::setUniformBuffers(const gl::Buffer *vertexUniformBuffers[], con
if (uniformBuffer)
{
BufferStorage11 *bufferStorage = BufferStorage11::makeBufferStorage11(uniformBuffer->getStorage());
ID3D11Buffer *constantBuffer = bufferStorage->getBuffer(GL_UNIFORM_BUFFER);
ID3D11Buffer *constantBuffer = bufferStorage->getBuffer(true);
if (!constantBuffer)
{
......@@ -1071,7 +1071,7 @@ GLenum Renderer11::applyIndexBuffer(const GLvoid *indices, gl::Buffer *elementAr
BufferStorage11 *storage = BufferStorage11::makeBufferStorage11(indexInfo->storage);
IndexBuffer11* indexBuffer = IndexBuffer11::makeIndexBuffer11(indexInfo->indexBuffer);
mDeviceContext->IASetIndexBuffer(storage->getBuffer(GL_ELEMENT_ARRAY_BUFFER), indexBuffer->getIndexFormat(), indexInfo->startOffset);
mDeviceContext->IASetIndexBuffer(storage->getBuffer(false), indexBuffer->getIndexFormat(), indexInfo->startOffset);
mAppliedIBSerial = 0;
mAppliedStorageIBSerial = storage->getSerial();
......
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