compare before change

check to see if data is different in internal sets before changing values
This commit is contained in:
marauder2k7 2024-02-24 19:52:35 +00:00
parent 3f3ef12c3b
commit 6355e122d2
2 changed files with 33 additions and 20 deletions

View file

@ -251,7 +251,10 @@ void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const
if (_dxHandle->mInstancingConstant) if (_dxHandle->mInstancingConstant)
buf = mInstPtr + _dxHandle->mOffset; buf = mInstPtr + _dxHandle->mOffset;
dMemcpy(buf, &param, sizeof(ConstType)); if (dMemcmp(buf, &param, sizeof(ConstType)) != 0)
{
dMemcpy(buf, &param, sizeof(ConstType));
}
} }
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<F32>& fv) void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<F32>& fv)
@ -307,12 +310,12 @@ void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage); const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
U8* buf = mBufferMap[bufDesc].data; U8* buf = mBufferMap[bufDesc].data;
const U8* fvBuffer = static_cast<const U8*>(fv.getBuffer()); const U8* fvBuffer = static_cast<const U8*>(fv.getBuffer());
for (U32 i = 0; i < fv.size(); ++i) U32 size = fv.getElementSize() * fv.size();
{
dMemcpy(buf + _dxHandle->mOffset + i * sizeof(ConstType), fvBuffer, sizeof(ConstType));
fvBuffer += fv.getElementSize();
}
if (dMemcmp(buf + _dxHandle->mOffset, fvBuffer, size) != 0)
{
dMemcpy(buf + _dxHandle->mOffset, fvBuffer, size);
}
} }
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF& mat, const GFXShaderConstType matrixType) void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF& mat, const GFXShaderConstType matrixType)
@ -348,7 +351,10 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF&
if (matrixType == GFXSCT_Float4x4) if (matrixType == GFXSCT_Float4x4)
{ {
dMemcpy(buf, &transposed, sizeof(MatrixF)); if (dMemcmp(buf + _dxHandle->mOffset, &transposed, sizeof(MatrixF)) != 0)
{
dMemcpy(buf + _dxHandle->mOffset, &transposed, sizeof(MatrixF));
}
return; return;
} }
@ -369,7 +375,10 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF&
break; break;
} }
dMemcpy(buf, (const F32*)transposed, csize); if (dMemcmp(buf + _dxHandle->mOffset, &transposed, csize) != 0)
{
dMemcpy(buf + _dxHandle->mOffset, &transposed, csize);
}
} }
@ -407,7 +416,10 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF*
if (matrixType == GFXSCT_Float4x4) if (matrixType == GFXSCT_Float4x4)
{ {
dMemcpy(buf + _dxHandle->mOffset, transposed.address(), _dxHandle->getSize()); if (dMemcmp(buf + _dxHandle->mOffset, transposed.address(), sizeof(MatrixF) * arraySize) != 0)
{
dMemcpy(buf + _dxHandle->mOffset, transposed.address(), sizeof(MatrixF) * arraySize);
}
return; return;
} }
@ -430,7 +442,10 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF*
for (int i = 0; i < arraySize; i++) for (int i = 0; i < arraySize; i++)
{ {
dMemcpy(buf + _dxHandle->mOffset + (i * csize), transposed[i], csize); if (dMemcmp(buf + _dxHandle->mOffset + (i * csize), transposed[i], csize) != 0)
{
dMemcpy(buf + _dxHandle->mOffset + (i * csize), transposed[i], csize);
}
} }
} }
@ -580,7 +595,6 @@ GFXD3D11Shader::GFXD3D11Shader()
smD3DInclude = new gfxD3D11Include; smD3DInclude = new gfxD3D11Include;
globalAdded = false; globalAdded = false;
globalOffset = 0;
globalSize = 0; globalSize = 0;
} }
@ -836,14 +850,13 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
D3D11_SHADER_DESC shaderDesc; D3D11_SHADER_DESC shaderDesc;
refTable->GetDesc(&shaderDesc); refTable->GetDesc(&shaderDesc);
bool globalBuffer = false;
// we loop through and account for the most common data types. // we loop through and account for the most common data types.
for (U32 i = 0; i < shaderDesc.BoundResources; i++) for (U32 i = 0; i < shaderDesc.BoundResources; i++)
{ {
GFXShaderConstDesc desc; GFXShaderConstDesc desc;
D3D11_SHADER_INPUT_BIND_DESC shaderInputBind; D3D11_SHADER_INPUT_BIND_DESC shaderInputBind;
refTable->GetResourceBindingDesc(i, &shaderInputBind); refTable->GetResourceBindingDesc(i, &shaderInputBind);
bool globalBuffer = false;
if (shaderInputBind.Type == D3D_SIT_CBUFFER) if (shaderInputBind.Type == D3D_SIT_CBUFFER)
{ {
@ -871,10 +884,11 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
// push back our const buffer as a descriptor, this also marks the start of a buffer. // push back our const buffer as a descriptor, this also marks the start of a buffer.
desc.size = constantBufferDesc.Size; desc.size = constantBufferDesc.Size;
globalSize += desc.size; if (globalBuffer && !globalAdded)
{
if(globalBuffer && !globalAdded)
mShaderConsts.push_back(desc); mShaderConsts.push_back(desc);
globalAdded = true;
}
else if (!globalBuffer) else if (!globalBuffer)
mShaderConsts.push_back(desc); mShaderConsts.push_back(desc);
@ -895,7 +909,7 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
// set the bind point to the same as the const buffer. // set the bind point to the same as the const buffer.
varDesc.bindPoint = desc.bindPoint; varDesc.bindPoint = desc.bindPoint;
varDesc.offset = globalBuffer ? globalOffset + shaderVarDesc.StartOffset : shaderVarDesc.StartOffset; varDesc.offset = (globalBuffer && shaderStage != SHADER_STAGE::VERTEX_SHADER) ? globalSize + shaderVarDesc.StartOffset : shaderVarDesc.StartOffset;
varDesc.arraySize = mMax(shaderTypeDesc.Elements, 1); varDesc.arraySize = mMax(shaderTypeDesc.Elements, 1);
varDesc.size = shaderVarDesc.Size; varDesc.size = shaderVarDesc.Size;
varDesc.shaderStage = globalBuffer ? SHADER_STAGE::ALL_SHADERS : shaderStage; varDesc.shaderStage = globalBuffer ? SHADER_STAGE::ALL_SHADERS : shaderStage;
@ -952,7 +966,7 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
mShaderConsts.push_back(varDesc); mShaderConsts.push_back(varDesc);
} }
globalOffset += desc.size; globalSize += desc.size;
} }
else if (shaderInputBind.Type == D3D_SIT_TEXTURE) else if (shaderInputBind.Type == D3D_SIT_TEXTURE)
{ {

View file

@ -232,7 +232,6 @@ protected:
bool globalAdded; bool globalAdded;
U32 globalOffset;
U32 globalSize; U32 globalSize;
}; };