Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 26c6c4a

Browse files
committed
Fix Win32SurfaceKHR resize issues
* Fixes crash when window is resized. * Take destination pitch into account when updating the framebuffer, so we no longer get skewed renders. * Return VK_ERROR_OUT_OF_DATE_KHR when presenting if the swapchain image dimensions do not match the window surface's. Bug: b/139372840 Change-Id: I744adbf222a1d06bc9cc879e299b11b56f6dd7cf Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/37429 Kokoro-Presubmit: kokoro <[email protected]> Reviewed-by: Alexis Hétu <[email protected]> Tested-by: Antonio Maiorano <[email protected]>
1 parent a68a80a commit 26c6c4a

16 files changed

+121
-51
lines changed

src/Vulkan/VkImage.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,11 @@ void Image::blit(Image* dstImage, const VkImageBlit& region, VkFilter filter) co
733733
device->getBlitter()->blit(this, dstImage, region, filter);
734734
}
735735

736+
void Image::blitToBuffer(VkImageSubresourceLayers subresource, VkOffset3D offset, VkExtent3D extent, uint8_t* dst, int bufferRowPitch, int bufferSlicePitch) const
737+
{
738+
device->getBlitter()->blitToBuffer(this, subresource, offset, extent, dst, bufferRowPitch, bufferSlicePitch);
739+
}
740+
736741
void Image::resolve(Image* dstImage, const VkImageResolve& region) const
737742
{
738743
VkImageBlit blitRegion;

src/Vulkan/VkImage.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class Image : public Object<Image, VkImage>
4141
void copyFrom(Buffer* srcBuffer, const VkBufferImageCopy& region);
4242

4343
void blit(Image* dstImage, const VkImageBlit& region, VkFilter filter) const;
44+
void blitToBuffer(VkImageSubresourceLayers subresource, VkOffset3D offset, VkExtent3D extent, uint8_t* dst, int bufferRowPitch, int bufferSlicePitch) const;
4445
void resolve(Image* dstImage, const VkImageResolve& region) const;
4546
void clear(const VkClearValue& clearValue, const vk::Format& viewFormat, const VkRect2D& renderArea, const VkImageSubresourceRange& subresourceRange);
4647
void clear(const VkClearColorValue& color, const VkImageSubresourceRange& subresourceRange);

src/Vulkan/VkQueue.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ void Queue::garbageCollect()
213213
}
214214

215215
#ifndef __ANDROID__
216-
void Queue::present(const VkPresentInfoKHR* presentInfo)
216+
VkResult Queue::present(const VkPresentInfoKHR* presentInfo)
217217
{
218218
// This is a hack to deal with screen tearing for now.
219219
// Need to correctly implement threading using VkSemaphore
@@ -227,8 +227,12 @@ void Queue::present(const VkPresentInfoKHR* presentInfo)
227227

228228
for(uint32_t i = 0; i < presentInfo->swapchainCount; i++)
229229
{
230-
vk::Cast(presentInfo->pSwapchains[i])->present(presentInfo->pImageIndices[i]);
230+
VkResult result = vk::Cast(presentInfo->pSwapchains[i])->present(presentInfo->pImageIndices[i]);
231+
if (result != VK_SUCCESS)
232+
return result;
231233
}
234+
235+
return VK_SUCCESS;
232236
}
233237
#endif
234238

src/Vulkan/VkQueue.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class Queue
5555
VkResult submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, Fence* fence);
5656
VkResult waitIdle();
5757
#ifndef __ANDROID__
58-
void present(const VkPresentInfoKHR* presentInfo);
58+
VkResult present(const VkPresentInfoKHR* presentInfo);
5959
#endif
6060

6161
private:

src/Vulkan/libVulkan.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2927,9 +2927,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(VkQueue queue, const VkPresentI
29272927
TRACE("(VkQueue queue = %p, const VkPresentInfoKHR* pPresentInfo = %p)",
29282928
queue, pPresentInfo);
29292929

2930-
vk::Cast(queue)->present(pPresentInfo);
2931-
2932-
return VK_SUCCESS;
2930+
return vk::Cast(queue)->present(pPresentInfo);
29332931
}
29342932

29352933
VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo, uint32_t *pImageIndex)

src/WSI/MacOSSurfaceMVK.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class MacOSSurfaceMVK : public SurfaceKHR, public ObjectBase<MacOSSurfaceMVK, Vk
3535

3636
virtual void attachImage(PresentImage* image) override {}
3737
virtual void detachImage(PresentImage* image) override {}
38-
void present(PresentImage* image) override;
38+
VkResult present(PresentImage* image) override;
3939

4040
private:
4141
MetalLayer* metalLayer = nullptr;

src/WSI/MacOSSurfaceMVK.mm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ VkExtent2D getExtent() const
128128
pSurfaceCapabilities->maxImageExtent = extent;
129129
}
130130

131-
void MacOSSurfaceMVK::present(PresentImage* image)
131+
VkResult MacOSSurfaceMVK::present(PresentImage* image)
132132
{
133133
auto drawable = metalLayer->getNextDrawable();
134134
if(drawable)
@@ -140,6 +140,7 @@ VkExtent2D getExtent() const
140140
bytesPerRow:image->getImage()->rowPitchBytes(VK_IMAGE_ASPECT_COLOR_BIT, 0)];
141141
[drawable present];
142142
}
143+
return VK_SUCCESS;
143144
}
144145

145146
}

src/WSI/VkSurfaceKHR.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class SurfaceKHR
9090

9191
virtual void attachImage(PresentImage* image) = 0;
9292
virtual void detachImage(PresentImage* image) = 0;
93-
virtual void present(PresentImage* image) = 0;
93+
virtual VkResult present(PresentImage* image) = 0;
9494

9595
void associateSwapchain(SwapchainKHR* swapchain);
9696
void disassociateSwapchain();

src/WSI/VkSwapchainKHR.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,20 @@ VkResult SwapchainKHR::getNextImage(uint64_t timeout, Semaphore* semaphore, Fenc
198198
return VK_NOT_READY;
199199
}
200200

201-
void SwapchainKHR::present(uint32_t index)
201+
VkResult SwapchainKHR::present(uint32_t index)
202202
{
203-
auto & image = images[index];
203+
auto& image = images[index];
204204
image.setStatus(PRESENTING);
205-
surface->present(&image);
205+
VkResult result = surface->present(&image);
206206
image.setStatus(AVAILABLE);
207207

208208
if(retired)
209209
{
210210
surface->detachImage(&image);
211211
image.clear();
212212
}
213+
214+
return result;
213215
}
214216

215217
}

src/WSI/VkSwapchainKHR.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class SwapchainKHR : public Object<SwapchainKHR, VkSwapchainKHR>
4646

4747
VkResult getNextImage(uint64_t timeout, Semaphore* semaphore, Fence* fence, uint32_t* pImageIndex);
4848

49-
void present(uint32_t index);
49+
VkResult present(uint32_t index);
5050
PresentImage const &getImage(uint32_t imageIndex) { return images[imageIndex]; }
5151

5252
private:

0 commit comments

Comments
 (0)