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