|
|
|
@ -12,6 +12,8 @@ |
|
|
|
|
|
|
|
|
|
// CHANGELOG |
|
|
|
|
// (minor and older changes stripped away, please see git history for details) |
|
|
|
|
// 2022-07-05: Metal: Add dispatch synchronization. |
|
|
|
|
// 2022-06-30: Metal: Use __bridge for ARC based systems. |
|
|
|
|
// 2022-06-01: Metal: Fixed null dereference on exit inside command buffer completion handler. |
|
|
|
|
// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts. |
|
|
|
|
// 2022-01-03: Metal: Ignore ImDrawCmd where ElemCount == 0 (very rare but can technically be manufactured by user code). |
|
|
|
@ -295,10 +297,13 @@ void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData, id<MTLCommandBuffer> c |
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{ |
|
|
|
|
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); |
|
|
|
|
if (bd != NULL) |
|
|
|
|
{ |
|
|
|
|
@synchronized(bd->SharedMetalContext.bufferCache) |
|
|
|
|
{ |
|
|
|
|
[bd->SharedMetalContext.bufferCache addObject:vertexBuffer]; |
|
|
|
|
[bd->SharedMetalContext.bufferCache addObject:indexBuffer]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}]; |
|
|
|
|
} |
|
|
|
@ -440,6 +445,8 @@ void ImGui_ImplMetal_DestroyDeviceObjects() |
|
|
|
|
{ |
|
|
|
|
uint64_t now = GetMachAbsoluteTimeInSeconds(); |
|
|
|
|
|
|
|
|
|
@synchronized(self.bufferCache) |
|
|
|
|
{ |
|
|
|
|
// Purge old buffers that haven't been useful for a while |
|
|
|
|
if (now - self.lastBufferCachePurge > 1.0) |
|
|
|
|
{ |
|
|
|
@ -463,6 +470,7 @@ void ImGui_ImplMetal_DestroyDeviceObjects() |
|
|
|
|
bestCandidate.lastReuseTime = now; |
|
|
|
|
return bestCandidate; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// No luck; make a new buffer |
|
|
|
|
id<MTLBuffer> backing = [device newBufferWithLength:length options:MTLResourceStorageModeShared]; |
|
|
|
|