blob: 4abb2ee9e0aed166b80e8cb7eb3034a6d4beb302 [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"
16#include "GrVkCopyPipeline.h"
17#include "GrVkDescriptorSet.h"
18#include "GrVkGpu.h"
19#include "GrVkImageView.h"
Greg Daniel7d918fd2018-06-19 15:22:01 -040020#include "GrVkPipelineLayout.h"
egdanielbc9b2962016-09-27 08:00:53 -070021#include "GrVkRenderTarget.h"
22#include "GrVkResourceProvider.h"
23#include "GrVkSampler.h"
24#include "GrVkTexture.h"
25#include "GrVkUniformBuffer.h"
26#include "GrVkVertexBuffer.h"
27#include "SkPoint.h"
28#include "SkRect.h"
Ryan Macnak38a10ad2017-07-10 10:36:34 -070029#include "SkTraceEvent.h"
egdanielbc9b2962016-09-27 08:00:53 -070030
Greg Danielf9f27232017-01-06 14:40:08 -050031GrVkCopyManager::GrVkCopyManager()
32 : fVertShaderModule(VK_NULL_HANDLE)
33 , fFragShaderModule(VK_NULL_HANDLE)
Greg Daniel7d918fd2018-06-19 15:22:01 -040034 , fPipelineLayout(nullptr) {}
Greg Danielf9f27232017-01-06 14:40:08 -050035
36GrVkCopyManager::~GrVkCopyManager() {}
37
egdanielbc9b2962016-09-27 08:00:53 -070038bool GrVkCopyManager::createCopyProgram(GrVkGpu* gpu) {
Brian Osman39c08ac2017-07-26 09:36:09 -040039 TRACE_EVENT0("skia", TRACE_FUNC);
Ryan Macnak38a10ad2017-07-10 10:36:34 -070040
Brian Salomon1edc5b92016-11-29 13:43:46 -050041 const GrShaderCaps* shaderCaps = gpu->caps()->shaderCaps();
42 const char* version = shaderCaps->versionDeclString();
egdanielbc9b2962016-09-27 08:00:53 -070043 SkString vertShaderText(version);
44 vertShaderText.append(
45 "#extension GL_ARB_separate_shader_objects : enable\n"
46 "#extension GL_ARB_shading_language_420pack : enable\n"
47
48 "layout(set = 0, binding = 0) uniform vertexUniformBuffer {"
Ethan Nicholasf7b88202017-09-18 14:10:39 -040049 "half4 uPosXform;"
50 "half4 uTexCoordXform;"
egdanielbc9b2962016-09-27 08:00:53 -070051 "};"
Ethan Nicholas8aa45692017-09-20 11:24:15 -040052 "layout(location = 0) in float2 inPosition;"
Ethan Nicholasf7b88202017-09-18 14:10:39 -040053 "layout(location = 1) out half2 vTexCoord;"
egdanielbc9b2962016-09-27 08:00:53 -070054
55 "// Copy Program VS\n"
56 "void main() {"
57 "vTexCoord = inPosition * uTexCoordXform.xy + uTexCoordXform.zw;"
Ethan Nicholasbed683a2017-09-26 14:23:59 -040058 "sk_Position.xy = inPosition * uPosXform.xy + uPosXform.zw;"
59 "sk_Position.zw = half2(0, 1);"
egdanielbc9b2962016-09-27 08:00:53 -070060 "}"
61 );
62
63 SkString fragShaderText(version);
64 fragShaderText.append(
65 "#extension GL_ARB_separate_shader_objects : enable\n"
66 "#extension GL_ARB_shading_language_420pack : enable\n"
67
Ethan Nicholasf7b88202017-09-18 14:10:39 -040068 "layout(set = 1, binding = 0) uniform sampler2D uTextureSampler;"
69 "layout(location = 1) in half2 vTexCoord;"
egdanielbc9b2962016-09-27 08:00:53 -070070
71 "// Copy Program FS\n"
72 "void main() {"
Greg Daniele4641602018-03-16 08:52:32 -040073 "sk_FragColor = texture(uTextureSampler, vTexCoord);"
egdanielbc9b2962016-09-27 08:00:53 -070074 "}"
75 );
76
Ethan Nicholas941e7e22016-12-12 15:33:30 -050077 SkSL::Program::Settings settings;
78 SkSL::Program::Inputs inputs;
79 if (!GrCompileVkShaderModule(gpu, vertShaderText.c_str(), VK_SHADER_STAGE_VERTEX_BIT,
80 &fVertShaderModule, &fShaderStageInfo[0], settings, &inputs)) {
egdanielbc9b2962016-09-27 08:00:53 -070081 this->destroyResources(gpu);
82 return false;
83 }
Ethan Nicholas941e7e22016-12-12 15:33:30 -050084 SkASSERT(inputs.isEmpty());
egdanielbc9b2962016-09-27 08:00:53 -070085
Ethan Nicholas941e7e22016-12-12 15:33:30 -050086 if (!GrCompileVkShaderModule(gpu, fragShaderText.c_str(), VK_SHADER_STAGE_FRAGMENT_BIT,
87 &fFragShaderModule, &fShaderStageInfo[1], settings, &inputs)) {
egdanielbc9b2962016-09-27 08:00:53 -070088 this->destroyResources(gpu);
89 return false;
90 }
Ethan Nicholas941e7e22016-12-12 15:33:30 -050091 SkASSERT(inputs.isEmpty());
egdanielbc9b2962016-09-27 08:00:53 -070092
93 VkDescriptorSetLayout dsLayout[2];
94
95 GrVkResourceProvider& resourceProvider = gpu->resourceProvider();
96
97 dsLayout[GrVkUniformHandler::kUniformBufferDescSet] = resourceProvider.getUniformDSLayout();
98
99 uint32_t samplerVisibility = kFragment_GrShaderFlag;
100 SkTArray<uint32_t> visibilityArray(&samplerVisibility, 1);
101
Greg Daniela7543782017-05-02 14:01:43 -0400102 resourceProvider.getSamplerDescriptorSetHandle(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
103 visibilityArray, &fSamplerDSHandle);
egdanielbc9b2962016-09-27 08:00:53 -0700104 dsLayout[GrVkUniformHandler::kSamplerDescSet] =
105 resourceProvider.getSamplerDSLayout(fSamplerDSHandle);
106
107 // Create the VkPipelineLayout
108 VkPipelineLayoutCreateInfo layoutCreateInfo;
109 memset(&layoutCreateInfo, 0, sizeof(VkPipelineLayoutCreateFlags));
110 layoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
111 layoutCreateInfo.pNext = 0;
112 layoutCreateInfo.flags = 0;
113 layoutCreateInfo.setLayoutCount = 2;
114 layoutCreateInfo.pSetLayouts = dsLayout;
115 layoutCreateInfo.pushConstantRangeCount = 0;
116 layoutCreateInfo.pPushConstantRanges = nullptr;
117
Greg Daniel7d918fd2018-06-19 15:22:01 -0400118 VkPipelineLayout pipelineLayout;
egdanielbc9b2962016-09-27 08:00:53 -0700119 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreatePipelineLayout(gpu->device(),
120 &layoutCreateInfo,
121 nullptr,
Greg Daniel7d918fd2018-06-19 15:22:01 -0400122 &pipelineLayout));
egdanielbc9b2962016-09-27 08:00:53 -0700123 if (err) {
124 this->destroyResources(gpu);
125 return false;
126 }
127
Greg Daniel7d918fd2018-06-19 15:22:01 -0400128 fPipelineLayout = new GrVkPipelineLayout(pipelineLayout);
129
egdanielbc9b2962016-09-27 08:00:53 -0700130 static const float vdata[] = {
131 0, 0,
132 0, 1,
133 1, 0,
134 1, 1
135 };
136 fVertexBuffer.reset(GrVkVertexBuffer::Create(gpu, sizeof(vdata), false));
137 SkASSERT(fVertexBuffer.get());
138 fVertexBuffer->updateData(vdata, sizeof(vdata));
139
Ethan Nicholas5af9ea32017-07-28 15:19:46 -0400140 // We use 2 float4's for uniforms
Greg Danielf9f27232017-01-06 14:40:08 -0500141 fUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, 8 * sizeof(float)));
142 SkASSERT(fUniformBuffer.get());
egdanielbc9b2962016-09-27 08:00:53 -0700143
144 return true;
145}
146
147bool GrVkCopyManager::copySurfaceAsDraw(GrVkGpu* gpu,
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400148 GrSurface* dst, GrSurfaceOrigin dstOrigin,
149 GrSurface* src, GrSurfaceOrigin srcOrigin,
Greg Daniel55fa6472018-03-16 16:13:10 -0400150 const SkIRect& srcRect, const SkIPoint& dstPoint,
151 bool canDiscardOutsideDstRect) {
Greg Daniel6c9f1012017-05-11 09:20:59 -0400152 // None of our copy methods can handle a swizzle. TODO: Make copySurfaceAsDraw handle the
153 // swizzle.
154 if (gpu->caps()->shaderCaps()->configOutputSwizzle(src->config()) !=
155 gpu->caps()->shaderCaps()->configOutputSwizzle(dst->config())) {
156 return false;
157 }
158
Greg Daniele3cd6912017-05-17 11:15:55 -0400159 if (gpu->vkCaps().newCBOnPipelineChange()) {
160 // We bind a new pipeline here for the copy so we must start a new command buffer.
Greg Daniel51316782017-08-02 15:10:09 +0000161 gpu->finishFlush(0, nullptr);
Greg Daniele3cd6912017-05-17 11:15:55 -0400162 }
163
egdanielbc9b2962016-09-27 08:00:53 -0700164 GrVkRenderTarget* rt = static_cast<GrVkRenderTarget*>(dst->asRenderTarget());
165 if (!rt) {
166 return false;
167 }
168
169 GrVkTexture* srcTex = static_cast<GrVkTexture*>(src->asTexture());
170 if (!srcTex) {
171 return false;
172 }
173
174 if (VK_NULL_HANDLE == fVertShaderModule) {
175 SkASSERT(VK_NULL_HANDLE == fFragShaderModule &&
Greg Daniel7d918fd2018-06-19 15:22:01 -0400176 nullptr == fPipelineLayout &&
egdanielbc9b2962016-09-27 08:00:53 -0700177 nullptr == fVertexBuffer.get() &&
Greg Danielf9f27232017-01-06 14:40:08 -0500178 nullptr == fUniformBuffer.get());
egdanielbc9b2962016-09-27 08:00:53 -0700179 if (!this->createCopyProgram(gpu)) {
180 SkDebugf("Failed to create copy program.\n");
181 return false;
182 }
183 }
Greg Daniel7d918fd2018-06-19 15:22:01 -0400184 SkASSERT(fPipelineLayout);
egdanielbc9b2962016-09-27 08:00:53 -0700185
186 GrVkResourceProvider& resourceProv = gpu->resourceProvider();
187
188 GrVkCopyPipeline* pipeline = resourceProv.findOrCreateCopyPipeline(rt,
189 fShaderStageInfo,
Greg Daniel7d918fd2018-06-19 15:22:01 -0400190 fPipelineLayout->layout());
egdanielbc9b2962016-09-27 08:00:53 -0700191 if (!pipeline) {
192 return false;
193 }
194
195 // UPDATE UNIFORM DESCRIPTOR SET
196 int w = srcRect.width();
197 int h = srcRect.height();
198
199 // dst rect edges in NDC (-1 to 1)
200 int dw = dst->width();
201 int dh = dst->height();
202 float dx0 = 2.f * dstPoint.fX / dw - 1.f;
203 float dx1 = 2.f * (dstPoint.fX + w) / dw - 1.f;
204 float dy0 = 2.f * dstPoint.fY / dh - 1.f;
205 float dy1 = 2.f * (dstPoint.fY + h) / dh - 1.f;
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400206 if (kBottomLeft_GrSurfaceOrigin == dstOrigin) {
egdanielbc9b2962016-09-27 08:00:53 -0700207 dy0 = -dy0;
208 dy1 = -dy1;
209 }
210
211
212 float sx0 = (float)srcRect.fLeft;
213 float sx1 = (float)(srcRect.fLeft + w);
214 float sy0 = (float)srcRect.fTop;
215 float sy1 = (float)(srcRect.fTop + h);
216 int sh = src->height();
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400217 if (kBottomLeft_GrSurfaceOrigin == srcOrigin) {
egdanielbc9b2962016-09-27 08:00:53 -0700218 sy0 = sh - sy0;
219 sy1 = sh - sy1;
220 }
221 // src rect edges in normalized texture space (0 to 1).
222 int sw = src->width();
223 sx0 /= sw;
224 sx1 /= sw;
225 sy0 /= sh;
226 sy1 /= sh;
227
228 float uniData[] = { dx1 - dx0, dy1 - dy0, dx0, dy0, // posXform
229 sx1 - sx0, sy1 - sy0, sx0, sy0 }; // texCoordXform
230
231 fUniformBuffer->updateData(gpu, uniData, sizeof(uniData), nullptr);
232
233 const GrVkDescriptorSet* uniformDS = resourceProv.getUniformDescriptorSet();
234 SkASSERT(uniformDS);
235
236 VkDescriptorBufferInfo uniBufferInfo;
237 uniBufferInfo.buffer = fUniformBuffer->buffer();
238 uniBufferInfo.offset = fUniformBuffer->offset();
239 uniBufferInfo.range = fUniformBuffer->size();
240
241 VkWriteDescriptorSet descriptorWrites;
242 descriptorWrites.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
243 descriptorWrites.pNext = nullptr;
244 descriptorWrites.dstSet = uniformDS->descriptorSet();
Greg Daniel18f96022017-05-04 15:09:03 -0400245 descriptorWrites.dstBinding = GrVkUniformHandler::kGeometryBinding;
egdanielbc9b2962016-09-27 08:00:53 -0700246 descriptorWrites.dstArrayElement = 0;
247 descriptorWrites.descriptorCount = 1;
248 descriptorWrites.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
249 descriptorWrites.pImageInfo = nullptr;
250 descriptorWrites.pBufferInfo = &uniBufferInfo;
251 descriptorWrites.pTexelBufferView = nullptr;
252
253 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
254 1,
255 &descriptorWrites,
256 0, nullptr));
257
258 // UPDATE SAMPLER DESCRIPTOR SET
259 const GrVkDescriptorSet* samplerDS =
260 gpu->resourceProvider().getSamplerDescriptorSet(fSamplerDSHandle);
261
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400262 GrSamplerState samplerState = GrSamplerState::ClampNearest();
egdanielbc9b2962016-09-27 08:00:53 -0700263
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400264 GrVkSampler* sampler = resourceProv.findOrCreateCompatibleSampler(
265 samplerState, srcTex->texturePriv().maxMipMapLevel());
egdanielbc9b2962016-09-27 08:00:53 -0700266
267 VkDescriptorImageInfo imageInfo;
268 memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo));
269 imageInfo.sampler = sampler->sampler();
Brian Osman2b23c4b2018-06-01 12:25:08 -0400270 imageInfo.imageView = srcTex->textureView()->imageView();
egdanielbc9b2962016-09-27 08:00:53 -0700271 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
272
273 VkWriteDescriptorSet writeInfo;
274 memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet));
275 writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
276 writeInfo.pNext = nullptr;
277 writeInfo.dstSet = samplerDS->descriptorSet();
278 writeInfo.dstBinding = 0;
279 writeInfo.dstArrayElement = 0;
280 writeInfo.descriptorCount = 1;
281 writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
282 writeInfo.pImageInfo = &imageInfo;
283 writeInfo.pBufferInfo = nullptr;
284 writeInfo.pTexelBufferView = nullptr;
285
286 GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
287 1,
288 &writeInfo,
289 0, nullptr));
290
291 VkDescriptorSet vkDescSets[] = { uniformDS->descriptorSet(), samplerDS->descriptorSet() };
292
293 GrVkRenderTarget* texRT = static_cast<GrVkRenderTarget*>(srcTex->asRenderTarget());
294 if (texRT) {
Brian Salomon1fabd512018-02-09 09:54:25 -0500295 gpu->onResolveRenderTarget(texRT);
egdanielbc9b2962016-09-27 08:00:53 -0700296 }
297
298 GrVkPrimaryCommandBuffer* cmdBuffer = gpu->currentCommandBuffer();
299
300 // TODO: Make tighter bounds and then adjust bounds for origin and granularity if we see
301 // any perf issues with using the whole bounds
302 SkIRect bounds = SkIRect::MakeWH(rt->width(), rt->height());
303
Greg Danielf7828d02018-10-09 12:01:32 -0400304 // Change layouts of rt and texture. We aren't blending so we don't need color attachment read
305 // access for blending.
egdanielbc9b2962016-09-27 08:00:53 -0700306 GrVkImage* targetImage = rt->msaaImage() ? rt->msaaImage() : rt;
Greg Danielf7828d02018-10-09 12:01:32 -0400307 VkAccessFlags dstAccessFlags = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
308 if (!canDiscardOutsideDstRect) {
309 // We need to load the color attachment so need to be able to read it.
310 dstAccessFlags |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
311 }
egdanielbc9b2962016-09-27 08:00:53 -0700312 targetImage->setImageLayout(gpu,
313 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Greg Danielf7828d02018-10-09 12:01:32 -0400314 dstAccessFlags,
315 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
egdanielbc9b2962016-09-27 08:00:53 -0700316 false);
317
318 srcTex->setImageLayout(gpu,
319 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
320 VK_ACCESS_SHADER_READ_BIT,
Greg Danielf7828d02018-10-09 12:01:32 -0400321 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
egdanielbc9b2962016-09-27 08:00:53 -0700322 false);
323
Greg Daniel2b417842018-03-19 11:17:13 -0400324 GrStencilAttachment* stencil = rt->renderTargetPriv().getStencilAttachment();
325 if (stencil) {
326 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
Greg Danielf7828d02018-10-09 12:01:32 -0400327 // We aren't actually using the stencil but we still load and store it so we need
328 // appropriate barriers.
329 // TODO: Once we refactor surface and how we conntect stencil to RTs, we should not even
330 // have the stencil on this render pass if possible.
Greg Daniel2b417842018-03-19 11:17:13 -0400331 vkStencil->setImageLayout(gpu,
332 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Greg Danielf7828d02018-10-09 12:01:32 -0400333 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
334 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
335 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
Greg Daniel2b417842018-03-19 11:17:13 -0400336 false);
337 }
338
Greg Daniel55fa6472018-03-16 16:13:10 -0400339 VkAttachmentLoadOp loadOp = canDiscardOutsideDstRect ? VK_ATTACHMENT_LOAD_OP_DONT_CARE
340 : VK_ATTACHMENT_LOAD_OP_LOAD;
341 GrVkRenderPass::LoadStoreOps vkColorOps(loadOp, VK_ATTACHMENT_STORE_OP_STORE);
Greg Danielac95c5f2017-01-30 16:33:57 -0500342 GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_LOAD,
egdanielbc9b2962016-09-27 08:00:53 -0700343 VK_ATTACHMENT_STORE_OP_STORE);
egdanielbc9b2962016-09-27 08:00:53 -0700344 const GrVkRenderPass* renderPass;
Greg Daniel55fa6472018-03-16 16:13:10 -0400345 const GrVkResourceProvider::CompatibleRPHandle& rpHandle = rt->compatibleRenderPassHandle();
egdanielbc9b2962016-09-27 08:00:53 -0700346 if (rpHandle.isValid()) {
347 renderPass = gpu->resourceProvider().findRenderPass(rpHandle,
348 vkColorOps,
egdanielbc9b2962016-09-27 08:00:53 -0700349 vkStencilOps);
350 } else {
351 renderPass = gpu->resourceProvider().findRenderPass(*rt,
352 vkColorOps,
egdanielbc9b2962016-09-27 08:00:53 -0700353 vkStencilOps);
354 }
355
356 SkASSERT(renderPass->isCompatible(*rt->simpleRenderPass()));
357
358
Greg Daniel77a86f82017-01-23 11:04:45 -0500359 cmdBuffer->beginRenderPass(gpu, renderPass, nullptr, *rt, bounds, false);
egdanielbc9b2962016-09-27 08:00:53 -0700360 cmdBuffer->bindPipeline(gpu, pipeline);
361
362 // Uniform DescriptorSet, Sampler DescriptorSet, and vertex shader uniformBuffer
363 SkSTArray<3, const GrVkRecycledResource*> descriptorRecycledResources;
364 descriptorRecycledResources.push_back(uniformDS);
365 descriptorRecycledResources.push_back(samplerDS);
366 descriptorRecycledResources.push_back(fUniformBuffer->resource());
367
368 // One sampler, texture view, and texture
369 SkSTArray<3, const GrVkResource*> descriptorResources;
370 descriptorResources.push_back(sampler);
Brian Osman2b23c4b2018-06-01 12:25:08 -0400371 descriptorResources.push_back(srcTex->textureView());
egdanielbc9b2962016-09-27 08:00:53 -0700372 descriptorResources.push_back(srcTex->resource());
373
374 cmdBuffer->bindDescriptorSets(gpu,
375 descriptorRecycledResources,
376 descriptorResources,
377 fPipelineLayout,
378 0,
379 2,
380 vkDescSets,
381 0,
382 nullptr);
383
384 // Set Dynamic viewport and stencil
385 // We always use one viewport the size of the RT
386 VkViewport viewport;
387 viewport.x = 0.0f;
388 viewport.y = 0.0f;
389 viewport.width = SkIntToScalar(rt->width());
390 viewport.height = SkIntToScalar(rt->height());
391 viewport.minDepth = 0.0f;
392 viewport.maxDepth = 1.0f;
393 cmdBuffer->setViewport(gpu, 0, 1, &viewport);
394
395 // We assume the scissor is not enabled so just set it to the whole RT
396 VkRect2D scissor;
397 scissor.extent.width = rt->width();
398 scissor.extent.height = rt->height();
399 scissor.offset.x = 0;
400 scissor.offset.y = 0;
401 cmdBuffer->setScissor(gpu, 0, 1, &scissor);
402
Chris Dalton1d616352017-05-31 12:51:23 -0600403 cmdBuffer->bindInputBuffer(gpu, 0, fVertexBuffer.get());
egdanielbc9b2962016-09-27 08:00:53 -0700404 cmdBuffer->draw(gpu, 4, 1, 0, 0);
405 cmdBuffer->endRenderPass(gpu);
406
407 // Release all temp resources which should now be reffed by the cmd buffer
408 pipeline->unref(gpu);
409 uniformDS->unref(gpu);
410 samplerDS->unref(gpu);
411 sampler->unref(gpu);
412 renderPass->unref(gpu);
413
414 return true;
415}
416
417void GrVkCopyManager::destroyResources(GrVkGpu* gpu) {
418 if (VK_NULL_HANDLE != fVertShaderModule) {
419 GR_VK_CALL(gpu->vkInterface(), DestroyShaderModule(gpu->device(), fVertShaderModule,
420 nullptr));
421 fVertShaderModule = VK_NULL_HANDLE;
422 }
423
424 if (VK_NULL_HANDLE != fFragShaderModule) {
425 GR_VK_CALL(gpu->vkInterface(), DestroyShaderModule(gpu->device(), fFragShaderModule,
426 nullptr));
427 fFragShaderModule = VK_NULL_HANDLE;
428 }
429
Greg Daniel7d918fd2018-06-19 15:22:01 -0400430 if (fPipelineLayout) {
431 fPipelineLayout->unref(gpu);
432 fPipelineLayout = nullptr;
egdanielbc9b2962016-09-27 08:00:53 -0700433 }
434
435 if (fUniformBuffer) {
436 fUniformBuffer->release(gpu);
Greg Danielf9f27232017-01-06 14:40:08 -0500437 fUniformBuffer.reset();
egdanielbc9b2962016-09-27 08:00:53 -0700438 }
439}
440
441void GrVkCopyManager::abandonResources() {
442 fVertShaderModule = VK_NULL_HANDLE;
443 fFragShaderModule = VK_NULL_HANDLE;
Greg Daniel7d918fd2018-06-19 15:22:01 -0400444 if (fPipelineLayout) {
445 fPipelineLayout->unrefAndAbandon();
446 fPipelineLayout = nullptr;
447 }
egdanielbc9b2962016-09-27 08:00:53 -0700448
449 if (fUniformBuffer) {
450 fUniformBuffer->abandon();
Greg Danielf9f27232017-01-06 14:40:08 -0500451 fUniformBuffer.reset();
egdanielbc9b2962016-09-27 08:00:53 -0700452 }
453}