diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c index fc2e5fa279..ab80372196 100644 --- a/src/gpu/vulkan/SDL_gpu_vulkan.c +++ b/src/gpu/vulkan/SDL_gpu_vulkan.c @@ -893,6 +893,8 @@ typedef struct RenderPassHashTableKey { RenderPassColorTargetDescription colorTargetDescriptions[MAX_COLOR_TARGET_BINDINGS]; Uint32 numColorTargets; + VkFormat resolveTargetFormats[MAX_COLOR_TARGET_BINDINGS]; + Uint32 numResolveTargets; RenderPassDepthStencilTargetDescription depthStencilTargetDescription; VkSampleCountFlagBits sampleCount; } RenderPassHashTableKey; @@ -906,6 +908,8 @@ typedef struct FramebufferHashTableKey { VkImageView colorAttachmentViews[MAX_COLOR_TARGET_BINDINGS]; Uint32 numColorTargets; + VkImageView resolveAttachmentViews[MAX_COLOR_TARGET_BINDINGS]; + Uint32 numResolveAttachments; VkImageView depthStencilAttachmentView; Uint32 width; Uint32 height; @@ -2879,6 +2883,11 @@ static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( remove = true; } } + for (Uint32 i = 0; i < key->numResolveAttachments; i += 1) { + if (key->resolveAttachmentViews[i] == view) { + remove = true; + } + } if (key->depthStencilAttachmentView == view) { remove = true; } @@ -3334,6 +3343,10 @@ static Uint32 VULKAN_INTERNAL_RenderPassHashFunction( result = result * hashFactor + hashTableKey->colorTargetDescriptions[i].format; } + for (Uint32 i = 0; i < hashTableKey->numResolveTargets; i += 1) { + result = result * hashFactor + hashTableKey->resolveTargetFormats[i]; + } + result = result * hashFactor + hashTableKey->depthStencilTargetDescription.loadOp; result = result * hashFactor + hashTableKey->depthStencilTargetDescription.storeOp; result = result * hashFactor + hashTableKey->depthStencilTargetDescription.stencilLoadOp; @@ -3357,6 +3370,10 @@ static bool VULKAN_INTERNAL_RenderPassHashKeyMatch( return 0; } + if (a->numResolveTargets != b->numResolveTargets) { + return 0; + } + if (a->sampleCount != b->sampleCount) { return 0; } @@ -3375,6 +3392,12 @@ static bool VULKAN_INTERNAL_RenderPassHashKeyMatch( } } + for (Uint32 i = 0; i < a->numResolveTargets; i += 1) { + if (a->resolveTargetFormats[i] != b->resolveTargetFormats[i]) { + return 0; + } + } + if (a->depthStencilTargetDescription.format != b->depthStencilTargetDescription.format) { return 0; } @@ -3426,6 +3449,9 @@ static Uint32 VULKAN_INTERNAL_FramebufferHashFunction( for (Uint32 i = 0; i < hashTableKey->numColorTargets; i += 1) { result = result * hashFactor + (Uint32)(uintptr_t)hashTableKey->colorAttachmentViews[i]; } + for (Uint32 i = 0; i < hashTableKey->numResolveAttachments; i += 1) { + result = result * hashFactor + (Uint32)(uintptr_t)hashTableKey->resolveAttachmentViews[i]; + } result = result * hashFactor + (Uint32)(uintptr_t)hashTableKey->depthStencilAttachmentView; result = result * hashFactor + hashTableKey->width; @@ -3446,12 +3472,22 @@ static bool VULKAN_INTERNAL_FramebufferHashKeyMatch( return 0; } + if (a->numResolveAttachments != b->numResolveAttachments) { + return 0; + } + for (Uint32 i = 0; i < a->numColorTargets; i += 1) { if (a->colorAttachmentViews[i] != b->colorAttachmentViews[i]) { return 0; } } + for (Uint32 i = 0; i < a->numResolveAttachments; i += 1) { + if (a->resolveAttachmentViews[i] != b->resolveAttachmentViews[i]) { + return 0; + } + } + if (a->depthStencilAttachmentView != b->depthStencilAttachmentView) { return 0; } @@ -6835,10 +6871,17 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( RenderPassHashTableKey key; Uint32 i; + SDL_zero(key); + for (i = 0; i < numColorTargets; i += 1) { key.colorTargetDescriptions[i].format = SDLToVK_TextureFormat[((VulkanTextureContainer *)colorTargetInfos[i].texture)->header.info.format]; key.colorTargetDescriptions[i].loadOp = colorTargetInfos[i].load_op; key.colorTargetDescriptions[i].storeOp = colorTargetInfos[i].store_op; + + if (colorTargetInfos[i].resolve_texture != NULL) { + key.resolveTargetFormats[key.numResolveTargets] = SDLToVK_TextureFormat[((VulkanTextureContainer *)colorTargetInfos[i].resolve_texture)->header.info.format]; + key.numResolveTargets += 1; + } } key.sampleCount = VK_SAMPLE_COUNT_1_BIT; @@ -6921,9 +6964,8 @@ static VulkanFramebuffer *VULKAN_INTERNAL_FetchFramebuffer( Uint32 attachmentCount = 0; Uint32 i; - for (i = 0; i < MAX_COLOR_TARGET_BINDINGS; i += 1) { - key.colorAttachmentViews[i] = VK_NULL_HANDLE; - } + SDL_zero(imageViewAttachments); + SDL_zero(key); key.numColorTargets = numColorTargets; @@ -6937,6 +6979,17 @@ static VulkanFramebuffer *VULKAN_INTERNAL_FetchFramebuffer( Uint32 rtvIndex = container->header.info.type == SDL_GPU_TEXTURETYPE_3D ? colorTargetInfos[i].layer_or_depth_plane : 0; key.colorAttachmentViews[i] = subresource->renderTargetViews[rtvIndex]; + + if (colorTargetInfos[i].resolve_texture != NULL) { + VulkanTextureContainer *resolveTextureContainer = (VulkanTextureContainer *)colorTargetInfos[i].resolve_texture; + VulkanTextureSubresource *resolveSubresource = VULKAN_INTERNAL_FetchTextureSubresource( + resolveTextureContainer, + colorTargetInfos[i].layer_or_depth_plane, + colorTargetInfos[i].mip_level); + + key.resolveAttachmentViews[key.numResolveAttachments] = resolveSubresource->renderTargetViews[0]; + key.numResolveAttachments += 1; + } } if (depthStencilTargetInfo == NULL) {