Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: src/gpu/vk/GrVkGpuCommandBuffer.cpp

Issue 2104353002: Add discard support to Vulkan (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nit Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrVkGpuCommandBuffer.h" 8 #include "GrVkGpuCommandBuffer.h"
9 9
10 #include "GrMesh.h" 10 #include "GrMesh.h"
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 if (GrStencilAttachment* stencil = fRenderTarget->renderTargetPriv().getSten cilAttachment()) { 111 if (GrStencilAttachment* stencil = fRenderTarget->renderTargetPriv().getSten cilAttachment()) {
112 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil; 112 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
113 vkStencil->setImageLayout(fGpu, 113 vkStencil->setImageLayout(fGpu,
114 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIM AL, 114 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIM AL,
115 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | 115 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
116 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, 116 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
117 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 117 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
118 false); 118 false);
119 } 119 }
120 120
121 if (GrVkImage* msaaImage = fRenderTarget->msaaImage()) {
122 msaaImage->setImageLayout(fGpu,
123 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
124 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
125 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
126 false);
127 }
128
121 for (int i = 0; i < fSampledImages.count(); ++i) { 129 for (int i = 0; i < fSampledImages.count(); ++i) {
122 fSampledImages[i]->setImageLayout(fGpu, 130 fSampledImages[i]->setImageLayout(fGpu,
123 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIM AL, 131 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIM AL,
124 VK_ACCESS_SHADER_READ_BIT, 132 VK_ACCESS_SHADER_READ_BIT,
125 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 133 VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
126 false); 134 false);
127 } 135 }
128 136
129 fGpu->submitSecondaryCommandBuffer(fCommandBuffer, fRenderPass, &fColorClear Value, 137 fGpu->submitSecondaryCommandBuffer(fCommandBuffer, fRenderPass, &fColorClear Value,
130 fRenderTarget, bounds); 138 fRenderTarget, bounds);
131 } 139 }
132 140
141 void GrVkGpuCommandBuffer::discard(GrRenderTarget* target) {
142 if (fIsEmpty) {
143 // We will change the render pass to do a clear load instead
144 GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_DONT_CARE,
145 VK_ATTACHMENT_STORE_OP_STORE);
146 GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_DONT_CAR E,
147 VK_ATTACHMENT_STORE_OP_STORE);
148 GrVkRenderPass::LoadStoreOps vkResolveOps(VK_ATTACHMENT_LOAD_OP_DONT_CAR E,
149 VK_ATTACHMENT_STORE_OP_STORE);
150
151 const GrVkRenderPass* oldRP = fRenderPass;
152
153 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target);
154 const GrVkResourceProvider::CompatibleRPHandle& rpHandle =
155 vkRT->compatibleRenderPassHandle();
156 if (rpHandle.isValid()) {
157 fRenderPass = fGpu->resourceProvider().findRenderPass(rpHandle,
158 vkColorOps,
159 vkResolveOps,
160 vkStencilOps);
161 } else {
162 fRenderPass = fGpu->resourceProvider().findRenderPass(*vkRT,
163 vkColorOps,
164 vkResolveOps,
165 vkStencilOps);
166 }
167
168 SkASSERT(fRenderPass->isCompatible(*oldRP));
169 oldRP->unref(fGpu);
170 }
171 }
172
133 void GrVkGpuCommandBuffer::onClearStencilClip(GrRenderTarget* target, 173 void GrVkGpuCommandBuffer::onClearStencilClip(GrRenderTarget* target,
134 const SkIRect& rect, 174 const SkIRect& rect,
135 bool insideClip) { 175 bool insideClip) {
136 SkASSERT(target); 176 SkASSERT(target);
137 177
138 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target); 178 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target);
139 GrStencilAttachment* sb = target->renderTargetPriv().getStencilAttachment(); 179 GrStencilAttachment* sb = target->renderTargetPriv().getStencilAttachment();
140 // this should only be called internally when we know we have a 180 // this should only be called internally when we know we have a
141 // stencil buffer. 181 // stencil buffer.
142 SkASSERT(sb); 182 SkASSERT(sb);
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 fGpu->stats()->incNumDraws(); 428 fGpu->stats()->incNumDraws();
389 } while ((nonIdxMesh = iter.next())); 429 } while ((nonIdxMesh = iter.next()));
390 } 430 }
391 431
392 // Technically we don't have to call this here (since there is a safety chec k in 432 // Technically we don't have to call this here (since there is a safety chec k in
393 // pipelineState:setData but this will allow for quicker freeing of resource s if the 433 // pipelineState:setData but this will allow for quicker freeing of resource s if the
394 // pipelineState sits in a cache for a while. 434 // pipelineState sits in a cache for a while.
395 pipelineState->freeTempResources(fGpu); 435 pipelineState->freeTempResources(fGpu);
396 } 436 }
397 437
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698