mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-03-06 05:50:31 +00:00
Remove code duplication
Removed code duplication, all types can be routed through the same function apart from matrices.
This commit is contained in:
parent
8c01a1a85b
commit
af29a2af0a
2 changed files with 131 additions and 142 deletions
|
|
@ -175,34 +175,134 @@ GFXShader* GFXD3D11ShaderConstBuffer::getShader()
|
|||
return mShader;
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::setMatrix(GFXShaderConstHandle* handle, const U32 inSize, const void* data)
|
||||
{
|
||||
AssertFatal(handle, "GFXD3D11ShaderConstBuffer::internalSet - Handle is NULL!");
|
||||
AssertFatal(handle->isValid(), "GFXD3D11ShaderConstBuffer::internalSet - Handle is not valid!");
|
||||
AssertFatal(dynamic_cast<GFXD3D11ShaderConstHandle*>(handle), "GFXD3D11ShaderConstBuffer::internalSet - Incorrect const buffer type");
|
||||
|
||||
GFXD3D11ShaderConstHandle* _dxHandle = static_cast<GFXD3D11ShaderConstHandle*>(handle);
|
||||
AssertFatal(mShader == _dxHandle->mShader, "GFXD3D11ShaderConstBuffer::internalSet - Should only set handles which are owned by our shader");
|
||||
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
|
||||
U8* buf = mBufferMap[bufDesc].data;
|
||||
|
||||
if (_dxHandle->mDesc.constType == GFXSCT_Float4x4)
|
||||
{
|
||||
// Special case, we can just blast this guy.
|
||||
if (dMemcmp(buf + _dxHandle->mDesc.offset, data, inSize) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mDesc.offset, data, inSize);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
PROFILE_SCOPE(GFXD3D11ConstBufferLayout_setMatrix_not4x4);
|
||||
|
||||
// Figure out how big of a chunk we are copying. We're going to copy 4 columns by N rows of data
|
||||
U32 csize;
|
||||
switch (_dxHandle->mDesc.constType)
|
||||
{
|
||||
case GFXSCT_Float2x2:
|
||||
csize = 24; //this takes up 16+8
|
||||
break;
|
||||
case GFXSCT_Float3x3:
|
||||
csize = 44; //This takes up 16+16+12
|
||||
break;
|
||||
case GFXSCT_Float4x3:
|
||||
csize = 48;
|
||||
break;
|
||||
default:
|
||||
AssertFatal(false, "Unhandled case!");
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
// Loop through and copy
|
||||
bool ret = false;
|
||||
U8* currDestPointer = buf + _dxHandle->mDesc.offset;
|
||||
const U8* currSourcePointer = static_cast<const U8*>(data);
|
||||
const U8* endData = currSourcePointer + inSize;
|
||||
while (currSourcePointer < endData)
|
||||
{
|
||||
if (dMemcmp(currDestPointer, currSourcePointer, csize) != 0)
|
||||
{
|
||||
dMemcpy(currDestPointer, currSourcePointer, csize);
|
||||
ret = true;
|
||||
}
|
||||
|
||||
currDestPointer += csize;
|
||||
currSourcePointer += sizeof(MatrixF);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const U32 inSize, const void* data)
|
||||
{
|
||||
AssertFatal(handle, "GFXD3D11ShaderConstBuffer::internalSet - Handle is NULL!");
|
||||
AssertFatal(handle->isValid(), "GFXD3D11ShaderConstBuffer::internalSet - Handle is not valid!");
|
||||
AssertFatal(dynamic_cast<GFXD3D11ShaderConstHandle*>(handle), "GFXD3D11ShaderConstBuffer::internalSet - Incorrect const buffer type");
|
||||
|
||||
GFXD3D11ShaderConstHandle* _dxHandle = static_cast<GFXD3D11ShaderConstHandle*>(handle);
|
||||
AssertFatal(mShader == _dxHandle->mShader, "GFXD3D11ShaderConstBuffer::internalSet - Should only set handles which are owned by our shader");
|
||||
|
||||
S32 size = inSize;
|
||||
switch (_dxHandle->mDesc.constType)
|
||||
{
|
||||
case GFXSCT_Float2x2:
|
||||
case GFXSCT_Float3x3:
|
||||
case GFXSCT_Float4x3:
|
||||
case GFXSCT_Float4x4:
|
||||
setMatrix(handle, size, data);
|
||||
return;
|
||||
break;
|
||||
// TODO add other AlignedVector here
|
||||
case GFXSCT_Float2:
|
||||
if (size > sizeof(Point2F))
|
||||
size = _dxHandle->mDesc.size;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
|
||||
U8* buf = mBufferMap[bufDesc].data;
|
||||
|
||||
|
||||
if (dMemcmp(buf + _dxHandle->mDesc.offset, data, size) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mDesc.offset, data, size);
|
||||
}
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const F32 fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(F32), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const Point2F& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(Point2F), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const Point3F& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(Point3F), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const Point4F& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(Point4F), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const PlaneF& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(PlaneF), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const LinearColorF& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(Point4F), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const S32 fv)
|
||||
|
|
@ -216,103 +316,62 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const S32 fv)
|
|||
if ( ((GFXD3D11ShaderConstHandle*)handle)->isSampler() )
|
||||
return;
|
||||
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(S32), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const Point2I& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(Point2I), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const Point3I& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, sizeof(Point3I), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const Point4I& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
}
|
||||
|
||||
|
||||
template<typename ConstType>
|
||||
void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const ConstType& param)
|
||||
{
|
||||
AssertFatal(handle, "GFXD3D11ShaderConstBuffer::internalSet - Handle is NULL!");
|
||||
AssertFatal(handle->isValid(), "GFXD3D11ShaderConstBuffer::internalSet - Handle is not valid!");
|
||||
AssertFatal(dynamic_cast<GFXD3D11ShaderConstHandle*>(handle), "GFXD3D11ShaderConstBuffer::internalSet - Incorrect const buffer type");
|
||||
|
||||
GFXD3D11ShaderConstHandle* _dxHandle = static_cast<GFXD3D11ShaderConstHandle*>(handle);
|
||||
AssertFatal(mShader == _dxHandle->mShader, "GFXD3D11ShaderConstBuffer::internalSet - Should only set handles which are owned by our shader");
|
||||
|
||||
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
|
||||
U8* buf = mBufferMap[bufDesc].data;
|
||||
|
||||
if (_dxHandle->mInstancingConstant)
|
||||
buf = mInstPtr + _dxHandle->mOffset;
|
||||
|
||||
dMemcpy(buf + _dxHandle->mOffset, ¶m, sizeof(ConstType));
|
||||
}
|
||||
|
||||
template<typename ConstType>
|
||||
void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const AlignedArray<ConstType>& fv)
|
||||
{
|
||||
AssertFatal(handle, "GFXD3D11ShaderConstBuffer::internalSet - Handle is NULL!");
|
||||
AssertFatal(handle->isValid(), "GFXD3D11ShaderConstBuffer::internalSet - Handle is not valid!");
|
||||
AssertFatal(dynamic_cast<GFXD3D11ShaderConstHandle*>(handle), "GFXD3D11ShaderConstBuffer::internalSet - Incorrect const buffer type");
|
||||
|
||||
GFXD3D11ShaderConstHandle* _dxHandle = static_cast<GFXD3D11ShaderConstHandle*>(handle);
|
||||
AssertFatal(mShader == _dxHandle->mShader, "GFXD3D11ShaderConstBuffer::internalSet - Should only set handles which are owned by our shader");
|
||||
AssertFatal(!_dxHandle->mInstancingConstant, "GFXD3D11ShaderConstBuffer::internalSet - Instancing not supported for array");
|
||||
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
|
||||
U8* buf = mBufferMap[bufDesc].data;
|
||||
const U8* fvBuffer = static_cast<const U8*>(fv.getBuffer());
|
||||
U32 size = fv.getElementSize() * fv.size();
|
||||
|
||||
if (dMemcmp(buf + _dxHandle->mOffset, fvBuffer, _dxHandle->mSize) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mOffset, fvBuffer, _dxHandle->mSize);
|
||||
}
|
||||
internalSet(handle, sizeof(Point4I), &fv);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<F32>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<Point2F>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<Point3F>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<Point4F>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<S32>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<Point2I>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<Point3I>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const AlignedArray<Point4I>& fv)
|
||||
{
|
||||
internalSet(handle, fv);
|
||||
internalSet(handle, fv.getElementSize() * fv.size(), fv.getBuffer());
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF& mat, const GFXShaderConstType matrixType)
|
||||
|
|
@ -324,8 +383,6 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF&
|
|||
const GFXD3D11ShaderConstHandle* _dxHandle = static_cast<const GFXD3D11ShaderConstHandle*>(handle);
|
||||
AssertFatal(!_dxHandle->isSampler(), "Handle is sampler constant!" );
|
||||
AssertFatal(_dxHandle->mShader == mShader, "Mismatched shaders!");
|
||||
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
|
||||
U8* buf = mBufferMap[bufDesc].data;
|
||||
|
||||
MatrixF transposed;
|
||||
if (matrixType == GFXSCT_Float4x3)
|
||||
|
|
@ -346,37 +403,7 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF&
|
|||
return;
|
||||
}
|
||||
|
||||
if (matrixType == GFXSCT_Float4x4)
|
||||
{
|
||||
if (dMemcmp(buf + _dxHandle->mOffset, &transposed, sizeof(MatrixF)) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mOffset, &transposed, sizeof(MatrixF));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
U32 csize;
|
||||
switch (matrixType)
|
||||
{
|
||||
case GFXSCT_Float2x2:
|
||||
csize = 24; //this takes up 16+8
|
||||
break;
|
||||
case GFXSCT_Float3x3:
|
||||
csize = 44; //This takes up 16+16+12
|
||||
break;
|
||||
case GFXSCT_Float4x3:
|
||||
csize = 48;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dMemcmp(buf + _dxHandle->mOffset, &transposed, csize) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mOffset, &transposed, csize);
|
||||
}
|
||||
|
||||
internalSet(handle, sizeof(MatrixF), &transposed);
|
||||
}
|
||||
|
||||
void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF* mat, const U32 arraySize, const GFXShaderConstType matrixType)
|
||||
|
|
@ -389,10 +416,6 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF*
|
|||
AssertFatal(!_dxHandle->isSampler(), "Handle is sampler constant!");
|
||||
AssertFatal(_dxHandle->mShader == mShader, "Mismatched shaders!");
|
||||
|
||||
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
|
||||
|
||||
U8* buf = mBufferMap[bufDesc].data;
|
||||
|
||||
static Vector<MatrixF> transposed;
|
||||
if (arraySize > transposed.size())
|
||||
transposed.setSize(arraySize);
|
||||
|
|
@ -411,39 +434,7 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF*
|
|||
if (_dxHandle->mInstancingConstant)
|
||||
return;
|
||||
|
||||
if (matrixType == GFXSCT_Float4x4)
|
||||
{
|
||||
if (dMemcmp(buf + _dxHandle->mOffset, transposed.begin(), sizeof(MatrixF) * arraySize) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mOffset, transposed.begin(), sizeof(MatrixF) * arraySize);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
U32 csize;
|
||||
switch (matrixType)
|
||||
{
|
||||
case GFXSCT_Float2x2:
|
||||
csize = 24; //this takes up 16+8
|
||||
break;
|
||||
case GFXSCT_Float3x3:
|
||||
csize = 44; //This takes up 16+16+12
|
||||
break;
|
||||
case GFXSCT_Float4x3:
|
||||
csize = 48;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
for (int i = 0; i < arraySize; i++)
|
||||
{
|
||||
if (dMemcmp(buf + _dxHandle->mOffset + (i * csize), transposed[i], csize) != 0)
|
||||
{
|
||||
dMemcpy(buf + _dxHandle->mOffset + (i * csize), transposed[i], csize);
|
||||
}
|
||||
}
|
||||
internalSet(handle, sizeof(MatrixF) * arraySize, transposed.begin());
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -672,7 +663,7 @@ bool GFXD3D11Shader::_compileShader( const Torque::Path &filePath,
|
|||
ID3D11ShaderReflection* reflectionTable = NULL;
|
||||
|
||||
#ifdef TORQUE_GFX_VISUAL_DEBUG //for use with NSight, GPU Perf studio, VS graphics debugger
|
||||
U32 flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PREFER_FLOW_CONTROL | D3DCOMPILE_SKIP_OPTIMIZATION;
|
||||
U32 flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_PREFER_FLOW_CONTROL | D3DCOMPILE_SKIP_OPTIMIZATION;
|
||||
#elif defined(TORQUE_DEBUG) //debug build
|
||||
U32 flags = D3DCOMPILE_DEBUG | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_WARNINGS_ARE_ERRORS;
|
||||
#else //release build
|
||||
|
|
@ -791,15 +782,15 @@ bool GFXD3D11Shader::_compileShader( const Torque::Path &filePath,
|
|||
AssertFatal(false, "D3D11Shader::_compilershader- failed to create shader");
|
||||
}
|
||||
|
||||
if(res == S_OK)
|
||||
if(res == S_OK)
|
||||
{
|
||||
HRESULT reflectionResult = D3DReflect(code->GetBufferPointer(), code->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&reflectionTable);
|
||||
if(FAILED(reflectionResult))
|
||||
AssertFatal(false, "D3D11Shader::_compilershader - Failed to get shader reflection table interface");
|
||||
}
|
||||
HRESULT reflectionResult = D3DReflect(code->GetBufferPointer(), code->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&reflectionTable);
|
||||
if(FAILED(reflectionResult))
|
||||
AssertFatal(false, "D3D11Shader::_compilershader - Failed to get shader reflection table interface");
|
||||
}
|
||||
|
||||
if(res == S_OK)
|
||||
_getShaderConstants(reflectionTable, shaderStage);
|
||||
if(res == S_OK)
|
||||
_getShaderConstants(reflectionTable, shaderStage);
|
||||
|
||||
if(FAILED(res) && smLogErrors)
|
||||
Con::errorf("GFXD3D11Shader::_compileShader - Unable to create shader for '%s'.", filePath.getFullPath().c_str());
|
||||
|
|
|
|||
|
|
@ -163,11 +163,9 @@ protected:
|
|||
WeakRefPtr<GFXD3D11Shader> mShader;
|
||||
BufferMap mBufferMap;
|
||||
|
||||
template<typename ConstType>
|
||||
void internalSet(GFXShaderConstHandle* handle, const ConstType& param);
|
||||
|
||||
template<typename ConstType>
|
||||
void internalSet(GFXShaderConstHandle* handle, const AlignedArray<ConstType>& fv);
|
||||
void setMatrix(GFXShaderConstHandle* handle, const U32 inSize, const void* data);
|
||||
void internalSet(GFXShaderConstHandle* handle, const U32 inSize, const void* data);
|
||||
|
||||
|
||||
// we probably want this to be GFXDevice and not per shader.
|
||||
ID3D11Buffer* mBoundConstantBuffers[16];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue