Prevent invalid texture update calls to immutable texture. Issue #1338.
This commit is contained in:
parent
cef850f3dd
commit
627abbd9d3
@ -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)
|
||||
|
27
src/bgfx_p.h
27
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,7 +4560,13 @@ 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;
|
||||
@ -4555,6 +4574,7 @@ namespace bgfx
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user