From 627abbd9d30d0e53457bace38200c87fea772941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Mon, 19 Feb 2018 09:42:02 -0800 Subject: [PATCH] Prevent invalid texture update calls to immutable texture. Issue #1338. --- src/bgfx.cpp | 8 ++++---- src/bgfx_p.h | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/bgfx.cpp b/src/bgfx.cpp index b7379fc40..3ffd800ae 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -3647,7 +3647,7 @@ error: TextureHandle createTexture(const Memory* _mem, uint32_t _flags, uint8_t _skip, TextureInfo* _info) { BX_CHECK(NULL != _mem, "_mem can't be NULL"); - return s_ctx->createTexture(_mem, _flags, _skip, _info, BackbufferRatio::Count); + return s_ctx->createTexture(_mem, _flags, _skip, _info, BackbufferRatio::Count, false); } void getTextureSizeFromRatio(BackbufferRatio::Enum _ratio, uint16_t& _width, uint16_t& _height) @@ -3718,7 +3718,7 @@ error: tc.m_mem = _mem; bx::write(&writer, tc); - return s_ctx->createTexture(mem, _flags, 0, NULL, _ratio); + return s_ctx->createTexture(mem, _flags, 0, NULL, _ratio, NULL != _mem); } TextureHandle createTexture2D(uint16_t _width, uint16_t _height, bool _hasMips, uint16_t _numLayers, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) @@ -3771,7 +3771,7 @@ error: tc.m_mem = _mem; bx::write(&writer, tc); - return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::Count); + return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::Count, NULL != _mem); } TextureHandle createTextureCube(uint16_t _size, bool _hasMips, uint16_t _numLayers, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) @@ -3813,7 +3813,7 @@ error: tc.m_mem = _mem; bx::write(&writer, tc); - return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::Count); + return s_ctx->createTexture(mem, _flags, 0, NULL, BackbufferRatio::Count, NULL != _mem); } void setName(TextureHandle _handle, const char* _name) diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 11a69c250..df2f0a27d 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -3742,7 +3742,7 @@ namespace bgfx } } - BGFX_API_FUNC(TextureHandle createTexture(const Memory* _mem, uint32_t _flags, uint8_t _skip, TextureInfo* _info, BackbufferRatio::Enum _ratio) ) + BGFX_API_FUNC(TextureHandle createTexture(const Memory* _mem, uint32_t _flags, uint8_t _skip, TextureInfo* _info, BackbufferRatio::Enum _ratio, bool _immutable) ) { BGFX_MUTEX_SCOPE(m_resourceApiLock); @@ -3782,7 +3782,12 @@ namespace bgfx if (isValid(handle) ) { TextureRef& ref = m_textureRef[handle.idx]; - ref.init(_ratio, _info->format, imageContainer.m_numMips, 0 != (g_caps.supported & BGFX_CAPS_TEXTURE_DIRECT_ACCESS) ); + ref.init(_ratio + , _info->format + , imageContainer.m_numMips + , 0 != (g_caps.supported & BGFX_CAPS_TEXTURE_DIRECT_ACCESS) + , _immutable + ); CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateTexture); cmdbuf.write(handle); @@ -3925,6 +3930,14 @@ namespace bgfx { BGFX_MUTEX_SCOPE(m_resourceApiLock); + const TextureRef& textureRef = m_textureRef[_handle.idx]; + if (textureRef.m_immutable) + { + BX_WARN(false, "Can't update immutable texture."); + release(_mem); + return; + } + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::UpdateTexture); cmdbuf.write(_handle); cmdbuf.write(_side); @@ -4547,14 +4560,21 @@ namespace bgfx struct TextureRef { - void init(BackbufferRatio::Enum _ratio, TextureFormat::Enum _format, uint8_t _numMips, bool _ptrPending) + void init( + BackbufferRatio::Enum _ratio + , TextureFormat::Enum _format + , uint8_t _numMips + , bool _ptrPending + , bool _immutable + ) { - m_ptr = _ptrPending ? (void*)UINTPTR_MAX : NULL; - m_refCount = 1; - m_bbRatio = uint8_t(_ratio); - m_format = uint8_t(_format); - m_numMips = _numMips; - m_owned = false; + m_ptr = _ptrPending ? (void*)UINTPTR_MAX : NULL; + m_refCount = 1; + m_bbRatio = uint8_t(_ratio); + m_format = uint8_t(_format); + m_numMips = _numMips; + m_owned = false; + m_immutable = _immutable; } String m_name; @@ -4564,6 +4584,7 @@ namespace bgfx uint8_t m_format; uint8_t m_numMips; bool m_owned; + bool m_immutable; }; struct FrameBufferRef