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