Browse Source

bkup

still memory heap issue
marauder2k7 1 year ago
parent
commit
42b8748f5b

+ 118 - 68
Engine/source/gfx/D3D11/gfxD3D11Shader.cpp

@@ -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];

+ 3 - 11
Engine/source/gfx/D3D11/gfxD3D11Shader.h

@@ -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, 

+ 0 - 1
Engine/source/materials/processedCustomMaterial.cpp

@@ -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"

+ 0 - 1
Engine/source/materials/processedShaderMaterial.cpp

@@ -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"