still memory heap issue
This commit is contained in:
marauder2k7 2024-02-24 12:04:53 +00:00
parent 4caa54ad7e
commit 42b8748f5b
4 changed files with 121 additions and 81 deletions

View file

@ -157,6 +157,11 @@ GFXD3D11ShaderConstBuffer::~GFXD3D11ShaderConstBuffer()
{
delete[] i->value;
}
mBufferMap.clear();
if (mShader)
mShader->_unlinkBuffer(this);
}
GFXShader* GFXD3D11ShaderConstBuffer::getShader()
@ -234,7 +239,7 @@ void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const
GFXD3D11ShaderConstHandle* _dxHandle = static_cast<GFXD3D11ShaderConstHandle*>(handle);
AssertFatal(mShader == _dxHandle->mShader, "GFXD3D11ShaderConstBuffer::internalSet - Should only set handles which are owned by our shader");
BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
U8* buf = mBufferMap[bufDesc] + _dxHandle->mOffset;
if (_dxHandle->mInstancingConstant)
@ -293,7 +298,7 @@ void GFXD3D11ShaderConstBuffer::internalSet(GFXShaderConstHandle* handle, const
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");
BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
U8* buf = mBufferMap[bufDesc];
const U8* fvBuffer = static_cast<const U8*>(fv.getBuffer());
for (U32 i = 0; i < fv.size(); ++i)
@ -313,7 +318,7 @@ 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!");
BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
U8* buf = mBufferMap[bufDesc] + _dxHandle->mOffset;
MatrixF transposed;
@ -372,7 +377,7 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF*
AssertFatal(!_dxHandle->isSampler(), "Handle is sampler constant!");
AssertFatal(_dxHandle->mShader == mShader, "Mismatched shaders!");
BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
const BufferKey bufDesc(_dxHandle->mBinding, (SHADER_STAGE)_dxHandle->mStage);
U8* buf = mBufferMap[bufDesc] ;
@ -433,21 +438,18 @@ const String GFXD3D11ShaderConstBuffer::describeSelf() const
return ret;
}
bool GFXD3D11ShaderConstBuffer::isDirty()
{
return true;
}
void GFXD3D11ShaderConstBuffer::addBuffer(U32 bufBindingPoint, SHADER_STAGE shaderStage, U32 size)
{
BufferKey bufKey(bufBindingPoint, shaderStage);
const BufferKey bufKey(bufBindingPoint, shaderStage);
BufferMap::Iterator buffer = mBufferMap.find(bufKey);
// already added? pass...
if (buffer != mBufferMap.end())
return;
U8* buf = new U8[size];
dMemset(buf, 0, size);
// new buffer with our size.
mBufferMap[bufKey] = new U8[size];
mBufferMap[bufKey] = buf;
}
void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderBuffer )
@ -461,6 +463,11 @@ void GFXD3D11ShaderConstBuffer::onShaderReload( GFXD3D11Shader *shader )
{
AssertFatal( shader == mShader, "GFXD3D11ShaderConstBuffer::onShaderReload is hosed!" );
for (BufferMap::Iterator i = mBufferMap.begin(); i != mBufferMap.end(); i++)
{
delete[] i->value;
}
// Set the lost state.
mWasLost = true;
}
@ -496,6 +503,10 @@ GFXD3D11Shader::~GFXD3D11Shader()
delete[] i->value;
}
mHandles.clear();
mBuffers.clear();
for (U32 i = 0; i < 16; i++)
{
SAFE_RELEASE(mBoundConstantBuffers[i]);
@ -536,7 +547,7 @@ bool GFXD3D11Shader::_init()
memset(&d3dMacros[macroCount - 1], 0, sizeof(D3D_SHADER_MACRO));
mShaderConsts.clear();
mSamplerDescriptions.clear();
if (!mVertexFile.isEmpty() && !_compileShader( mVertexFile, SHADER_STAGE::VERTEX_SHADER, d3dMacros) )
return false;
@ -662,36 +673,37 @@ bool GFXD3D11Shader::_compileShader( const Torque::Path &filePath,
if(code != NULL)
{
switch (shaderStage)
{
case VERTEX_SHADER:
res = D3D11DEVICE->CreateVertexShader(code->GetBufferPointer(), code->GetBufferSize(), NULL, &mVertShader);
break;
case PIXEL_SHADER:
res = D3D11DEVICE->CreatePixelShader(code->GetBufferPointer(), code->GetBufferSize(), NULL, &mPixShader);
break;
case GEOMETRY_SHADER:
break;
case DOMAIN_SHADER:
break;
case HULL_SHADER:
break;
case COMPUTE_SHADER:
break;
default:
break;
}
switch (shaderStage)
{
case VERTEX_SHADER:
res = D3D11DEVICE->CreateVertexShader(code->GetBufferPointer(), code->GetBufferSize(), NULL, &mVertShader);
break;
case PIXEL_SHADER:
res = D3D11DEVICE->CreatePixelShader(code->GetBufferPointer(), code->GetBufferSize(), NULL, &mPixShader);
break;
case GEOMETRY_SHADER:
break;
case DOMAIN_SHADER:
break;
case HULL_SHADER:
break;
case COMPUTE_SHADER:
break;
default:
break;
}
if (FAILED(res))
{
AssertFatal(false, "D3D11Shader::_compilershader- failed to create shader");
}
if (FAILED(res))
{
AssertFatal(false, "D3D11Shader::_compilershader- failed to create shader");
}
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");
}
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");
}
if(res == S_OK)
_getShaderConstants(reflectionTable, shaderStage);
@ -704,29 +716,28 @@ bool GFXD3D11Shader::_compileShader( const Torque::Path &filePath,
bool result = code && SUCCEEDED(res);
#ifdef TORQUE_DEBUG
String shader;
switch (shaderStage)
{
case VERTEX_SHADER:
shader = mVertexFile.getFileName();
mVertShader->SetPrivateData(WKPDID_D3DDebugObjectName, shader.size(), shader.c_str());
break;
case PIXEL_SHADER:
shader = mPixelFile.getFileName();
mPixShader->SetPrivateData(WKPDID_D3DDebugObjectName, shader.size(), shader.c_str());
break;
case GEOMETRY_SHADER:
break;
case DOMAIN_SHADER:
break;
case HULL_SHADER:
break;
case COMPUTE_SHADER:
break;
default:
break;
}
//String shader;
//switch (shaderStage)
//{
//case VERTEX_SHADER:
// shader = mVertexFile.getFileName();
// mVertShader->SetPrivateData(WKPDID_D3DDebugObjectName, shader.size(), shader.c_str());
// break;
//case PIXEL_SHADER:
// shader = mPixelFile.getFileName();
// mPixShader->SetPrivateData(WKPDID_D3DDebugObjectName, shader.size(), shader.c_str());
// break;
//case GEOMETRY_SHADER:
// break;
//case DOMAIN_SHADER:
// break;
//case HULL_SHADER:
// break;
//case COMPUTE_SHADER:
// break;
//default:
// break;
//}
#endif
SAFE_RELEASE(code);
@ -768,6 +779,9 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
constantBuffer->GetDesc(&constantBufferDesc);
#ifdef D3D11_DEBUG_SPEW
Con::printf("Constant Buffer Name: %s", constantBufferDesc.Name);
#endif
// push back our const buffer as a descriptor, this also marks the start of a buffer.
desc.size = constantBufferDesc.Size;
mShaderConsts.push_back(desc);
@ -783,6 +797,10 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
D3D11_SHADER_TYPE_DESC shaderTypeDesc;
bufferVar->GetType()->GetDesc(&shaderTypeDesc);
bool unusedVar = shaderVarDesc.uFlags & D3D_SVF_USED ? false : true;
if (unusedVar)
continue;
varDesc.name = String(shaderVarDesc.Name);
if (varDesc.name.find("$") != 0)
varDesc.name = String::ToString("$%s", varDesc.name.c_str());
@ -795,6 +813,10 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
varDesc.shaderStage = shaderStage;
varDesc.samplerReg = -1;
#ifdef D3D11_DEBUG_SPEW
Con::printf("Variable Name %s:, offset: %d, size: %d, constantDesc.Elements: %d", varDesc.name.c_str(), varDesc.StartOffset, varDesc.Size, varDesc.arraySize);
#endif
if (shaderTypeDesc.Class == D3D_SVC_SCALAR || shaderTypeDesc.Class == D3D_SVC_VECTOR)
{
switch (shaderTypeDesc.Type)
@ -882,7 +904,8 @@ void GFXD3D11Shader::_getShaderConstants( ID3D11ShaderReflection *refTable,
desc.samplerReg = shaderInputBind.BindPoint;
desc.bindPoint = -1;
desc.shaderStage = shaderStage;
mShaderConsts.push_back(desc);
desc.arraySize = shaderInputBind.BindCount;
mSamplerDescriptions.push_back(desc);
}
else if (shaderInputBind.Type == D3D_SIT_UAV_RWTYPED ||
shaderInputBind.Type == D3D_SIT_UAV_RWSTRUCTURED ||
@ -943,8 +966,7 @@ void GFXD3D11Shader::_buildShaderConstantHandles()
if (desc.constType == GFXSCT_ConstBuffer)
{
BufferKey bufKey(desc.bindPoint, (SHADER_STAGE)desc.shaderStage);
const BufferKey bufKey(desc.bindPoint, (SHADER_STAGE)desc.shaderStage);
BufferMap::Iterator buffer = mBuffers.find(bufKey);
// already added? pass...
@ -970,8 +992,10 @@ void GFXD3D11Shader::_buildShaderConstantHandles()
mBoundConstantBuffers[desc.bindPoint] = constBuffer;
U8* buf = new U8[desc.size];
dMemset(buf, 0, desc.size);
// new buffer with our size.
mBuffers[bufKey] = new U8[desc.size];
mBuffers[bufKey] = buf;
// do not add to handles..
continue;
@ -990,6 +1014,29 @@ void GFXD3D11Shader::_buildShaderConstantHandles()
}
}
for (U32 i = 0; i < mSamplerDescriptions.size(); i++)
{
GFXShaderConstDesc& desc = mSamplerDescriptions[i];
AssertFatal(desc.constType == GFXSCT_Sampler ||
desc.constType == GFXSCT_SamplerCube ||
desc.constType == GFXSCT_SamplerCubeArray ||
desc.constType == GFXSCT_SamplerTextureArray,
"GFXD3D11Shader::_buildShaderConstantHandles - Invalid samplerDescription type!");
HandleMap::Iterator handle = mHandles.find(desc.name);
// already added? reinit just in case..
// not sure if we need to do anything different with samplers.
if (handle != mHandles.end())
{
handle->value->reinit(desc);
}
else
{
mHandles[desc.name] = new GFXD3D11ShaderConstHandle(this, desc);
}
}
_buildInstancingShaderConstantHandles();
}
@ -1040,9 +1087,12 @@ void GFXD3D11Shader::setConstantsFromBuffer(GFXD3D11ShaderConstBuffer* buffer)
{
BufferRange bufRanges[6] = {};
D3D11_MAPPED_SUBRESOURCE pConstData;
ZeroMemory(&pConstData, sizeof(D3D11_MAPPED_SUBRESOURCE));
for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); ++i)
{
BufferKey oldBufferDesc = i->key;
const BufferKey oldBufferDesc = i->key;
U8* oldBuff = i->value;
U8* newBuff = buffer->mBufferMap[i->key];

View file

@ -29,7 +29,6 @@
#include "core/util/tDictionary.h"
#include "gfx/gfxShader.h"
#include "gfx/gfxResource.h"
#include "gfx/genericConstBuffer.h"
#include "gfx/D3D11/gfxD3D11Device.h"
class GFXD3D11Shader;
@ -50,7 +49,7 @@ typedef CompoundKey<U32, SHADER_STAGE> BufferKey;
struct BufferRange
{
U32 mBufMin = 0xFFFFFFFF;
U32 mBufMin = U32_MAX;
U32 mBufMax = 0;
inline void addSlot(U32 slot)
@ -116,9 +115,6 @@ public:
/// @param mPrevShaderBuffer The previously active buffer
void activate(GFXD3D11ShaderConstBuffer *prevShaderBuffer);
/// Used internally by GXD3D11ShaderConstBuffer to determine if it's dirty.
bool isDirty();
void addBuffer(U32 bufBindingPoint, SHADER_STAGE shaderStage, U32 size);
/// Called from GFXD3D11Shader when constants have changed and need
@ -191,7 +187,6 @@ public:
virtual GFXShaderConstHandle* getShaderConstHandle(const String& name);
virtual GFXShaderConstHandle* findShaderConstHandle(const String& name);
virtual U32 getAlignmentValue(const GFXShaderConstType constType) const;
virtual bool getDisassembly( String &outStr ) const;
// GFXResource
virtual void zombify();
@ -199,9 +194,7 @@ public:
protected:
virtual bool _init();
static const U32 smCompiledShaderTag;
virtual bool _init();
ID3D11VertexShader *mVertShader;
ID3D11PixelShader *mPixShader;
@ -216,8 +209,7 @@ protected:
/// Vector of descriptions (consolidated for the getShaderConstDesc call)
Vector<GFXShaderConstDesc> mShaderConsts;
//Vector<ID3D11Buffer*> mDeviceBuffers;
Vector<GFXShaderConstDesc> mSamplerDescriptions;
// These two functions are used when compiling shaders from hlsl
virtual bool _compileShader( const Torque::Path &filePath,

View file

@ -35,7 +35,6 @@
#include "materials/materialParameters.h"
#include "gfx/sim/gfxStateBlockData.h"
#include "core/util/safeDelete.h"
#include "gfx/genericConstBuffer.h"
#include "console/simFieldDictionary.h"
#include "console/propertyParsing.h"
#include "gfx/util/screenspace.h"

View file

@ -26,7 +26,6 @@
#include "core/util/safeDelete.h"
#include "gfx/sim/cubemapData.h"
#include "gfx/gfxShader.h"
#include "gfx/genericConstBuffer.h"
#include "gfx/gfxPrimitiveBuffer.h"
#include "scene/sceneRenderState.h"
#include "shaderGen/shaderFeature.h"