aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2016-08-31 11:03:50 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-31 11:03:50 -0700
commit580fa596c9648c3dafb7980d3304c82d4502c719 (patch)
treed67c73ab234218ed8843344cbac1e6d46544d597
parentf57372daf0562a187c24d427366ac6d0cb980c9b (diff)
In VulkanWindowContext add check to see if ganesh changed the layout of the image.
-rw-r--r--src/gpu/vk/GrVkRenderTarget.cpp6
-rw-r--r--tools/viewer/sk_app/VulkanWindowContext.cpp26
2 files changed, 24 insertions, 8 deletions
diff --git a/src/gpu/vk/GrVkRenderTarget.cpp b/src/gpu/vk/GrVkRenderTarget.cpp
index 6d95ba0d00..d6895d25fc 100644
--- a/src/gpu/vk/GrVkRenderTarget.cpp
+++ b/src/gpu/vk/GrVkRenderTarget.cpp
@@ -353,8 +353,10 @@ void GrVkRenderTarget::onAbandon() {
GrBackendObject GrVkRenderTarget::getRenderTargetHandle() const {
- // Currently just passing back the pointer to the main Image::Resource as the handle
- return (GrBackendObject)&fResource;
+ // If the render target is multisampled, we currently return the ImageInfo for the resolved
+ // image. If we only wrap the msaa target (currently not implemented) we should return a handle
+ // to that instead.
+ return (GrBackendObject)&fInfo;
}
const GrVkResource* GrVkRenderTarget::stencilImageResource() const {
diff --git a/tools/viewer/sk_app/VulkanWindowContext.cpp b/tools/viewer/sk_app/VulkanWindowContext.cpp
index 7f35e30f48..589a7b8c1c 100644
--- a/tools/viewer/sk_app/VulkanWindowContext.cpp
+++ b/tools/viewer/sk_app/VulkanWindowContext.cpp
@@ -12,6 +12,7 @@
#include "VulkanWindowContext.h"
#include "vk/GrVkInterface.h"
+#include "vk/GrVkMemory.h"
#include "vk/GrVkUtil.h"
#include "vk/GrVkTypes.h"
@@ -262,7 +263,7 @@ void VulkanWindowContext::createBuffers(VkFormat format) {
GrVkImageInfo info;
info.fImage = fImages[i];
info.fAlloc = { VK_NULL_HANDLE, 0, 0 };
- info.fImageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ info.fImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
info.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
info.fFormat = format;
info.fLevelCount = 1;
@@ -459,6 +460,7 @@ sk_sp<SkSurface> VulkanWindowContext::getBackbufferSurface() {
// set up layout transfer from initial to color attachment
VkImageLayout layout = fImageLayouts[backbuffer->fImageIndex];
+ SkASSERT(VK_IMAGE_LAYOUT_UNDEFINED == layout || VK_IMAGE_LAYOUT_PRESENT_SRC_KHR == layout);
VkPipelineStageFlags srcStageMask = (VK_IMAGE_LAYOUT_UNDEFINED == layout) ?
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT :
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
@@ -514,17 +516,29 @@ sk_sp<SkSurface> VulkanWindowContext::getBackbufferSurface() {
QueueSubmit(fBackendContext->fQueue, 1, &submitInfo,
backbuffer->fUsageFences[0]));
- return sk_ref_sp(fSurfaces[backbuffer->fImageIndex].get());
+ GrVkImageInfo* imageInfo;
+ SkSurface* surface = fSurfaces[backbuffer->fImageIndex].get();
+ surface->getRenderTargetHandle((GrBackendObject*)&imageInfo,
+ SkSurface::kFlushRead_BackendHandleAccess);
+ imageInfo->updateImageLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+
+ return sk_ref_sp(surface);
}
void VulkanWindowContext::swapBuffers() {
BackbufferInfo* backbuffer = fBackbuffers + fCurrentBackbufferIndex;
-
- VkImageLayout layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ GrVkImageInfo* imageInfo;
+ SkSurface* surface = fSurfaces[backbuffer->fImageIndex].get();
+ surface->getRenderTargetHandle((GrBackendObject*)&imageInfo,
+ SkSurface::kFlushRead_BackendHandleAccess);
+ // Check to make sure we never change the actually wrapped image
+ SkASSERT(imageInfo->fImage == fImages[backbuffer->fImageIndex]);
+
+ VkImageLayout layout = imageInfo->fImageLayout;
+ VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout);
VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
- VkAccessFlags srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
VkAccessFlags dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
VkImageMemoryBarrier imageMemoryBarrier = {