fix(font-atlas): wait for the GPU before the image goes; DOM stubs for SetAppId and SetTextInput

~FontAtlas destroyed the image while frames that sample it could still
run (HelloUI declares the atlas after the window, so it goes first); it
waits on the queue now, as the descriptor heap does. The DOM build got
the two new Window methods as no-ops, like the other backend-specific
ones.
This commit is contained in:
Jorijn van der Graaf 2026-10-18 03:28:11 +02:00
commit 1c30b1bbf7
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
2 changed files with 10 additions and 4 deletions

View file

@ -1640,6 +1640,10 @@ void Window::SetTitle(const std::string_view title) {
Crafter::DomEnv::domSetTitle(title.data(), static_cast<std::int32_t>(title.size())); Crafter::DomEnv::domSetTitle(title.data(), static_cast<std::int32_t>(title.size()));
} }
void Window::SetAppId(const std::string_view) {}
void Window::SetTextInput(bool, std::int32_t, std::int32_t, std::int32_t, std::int32_t, TextInputPurpose) {}
void Window::Resize(std::uint32_t newWidth, std::uint32_t newHeight) { void Window::Resize(std::uint32_t newWidth, std::uint32_t newHeight) {
if (newWidth == 0 || newHeight == 0) return; if (newWidth == 0 || newHeight == 0) return;
if (newWidth == width && newHeight == height) return; if (newWidth == width && newHeight == height) return;

View file

@ -100,11 +100,13 @@ export namespace Crafter {
FontAtlas() = default; FontAtlas() = default;
FontAtlas(const FontAtlas&) = delete; FontAtlas(const FontAtlas&) = delete;
FontAtlas& operator=(const FontAtlas&) = delete; FontAtlas& operator=(const FontAtlas&) = delete;
// The image goes with the atlas. The owner waits for the GPU first // The image goes with the atlas, once the GPU is done with it; in
// and, in sets mode, destroys the heap holding the image's view before // sets mode the owner destroys the heap holding the image's view
// the atlas. // before the atlas.
~FontAtlas() { ~FontAtlas() {
if (image.image != VK_NULL_HANDLE) image.Destroy(); if (image.image == VK_NULL_HANDLE) return;
if (Device::queue != VK_NULL_HANDLE) vkQueueWaitIdle(Device::queue);
image.Destroy();
} }
#endif #endif