Skip to content

Commit 9802c61

Browse files
committed
WIP - Backends: SDLGPU3: Reuse texture transfer buffer.
1 parent c24a7c2 commit 9802c61

File tree

1 file changed

+38
-26
lines changed

1 file changed

+38
-26
lines changed

backends/imgui_impl_sdlgpu3.cpp

+38-26
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ struct ImGui_ImplSDLGPU3_Data
5757
ImGui_ImplSDLGPU3_InitInfo InitInfo;
5858

5959
// Graphics pipeline & shaders
60-
SDL_GPUShader* VertexShader = nullptr;
61-
SDL_GPUShader* FragmentShader = nullptr;
62-
SDL_GPUGraphicsPipeline* Pipeline = nullptr;
63-
SDL_GPUSampler* TexSampler = nullptr;
60+
SDL_GPUShader* VertexShader = nullptr;
61+
SDL_GPUShader* FragmentShader = nullptr;
62+
SDL_GPUGraphicsPipeline* Pipeline = nullptr;
63+
SDL_GPUSampler* TexSampler = nullptr;
64+
SDL_GPUTransferBuffer* TexTransferBuffer = nullptr;
65+
uint32_t TexTransferBufferSize = 0;
6466

6567
// Frame data for main window
6668
ImGui_ImplSDLGPU3_FrameData MainWindowFrameData;
@@ -333,22 +335,29 @@ void ImGui_ImplSDLGPU3_UpdateTexture(ImTextureData* tex)
333335
uint32_t upload_pitch = upload_w * tex->BytesPerPixel;
334336
uint32_t upload_size = upload_w * upload_h * tex->BytesPerPixel;
335337

336-
// Create all the upload structures and upload:
337-
SDL_GPUTransferBufferCreateInfo transferbuffer_info = {};
338-
transferbuffer_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD;
339-
transferbuffer_info.size = upload_size;
340-
341-
SDL_GPUTransferBuffer* transferbuffer = SDL_CreateGPUTransferBuffer(v->Device, &transferbuffer_info);
342-
IM_ASSERT(transferbuffer != nullptr && "Failed to create font transfer buffer, call SDL_GetError() for more information");
338+
// Create transfer buffer
339+
if (bd->TexTransferBufferSize < upload_size)
340+
{
341+
SDL_ReleaseGPUTransferBuffer(v->Device, bd->TexTransferBuffer);
342+
SDL_GPUTransferBufferCreateInfo transferbuffer_info = {};
343+
transferbuffer_info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD;
344+
transferbuffer_info.size = upload_size + 1024;
345+
bd->TexTransferBufferSize = upload_size + 1024;
346+
bd->TexTransferBuffer = SDL_CreateGPUTransferBuffer(v->Device, &transferbuffer_info);
347+
IM_ASSERT(bd->TexTransferBuffer != nullptr && "Failed to create font transfer buffer, call SDL_GetError() for more information");
348+
}
343349

344-
void* texture_ptr = SDL_MapGPUTransferBuffer(v->Device, transferbuffer, false);
345-
for (int y = 0; y < upload_h; y++)
346-
memcpy((void*)((uintptr_t)texture_ptr + y * upload_pitch), tex->GetPixelsAt(upload_x, upload_y + y), upload_pitch);
347-
SDL_UnmapGPUTransferBuffer(v->Device, transferbuffer);
350+
// Copy to transfer buffer
351+
{
352+
void* texture_ptr = SDL_MapGPUTransferBuffer(v->Device, bd->TexTransferBuffer, false);
353+
for (int y = 0; y < upload_h; y++)
354+
memcpy((void*)((uintptr_t)texture_ptr + y * upload_pitch), tex->GetPixelsAt(upload_x, upload_y + y), upload_pitch);
355+
SDL_UnmapGPUTransferBuffer(v->Device, bd->TexTransferBuffer);
356+
}
348357

349358
SDL_GPUTextureTransferInfo transfer_info = {};
350359
transfer_info.offset = 0;
351-
transfer_info.transfer_buffer = transferbuffer;
360+
transfer_info.transfer_buffer = bd->TexTransferBuffer;
352361

353362
SDL_GPUTextureRegion texture_region = {};
354363
texture_region.texture = backend_tex->Texture;
@@ -358,12 +367,14 @@ void ImGui_ImplSDLGPU3_UpdateTexture(ImTextureData* tex)
358367
texture_region.h = (Uint32)upload_h;
359368
texture_region.d = 1;
360369

361-
SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(v->Device);
362-
SDL_GPUCopyPass* copy_pass = SDL_BeginGPUCopyPass(cmd);
363-
SDL_UploadToGPUTexture(copy_pass, &transfer_info, &texture_region, false);
364-
SDL_EndGPUCopyPass(copy_pass);
365-
SDL_SubmitGPUCommandBuffer(cmd);
366-
SDL_ReleaseGPUTransferBuffer(v->Device, transferbuffer);
370+
// Upload
371+
{
372+
SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(v->Device);
373+
SDL_GPUCopyPass* copy_pass = SDL_BeginGPUCopyPass(cmd);
374+
SDL_UploadToGPUTexture(copy_pass, &transfer_info, &texture_region, false);
375+
SDL_EndGPUCopyPass(copy_pass);
376+
SDL_SubmitGPUCommandBuffer(cmd);
377+
}
367378

368379
tex->Status = ImTextureStatus_OK;
369380
}
@@ -588,10 +599,11 @@ void ImGui_ImplSDLGPU3_DestroyDeviceObjects()
588599
tex->Status = ImTextureStatus_WantDestroy;
589600
ImGui_ImplSDLGPU3_UpdateTexture(tex);
590601
}
591-
if (bd->VertexShader) { SDL_ReleaseGPUShader(v->Device, bd->VertexShader); bd->VertexShader = nullptr;}
592-
if (bd->FragmentShader) { SDL_ReleaseGPUShader(v->Device, bd->FragmentShader); bd->FragmentShader = nullptr;}
593-
if (bd->TexSampler) { SDL_ReleaseGPUSampler(v->Device, bd->TexSampler); bd->TexSampler = nullptr;}
594-
if (bd->Pipeline) { SDL_ReleaseGPUGraphicsPipeline(v->Device, bd->Pipeline); bd->Pipeline = nullptr;}
602+
if (bd->TexTransferBuffer) { SDL_ReleaseGPUTransferBuffer(v->Device, bd->TexTransferBuffer); bd->TexTransferBuffer = nullptr; }
603+
if (bd->VertexShader) { SDL_ReleaseGPUShader(v->Device, bd->VertexShader); bd->VertexShader = nullptr; }
604+
if (bd->FragmentShader) { SDL_ReleaseGPUShader(v->Device, bd->FragmentShader); bd->FragmentShader = nullptr; }
605+
if (bd->TexSampler) { SDL_ReleaseGPUSampler(v->Device, bd->TexSampler); bd->TexSampler = nullptr; }
606+
if (bd->Pipeline) { SDL_ReleaseGPUGraphicsPipeline(v->Device, bd->Pipeline); bd->Pipeline = nullptr; }
595607
}
596608

597609
bool ImGui_ImplSDLGPU3_Init(ImGui_ImplSDLGPU3_InitInfo* info)

0 commit comments

Comments
 (0)