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