mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 08:34:40 +00:00
working example
now its working.. still not perfect but its getting there
This commit is contained in:
parent
42b8748f5b
commit
dd4d48d654
2 changed files with 85 additions and 88 deletions
|
|
@ -149,6 +149,11 @@ GFXD3D11ShaderConstBuffer::GFXD3D11ShaderConstBuffer( GFXD3D11Shader* shader)
|
||||||
{
|
{
|
||||||
mShader = shader;
|
mShader = shader;
|
||||||
mDeviceContext = D3D11DEVICECONTEXT;
|
mDeviceContext = D3D11DEVICECONTEXT;
|
||||||
|
|
||||||
|
for (U32 i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
mBoundConstantBuffers[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GFXD3D11ShaderConstBuffer::~GFXD3D11ShaderConstBuffer()
|
GFXD3D11ShaderConstBuffer::~GFXD3D11ShaderConstBuffer()
|
||||||
|
|
@ -160,6 +165,12 @@ GFXD3D11ShaderConstBuffer::~GFXD3D11ShaderConstBuffer()
|
||||||
|
|
||||||
mBufferMap.clear();
|
mBufferMap.clear();
|
||||||
|
|
||||||
|
for (U32 i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
SAFE_RELEASE(mBoundConstantBuffers[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (mShader)
|
if (mShader)
|
||||||
mShader->_unlinkBuffer(this);
|
mShader->_unlinkBuffer(this);
|
||||||
}
|
}
|
||||||
|
|
@ -342,7 +353,7 @@ void GFXD3D11ShaderConstBuffer::set(GFXShaderConstHandle* handle, const MatrixF&
|
||||||
|
|
||||||
if (matrixType == GFXSCT_Float4x4)
|
if (matrixType == GFXSCT_Float4x4)
|
||||||
{
|
{
|
||||||
dMemcpy(buf, transposed, sizeof(MatrixF));
|
dMemcpy(buf, &transposed, sizeof(MatrixF));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -447,15 +458,76 @@ void GFXD3D11ShaderConstBuffer::addBuffer(U32 bufBindingPoint, SHADER_STAGE shad
|
||||||
return;
|
return;
|
||||||
|
|
||||||
U8* buf = new U8[size];
|
U8* buf = new U8[size];
|
||||||
dMemset(buf, 0, size);
|
|
||||||
// new buffer with our size.
|
// new buffer with our size.
|
||||||
mBufferMap[bufKey] = buf;
|
mBufferMap[bufKey] = buf;
|
||||||
|
|
||||||
|
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, &mBoundConstantBuffers[bufBindingPoint]);
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
{
|
||||||
|
AssertFatal(false, "can't create constant buffer");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderBuffer )
|
void GFXD3D11ShaderConstBuffer::activate( GFXD3D11ShaderConstBuffer *prevShaderBuffer )
|
||||||
{
|
{
|
||||||
PROFILE_SCOPE(GFXD3D11ShaderConstBuffer_activate);
|
PROFILE_SCOPE(GFXD3D11ShaderConstBuffer_activate);
|
||||||
mShader->setConstantsFromBuffer(this);
|
|
||||||
|
if (prevShaderBuffer == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BufferRange bufRanges[6] = {};
|
||||||
|
|
||||||
|
D3D11_MAPPED_SUBRESOURCE pConstData;
|
||||||
|
ZeroMemory(&pConstData, sizeof(D3D11_MAPPED_SUBRESOURCE));
|
||||||
|
|
||||||
|
for (BufferMap::Iterator i = mBufferMap.begin(); i != mBufferMap.end(); ++i)
|
||||||
|
{
|
||||||
|
const BufferKey oldBufferDesc = i->key;
|
||||||
|
U8* oldBuff = i->value;
|
||||||
|
|
||||||
|
U8* newBuff = prevShaderBuffer->mBufferMap[i->key];
|
||||||
|
U32 size = mShader->mBuffers[i->key].size();
|
||||||
|
|
||||||
|
if (dMemcmp(oldBuff, newBuff, size) != 0)
|
||||||
|
{
|
||||||
|
// else copy new over the buffer.
|
||||||
|
dMemcpy(oldBuff, newBuff, size);
|
||||||
|
|
||||||
|
// buffer has been changed and needs updating.
|
||||||
|
D3D11DEVICECONTEXT->UpdateSubresource(mBoundConstantBuffers[oldBufferDesc.key1], 0, NULL, oldBuff, size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bufRanges[oldBufferDesc.key2].addSlot(oldBufferDesc.key1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bufRanges[SHADER_STAGE::VERTEX_SHADER].isValid())
|
||||||
|
{
|
||||||
|
const U32 bufStartSlot = bufRanges[SHADER_STAGE::VERTEX_SHADER].mBufMin;
|
||||||
|
const U32 numBufs = bufRanges[SHADER_STAGE::VERTEX_SHADER].mBufMax - bufRanges[SHADER_STAGE::VERTEX_SHADER].mBufMin + 1;
|
||||||
|
ID3D11Buffer** vsBuffers = mBoundConstantBuffers + bufStartSlot;
|
||||||
|
|
||||||
|
D3D11DEVICECONTEXT->VSSetConstantBuffers(bufStartSlot, numBufs, vsBuffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bufRanges[SHADER_STAGE::PIXEL_SHADER].isValid())
|
||||||
|
{
|
||||||
|
const U32 bufStartSlot = bufRanges[SHADER_STAGE::PIXEL_SHADER].mBufMin;
|
||||||
|
const U32 numBufs = bufRanges[SHADER_STAGE::PIXEL_SHADER].mBufMax - bufRanges[SHADER_STAGE::PIXEL_SHADER].mBufMin + 1;
|
||||||
|
ID3D11Buffer** psBuffers = mBoundConstantBuffers + bufStartSlot;
|
||||||
|
|
||||||
|
D3D11DEVICECONTEXT->PSSetConstantBuffers(bufStartSlot, numBufs, psBuffers);
|
||||||
|
}
|
||||||
|
|
||||||
mWasLost = false;
|
mWasLost = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -485,10 +557,7 @@ GFXD3D11Shader::GFXD3D11Shader()
|
||||||
if( smD3DInclude == NULL )
|
if( smD3DInclude == NULL )
|
||||||
smD3DInclude = new gfxD3D11Include;
|
smD3DInclude = new gfxD3D11Include;
|
||||||
|
|
||||||
for (U32 i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
mBoundConstantBuffers[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
@ -500,18 +569,13 @@ GFXD3D11Shader::~GFXD3D11Shader()
|
||||||
|
|
||||||
for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); i++)
|
for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); i++)
|
||||||
{
|
{
|
||||||
delete[] i->value;
|
i->value.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
mHandles.clear();
|
mHandles.clear();
|
||||||
|
|
||||||
mBuffers.clear();
|
mBuffers.clear();
|
||||||
|
|
||||||
for (U32 i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
SAFE_RELEASE(mBoundConstantBuffers[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// release shaders
|
// release shaders
|
||||||
SAFE_RELEASE(mVertShader);
|
SAFE_RELEASE(mVertShader);
|
||||||
SAFE_RELEASE(mPixShader);
|
SAFE_RELEASE(mPixShader);
|
||||||
|
|
@ -973,27 +1037,8 @@ void GFXD3D11Shader::_buildShaderConstantHandles()
|
||||||
if (buffer != mBuffers.end())
|
if (buffer != mBuffers.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ID3D11Buffer* constBuffer = nullptr;
|
Vector<U8> buf;
|
||||||
D3D11_BUFFER_DESC cbDesc;
|
buf.setSize(desc.size);
|
||||||
cbDesc.ByteWidth = desc.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, &constBuffer);
|
|
||||||
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
AssertFatal(false, "can't create constant buffer");
|
|
||||||
}
|
|
||||||
|
|
||||||
mBoundConstantBuffers[desc.bindPoint] = constBuffer;
|
|
||||||
|
|
||||||
U8* buf = new U8[desc.size];
|
|
||||||
dMemset(buf, 0, desc.size);
|
|
||||||
// new buffer with our size.
|
// new buffer with our size.
|
||||||
mBuffers[bufKey] = buf;
|
mBuffers[bufKey] = buf;
|
||||||
|
|
||||||
|
|
@ -1083,52 +1128,6 @@ void GFXD3D11Shader::_buildInstancingShaderConstantHandles()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
const BufferKey oldBufferDesc = i->key;
|
|
||||||
U8* oldBuff = i->value;
|
|
||||||
|
|
||||||
U8* newBuff = buffer->mBufferMap[i->key];
|
|
||||||
|
|
||||||
if (dMemcmp(oldBuff, newBuff, sizeof(oldBuff)) != 0)
|
|
||||||
{
|
|
||||||
// else copy new over the buffer.
|
|
||||||
dMemcpy(oldBuff, newBuff, sizeof(oldBuff));
|
|
||||||
|
|
||||||
// buffer has been changed and needs updating.
|
|
||||||
D3D11DEVICECONTEXT->UpdateSubresource(mBoundConstantBuffers[oldBufferDesc.key1], 0, NULL, oldBuff, sizeof(oldBuff), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bufRanges[oldBufferDesc.key2].addSlot(oldBufferDesc.key1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mVertShader != nullptr && bufRanges[SHADER_STAGE::VERTEX_SHADER].isValid())
|
|
||||||
{
|
|
||||||
const U32 bufStartSlot = bufRanges[SHADER_STAGE::VERTEX_SHADER].mBufMin;
|
|
||||||
const U32 numBufs = bufRanges[SHADER_STAGE::VERTEX_SHADER].mBufMax - bufRanges[SHADER_STAGE::VERTEX_SHADER].mBufMin + 1;
|
|
||||||
ID3D11Buffer** vsBuffers = mBoundConstantBuffers + bufStartSlot;
|
|
||||||
|
|
||||||
D3D11DEVICECONTEXT->VSSetConstantBuffers(bufStartSlot, numBufs, vsBuffers);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mPixShader != nullptr && bufRanges[SHADER_STAGE::PIXEL_SHADER].isValid())
|
|
||||||
{
|
|
||||||
const U32 bufStartSlot = bufRanges[SHADER_STAGE::PIXEL_SHADER].mBufMin;
|
|
||||||
const U32 numBufs = bufRanges[SHADER_STAGE::PIXEL_SHADER].mBufMax - bufRanges[SHADER_STAGE::PIXEL_SHADER].mBufMin + 1;
|
|
||||||
ID3D11Buffer** psBuffers = mBoundConstantBuffers + bufStartSlot;
|
|
||||||
|
|
||||||
D3D11DEVICECONTEXT->PSSetConstantBuffers(bufStartSlot, numBufs, psBuffers);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
GFXShaderConstBufferRef GFXD3D11Shader::allocConstBuffer()
|
GFXShaderConstBufferRef GFXD3D11Shader::allocConstBuffer()
|
||||||
{
|
{
|
||||||
GFXD3D11ShaderConstBuffer* buffer = new GFXD3D11ShaderConstBuffer(this);
|
GFXD3D11ShaderConstBuffer* buffer = new GFXD3D11ShaderConstBuffer(this);
|
||||||
|
|
@ -1136,7 +1135,7 @@ GFXShaderConstBufferRef GFXD3D11Shader::allocConstBuffer()
|
||||||
for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); ++i)
|
for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); ++i)
|
||||||
{
|
{
|
||||||
// add our buffer descriptions to the full const buffer.
|
// add our buffer descriptions to the full const buffer.
|
||||||
buffer->addBuffer(i->key.key1,i->key.key2, sizeof(i->value));
|
buffer->addBuffer(i->key.key1,i->key.key2, i->value.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
mActiveBuffers.push_back( buffer );
|
mActiveBuffers.push_back( buffer );
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ public:
|
||||||
virtual void zombify() {}
|
virtual void zombify() {}
|
||||||
virtual void resurrect() {}
|
virtual void resurrect() {}
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
friend class GFXD3D11Shader;
|
friend class GFXD3D11Shader;
|
||||||
/// We keep a weak reference to the shader
|
/// We keep a weak reference to the shader
|
||||||
/// because it will often be deleted.
|
/// because it will often be deleted.
|
||||||
|
|
@ -161,6 +161,9 @@ private:
|
||||||
|
|
||||||
template<typename ConstType>
|
template<typename ConstType>
|
||||||
void internalSet(GFXShaderConstHandle* handle, const AlignedArray<ConstType>& fv);
|
void internalSet(GFXShaderConstHandle* handle, const AlignedArray<ConstType>& fv);
|
||||||
|
|
||||||
|
// we probably want this to be GFXDevice and not per shader.
|
||||||
|
ID3D11Buffer* mBoundConstantBuffers[16];
|
||||||
};
|
};
|
||||||
|
|
||||||
class gfxD3D11Include;
|
class gfxD3D11Include;
|
||||||
|
|
@ -175,8 +178,7 @@ class GFXD3D11Shader : public GFXShader
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef Map<String, GFXD3D11ShaderConstHandle*> HandleMap;
|
typedef Map<String, GFXD3D11ShaderConstHandle*> HandleMap;
|
||||||
|
typedef Map<BufferKey, Vector<U8>> BufferMap;
|
||||||
typedef Map<BufferKey, U8*> BufferMap;
|
|
||||||
|
|
||||||
GFXD3D11Shader();
|
GFXD3D11Shader();
|
||||||
virtual ~GFXD3D11Shader();
|
virtual ~GFXD3D11Shader();
|
||||||
|
|
@ -199,9 +201,6 @@ protected:
|
||||||
ID3D11VertexShader *mVertShader;
|
ID3D11VertexShader *mVertShader;
|
||||||
ID3D11PixelShader *mPixShader;
|
ID3D11PixelShader *mPixShader;
|
||||||
|
|
||||||
// we probably want this to be GFXDevice and not per shader.
|
|
||||||
ID3D11Buffer* mBoundConstantBuffers[16];
|
|
||||||
|
|
||||||
static gfxD3DIncludeRef smD3DInclude;
|
static gfxD3DIncludeRef smD3DInclude;
|
||||||
|
|
||||||
HandleMap mHandles;
|
HandleMap mHandles;
|
||||||
|
|
@ -223,7 +222,6 @@ protected:
|
||||||
virtual void _buildShaderConstantHandles();
|
virtual void _buildShaderConstantHandles();
|
||||||
void _buildInstancingShaderConstantHandles();
|
void _buildInstancingShaderConstantHandles();
|
||||||
|
|
||||||
void setConstantsFromBuffer(GFXD3D11ShaderConstBuffer* buffer);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue