blob: 6ecd6ba581022585fd4c61962a18d5f028d220b5 [file] [log] [blame]
egdanielbc9b2962016-09-27 08:00:53 -07001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6*/
7
8#include "GrVkCopyManager.h"
9
Greg Daniel2b417842018-03-19 11:17:13 -040010#include "GrRenderTargetPriv.h"
Brian Salomon2bbdcc42017-09-07 12:36:34 -040011#include "GrSamplerState.h"
Brian Salomon94efbf52016-11-29 13:43:05 -050012#include "GrShaderCaps.h"
13#include "GrSurface.h"
egdanielbc9b2962016-09-27 08:00:53 -070014#include "GrTexturePriv.h"
15#include "GrVkCommandBuffer.h"
Ethan Nicholas8e265a72018-12-12 16:22:40 -050016#include "GrVkCommandPool.h"
egdanielbc9b2962016-09-27 08:00:53 -070017#include "GrVkCopyPipeline.h"
18#include "GrVkDescriptorSet.h"
19#include "GrVkGpu.h"
20#include "GrVkImageView.h"
Greg Daniel7d918fd2018-06-19 15:22:01 -040021#include "GrVkPipelineLayout.h"
egdanielbc9b2962016-09-27 08:00:53 -070022#include "GrVkRenderTarget.h"
23#include "GrVkResourceProvider.h"
24#include "GrVkSampler.h"
25#include "GrVkTexture.h"
26#include "GrVkUniformBuffer.h"
27#include "GrVkVertexBuffer.h"
28#include "SkPoint.h"
29#include "SkRect.h"
Ryan Macnak38a10ad2017-07-10 10:36:34 -070030#include "SkTraceEvent.h"
egdanielbc9b2962016-09-27 08:00:53 -070031
Greg Danielf9f27232017-01-06 14:40:08 -050032GrVkCopyManager::GrVkCopyManager()
33 : fVertShaderModule(VK_NULL_HANDLE)
34 , fFragShaderModule(VK_NULL_HANDLE)
Greg Daniel7d918fd2018-06-19 15:22:01 -040035 , fPipelineLayout(nullptr) {}
Greg Danielf9f27232017-01-06 14:40:08 -050036
37GrVkCopyManager::~GrVkCopyManager() {}
38
egdanielbc9b2962016-09-27 08:00:53 -070039bool GrVkCopyManager::createCopyProgram(GrVkGpu* gpu) {
Brian Osman39c08ac2017-07-26 09:36:09 -040040 TRACE_EVENT0("skia", TRACE_FUNC);
Ryan Macnak38a10ad2017-07-10 10:36:34 -070041
Brian Salomon1edc5b92016-11-29 13:43:46 -050042 const GrShaderCaps* shaderCaps = gpu->caps()->shaderCaps();
43 const char* version = shaderCaps->versionDeclString();
egdanielbc9b2962016-09-27 08:00:53 -070044 SkString vertShaderText(version);
45 vertShaderText.append(
46 "#extension GL_ARB_separate_shader_objects : enable\n"
47 "#extension GL_ARB_shading_language_420pack : enable\n"
48
49 "layout(set = 0, binding = 0) uniform vertexUniformBuffer {"
Ethan Nicholasf7b88202017-09-18 14:10:39 -040050 "half4 uPosXform;"
51 "half4 uTexCoordXform;"
egdanielbc9b2962016-09-27 08:00:53 -070052 "};"
Ethan Nicholas8aa45692017-09-20 11:24:15 -040053 "layout(location = 0) in float2 inPosition;"
Ethan Nicholasf7b88202017-09-18 14:10:39 -040054 "layout(location = 1) out half2 vTexCoord;"
egdanielbc9b2962016-09-27 08:00:53 -070055
56 "// Copy Program VS\n"
57 "void main() {"
Ethan Nicholase1f55022019-02-05 17:17:40 -050058 "vTexCoord = half2(inPosition * uTexCoordXform.xy + uTexCoordXform.zw);"
Ethan Nicholasbed683a2017-09-26 14:23:59 -040059 "sk_Position.xy = inPosition * uPosXform.xy + uPosXform.zw;"
60 "sk_Position.zw = half2(0, 1);"
egdanielbc9b2962016-09-27 08:00:53 -070061 "}"
62 );
63
64 SkString fragShaderText(version);
65 fragShaderText.append(
66 "#extension GL_ARB_separate_shader_objects : enable\n"
67 "#extension GL_ARB_shading_language_420pack : enable\n"
68
Ethan Nicholasf7b88202017-09-18 14:10:39 -040069 "layout(set = 1, binding = 0) uniform sampler2D uTextureSampler;"
70 "layout(location = 1) in half2 vTexCoord;"
egdanielbc9b2962016-09-27 08:00:53 -070071
72 "// Copy Program FS\n"
73 "void main() {"
Greg Daniele4641602018-03-16 08:52:32 -040074 "sk_FragColor = texture(uTextureSampler, vTexCoord);"
egdanielbc9b2962016-09-27 08:00:53 -070075 "}"
76 );
77
Ethan Nicholas941e7e22016-12-12 15:33:30 -050078 SkSL::Program::Settings settings;
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050079 SkSL::String spirv;
Ethan Nicholas941e7e22016-12-12 15:33:30 -050080 SkSL::Program::Inputs inputs;
81 if (!GrCompileVkShaderModule(gpu, vertShaderText.c_str(), VK_SHADER_STAGE_VERTEX_BIT,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050082 &fVertShaderModule, &fShaderStageInfo[0], settings, &spirv,
83 &inputs)) {
egdanielbc9b2962016-09-27 08:00:53 -070084 this->destroyResources(gpu);
85 return false;
86 }
Ethan Nicholas941e7e22016-12-12 15:33:30 -050087 SkASSERT(inputs.isEmpty());
egdanielbc9b2962016-09-27 08:00:53 -070088
Ethan Nicholas941e7e22016-12-12 15:33:30 -050089 if (!GrCompileVkShaderModule(gpu, fragShaderText.c_str(), VK_SHADER_STAGE_FRAGMENT_BIT,
Ethan Nicholas92e01cf2018-12-19 13:12:10 -050090 &fFragShaderModule, &fShaderStageInfo[1], settings, &spirv,
91 &inputs)) {
egdanielbc9b2962016-09-27 08:00:53 -070092 this->destroyResources(gpu);
93 return false;
94 }
Ethan Nicholas941e7e22016-12-12 15:33:30 -050095 SkASSERT(inputs.isEmpty());
egdanielbc9b2962016-09-27 08:00:53 -070096
97 VkDescriptorSetLayout dsLayout[2];
98
99 GrVkResourceProvider& resourceProvider = gpu->resourceProvider();
100
101 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
102
103 uint32_t samplerVisibility = kFragment_GrShaderFlag;
104 SkTArray<uint32_t> visibilityArray(&samplerVisibility, 1);
105
Greg Daniela7543782017-05-02 14:01:43 -0400106 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
107 visibilityArray, &fSamplerDSHandle);
egdanielbc9b2962016-09-27 08:00:53 -0700108 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
109 resourceProvider.getSamplerDSLayout(fSamplerDSHandle);
110
111 // Create the VkPipelineLayout
112 VkPipelineLayoutCreateInfo layoutCreateInfo;
113 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
114 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
115 layoutCreateInfo.pNext = 0;
116 layoutCreateInfo.flags = 0;
117 layoutCreateInfo.setLayoutCount = 2;
118 layoutCreateInfo.pSetLayouts = dsLayout;
119 layoutCreateInfo.pushConstantRangeCount = 0;
120 layoutCreateInfo.pPushConstantRanges = nullptr;
121
Greg Daniel7d918fd2018-06-19 15:22:01 -0400122 VkPipelineLayout pipelineLayout;
egdanielbc9b2962016-09-27 08:00:53 -0700123 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreatePipelineLayout(gpu->device(),
124 &layoutCreateInfo,
125 nullptr,
Greg Daniel7d918fd2018-06-19 15:22:01 -0400126 &pipelineLayout));
egdanielbc9b2962016-09-27 08:00:53 -0700127 if (err) {
128 this->destroyResources(gpu);
129 return false;
130 }
131
Greg Daniel7d918fd2018-06-19 15:22:01 -0400132 fPipelineLayout = new GrVkPipelineLayout(pipelineLayout);
133
egdanielbc9b2962016-09-27 08:00:53 -0700134 static const float vdata[] = {
135 0, 0,
136 0, 1,
137 1, 0,
138 1, 1
139 };
Brian Salomon12d22642019-01-29 14:38:50 -0500140 fVertexBuffer = GrVkVertexBuffer::Make(gpu, sizeof(vdata), false);
egdanielbc9b2962016-09-27 08:00:53 -0700141 SkASSERT(fVertexBuffer.get());
142 fVertexBuffer->updateData(vdata, sizeof(vdata));
143
Ethan Nicholas5af9ea32017-07-28 15:19:46 -0400144 // We use 2 float4's for uniforms
Greg Danielf9f27232017-01-06 14:40:08 -0500145 fUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, 8 * sizeof(float)));
146 SkASSERT(fUniformBuffer.get());
egdanielbc9b2962016-09-27 08:00:53 -0700147
148 return true;
149}
150
151bool GrVkCopyManager::copySurfaceAsDraw(GrVkGpu* gpu,
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400152 GrSurface* dst, GrSurfaceOrigin dstOrigin,
153 GrSurface* src, GrSurfaceOrigin srcOrigin,
Greg Daniel55fa6472018-03-16 16:13:10 -0400154 const SkIRect& srcRect, const SkIPoint& dstPoint,
155 bool canDiscardOutsideDstRect) {
Greg Daniel6c9f1012017-05-11 09:20:59 -0400156 // None of our copy methods can handle a swizzle. TODO: Make copySurfaceAsDraw handle the
157 // swizzle.
158 if (gpu->caps()->shaderCaps()->configOutputSwizzle(src->config()) !=
159 gpu->caps()->shaderCaps()->configOutputSwizzle(dst->config())) {
160 return false;
161 }
162
egdanielbc9b2962016-09-27 08:00:53 -0700163 GrVkRenderTarget* rt = static_cast<GrVkRenderTarget*>(dst->asRenderTarget());
164 if (!rt) {
165 return false;
166 }
167
168 GrVkTexture* srcTex = static_cast<GrVkTexture*>(src->asTexture());
169 if (!srcTex) {
170 return false;
171 }
172
173 if (VK_NULL_HANDLE == fVertShaderModule) {
174 SkASSERT(VK_NULL_HANDLE == fFragShaderModule &&
Greg Daniel7d918fd2018-06-19 15:22:01 -0400175 nullptr == fPipelineLayout &&
egdanielbc9b2962016-09-27 08:00:53 -0700176 nullptr == fVertexBuffer.get() &&
Greg Danielf9f27232017-01-06 14:40:08 -0500177 nullptr == fUniformBuffer.get());
egdanielbc9b2962016-09-27 08:00:53 -0700178 if (!this->createCopyProgram(gpu)) {
179 SkDebugf("Failed to create copy program.\n");
180 return false;
181 }
182 }
Greg Daniel7d918fd2018-06-19 15:22:01 -0400183 SkASSERT(fPipelineLayout);
egdanielbc9b2962016-09-27 08:00:53 -0700184
185 GrVkResourceProvider& resourceProv = gpu->resourceProvider();
186
187 GrVkCopyPipeline* pipeline = resourceProv.findOrCreateCopyPipeline(rt,
188 fShaderStageInfo,
Greg Daniel7d918fd2018-06-19 15:22:01 -0400189 fPipelineLayout->layout());
egdanielbc9b2962016-09-27 08:00:53 -0700190 if (!pipeline) {
191 return false;
192 }
193
194 // UPDATE UNIFORM DESCRIPTOR SET
195 int w = srcRect.width();
196 int h = srcRect.height();
197
198 // dst rect edges in NDC (-1 to 1)
199 int dw = dst->width();
200 int dh = dst->height();
201 float dx0 = 2.f * dstPoint.fX / dw - 1.f;
202 float dx1 = 2.f * (dstPoint.fX + w) / dw - 1.f;
203 float dy0 = 2.f * dstPoint.fY / dh - 1.f;
204 float dy1 = 2.f * (dstPoint.fY + h) / dh - 1.f;
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400205 if (kBottomLeft_GrSurfaceOrigin == dstOrigin) {
egdanielbc9b2962016-09-27 08:00:53 -0700206 dy0 = -dy0;
207 dy1 = -dy1;
208 }
209
210
211 float sx0 = (float)srcRect.fLeft;
212 float sx1 = (float)(srcRect.fLeft + w);
213 float sy0 = (float)srcRect.fTop;
214 float sy1 = (float)(srcRect.fTop + h);
215 int sh = src->height();
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400216 if (kBottomLeft_GrSurfaceOrigin == srcOrigin) {
egdanielbc9b2962016-09-27 08:00:53 -0700217 sy0 = sh - sy0;
218 sy1 = sh - sy1;
219 }
220 // src rect edges in normalized texture space (0 to 1).
221 int sw = src->width();
222 sx0 /= sw;
223 sx1 /= sw;
224 sy0 /= sh;
225 sy1 /= sh;
226
227 float uniData[] = { dx1 - dx0, dy1 - dy0, dx0, dy0, // posXform
228 sx1 - sx0, sy1 - sy0, sx0, sy0 }; // texCoordXform
229
230 fUniformBuffer->updateData(gpu, uniData, sizeof(uniData), nullptr);
231
232 const GrVkDescriptorSet* uniformDS = resourceProv.getUniformDescriptorSet();
233 SkASSERT(uniformDS);
234
235 VkDescriptorBufferInfo uniBufferInfo;
236 uniBufferInfo.buffer = fUniformBuffer->buffer();
237 uniBufferInfo.offset = fUniformBuffer->offset();
238 uniBufferInfo.range = fUniformBuffer->size();
239
240 VkWriteDescriptorSet descriptorWrites;
241 descriptorWrites.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
242 descriptorWrites.pNext = nullptr;
243 descriptorWrites.dstSet = uniformDS->descriptorSet();
Greg Daniel18f96022017-05-04 15:09:03 -0400244 descriptorWrites.dstBinding = GrVkUniformHandler::kGeometryBinding;
egdanielbc9b2962016-09-27 08:00:53 -0700245 descriptorWrites.dstArrayElement = 0;
246 descriptorWrites.descriptorCount = 1;
247 descriptorWrites.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
248 descriptorWrites.pImageInfo = nullptr;
249 descriptorWrites.pBufferInfo = &uniBufferInfo;
250 descriptorWrites.pTexelBufferView = nullptr;
251
252 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
253 1,
254 &descriptorWrites,
255 0, nullptr));
256
257 // UPDATE SAMPLER DESCRIPTOR SET
258 const GrVkDescriptorSet* samplerDS =
259 gpu->resourceProvider().getSamplerDescriptorSet(fSamplerDSHandle);
260
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400261 GrSamplerState samplerState = GrSamplerState::ClampNearest();
egdanielbc9b2962016-09-27 08:00:53 -0700262
Greg Daniel7e000222018-12-03 10:08:21 -0500263 GrVkSampler* sampler = resourceProv.findOrCreateCompatibleSampler(
264 samplerState, GrVkYcbcrConversionInfo());
egdanielbc9b2962016-09-27 08:00:53 -0700265
266 VkDescriptorImageInfo imageInfo;
267 memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
268 imageInfo.sampler = sampler->sampler();
Brian Osman2b23c4b2018-06-01 12:25:08 -0400269 imageInfo.imageView = srcTex->textureView()->imageView();
egdanielbc9b2962016-09-27 08:00:53 -0700270 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
271
272 VkWriteDescriptorSet writeInfo;
273 memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
274 writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
275 writeInfo.pNext = nullptr;
276 writeInfo.dstSet = samplerDS->descriptorSet();
277 writeInfo.dstBinding = 0;
278 writeInfo.dstArrayElement = 0;
279 writeInfo.descriptorCount = 1;
280 writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
281 writeInfo.pImageInfo = &imageInfo;
282 writeInfo.pBufferInfo = nullptr;
283 writeInfo.pTexelBufferView = nullptr;
284
285 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
286 1,
287 &writeInfo,
288 0, nullptr));
289
290 VkDescriptorSet vkDescSets[] = { uniformDS->descriptorSet(), samplerDS->descriptorSet() };
291
292 GrVkRenderTarget* texRT = static_cast<GrVkRenderTarget*>(srcTex->asRenderTarget());
293 if (texRT) {
Greg Daniel0a77f432018-12-06 11:23:32 -0500294 gpu->resolveRenderTargetNoFlush(texRT);
egdanielbc9b2962016-09-27 08:00:53 -0700295 }
296
egdanielbc9b2962016-09-27 08:00:53 -0700297 // TODO: Make tighter bounds and then adjust bounds for origin and granularity if we see
298 // any perf issues with using the whole bounds
299 SkIRect bounds = SkIRect::MakeWH(rt->width(), rt->height());
300
Greg Danielf7828d02018-10-09 12:01:32 -0400301 // Change layouts of rt and texture. We aren't blending so we don't need color attachment read
302 // access for blending.
egdanielbc9b2962016-09-27 08:00:53 -0700303 GrVkImage* targetImage = rt->msaaImage() ? rt->msaaImage() : rt;
Greg Danielf7828d02018-10-09 12:01:32 -0400304 VkAccessFlags dstAccessFlags = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
305 if (!canDiscardOutsideDstRect) {
306 // We need to load the color attachment so need to be able to read it.
307 dstAccessFlags |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
308 }
egdanielbc9b2962016-09-27 08:00:53 -0700309 targetImage->setImageLayout(gpu,
310 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Greg Danielf7828d02018-10-09 12:01:32 -0400311 dstAccessFlags,
312 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
egdanielbc9b2962016-09-27 08:00:53 -0700313 false);
314
315 srcTex->setImageLayout(gpu,
316 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
317 VK_ACCESS_SHADER_READ_BIT,
Greg Danielf7828d02018-10-09 12:01:32 -0400318 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
egdanielbc9b2962016-09-27 08:00:53 -0700319 false);
320
Greg Daniel2b417842018-03-19 11:17:13 -0400321 GrStencilAttachment* stencil = rt->renderTargetPriv().getStencilAttachment();
322 if (stencil) {
323 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
Greg Danielf7828d02018-10-09 12:01:32 -0400324 // We aren't actually using the stencil but we still load and store it so we need
325 // appropriate barriers.
326 // TODO: Once we refactor surface and how we conntect stencil to RTs, we should not even
327 // have the stencil on this render pass if possible.
Greg Daniel2b417842018-03-19 11:17:13 -0400328 vkStencil->setImageLayout(gpu,
329 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Greg Danielf7828d02018-10-09 12:01:32 -0400330 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
331 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
332 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
Greg Daniel2b417842018-03-19 11:17:13 -0400333 false);
334 }
335
Greg Daniel55fa6472018-03-16 16:13:10 -0400336 VkAttachmentLoadOp loadOp = canDiscardOutsideDstRect ? VK_ATTACHMENT_LOAD_OP_DONT_CARE
337 : VK_ATTACHMENT_LOAD_OP_LOAD;
338 GrVkRenderPass::LoadStoreOps vkColorOps(loadOp, VK_ATTACHMENT_STORE_OP_STORE);
Greg Danielac95c5f2017-01-30 16:33:57 -0500339 GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_LOAD,
egdanielbc9b2962016-09-27 08:00:53 -0700340 VK_ATTACHMENT_STORE_OP_STORE);
egdanielbc9b2962016-09-27 08:00:53 -0700341 const GrVkRenderPass* renderPass;
Greg Daniel55fa6472018-03-16 16:13:10 -0400342 const GrVkResourceProvider::CompatibleRPHandle& rpHandle = rt->compatibleRenderPassHandle();
egdanielbc9b2962016-09-27 08:00:53 -0700343 if (rpHandle.isValid()) {
344 renderPass = gpu->resourceProvider().findRenderPass(rpHandle,
345 vkColorOps,
egdanielbc9b2962016-09-27 08:00:53 -0700346 vkStencilOps);
347 } else {
348 renderPass = gpu->resourceProvider().findRenderPass(*rt,
349 vkColorOps,
egdanielbc9b2962016-09-27 08:00:53 -0700350 vkStencilOps);
351 }
352
353 SkASSERT(renderPass->isCompatible(*rt->simpleRenderPass()));
354
Greg Daniel57614482018-12-07 09:16:31 -0500355 GrVkPrimaryCommandBuffer* cmdBuffer = gpu->currentCommandBuffer();
356 cmdBuffer->beginRenderPass(gpu, renderPass, nullptr, *rt, bounds, true);
egdanielbc9b2962016-09-27 08:00:53 -0700357
Ethan Nicholas8e265a72018-12-12 16:22:40 -0500358 GrVkSecondaryCommandBuffer* secondary = gpu->cmdPool()->findOrCreateSecondaryCommandBuffer(gpu);
Greg Daniel57614482018-12-07 09:16:31 -0500359 if (!secondary) {
360 return false;
361 }
362 secondary->begin(gpu, rt->framebuffer(), renderPass);
363
364 secondary->bindPipeline(gpu, pipeline);
egdanielbc9b2962016-09-27 08:00:53 -0700365
366 // Uniform DescriptorSet, Sampler DescriptorSet, and vertex shader uniformBuffer
367 SkSTArray<3, const GrVkRecycledResource*> descriptorRecycledResources;
368 descriptorRecycledResources.push_back(uniformDS);
369 descriptorRecycledResources.push_back(samplerDS);
370 descriptorRecycledResources.push_back(fUniformBuffer->resource());
371
372 // One sampler, texture view, and texture
373 SkSTArray<3, const GrVkResource*> descriptorResources;
374 descriptorResources.push_back(sampler);
Brian Osman2b23c4b2018-06-01 12:25:08 -0400375 descriptorResources.push_back(srcTex->textureView());
egdanielbc9b2962016-09-27 08:00:53 -0700376 descriptorResources.push_back(srcTex->resource());
377
Greg Daniel57614482018-12-07 09:16:31 -0500378 secondary->bindDescriptorSets(gpu,
egdanielbc9b2962016-09-27 08:00:53 -0700379 descriptorRecycledResources,
380 descriptorResources,
381 fPipelineLayout,
382 0,
383 2,
384 vkDescSets,
385 0,
386 nullptr);
387
388 // Set Dynamic viewport and stencil
389 // We always use one viewport the size of the RT
390 VkViewport viewport;
391 viewport.x = 0.0f;
392 viewport.y = 0.0f;
393 viewport.width = SkIntToScalar(rt->width());
394 viewport.height = SkIntToScalar(rt->height());
395 viewport.minDepth = 0.0f;
396 viewport.maxDepth = 1.0f;
Greg Daniel57614482018-12-07 09:16:31 -0500397 secondary->setViewport(gpu, 0, 1, &viewport);
egdanielbc9b2962016-09-27 08:00:53 -0700398
399 // We assume the scissor is not enabled so just set it to the whole RT
400 VkRect2D scissor;
401 scissor.extent.width = rt->width();
402 scissor.extent.height = rt->height();
403 scissor.offset.x = 0;
404 scissor.offset.y = 0;
Greg Daniel57614482018-12-07 09:16:31 -0500405 secondary->setScissor(gpu, 0, 1, &scissor);
egdanielbc9b2962016-09-27 08:00:53 -0700406
Greg Daniel57614482018-12-07 09:16:31 -0500407 secondary->bindInputBuffer(gpu, 0, fVertexBuffer.get());
408 secondary->draw(gpu, 4, 1, 0, 0);
409 secondary->end(gpu);
410 cmdBuffer->executeCommands(gpu, secondary);
egdanielbc9b2962016-09-27 08:00:53 -0700411 cmdBuffer->endRenderPass(gpu);
Greg Daniel57614482018-12-07 09:16:31 -0500412 secondary->unref(gpu);
egdanielbc9b2962016-09-27 08:00:53 -0700413
414 // Release all temp resources which should now be reffed by the cmd buffer
415 pipeline->unref(gpu);
416 uniformDS->unref(gpu);
417 samplerDS->unref(gpu);
418 sampler->unref(gpu);
419 renderPass->unref(gpu);
420
421 return true;
422}
423
424void GrVkCopyManager::destroyResources(GrVkGpu* gpu) {
425 if (VK_NULL_HANDLE != fVertShaderModule) {
426 GR_VK_CALL(gpu->vkInterface(), DestroyShaderModule(gpu->device(), fVertShaderModule,
427 nullptr));
428 fVertShaderModule = VK_NULL_HANDLE;
429 }
430
431 if (VK_NULL_HANDLE != fFragShaderModule) {
432 GR_VK_CALL(gpu->vkInterface(), DestroyShaderModule(gpu->device(), fFragShaderModule,
433 nullptr));
434 fFragShaderModule = VK_NULL_HANDLE;
435 }
436
Greg Daniel7d918fd2018-06-19 15:22:01 -0400437 if (fPipelineLayout) {
438 fPipelineLayout->unref(gpu);
439 fPipelineLayout = nullptr;
egdanielbc9b2962016-09-27 08:00:53 -0700440 }
441
442 if (fUniformBuffer) {
443 fUniformBuffer->release(gpu);
Greg Danielf9f27232017-01-06 14:40:08 -0500444 fUniformBuffer.reset();
egdanielbc9b2962016-09-27 08:00:53 -0700445 }
446}
447
448void GrVkCopyManager::abandonResources() {
449 fVertShaderModule = VK_NULL_HANDLE;
450 fFragShaderModule = VK_NULL_HANDLE;
Greg Daniel7d918fd2018-06-19 15:22:01 -0400451 if (fPipelineLayout) {
452 fPipelineLayout->unrefAndAbandon();
453 fPipelineLayout = nullptr;
454 }
egdanielbc9b2962016-09-27 08:00:53 -0700455
456 if (fUniformBuffer) {
457 fUniformBuffer->abandon();
Greg Danielf9f27232017-01-06 14:40:08 -0500458 fUniformBuffer.reset();
egdanielbc9b2962016-09-27 08:00:53 -0700459 }
460}