Index: tools/viewer/sk_app/VulkanWindowContext.cpp |
diff --git a/tools/viewer/sk_app/VulkanWindowContext.cpp b/tools/viewer/sk_app/VulkanWindowContext.cpp |
index 2570e826a387c873afa3529bc95bb968814a4173..bc200de42704a57ece5760bf082b1bbdf5490a02 100644 |
--- a/tools/viewer/sk_app/VulkanWindowContext.cpp |
+++ b/tools/viewer/sk_app/VulkanWindowContext.cpp |
@@ -7,6 +7,7 @@ |
*/ |
#include "GrContext.h" |
+#include "GrRenderTarget.h" |
#include "SkSurface.h" |
#include "VulkanWindowContext.h" |
@@ -25,8 +26,12 @@ |
namespace sk_app { |
VulkanWindowContext::VulkanWindowContext(void* platformData, const DisplayParams& params) |
- : fSurface(VK_NULL_HANDLE) |
+ : WindowContext() |
+ , fSurface(VK_NULL_HANDLE) |
, fSwapchain(VK_NULL_HANDLE) |
+ , fImages(nullptr) |
+ , fImageLayouts(nullptr) |
+ , fSurfaces(nullptr) |
, fCommandPool(VK_NULL_HANDLE) |
, fBackbuffers(nullptr) { |
@@ -250,6 +255,7 @@ void VulkanWindowContext::createBuffers(VkFormat format) { |
// set up initial image layouts and create surfaces |
fImageLayouts = new VkImageLayout[fImageCount]; |
+ fRenderTargets = new sk_sp<GrRenderTarget>[fImageCount]; |
fSurfaces = new sk_sp<SkSurface>[fImageCount]; |
for (uint32_t i = 0; i < fImageCount; ++i) { |
fImageLayouts[i] = VK_IMAGE_LAYOUT_UNDEFINED; |
@@ -269,10 +275,9 @@ void VulkanWindowContext::createBuffers(VkFormat format) { |
desc.fSampleCnt = 0; |
desc.fStencilBits = 0; |
desc.fRenderTargetHandle = (GrBackendObject) &info; |
- SkSurfaceProps props(GrPixelConfigIsSRGB(fPixelConfig) |
- ? SkSurfaceProps::kGammaCorrect_Flag : 0, |
- kUnknown_SkPixelGeometry); |
- fSurfaces[i] = SkSurface::MakeFromBackendRenderTarget(fContext, desc, &props); |
+ fRenderTargets[i].reset(fContext->textureProvider()->wrapBackendRenderTarget(desc)); |
+ |
+ fSurfaces[i] = this->createRenderSurface(fRenderTargets[i], 24); |
} |
// create the command pool for the command buffers |
@@ -361,8 +366,11 @@ void VulkanWindowContext::destroyBuffers() { |
delete[] fBackbuffers; |
fBackbuffers = nullptr; |
+ // Does this actually free the surfaces? |
delete[] fSurfaces; |
fSurfaces = nullptr; |
+ delete[] fRenderTargets; |
+ fRenderTargets = nullptr; |
delete[] fImageLayouts; |
fImageLayouts = nullptr; |
delete[] fImages; |
@@ -398,7 +406,8 @@ void VulkanWindowContext::destroyContext() { |
fSurface = VK_NULL_HANDLE; |
} |
- delete fContext; |
+ fContext->abandonContext(); |
+ fContext->unref(); |
fBackendContext.reset(nullptr); |
} |
@@ -419,7 +428,7 @@ VulkanWindowContext::BackbufferInfo* VulkanWindowContext::getAvailableBackbuffer |
return backbuffer; |
} |
-SkSurface* VulkanWindowContext::getBackbufferSurface() { |
+sk_sp<SkSurface> VulkanWindowContext::getBackbufferSurface() { |
BackbufferInfo* backbuffer = this->getAvailableBackbuffer(); |
SkASSERT(backbuffer); |
@@ -510,14 +519,16 @@ SkSurface* VulkanWindowContext::getBackbufferSurface() { |
QueueSubmit(fBackendContext->fQueue, 1, &submitInfo, |
backbuffer->fUsageFences[0])); |
- return fSurfaces[backbuffer->fImageIndex].get(); |
+ return sk_ref_sp(fSurfaces[backbuffer->fImageIndex].get()); |
} |
- |
void VulkanWindowContext::swapBuffers() { |
BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex; |
+ this->presentRenderSurface(fSurfaces[backbuffer->fImageIndex], |
+ fRenderTargets[backbuffer->fImageIndex], 24); |
+ |
VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; |