From e16a70f08332d6f09c80624c65887a0b331de2ac Mon Sep 17 00:00:00 2001 From: SRSaunders <82544213+SRSaunders@users.noreply.github.com> Date: Tue, 7 Apr 2026 12:48:29 -0400 Subject: [PATCH 1/5] Fix initial resize handling for dynamicrenderinglocalread --- .../dynamicrenderinglocalread/dynamicrenderinglocalread.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp index fb8313b64..c435e2c05 100644 --- a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp +++ b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp @@ -141,7 +141,7 @@ class VulkanExample : public VulkanExampleBase { // With VK_KHR_dynamic_rendering we no longer need a frame buffer, so skip the sample base framebuffer setup - if (attachments.width != width || attachments.height != height) + if (resized) { attachments.width = width; attachments.height = height; @@ -160,6 +160,7 @@ class VulkanExample : public VulkanExampleBase writeDescriptorSets.push_back(vks::initializers::writeDescriptorSet(passes.composition.descriptorSet, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, static_cast(i), &descriptorImageInfos[i])); } vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr); + resized = false; } } @@ -459,6 +460,9 @@ class VulkanExample : public VulkanExampleBase vkCmdPipelineBarrier2KHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdPipelineBarrier2KHR")); vkCmdSetRenderingInputAttachmentIndicesKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetRenderingInputAttachmentIndicesKHR")); + attachments.width = width; + attachments.height = height; + initLights(); createAttachments(); loadAssets(); From 47e55badc57c679549119df762af072be9dd03be Mon Sep 17 00:00:00 2001 From: SRSaunders <82544213+SRSaunders@users.noreply.github.com> Date: Tue, 7 Apr 2026 12:50:36 -0400 Subject: [PATCH 2/5] Make dynamicrenderinglocalread work on iOS subproject and Simulator --- apple/examples.h | 4 ++++ .../dynamicrenderinglocalread.cpp | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/apple/examples.h b/apple/examples.h index c0f8ee027..f3a2f7957 100644 --- a/apple/examples.h +++ b/apple/examples.h @@ -429,6 +429,10 @@ # include "../examples/dynamicrendering/dynamicrendering.cpp" #endif +#ifdef MVK_dynamicrenderinglocalread +# include "../examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp" +#endif + #ifdef MVK_dynamicrenderingmultisampling # include "../examples/dynamicrenderingmultisampling/dynamicrenderingmultisampling.cpp" #endif diff --git a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp index c435e2c05..0b34df2a7 100644 --- a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp +++ b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp @@ -103,8 +103,19 @@ class VulkanExample : public VulkanExampleBase }; deviceCreatepNextChain = &enabledSynchronization2FeaturesKHR; - attachments.width = width; - attachments.height = height; +#if (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_METAL_EXT)) && TARGET_OS_SIMULATOR + static const VkBool32 valueFalse = VK_FALSE; + + // On iOS Simulator use layer setting to disable MoltenVK's Metal argument buffers - otherwise blank display + VkLayerSettingEXT layerSetting; + layerSetting.pLayerName = "MoltenVK"; + layerSetting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + layerSetting.type = VK_LAYER_SETTING_TYPE_BOOL32_EXT; + layerSetting.pValues = &valueFalse; + layerSetting.valueCount = 1; + + enabledLayerSettings.push_back( layerSetting ); +#endif } ~VulkanExample() From 5ae2c86e2af4cd8d84e4373b61a5a0a451c1d17d Mon Sep 17 00:00:00 2001 From: SRSaunders <82544213+SRSaunders@users.noreply.github.com> Date: Tue, 14 Apr 2026 17:38:11 -0400 Subject: [PATCH 3/5] Fix some validation errors in dynamicrenderinglocalread example --- .../dynamicrenderinglocalread.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp index 4d9cbfcfa..5274cc2e6 100644 --- a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp +++ b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp @@ -138,6 +138,8 @@ class VulkanExample : public VulkanExampleBase for (auto& buffer : uniformBuffers) { buffer.destroy(); } + vkDestroyBuffer(device, lightsBuffer.buffer, nullptr); + vkFreeMemory(device, lightsBuffer.memory, nullptr); } } @@ -170,7 +172,7 @@ class VulkanExample : public VulkanExampleBase } // Enable physical device features required for this example - virtual void getEnabledFeatures() + virtual void getEnabledFeatures() override { // Enable anisotropic filtering if supported if (deviceFeatures.samplerAnisotropy) { @@ -454,7 +456,7 @@ class VulkanExample : public VulkanExampleBase } } - void prepare() + void prepare() override { VulkanExampleBase::prepare(); // Since we use an extension, we need to expliclity load the function pointers for extension related Vulkan commands @@ -508,7 +510,7 @@ class VulkanExample : public VulkanExampleBase colorAttachments[i] = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, .imageView = imageViewList[i], - .imageLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR, + .imageLayout = (i == 0) ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR, .resolveMode = VK_RESOLVE_MODE_NONE, .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, .storeOp = VK_ATTACHMENT_STORE_OP_STORE, @@ -579,6 +581,15 @@ class VulkanExample : public VulkanExampleBase vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, passes.composition.pipelineLayout, 0, 1, &passes.composition.descriptorSet, 0, nullptr); vkCmdDraw(cmdBuffer, 3, 1, 0, 0); + vkCmdEndRenderingKHR(cmdBuffer); + + // Update renderingInfo to use current swapchain image as single color attachment for the UI + colorAttachments[0].imageView = swapChain.imageViews[currentImageIndex]; + colorAttachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + renderingInfo.colorAttachmentCount = 1; + + vkCmdBeginRenderingKHR(cmdBuffer, &renderingInfo); + drawUI(cmdBuffer); vkCmdEndRenderingKHR(cmdBuffer); @@ -598,7 +609,7 @@ class VulkanExample : public VulkanExampleBase VK_CHECK_RESULT(vkEndCommandBuffer(cmdBuffer)); } - virtual void render() + virtual void render() override { if (!prepared) return; From 3e5942f0728d381de6a331bf192381abcf2b313a Mon Sep 17 00:00:00 2001 From: SRSaunders <82544213+SRSaunders@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:31:34 -0400 Subject: [PATCH 4/5] Revert imageLayout workaround for VVL VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR defect --- .../dynamicrenderinglocalread/dynamicrenderinglocalread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp index 1fe0f6c3d..5121f42a1 100644 --- a/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp +++ b/examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp @@ -495,7 +495,7 @@ class VulkanExample : public VulkanExampleBase colorAttachments[i] = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, .imageView = imageViewList[i], - .imageLayout = (i == 0) ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR, + .imageLayout = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR, .resolveMode = VK_RESOLVE_MODE_NONE, .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, .storeOp = VK_ATTACHMENT_STORE_OP_STORE, @@ -568,7 +568,7 @@ class VulkanExample : public VulkanExampleBase vkCmdEndRenderingKHR(cmdBuffer); - // Update renderingInfo to use current swapchain image as single color attachment for the UI + // Update renderingInfo to specify and preserve the current swapchain image as the single color attachment for the UI colorAttachments[0].imageView = swapChain.imageViews[currentImageIndex]; colorAttachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; renderingInfo.colorAttachmentCount = 1; From 6aa2ee4712cca878e9ed99c0434186a1597dfc1e Mon Sep 17 00:00:00 2001 From: SRSaunders <82544213+SRSaunders@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:33:09 -0400 Subject: [PATCH 5/5] Revert change that added dynamicrenderinglocalread to apple subproject --- apple/examples.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apple/examples.h b/apple/examples.h index f3a2f7957..c0f8ee027 100644 --- a/apple/examples.h +++ b/apple/examples.h @@ -429,10 +429,6 @@ # include "../examples/dynamicrendering/dynamicrendering.cpp" #endif -#ifdef MVK_dynamicrenderinglocalread -# include "../examples/dynamicrenderinglocalread/dynamicrenderinglocalread.cpp" -#endif - #ifdef MVK_dynamicrenderingmultisampling # include "../examples/dynamicrenderingmultisampling/dynamicrenderingmultisampling.cpp" #endif