diff --git a/src/gx/CGxDevice.cpp b/src/gx/CGxDevice.cpp index 75f4a65..1a354b7 100644 --- a/src/gx/CGxDevice.cpp +++ b/src/gx/CGxDevice.cpp @@ -194,6 +194,11 @@ int32_t CGxDevice::BufUnlock(CGxBuf* buf, uint32_t size) { return 1; } +void CGxDevice::BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset) { + buf->unk1E = 1; + buf->unk1F = 0; +} + const CGxCaps& CGxDevice::Caps() const { return this->m_caps; } diff --git a/src/gx/CGxDevice.hpp b/src/gx/CGxDevice.hpp index 83c39b6..16a7216 100644 --- a/src/gx/CGxDevice.hpp +++ b/src/gx/CGxDevice.hpp @@ -120,6 +120,7 @@ class CGxDevice { virtual void PoolSizeSet(CGxPool*, uint32_t) = 0; virtual char* BufLock(CGxBuf*); virtual int32_t BufUnlock(CGxBuf*, uint32_t); + virtual void BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset); virtual int32_t TexCreate(EGxTexTarget, uint32_t, uint32_t, uint32_t, EGxTexFormat, EGxTexFormat, CGxTexFlags, void*, void (*)(EGxTexCommand, uint32_t, uint32_t, uint32_t, uint32_t, void*, uint32_t&, const void*&), const char*, CGxTex*&); virtual void TexDestroy(CGxTex* texId); virtual void ShaderCreate(CGxShader*[], EGxShTarget, const char*, const char*, int32_t); diff --git a/src/gx/d3d/CGxDeviceD3d.cpp b/src/gx/d3d/CGxDeviceD3d.cpp index 433a76e..d0fb4ed 100644 --- a/src/gx/d3d/CGxDeviceD3d.cpp +++ b/src/gx/d3d/CGxDeviceD3d.cpp @@ -394,6 +394,14 @@ int32_t CGxDeviceD3d::BufUnlock(CGxBuf* buf, uint32_t size) { return 1; } +void CGxDeviceD3d::BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset) { + CGxDevice::BufData(buf, data, size, offset); + + auto bufData = this->IBufLock(buf); + memcpy(&bufData[offset], data, size); + this->IBufUnlock(buf); +} + void CGxDeviceD3d::CapsWindowSize(CRect& dst) { dst = this->DeviceCurWindow(); } diff --git a/src/gx/d3d/CGxDeviceD3d.hpp b/src/gx/d3d/CGxDeviceD3d.hpp index 7aec4e3..18437d9 100644 --- a/src/gx/d3d/CGxDeviceD3d.hpp +++ b/src/gx/d3d/CGxDeviceD3d.hpp @@ -258,6 +258,7 @@ class CGxDeviceD3d : public CGxDevice { virtual void PoolSizeSet(CGxPool* pool, uint32_t size); virtual char* BufLock(CGxBuf* buf); virtual int32_t BufUnlock(CGxBuf* buf, uint32_t size); + virtual void BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset); virtual void IShaderCreate(CGxShader* shader); virtual void ShaderCreate(CGxShader* shaders[], EGxShTarget target, const char* a4, const char* a5, int32_t permutations); virtual int32_t StereoEnabled(); diff --git a/src/gx/gll/CGxDeviceGLL.cpp b/src/gx/gll/CGxDeviceGLL.cpp index db0bc25..244ac4f 100644 --- a/src/gx/gll/CGxDeviceGLL.cpp +++ b/src/gx/gll/CGxDeviceGLL.cpp @@ -117,6 +117,14 @@ int32_t CGxDeviceGLL::BufUnlock(CGxBuf* buf, uint32_t size) { return this->IBufUnlock(buf); } +void CGxDeviceGLL::BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset) { + CGxDevice::BufData(buf, data, size, offset); + + auto bufData = this->IBufLock(buf); + memcpy(&bufData[offset], data, size); + this->IBufUnlock(buf); +} + void CGxDeviceGLL::CapsWindowSize(CRect& rect) { CRect windowRect = this->DeviceCurWindow(); diff --git a/src/gx/gll/CGxDeviceGLL.hpp b/src/gx/gll/CGxDeviceGLL.hpp index 7f4e44d..c311698 100644 --- a/src/gx/gll/CGxDeviceGLL.hpp +++ b/src/gx/gll/CGxDeviceGLL.hpp @@ -43,6 +43,7 @@ class CGxDeviceGLL : public CGxDevice { virtual void PoolSizeSet(CGxPool*, uint32_t); virtual char* BufLock(CGxBuf*); virtual int32_t BufUnlock(CGxBuf*, uint32_t); + virtual void BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset); virtual void TexDestroy(CGxTex* texId); virtual void IShaderCreate(CGxShader*); virtual void ShaderCreate(CGxShader*[], EGxShTarget, const char*, const char*, int32_t);