From 11d8604d8e84c83cda7d735f1f697a9bdbd9c4dc Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Thu, 14 Mar 2024 14:23:08 +0000 Subject: [PATCH] ogl device buffer creation now ogl mirrors dx side with ubo creation and clearing pushed up to the device level. --- Engine/source/gfx/D3D11/gfxD3D11Shader.cpp | 8 ++++++ Engine/source/gfx/gl/gfxGLDevice.cpp | 22 ++++++++++++++++ Engine/source/gfx/gl/gfxGLDevice.h | 8 ++++++ Engine/source/gfx/gl/gfxGLShader.cpp | 29 ++++++++++------------ Engine/source/gfx/gl/gfxGLShader.h | 2 +- 5 files changed, 52 insertions(+), 17 deletions(-) diff --git a/Engine/source/gfx/D3D11/gfxD3D11Shader.cpp b/Engine/source/gfx/D3D11/gfxD3D11Shader.cpp index 5dd1a95d7..6259be330 100644 --- a/Engine/source/gfx/D3D11/gfxD3D11Shader.cpp +++ b/Engine/source/gfx/D3D11/gfxD3D11Shader.cpp @@ -155,6 +155,14 @@ GFXD3D11ShaderConstBuffer::~GFXD3D11ShaderConstBuffer() } mBufferMap.clear(); // Clear the map + for (U32 i = 0; i < 6; i++) + { + for (U32 j = 0; j < 16; j++) + { + mBoundBuffers[i][j] = nullptr; + } + } + if (mShader) mShader->_unlinkBuffer(this); } diff --git a/Engine/source/gfx/gl/gfxGLDevice.cpp b/Engine/source/gfx/gl/gfxGLDevice.cpp index 452e72227..148a68648 100644 --- a/Engine/source/gfx/gl/gfxGLDevice.cpp +++ b/Engine/source/gfx/gl/gfxGLDevice.cpp @@ -292,6 +292,11 @@ GFXGLDevice::~GFXGLDevice() mTextureManager->kill(); } + // Free device buffers + DeviceBufferMap::Iterator bufferIter = mDeviceBufferMap.begin(); + for (; bufferIter != mDeviceBufferMap.end(); ++bufferIter) + glDeleteBuffers(1, &bufferIter->value); + GFXResource* walk = mResourceListHead; while(walk) { @@ -307,6 +312,23 @@ GFXGLDevice::~GFXGLDevice() SAFE_DELETE( mOpenglStateCache ); } +GLuint GFXGLDevice::getDeviceBuffer(const GFXShaderConstDesc desc) +{ + String name(desc.name + "_" + String::ToString(desc.size)); + DeviceBufferMap::Iterator buf = mDeviceBufferMap.find(name); + if (buf != mDeviceBufferMap.end()) + { + return mDeviceBufferMap[name]; + } + + GLuint uboHandle; + glGenBuffers(1, &uboHandle); + + mDeviceBufferMap[name] = uboHandle; + + return uboHandle; +} + void GFXGLDevice::zombify() { mTextureManager->zombify(); diff --git a/Engine/source/gfx/gl/gfxGLDevice.h b/Engine/source/gfx/gl/gfxGLDevice.h index 36b0cfa71..981aff662 100644 --- a/Engine/source/gfx/gl/gfxGLDevice.h +++ b/Engine/source/gfx/gl/gfxGLDevice.h @@ -47,6 +47,7 @@ class GFXGLShaderConstBuffer; class GFXGLDevice : public GFXDevice { + public: struct GLCapabilities { @@ -60,6 +61,11 @@ public: }; GLCapabilities mCapabilities; + // UBO map + typedef Map DeviceBufferMap; + // grab device buffer. + GLuint getDeviceBuffer(const GFXShaderConstDesc desc); + void zombify(); void resurrect(); GFXGLDevice(U32 adapterIndex); @@ -202,6 +208,8 @@ protected: virtual void setVertexStream( U32 stream, GFXVertexBuffer *buffer ); virtual void setVertexStreamFrequency( U32 stream, U32 frequency ); StrongRefPtr mCurrentConstBuffer; + DeviceBufferMap mDeviceBufferMap; + private: typedef GFXDevice Parent; diff --git a/Engine/source/gfx/gl/gfxGLShader.cpp b/Engine/source/gfx/gl/gfxGLShader.cpp index fd2da2f3f..e13ff1a52 100644 --- a/Engine/source/gfx/gl/gfxGLShader.cpp +++ b/Engine/source/gfx/gl/gfxGLShader.cpp @@ -434,30 +434,27 @@ void GFXGLShaderConstBuffer::activate(GFXGLShaderConstBuffer* prevShaderBuffer) mWasLost = false; } -void GFXGLShaderConstBuffer::addBuffer(S32 bufBindingPoint, U32 size) +void GFXGLShaderConstBuffer::addBuffer(const GFXShaderConstDesc desc) { // if this is the global buffer set it to the highest. - if (bufBindingPoint == -1) + if (desc.bindPoint == -1) { // we dont create a bufferhandle for this one. - U8* buf = new U8[size]; - dMemset(buf, 0, size); + U8* buf = new U8[desc.size]; + dMemset(buf, 0, desc.size); mBufferMap[-1].data = buf; - mBufferMap[-1].size = size; + mBufferMap[-1].size = desc.size; mBufferMap[-1].isDirty = true; } else { - U8* buf = new U8[size]; - dMemset(buf, 0, size); - mBufferMap[bufBindingPoint].data = buf; - mBufferMap[bufBindingPoint].size = size; - mBufferMap[bufBindingPoint].isDirty = true; + U8* buf = new U8[desc.size]; + dMemset(buf, 0, desc.size); + mBufferMap[desc.bindPoint].data = buf; + mBufferMap[desc.bindPoint].size = desc.size; + mBufferMap[desc.bindPoint].isDirty = true; - GLuint uboHandle; - glGenBuffers(1, &uboHandle); - - mBufferMap[bufBindingPoint].bufHandle = uboHandle; + mBufferMap[desc.bindPoint].bufHandle = GFXGL->getDeviceBuffer(desc); } } @@ -478,7 +475,7 @@ void GFXGLShaderConstBuffer::onShaderReload(GFXGLShader* shader) for (GFXGLShader::BufferMap::Iterator i = shader->mBuffers.begin(); i != shader->mBuffers.end(); ++i) { // add our buffer descriptions to the full const buffer. - this->addBuffer(i->value.bindPoint, i->value.size); + this->addBuffer(i->value); } mWasLost = true; @@ -1161,7 +1158,7 @@ GFXShaderConstBufferRef GFXGLShader::allocConstBuffer() for (BufferMap::Iterator i = mBuffers.begin(); i != mBuffers.end(); ++i) { // add our buffer descriptions to the full const buffer. - buffer->addBuffer(i->value.bindPoint, i->value.size); + buffer->addBuffer(i->value); } buffer->registerResourceWithDevice(getOwningDevice()); diff --git a/Engine/source/gfx/gl/gfxGLShader.h b/Engine/source/gfx/gl/gfxGLShader.h index ee8b53dc6..1ca420b9e 100644 --- a/Engine/source/gfx/gl/gfxGLShader.h +++ b/Engine/source/gfx/gl/gfxGLShader.h @@ -111,7 +111,7 @@ public: /// Called by GFXGLDevice to activate this buffer. void activate(GFXGLShaderConstBuffer* prevShaderBuffer); - void addBuffer(S32 bufBindingPoint, U32 size); + void addBuffer(const GFXShaderConstDesc desc); /// Called when the shader this buffer references is reloaded. void onShaderReload(GFXGLShader* shader);