mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-06-06 23:40:54 +00:00
GPU D3D12: Fix teardown and leaks on device creation failure (#10639)
This commit is contained in:
parent
40d85109ac
commit
4bbf0d45fd
1 changed files with 19 additions and 18 deletions
|
@ -1247,25 +1247,8 @@ static void D3D12_INTERNAL_DestroyFence(D3D12Fence *fence)
|
||||||
SDL_free(fence);
|
SDL_free(fence);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: just move this into DestroyDevice
|
|
||||||
static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer)
|
static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer)
|
||||||
{
|
{
|
||||||
if (!renderer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release blit pipeline structures
|
|
||||||
D3D12_INTERNAL_ReleaseBlitPipelines((SDL_GPURenderer *)renderer);
|
|
||||||
|
|
||||||
// Flush any remaining GPU work...
|
|
||||||
D3D12_Wait((SDL_GPURenderer *)renderer);
|
|
||||||
|
|
||||||
// Release window data
|
|
||||||
for (Sint32 i = renderer->claimedWindowCount - 1; i >= 0; i -= 1) {
|
|
||||||
D3D12_UnclaimWindow((SDL_GPURenderer *)renderer, renderer->claimedWindows[i]->window);
|
|
||||||
}
|
|
||||||
SDL_free(renderer->claimedWindows);
|
|
||||||
|
|
||||||
// Release uniform buffers
|
// Release uniform buffers
|
||||||
for (Uint32 i = 0; i < renderer->uniformBufferPoolCount; i += 1) {
|
for (Uint32 i = 0; i < renderer->uniformBufferPoolCount; i += 1) {
|
||||||
D3D12_INTERNAL_DestroyBuffer(
|
D3D12_INTERNAL_DestroyBuffer(
|
||||||
|
@ -1317,8 +1300,14 @@ static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer)
|
||||||
// Clean up allocations
|
// Clean up allocations
|
||||||
SDL_free(renderer->availableCommandBuffers);
|
SDL_free(renderer->availableCommandBuffers);
|
||||||
SDL_free(renderer->submittedCommandBuffers);
|
SDL_free(renderer->submittedCommandBuffers);
|
||||||
SDL_free(renderer->availableFences);
|
|
||||||
SDL_free(renderer->uniformBufferPool);
|
SDL_free(renderer->uniformBufferPool);
|
||||||
|
SDL_free(renderer->claimedWindows);
|
||||||
|
SDL_free(renderer->availableFences);
|
||||||
|
SDL_free(renderer->buffersToDestroy);
|
||||||
|
SDL_free(renderer->texturesToDestroy);
|
||||||
|
SDL_free(renderer->samplersToDestroy);
|
||||||
|
SDL_free(renderer->graphicsPipelinesToDestroy);
|
||||||
|
SDL_free(renderer->computePipelinesToDestroy);
|
||||||
|
|
||||||
// Tear down D3D12 objects
|
// Tear down D3D12 objects
|
||||||
if (renderer->indirectDrawCommandSignature) {
|
if (renderer->indirectDrawCommandSignature) {
|
||||||
|
@ -1392,6 +1381,18 @@ static void D3D12_INTERNAL_DestroyRenderer(D3D12Renderer *renderer)
|
||||||
static void D3D12_DestroyDevice(SDL_GPUDevice *device)
|
static void D3D12_DestroyDevice(SDL_GPUDevice *device)
|
||||||
{
|
{
|
||||||
D3D12Renderer *renderer = (D3D12Renderer *)device->driverData;
|
D3D12Renderer *renderer = (D3D12Renderer *)device->driverData;
|
||||||
|
|
||||||
|
// Release blit pipeline structures
|
||||||
|
D3D12_INTERNAL_ReleaseBlitPipelines((SDL_GPURenderer *)renderer);
|
||||||
|
|
||||||
|
// Flush any remaining GPU work...
|
||||||
|
D3D12_Wait((SDL_GPURenderer *)renderer);
|
||||||
|
|
||||||
|
// Release window data
|
||||||
|
for (Sint32 i = renderer->claimedWindowCount - 1; i >= 0; i -= 1) {
|
||||||
|
D3D12_UnclaimWindow((SDL_GPURenderer *)renderer, renderer->claimedWindows[i]->window);
|
||||||
|
}
|
||||||
|
|
||||||
D3D12_INTERNAL_DestroyRenderer(renderer);
|
D3D12_INTERNAL_DestroyRenderer(renderer);
|
||||||
SDL_free(device);
|
SDL_free(device);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue