Added ImTextureData::QueueUserData for staged-rendering texture queues e.g. imgui_threaded_rendering.h. (#8597, #9136)
This commit is contained in:
parent
6f41d13c7a
commit
b335bf4328
3
imgui.h
3
imgui.h
@ -3558,13 +3558,14 @@ struct ImTextureRect
|
|||||||
// Why does we store two identifiers: TexID and BackendUserData?
|
// Why does we store two identifiers: TexID and BackendUserData?
|
||||||
// - ImTextureID TexID = lower-level identifier stored in ImDrawCmd. ImDrawCmd can refer to textures not created by the backend, and for which there's no ImTextureData.
|
// - ImTextureID TexID = lower-level identifier stored in ImDrawCmd. ImDrawCmd can refer to textures not created by the backend, and for which there's no ImTextureData.
|
||||||
// - void* BackendUserData = higher-level opaque storage for backend own book-keeping. Some backends may have enough with TexID and not need both.
|
// - void* BackendUserData = higher-level opaque storage for backend own book-keeping. Some backends may have enough with TexID and not need both.
|
||||||
// In columns below: who reads/writes each fields? 'r'=read, 'w'=write, 'core'=main library, 'backend'=renderer backend
|
// In columns below: who reads/writes each fields? 'r'=read, 'w'=write, 'core'=main library, 'backend'=renderer backend
|
||||||
struct ImTextureData
|
struct ImTextureData
|
||||||
{
|
{
|
||||||
//------------------------------------------ core / backend ---------------------------------------
|
//------------------------------------------ core / backend ---------------------------------------
|
||||||
int UniqueID; // w - // [DEBUG] Sequential index to facilitate identifying a texture when debugging/printing. Unique per atlas.
|
int UniqueID; // w - // [DEBUG] Sequential index to facilitate identifying a texture when debugging/printing. Unique per atlas.
|
||||||
ImTextureStatus Status; // rw rw // ImTextureStatus_OK/_WantCreate/_WantUpdates/_WantDestroy. Always use SetStatus() to modify!
|
ImTextureStatus Status; // rw rw // ImTextureStatus_OK/_WantCreate/_WantUpdates/_WantDestroy. Always use SetStatus() to modify!
|
||||||
void* BackendUserData; // - rw // Convenience storage for backend. Some backends may have enough with TexID.
|
void* BackendUserData; // - rw // Convenience storage for backend. Some backends may have enough with TexID.
|
||||||
|
void* QueueUserData; // r - // Convenience storage for a staged/multi-threaded rendering texture queue (e.g. imgui_threaded_rendering.h. See #8597). When != NULL, core assumes the texture is referenced by the queue.
|
||||||
ImTextureID TexID; // r w // Backend-specific texture identifier. Always use SetTexID() to modify! The identifier will stored in ImDrawCmd::GetTexID() and passed to backend's RenderDrawData function.
|
ImTextureID TexID; // r w // Backend-specific texture identifier. Always use SetTexID() to modify! The identifier will stored in ImDrawCmd::GetTexID() and passed to backend's RenderDrawData function.
|
||||||
ImTextureFormat Format; // w r // ImTextureFormat_RGBA32 (default) or ImTextureFormat_Alpha8
|
ImTextureFormat Format; // w r // ImTextureFormat_RGBA32 (default) or ImTextureFormat_Alpha8
|
||||||
int Width; // w r // Texture width
|
int Width; // w r // Texture width
|
||||||
|
|||||||
@ -2866,13 +2866,14 @@ bool ImTextureDataUpdateNewFrame(ImTextureData* tex)
|
|||||||
// If a texture has never reached the backend, they don't need to know about it.
|
// If a texture has never reached the backend, they don't need to know about it.
|
||||||
// (note: backends between 1.92.0 and 1.92.4 could set an already destroyed texture to ImTextureStatus_WantDestroy
|
// (note: backends between 1.92.0 and 1.92.4 could set an already destroyed texture to ImTextureStatus_WantDestroy
|
||||||
// when invalidating graphics objects twice, which would previously remove it from the list and crash.)
|
// when invalidating graphics objects twice, which would previously remove it from the list and crash.)
|
||||||
if (tex->Status == ImTextureStatus_WantDestroy && tex->TexID == ImTextureID_Invalid && tex->BackendUserData == NULL)
|
if (tex->Status == ImTextureStatus_WantDestroy && tex->TexID == ImTextureID_Invalid && tex->BackendUserData == NULL && tex->QueueUserData == NULL)
|
||||||
tex->Status = ImTextureStatus_Destroyed;
|
tex->Status = ImTextureStatus_Destroyed;
|
||||||
|
|
||||||
// Process texture being destroyed
|
// Process texture being destroyed
|
||||||
if (tex->Status == ImTextureStatus_Destroyed)
|
if (tex->Status == ImTextureStatus_Destroyed)
|
||||||
{
|
{
|
||||||
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == NULL && "Backend set texture Status to Destroyed but did not clear TexID/BackendUserData!");
|
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == NULL && "Backend set texture Status to Destroyed but did not clear TexID/BackendUserData!");
|
||||||
|
IM_ASSERT(tex->QueueUserData == NULL && "Texture queue set Status to Destroyed but did not clear QueueUserData!");
|
||||||
if (tex->WantDestroyNextFrame)
|
if (tex->WantDestroyNextFrame)
|
||||||
remove_from_list = true; // Destroy was scheduled by us
|
remove_from_list = true; // Destroy was scheduled by us
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user