mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 00:24:40 +00:00
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:
parent
a7dabae88a
commit
1e8841e6b5
4 changed files with 79 additions and 45 deletions
|
|
@ -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 );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue