1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot* Copyright 2016 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot*
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot* Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot* found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot*/
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkGpuCommandBuffer.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrFixedClip.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrMesh.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrOpFlushState.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrPipeline.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrRenderTargetPriv.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTexturePriv.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkCommandBuffer.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkGpu.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkPipeline.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkRenderPass.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkRenderTarget.h"
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkResourceProvider.h"
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkTexture.h"
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRect.h"
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuTextureCommandBuffer::copy(GrSurface* src, GrSurfaceOrigin srcOrigin,
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                       const SkIRect& srcRect, const SkIPoint& dstPoint) {
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCopies.emplace_back(src, srcOrigin, srcRect, dstPoint);
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuTextureCommandBuffer::insertEventMarker(const char* msg) {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // TODO: does Vulkan have a correlate?
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuTextureCommandBuffer::submit() {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < fCopies.count(); ++i) {
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        CopyInfo& copyInfo = fCopies[i];
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fGpu->copySurface(fTexture, fOrigin, copyInfo.fSrc, copyInfo.fSrcOrigin, copyInfo.fSrcRect,
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          copyInfo.fDstPoint);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrVkGpuTextureCommandBuffer::~GrVkGpuTextureCommandBuffer() {}
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////////
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid get_vk_load_store_ops(GrLoadOp loadOpIn, GrStoreOp storeOpIn,
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           VkAttachmentLoadOp* loadOp, VkAttachmentStoreOp* storeOp) {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    switch (loadOpIn) {
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case GrLoadOp::kLoad:
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case GrLoadOp::kClear:
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case GrLoadOp::kDiscard:
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        default:
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ABORT("Invalid LoadOp");
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    switch (storeOpIn) {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case GrStoreOp::kStore:
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *storeOp = VK_ATTACHMENT_STORE_OP_STORE;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case GrStoreOp::kDiscard:
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        default:
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SK_ABORT("Invalid StoreOp");
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *storeOp = VK_ATTACHMENT_STORE_OP_STORE;
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrVkGpuRTCommandBuffer::GrVkGpuRTCommandBuffer(GrVkGpu* gpu,
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               GrRenderTarget* rt, GrSurfaceOrigin origin,
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               const LoadAndStoreInfo& colorInfo,
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               const StencilLoadAndStoreInfo& stencilInfo)
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        : INHERITED(rt, origin)
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fGpu(gpu)
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fClearColor(GrColor4f::FromGrColor(colorInfo.fClearColor))
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        , fLastPipelineState(nullptr) {
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    get_vk_load_store_ops(colorInfo.fLoadOp, colorInfo.fStoreOp,
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          &fVkColorLoadOp, &fVkColorStoreOp);
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    get_vk_load_store_ops(stencilInfo.fLoadOp, stencilInfo.fStoreOp,
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          &fVkStencilLoadOp, &fVkStencilStoreOp);
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCurrentCmdInfo = -1;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->init();
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::init() {
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderPass::LoadStoreOps vkColorOps(fVkColorLoadOp, fVkColorStoreOp);
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderPass::LoadStoreOps vkStencilOps(fVkStencilLoadOp, fVkStencilStoreOp);
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos.push_back();
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(fCommandBufferInfos.count() == 1);
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCurrentCmdInfo = 0;
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkResourceProvider::CompatibleRPHandle& rpHandle = vkRT->compatibleRenderPassHandle();
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (rpHandle.isValid()) {
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkColorOps,
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkStencilOps);
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkColorOps,
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkStencilOps);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fColorClearValue.color.float32[0] = fClearColor.fRGBA[0];
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fColorClearValue.color.float32[1] = fClearColor.fRGBA[1];
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fColorClearValue.color.float32[2] = fClearColor.fRGBA[2];
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fColorClearValue.color.float32[3] = fClearColor.fRGBA[3];
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (VK_ATTACHMENT_LOAD_OP_CLEAR == fVkColorLoadOp) {
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds = SkRect::MakeWH(vkRT->width(), vkRT->height());
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.setEmpty();
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (VK_ATTACHMENT_LOAD_OP_CLEAR == fVkColorLoadOp) {
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fLoadStoreState = LoadStoreState::kStartsWithClear;
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else if (VK_ATTACHMENT_LOAD_OP_LOAD == fVkColorLoadOp &&
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot               VK_ATTACHMENT_STORE_OP_STORE == fVkColorStoreOp) {
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fLoadStoreState = LoadStoreState::kLoadAndStore;
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else if (VK_ATTACHMENT_LOAD_OP_DONT_CARE == fVkColorLoadOp) {
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fLoadStoreState = LoadStoreState::kStartsWithDiscard;
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fCommandBuffers.push_back(fGpu->resourceProvider().findOrCreateSecondaryCommandBuffer());
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->begin(fGpu, vkRT->framebuffer(), cbInfo.fRenderPass);
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrVkGpuRTCommandBuffer::~GrVkGpuRTCommandBuffer() {
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < fCommandBufferInfos.count(); ++i) {
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        CommandBufferInfo& cbInfo = fCommandBufferInfos[i];
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int j = 0; j < cbInfo.fCommandBuffers.count(); ++j) {
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fCommandBuffers[j]->unref(fGpu);
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fRenderPass->unref(fGpu);
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrGpu* GrVkGpuRTCommandBuffer::gpu() { return fGpu; }
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::end() {
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (fCurrentCmdInfo >= 0) {
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fCommandBufferInfos[fCurrentCmdInfo].currentCmdBuf()->end(fGpu);
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::submit() {
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!fRenderTarget) {
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkImage* targetImage = vkRT->msaaImage() ? vkRT->msaaImage() : vkRT;
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrStencilAttachment* stencil = fRenderTarget->renderTargetPriv().getStencilAttachment();
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < fCommandBufferInfos.count(); ++i) {
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        CommandBufferInfo& cbInfo = fCommandBufferInfos[i];
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int j = 0; j < cbInfo.fPreDrawUploads.count(); ++j) {
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            InlineUploadInfo& iuInfo = cbInfo.fPreDrawUploads[j];
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            iuInfo.fFlushState->doUpload(iuInfo.fUpload);
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int j = 0; j < cbInfo.fPreCopies.count(); ++j) {
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            CopyInfo& copyInfo = cbInfo.fPreCopies[j];
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fGpu->copySurface(fRenderTarget, fOrigin, copyInfo.fSrc, copyInfo.fSrcOrigin,
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                              copyInfo.fSrcRect, copyInfo.fDstPoint, copyInfo.fShouldDiscardDst);
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Make sure we do the following layout changes after all copies, uploads, or any other pre
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // work is done since we may change the layouts in the pre-work. Also since the draws will
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // be submitted in different render passes, we need to guard againts write and write issues.
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Change layout of our render target so it can be used as the color attachment.
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        targetImage->setImageLayout(fGpu,
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    false);
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // If we are using a stencil attachment we also need to update its layout
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (stencil) {
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            vkStencil->setImageLayout(fGpu,
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                      false);
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // If we have any sampled images set their layout now.
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int j = 0; j < cbInfo.fSampledImages.count(); ++j) {
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fSampledImages[j]->setImageLayout(fGpu,
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     VK_ACCESS_SHADER_READ_BIT,
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                     false);
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // TODO: We can't add this optimization yet since many things create a scratch texture which
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // adds the discard immediately, but then don't draw to it right away. This causes the
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // discard to be ignored and we get yelled at for loading uninitialized data. However, once
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // MDB lands, the discard will get reordered with the rest of the draw commands and we can
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // re-enable this.
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if 0
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (cbInfo.fIsEmpty && cbInfo.fLoadStoreState != kStartsWithClear) {
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // We have sumbitted no actual draw commands to the command buffer and we are not using
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // the render pass to do a clear so there is no need to submit anything.
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            continue;
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (cbInfo.fBounds.intersect(0, 0,
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     SkIntToScalar(fRenderTarget->width()),
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     SkIntToScalar(fRenderTarget->height()))) {
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkIRect iBounds;
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fBounds.roundOut(&iBounds);
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fGpu->submitSecondaryCommandBuffer(cbInfo.fCommandBuffers, cbInfo.fRenderPass,
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               &cbInfo.fColorClearValue, vkRT, fOrigin, iBounds);
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::discard() {
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (cbInfo.fIsEmpty) {
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Change the render pass to do a don't-care load for both color & stencil
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_DONT_CARE,
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                VK_ATTACHMENT_STORE_OP_STORE);
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_DONT_CARE,
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                  VK_ATTACHMENT_STORE_OP_STORE);
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrVkRenderPass* oldRP = cbInfo.fRenderPass;
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            vkRT->compatibleRenderPassHandle();
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (rpHandle.isValid()) {
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkColorOps,
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkStencilOps);
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkColorOps,
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkStencilOps);
258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(cbInfo.fRenderPass->isCompatible(*oldRP));
261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        oldRP->unref(fGpu);
262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.join(fRenderTarget->getBoundsRect());
263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fLoadStoreState = LoadStoreState::kStartsWithDiscard;
264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // If we are going to discard the whole render target then the results of any copies we did
265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // immediately before to the target won't matter, so just drop them.
266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fPreCopies.reset();
267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::insertEventMarker(const char* msg) {
271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // TODO: does Vulkan have a correlate?
272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::onClearStencilClip(const GrFixedClip& clip, bool insideStencilMask) {
275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(!clip.hasWindowRectangles());
276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrStencilAttachment* sb = fRenderTarget->renderTargetPriv().getStencilAttachment();
280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // this should only be called internally when we know we have a
281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // stencil buffer.
282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(sb);
283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int stencilBitCount = sb->bits();
284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // The contract with the callers does not guarantee that we preserve all bits in the stencil
286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // during this clear. Thus we will clear the entire stencil to the desired value.
287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    VkClearDepthStencilValue vkStencilColor;
289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    memset(&vkStencilColor, 0, sizeof(VkClearDepthStencilValue));
290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (insideStencilMask) {
291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkStencilColor.stencil = (1 << (stencilBitCount - 1));
292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkStencilColor.stencil = 0;
294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    VkClearRect clearRect;
297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Flip rect if necessary
298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkIRect vkRect;
299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!clip.scissorEnabled()) {
300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkRect.setXYWH(0, 0, fRenderTarget->width(), fRenderTarget->height());
301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else if (kBottomLeft_GrSurfaceOrigin != fOrigin) {
302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkRect = clip.scissorRect();
303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkIRect& scissor = clip.scissorRect();
305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkRect.setLTRB(scissor.fLeft, fRenderTarget->height() - scissor.fBottom,
306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                       scissor.fRight, fRenderTarget->height() - scissor.fTop);
307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop };
310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height() };
311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.baseArrayLayer = 0;
313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.layerCount = 1;
314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t stencilIndex;
316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAssertResult(cbInfo.fRenderPass->stencilAttachmentIndex(&stencilIndex));
317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    VkClearAttachment attachment;
319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    attachment.colorAttachment = 0; // this value shouldn't matter
321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    attachment.clearValue.depthStencil = vkStencilColor;
322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->clearAttachments(fGpu, 1, &attachment, 1, &clearRect);
324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fIsEmpty = false;
325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Update command buffer bounds
327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!clip.scissorEnabled()) {
328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.join(fRenderTarget->getBoundsRect());
329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.join(SkRect::Make(clip.scissorRect()));
331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::onClear(const GrFixedClip& clip, GrColor color) {
335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // parent class should never let us get here with no RT
338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(!clip.hasWindowRectangles());
339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    VkClearColorValue vkColor;
343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrColorToRGBAFloat(color, vkColor.float32);
344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (cbInfo.fIsEmpty && !clip.scissorEnabled()) {
346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Change the render pass to do a clear load
347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_CLEAR,
348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                VK_ATTACHMENT_STORE_OP_STORE);
349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Preserve the stencil buffer's load & store settings
350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderPass::LoadStoreOps vkStencilOps(fVkStencilLoadOp, fVkStencilStoreOp);
351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrVkRenderPass* oldRP = cbInfo.fRenderPass;
353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            vkRT->compatibleRenderPassHandle();
356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (rpHandle.isValid()) {
357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkColorOps,
359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkStencilOps);
360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkColorOps,
363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkStencilOps);
364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(cbInfo.fRenderPass->isCompatible(*oldRP));
367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        oldRP->unref(fGpu);
368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrColorToRGBAFloat(color, cbInfo.fColorClearValue.color.float32);
370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fLoadStoreState = LoadStoreState::kStartsWithClear;
371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // If we are going to clear the whole render target then the results of any copies we did
372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // immediately before to the target won't matter, so just drop them.
373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fPreCopies.reset();
374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Update command buffer bounds
376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.join(fRenderTarget->getBoundsRect());
377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // We always do a sub rect clear with clearAttachments since we are inside a render pass
381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    VkClearRect clearRect;
382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Flip rect if necessary
383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkIRect vkRect;
384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!clip.scissorEnabled()) {
385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkRect.setXYWH(0, 0, fRenderTarget->width(), fRenderTarget->height());
386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else if (kBottomLeft_GrSurfaceOrigin != fOrigin) {
387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkRect = clip.scissorRect();
388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkIRect& scissor = clip.scissorRect();
390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        vkRect.setLTRB(scissor.fLeft, fRenderTarget->height() - scissor.fBottom,
391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                       scissor.fRight, fRenderTarget->height() - scissor.fTop);
392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop };
394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height() };
395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.baseArrayLayer = 0;
396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    clearRect.layerCount = 1;
397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t colorIndex;
399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAssertResult(cbInfo.fRenderPass->colorAttachmentIndex(&colorIndex));
400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    VkClearAttachment attachment;
402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    attachment.colorAttachment = colorIndex;
404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    attachment.clearValue.color = vkColor;
405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->clearAttachments(fGpu, 1, &attachment, 1, &clearRect);
407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fIsEmpty = false;
408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Update command buffer bounds
410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!clip.scissorEnabled()) {
411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.join(fRenderTarget->getBoundsRect());
412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fBounds.join(SkRect::Make(clip.scissorRect()));
414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return;
416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////////
419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::addAdditionalCommandBuffer() {
421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->end(fGpu);
425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fCommandBuffers.push_back(fGpu->resourceProvider().findOrCreateSecondaryCommandBuffer());
426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->begin(fGpu, vkRT->framebuffer(), cbInfo.fRenderPass);
427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::addAdditionalRenderPass() {
430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCommandBufferInfos[fCurrentCmdInfo].currentCmdBuf()->end(fGpu);
433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos.push_back();
435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCurrentCmdInfo++;
436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_LOAD,
438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            VK_ATTACHMENT_STORE_OP_STORE);
439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_LOAD,
440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                              VK_ATTACHMENT_STORE_OP_STORE);
441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            vkRT->compatibleRenderPassHandle();
444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (rpHandle.isValid()) {
445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkColorOps,
447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkStencilOps);
448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkColorOps,
451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     vkStencilOps);
452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fLoadStoreState = LoadStoreState::kLoadAndStore;
454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fCommandBuffers.push_back(fGpu->resourceProvider().findOrCreateSecondaryCommandBuffer());
456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // It shouldn't matter what we set the clear color to here since we will assume loading of the
457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // attachment.
458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    memset(&cbInfo.fColorClearValue, 0, sizeof(VkClearValue));
459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fBounds.setEmpty();
460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->begin(fGpu, vkRT->framebuffer(), cbInfo.fRenderPass);
462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::inlineUpload(GrOpFlushState* state,
465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          GrDeferredTextureUploadFn& upload) {
466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!fCommandBufferInfos[fCurrentCmdInfo].fIsEmpty) {
467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->addAdditionalRenderPass();
468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCommandBufferInfos[fCurrentCmdInfo].fPreDrawUploads.emplace_back(state, upload);
470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
472fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
473fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  const SkIPoint& dstPoint) {
474fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
475fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!cbInfo.fIsEmpty || LoadStoreState::kStartsWithClear == cbInfo.fLoadStoreState) {
476fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->addAdditionalRenderPass();
477fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
478fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
479fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fCommandBufferInfos[fCurrentCmdInfo].fPreCopies.emplace_back(
480fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            src, srcOrigin, srcRect, dstPoint,
481fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            LoadStoreState::kStartsWithDiscard == cbInfo.fLoadStoreState);
482fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
483fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (LoadStoreState::kLoadAndStore != cbInfo.fLoadStoreState) {
484fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Change the render pass to do a load and store so we don't lose the results of our copy
485fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_LOAD,
486fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                VK_ATTACHMENT_STORE_OP_STORE);
487fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_LOAD,
488fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                  VK_ATTACHMENT_STORE_OP_STORE);
489fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
490fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrVkRenderPass* oldRP = cbInfo.fRenderPass;
491fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
492fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(fRenderTarget);
493fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
494fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                vkRT->compatibleRenderPassHandle();
495fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (rpHandle.isValid()) {
496fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
497fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkColorOps,
498fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkStencilOps);
499fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
500fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            cbInfo.fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
501fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkColorOps,
502fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                         vkStencilOps);
503fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
504fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(cbInfo.fRenderPass->isCompatible(*oldRP));
505fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        oldRP->unref(fGpu);
506fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
507fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fLoadStoreState = LoadStoreState::kLoadAndStore;
508fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
509fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
510fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
511fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
512fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////////
513fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
514fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::bindGeometry(const GrPrimitiveProcessor& primProc,
515fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          const GrBuffer* indexBuffer,
516fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          const GrBuffer* vertexBuffer,
517fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                          const GrBuffer* instanceBuffer) {
518fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkSecondaryCommandBuffer* currCmdBuf = fCommandBufferInfos[fCurrentCmdInfo].currentCmdBuf();
519fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // There is no need to put any memory barriers to make sure host writes have finished here.
520fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // When a command buffer is submitted to a queue, there is an implicit memory barrier that
521fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // occurs for all host writes. Additionally, BufferMemoryBarriers are not allowed inside of
522fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // an active RenderPass.
523fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
524fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Here our vertex and instance inputs need to match the same 0-based bindings they were
525fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // assigned in GrVkPipeline. That is, vertex first (if any) followed by instance.
526fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t binding = 0;
527fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
528fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (primProc.hasVertexAttribs()) {
529fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(vertexBuffer);
530fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(!vertexBuffer->isCPUBacked());
531fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(!vertexBuffer->isMapped());
532fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
533fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        currCmdBuf->bindInputBuffer(fGpu, binding++,
534fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    static_cast<const GrVkVertexBuffer*>(vertexBuffer));
535fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
536fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
537fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (primProc.hasInstanceAttribs()) {
538fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(instanceBuffer);
539fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(!instanceBuffer->isCPUBacked());
540fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(!instanceBuffer->isMapped());
541fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
542fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        currCmdBuf->bindInputBuffer(fGpu, binding++,
543fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    static_cast<const GrVkVertexBuffer*>(instanceBuffer));
544fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
545fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
546fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (indexBuffer) {
547fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(indexBuffer);
548fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(!indexBuffer->isMapped());
549fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(!indexBuffer->isCPUBacked());
550fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
551fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        currCmdBuf->bindIndexBuffer(fGpu, static_cast<const GrVkIndexBuffer*>(indexBuffer));
552fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
553fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
554fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
555fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGrVkPipelineState* GrVkGpuRTCommandBuffer::prepareDrawState(const GrPipeline& pipeline,
556fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            const GrPrimitiveProcessor& primProc,
557fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            GrPrimitiveType primitiveType,
558fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                            bool hasDynamicState) {
559fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
560fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(cbInfo.fRenderPass);
561fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
562fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkPipelineState* pipelineState =
563fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fGpu->resourceProvider().findOrCreateCompatiblePipelineState(pipeline,
564fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     primProc,
565fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     primitiveType,
566fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                                     *cbInfo.fRenderPass);
567fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!pipelineState) {
568fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return pipelineState;
569fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
570fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
571fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!cbInfo.fIsEmpty &&
572fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fLastPipelineState && fLastPipelineState != pipelineState &&
573fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fGpu->vkCaps().newCBOnPipelineChange()) {
574fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->addAdditionalCommandBuffer();
575fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
576fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fLastPipelineState = pipelineState;
577fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
578fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    pipelineState->setData(fGpu, primProc, pipeline);
579fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
580fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    pipelineState->bind(fGpu, cbInfo.currentCmdBuf());
581fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
582fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrRenderTarget* rt = pipeline.renderTarget();
583fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
584fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!pipeline.getScissorState().enabled()) {
585fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkPipeline::SetDynamicScissorRectState(fGpu, cbInfo.currentCmdBuf(),
586fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 rt, pipeline.proxy()->origin(),
587fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 SkIRect::MakeWH(rt->width(), rt->height()));
588fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else if (!hasDynamicState) {
589fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkPipeline::SetDynamicScissorRectState(fGpu, cbInfo.currentCmdBuf(),
590fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 rt, pipeline.proxy()->origin(),
591fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                 pipeline.getScissorState().rect());
592fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
593fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkPipeline::SetDynamicViewportState(fGpu, cbInfo.currentCmdBuf(), rt);
594fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkPipeline::SetDynamicBlendConstantState(fGpu, cbInfo.currentCmdBuf(), rt->config(),
595fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               pipeline.getXferProcessor());
596fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
597fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return pipelineState;
598fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
599fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
600fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void prepare_sampled_images(const GrResourceIOProcessor& processor,
601fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                   SkTArray<GrVkImage*>* sampledImages,
602fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                   GrVkGpu* gpu) {
603fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < processor.numTextureSamplers(); ++i) {
604fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrResourceIOProcessor::TextureSampler& sampler = processor.textureSampler(i);
605fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkTexture* vkTexture = static_cast<GrVkTexture*>(sampler.peekTexture());
606fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
607fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // We may need to resolve the texture first if it is also a render target
608fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrVkRenderTarget* texRT = static_cast<GrVkRenderTarget*>(vkTexture->asRenderTarget());
609fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (texRT) {
610fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            gpu->onResolveRenderTarget(texRT, sampler.proxy()->origin());
611fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
612fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
613fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // Check if we need to regenerate any mip maps
614fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (GrSamplerState::Filter::kMipMap == sampler.samplerState().filter()) {
615fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (vkTexture->texturePriv().mipMapsAreDirty()) {
616fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                gpu->generateMipmap(vkTexture, sampler.proxy()->origin());
617fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                vkTexture->texturePriv().markMipMapsClean();
618fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
619fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
620fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        sampledImages->push_back(vkTexture);
621fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
622fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
623fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
624fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::onDraw(const GrPipeline& pipeline,
625fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    const GrPrimitiveProcessor& primProc,
626fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    const GrMesh meshes[],
627fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    const GrPipeline::DynamicState dynamicStates[],
628fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    int meshCount,
629fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    const SkRect& bounds) {
630fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(pipeline.renderTarget() == fRenderTarget);
631fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
632fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!meshCount) {
633fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
634fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
635fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
636fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
637fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
638fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    prepare_sampled_images(primProc, &cbInfo.fSampledImages, fGpu);
639fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrFragmentProcessor::Iter iter(pipeline);
640fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    while (const GrFragmentProcessor* fp = iter.next()) {
641fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        prepare_sampled_images(*fp, &cbInfo.fSampledImages, fGpu);
642fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
643fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (GrTexture* dstTexture = pipeline.peekDstTexture()) {
644fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        cbInfo.fSampledImages.push_back(static_cast<GrVkTexture*>(dstTexture));
645fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
646fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
647fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrPrimitiveType primitiveType = meshes[0].primitiveType();
648fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkPipelineState* pipelineState = this->prepareDrawState(pipeline,
649fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              primProc,
650fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              primitiveType,
651fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                              SkToBool(dynamicStates));
652fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (!pipelineState) {
653fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
654fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
655fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
656fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < meshCount; ++i) {
657fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrMesh& mesh = meshes[i];
658fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (mesh.primitiveType() != primitiveType) {
659fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Technically we don't have to call this here (since there is a safety check in
660fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // pipelineState:setData but this will allow for quicker freeing of resources if the
661fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // pipelineState sits in a cache for a while.
662fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            pipelineState->freeTempResources(fGpu);
663fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkDEBUGCODE(pipelineState = nullptr);
664fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            primitiveType = mesh.primitiveType();
665fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            pipelineState = this->prepareDrawState(pipeline,
666fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   primProc,
667fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   primitiveType,
668fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                   SkToBool(dynamicStates));
669fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (!pipelineState) {
670fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return;
671fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
672fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
673fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
674fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (dynamicStates) {
675fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (pipeline.getScissorState().enabled()) {
676fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                GrVkPipeline::SetDynamicScissorRectState(fGpu, cbInfo.currentCmdBuf(),
677fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                         fRenderTarget, pipeline.proxy()->origin(),
678fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                         dynamicStates[i].fScissorRect);
679fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
680fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
681fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
682fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(pipelineState);
683fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        mesh.sendToGpu(primProc, this);
684fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
685fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
686fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fBounds.join(bounds);
687fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.fIsEmpty = false;
688fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
689fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Technically we don't have to call this here (since there is a safety check in
690fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // pipelineState:setData but this will allow for quicker freeing of resources if the
691fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // pipelineState sits in a cache for a while.
692fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    pipelineState->freeTempResources(fGpu);
693fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
694fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
695fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::sendInstancedMeshToGpu(const GrPrimitiveProcessor& primProc,
696fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    GrPrimitiveType,
697fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const GrBuffer* vertexBuffer,
698fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    int vertexCount,
699fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    int baseVertex,
700fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const GrBuffer* instanceBuffer,
701fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    int instanceCount,
702fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    int baseInstance) {
703fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
704fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->bindGeometry(primProc, nullptr, vertexBuffer, instanceBuffer);
705fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->draw(fGpu, vertexCount, instanceCount, baseVertex, baseInstance);
706fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fGpu->stats()->incNumDraws();
707fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
708fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
709fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid GrVkGpuRTCommandBuffer::sendIndexedInstancedMeshToGpu(const GrPrimitiveProcessor& primProc,
710fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           GrPrimitiveType,
711fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           const GrBuffer* indexBuffer,
712fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           int indexCount,
713fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           int baseIndex,
714fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           const GrBuffer* vertexBuffer,
715fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           int baseVertex,
716fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           const GrBuffer* instanceBuffer,
717fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           int instanceCount,
718fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                           int baseInstance) {
719fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CommandBufferInfo& cbInfo = fCommandBufferInfos[fCurrentCmdInfo];
720fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->bindGeometry(primProc, indexBuffer, vertexBuffer, instanceBuffer);
721fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    cbInfo.currentCmdBuf()->drawIndexed(fGpu, indexCount, instanceCount,
722fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                        baseIndex, baseVertex, baseInstance);
723fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fGpu->stats()->incNumDraws();
724fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
725fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
726