GrVkGpuCommandBuffer.cpp revision 0bbc3713de2f51c17fad935ccfd87dd68c7062ef
1066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel/* 2066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* Copyright 2016 Google Inc. 3066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* 4066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* Use of this source code is governed by a BSD-style license that can be 5066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel* found in the LICENSE file. 6066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel*/ 7066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 8066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrVkGpuCommandBuffer.h" 9066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 10066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrVkCommandBuffer.h" 11066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrVkGpu.h" 12066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrVkRenderPass.h" 13066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrVkRenderTarget.h" 14066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel#include "GrVkResourceProvider.h" 15066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 16066df7ca911b65d416783f3bec6f4f1662948ad5egdanielvoid get_vk_load_store_ops(GrGpuCommandBuffer::LoadAndStoreOp op, 17066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel VkAttachmentLoadOp* loadOp, VkAttachmentStoreOp* storeOp) { 18066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel switch (op) { 19066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel case GrGpuCommandBuffer::kLoadAndStore_LoadAndStoreOp: 20066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; 21066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *storeOp = VK_ATTACHMENT_STORE_OP_STORE; 22066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel break; 23066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel case GrGpuCommandBuffer::kLoadAndDiscard_LoadAndStoreOp: 24066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; 25066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; 26066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel break; 27066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel case GrGpuCommandBuffer::kClearAndStore_LoadAndStoreOp: 28066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; 29066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *storeOp = VK_ATTACHMENT_STORE_OP_STORE; 30066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel break; 31066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel case GrGpuCommandBuffer::kClearAndDiscard_LoadAndStoreOp: 32066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; 33066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; 34066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel break; 35066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel case GrGpuCommandBuffer::kDiscardAndStore_LoadAndStoreOp: 36066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; 37066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *storeOp = VK_ATTACHMENT_STORE_OP_STORE; 38066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel break; 39066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel case GrGpuCommandBuffer::kDiscardAndDiscard_LoadAndStoreOp: 40066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; 41066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel *storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; 42066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel break; 430bbc3713de2f51c17fad935ccfd87dd68c7062efbrianosman default: 440bbc3713de2f51c17fad935ccfd87dd68c7062efbrianosman SK_ABORT("Invalid LoadAndStoreOp"); 450bbc3713de2f51c17fad935ccfd87dd68c7062efbrianosman *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; 460bbc3713de2f51c17fad935ccfd87dd68c7062efbrianosman *storeOp = VK_ATTACHMENT_STORE_OP_STORE; 470bbc3713de2f51c17fad935ccfd87dd68c7062efbrianosman break; 48066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel } 49066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel} 50066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 51066df7ca911b65d416783f3bec6f4f1662948ad5egdanielGrVkGpuCommandBuffer::GrVkGpuCommandBuffer(GrVkGpu* gpu, 52066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel const GrVkRenderTarget& target, 53066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel LoadAndStoreOp colorOp, GrColor colorClear, 54066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel LoadAndStoreOp stencilOp, GrColor stencilClear) 55066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel : fGpu(gpu) { 56066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel VkAttachmentLoadOp vkLoadOp; 57066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel VkAttachmentStoreOp vkStoreOp; 58066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 59066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel get_vk_load_store_ops(colorOp, &vkLoadOp, &vkStoreOp); 60066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel GrVkRenderPass::LoadStoreOps vkColorOps(vkLoadOp, vkStoreOp); 61066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 62066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel get_vk_load_store_ops(stencilOp, &vkLoadOp, &vkStoreOp); 63066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel GrVkRenderPass::LoadStoreOps vkStencilOps(vkLoadOp, vkStoreOp); 64066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 65066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel GrVkRenderPass::LoadStoreOps vkResolveOps(VK_ATTACHMENT_LOAD_OP_LOAD, 66066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel VK_ATTACHMENT_STORE_OP_STORE); 67066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 68066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel const GrVkResourceProvider::CompatibleRPHandle& rpHandle = target.compatibleRenderPassHandle(); 69066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel if (rpHandle.isValid()) { 70066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle, 71066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel vkColorOps, 72066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel vkResolveOps, 73066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel vkStencilOps); 74066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel } else { 75066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fRenderPass = fGpu->resourceProvider().findRenderPass(target, 76066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel vkColorOps, 77066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel vkResolveOps, 78066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel vkStencilOps); 79066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel } 80066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 81066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fCommandBuffer = GrVkSecondaryCommandBuffer::Create(gpu, gpu->cmdPool(), fRenderPass); 82066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fCommandBuffer->begin(gpu, target.framebuffer()); 83066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel} 84066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 85066df7ca911b65d416783f3bec6f4f1662948ad5egdanielGrVkGpuCommandBuffer::~GrVkGpuCommandBuffer() { 86066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fCommandBuffer->unref(fGpu); 87066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fRenderPass->unref(fGpu); 88066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel} 89066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 90066df7ca911b65d416783f3bec6f4f1662948ad5egdanielvoid GrVkGpuCommandBuffer::end() { 91066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fCommandBuffer->end(fGpu); 92066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel} 93066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 94066df7ca911b65d416783f3bec6f4f1662948ad5egdanielvoid GrVkGpuCommandBuffer::submit() { 95066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel fGpu->submitSecondaryCommandBuffer(fCommandBuffer); 96066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel} 97066df7ca911b65d416783f3bec6f4f1662948ad5egdaniel 98