@@ -57,10 +57,12 @@ struct ImGui_ImplSDLGPU3_Data
57
57
ImGui_ImplSDLGPU3_InitInfo InitInfo;
58
58
59
59
// 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 ;
64
66
65
67
// Frame data for main window
66
68
ImGui_ImplSDLGPU3_FrameData MainWindowFrameData;
@@ -333,22 +335,29 @@ void ImGui_ImplSDLGPU3_UpdateTexture(ImTextureData* tex)
333
335
uint32_t upload_pitch = upload_w * tex->BytesPerPixel ;
334
336
uint32_t upload_size = upload_w * upload_h * tex->BytesPerPixel ;
335
337
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
+ }
343
349
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
+ }
348
357
349
358
SDL_GPUTextureTransferInfo transfer_info = {};
350
359
transfer_info.offset = 0 ;
351
- transfer_info.transfer_buffer = transferbuffer ;
360
+ transfer_info.transfer_buffer = bd-> TexTransferBuffer ;
352
361
353
362
SDL_GPUTextureRegion texture_region = {};
354
363
texture_region.texture = backend_tex->Texture ;
@@ -358,12 +367,14 @@ void ImGui_ImplSDLGPU3_UpdateTexture(ImTextureData* tex)
358
367
texture_region.h = (Uint32)upload_h;
359
368
texture_region.d = 1 ;
360
369
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
+ }
367
378
368
379
tex->Status = ImTextureStatus_OK;
369
380
}
@@ -588,10 +599,11 @@ void ImGui_ImplSDLGPU3_DestroyDeviceObjects()
588
599
tex->Status = ImTextureStatus_WantDestroy;
589
600
ImGui_ImplSDLGPU3_UpdateTexture (tex);
590
601
}
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 ; }
595
607
}
596
608
597
609
bool ImGui_ImplSDLGPU3_Init (ImGui_ImplSDLGPU3_InitInfo* info)
0 commit comments