From bcf1015149adc8ca578cb2d1e4c212d1f6db463e Mon Sep 17 00:00:00 2001 From: Kelsi Davis Date: Sun, 5 Apr 2026 01:30:29 -0700 Subject: [PATCH] fix(rendering): check sampler validity in VkTexture::isValid(), fix Windows build - VkTexture::isValid() now checks both image AND sampler handles. Previously it only checked the image, so a texture with a valid image but NULL sampler would pass validation and get bound to a descriptor set. On MoltenVK (macOS) this renders as pink/magenta boxes; the fallback white texture is now correctly used instead. - Fix fs::path to std::string implicit conversion in asset extractor that broke the Windows (MSYS2/clang) CI build. --- include/rendering/vk_texture.hpp | 2 +- tools/asset_extract/extractor.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/rendering/vk_texture.hpp b/include/rendering/vk_texture.hpp index fb0e01f1..985f699d 100644 --- a/include/rendering/vk_texture.hpp +++ b/include/rendering/vk_texture.hpp @@ -60,7 +60,7 @@ public: uint32_t getHeight() const { return image_.extent.height; } VkFormat getFormat() const { return image_.format; } uint32_t getMipLevels() const { return mipLevels_; } - bool isValid() const { return image_.image != VK_NULL_HANDLE; } + bool isValid() const { return image_.image != VK_NULL_HANDLE && sampler_ != VK_NULL_HANDLE; } // Write descriptor info for binding VkDescriptorImageInfo descriptorInfo(VkImageLayout layout = diff --git a/tools/asset_extract/extractor.cpp b/tools/asset_extract/extractor.cpp index 81c32ba1..0612c6fa 100644 --- a/tools/asset_extract/extractor.cpp +++ b/tools/asset_extract/extractor.cpp @@ -866,7 +866,7 @@ bool Extractor::run(const Options& opts) { // Merge with existing manifest so partial extractions don't nuke prior entries fs::path manifestPath = fs::path(effectiveOutputDir) / "manifest.json"; if (fs::exists(manifestPath)) { - auto existing = loadManifestEntries(manifestPath); + auto existing = loadManifestEntries(manifestPath.string()); if (!existing.empty()) { // New entries override existing ones with same key for (auto& entry : manifestEntries) { @@ -889,7 +889,7 @@ bool Extractor::run(const Options& opts) { }); // basePath is "." since manifest sits inside the output directory - if (!ManifestWriter::write(manifestPath, ".", manifestEntries)) { + if (!ManifestWriter::write(manifestPath.string(), ".", manifestEntries)) { std::cerr << "Failed to write manifest: " << manifestPath << "\n"; return false; }