pushed buffer creation up to the device level

now shaders ask the device to create a buffer, if a buffer of the same name and size already exist then a pointer to that buffer is returned instead. Going to see if something similar can be added to the opengl end.
This commit is contained in:
marauder2k7 2024-03-14 13:32:21 +00:00
parent a7dabae88a
commit 1e8841e6b5
4 changed files with 79 additions and 45 deletions

View file

@ -141,23 +141,15 @@ GFXD3D11ShaderConstBuffer::GFXD3D11ShaderConstBuffer(GFXD3D11Shader* shader)
for (U32 i = 0; i < 6; i++)
{
for (U32 j = 0; j < 3; j++)
for (U32 j = 0; j < 16; j++)
{
mBoundBuffers[i][j] = NULL;
mBoundBuffers[i][j] = nullptr;
}
}
}
GFXD3D11ShaderConstBuffer::~GFXD3D11ShaderConstBuffer()
{
for (U32 i = 0; i < 6; i++)
{
for (U32 j = 0; j < 3; j++)
{
SAFE_RELEASE(mBoundBuffers[i][j]);
}
}
for (auto& pair : mBufferMap) {
delete[] pair.value.data;
}
@ -459,11 +451,11 @@ const String GFXD3D11ShaderConstBuffer::describeSelf() const
return ret;
}
void GFXD3D11ShaderConstBuffer::addBuffer(U32 bufBindingPoint, GFXShaderStage shaderStage, U32 size)
void GFXD3D11ShaderConstBuffer::addBuffer(const GFXShaderConstDesc desc)
{
S32 shaderStageID = -1; // Initialize to -1 (bit not found)
for (int i = 0; i < sizeof(S32) * 8; ++i) {
if (shaderStage & (1 << i)) {
if (desc.shaderStage & (1 << i)) {
shaderStageID = i;
break;
}
@ -475,30 +467,15 @@ void GFXD3D11ShaderConstBuffer::addBuffer(U32 bufBindingPoint, GFXShaderStage sh
AssertFatal(false, "DX Const buffer requires a shaderStage flag.");
}
const BufferKey bufKey(bufBindingPoint, shaderStageID);
const BufferKey bufKey(desc.bindPoint, shaderStageID);
// doesnt matter if its already added.
U8* buf = new U8[size];
dMemset(buf, 0, size);
U8* buf = new U8[desc.size];
dMemset(buf, 0, desc.size);
mBufferMap[bufKey].data = buf;
mBufferMap[bufKey].size = size;
mBufferMap[bufKey].size = desc.size;
mBufferMap[bufKey].isDirty = true;
//ID3D11Buffer* tempBuf;
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = size;
cbDesc.Usage = D3D11_USAGE_DEFAULT;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = 0;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;
HRESULT hr;
hr = D3D11DEVICE->CreateBuffer(&cbDesc, NULL, &mBoundBuffers[(U32)shaderStageID][bufBindingPoint]);
if (FAILED(hr))
{
AssertFatal(false, "can't create constant buffer");
}
mBoundBuffers[(U32)shaderStageID][desc.bindPoint] = D3D11->getDeviceBuffer(desc);
}
void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderBuffer )
@ -586,14 +563,6 @@ void GFXD3D11ShaderConstBuffer::onShaderReload( GFXD3D11Shader *shader )
{
AssertFatal( shader == mShader, "GFXD3D11ShaderConstBuffer::onShaderReload is hosed!" );
for (U32 i = 0; i < 6; i++)
{
for (U32 j = 0; j < 3; j++)
{
SAFE_RELEASE(mBoundBuffers[i][j]);
}
}
for (auto& pair : mBufferMap) {
delete[] pair.value.data;
}
@ -602,7 +571,7 @@ void GFXD3D11ShaderConstBuffer::onShaderReload( GFXD3D11Shader *shader )
for (GFXD3D11Shader::BufferMap::Iterator i = shader->mBuffers.begin(); i != shader->mBuffers.end(); ++i)
{
// add our buffer descriptions to the full const buffer.
this->addBuffer(i->value.bindPoint, i->value.shaderStage, i->value.size);
this->addBuffer(i->value);
}
// Set the lost state.
@ -922,7 +891,26 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection* refTable,
desc.bindPoint = shaderInputBind.BindPoint;
if (String::compare(desc.name, "$Globals") == 0 || String::compare(desc.name, "$Params") == 0)
{
desc.name = desc.name + String::ToString((U32)shaderStage-1);
switch (shaderStage)
{
case VERTEX_SHADER:
desc.name = desc.name + "_" + mVertexFile.getFileName();
break;
case PIXEL_SHADER:
desc.name = desc.name + "_" + mPixelFile.getFileName();
break;
case GEOMETRY_SHADER:
desc.name = desc.name + "_" + mGeometryFile.getFileName();
break;
case DOMAIN_SHADER:
break;
case HULL_SHADER:
break;
case COMPUTE_SHADER:
break;
default:
break;
}
}
mBuffers[desc.name] = desc;
@ -1227,7 +1215,7 @@ GFXShaderConstBufferRef GFXD3D11Shader::allocConstBuffer()
for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); ++i)
{
// add our buffer descriptions to the full const buffer.
buffer->addBuffer(i->value.bindPoint, i->value.shaderStage, i->value.size);
buffer->addBuffer(i->value);
}
mActiveBuffers.push_back( buffer );