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

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

Issue 2262473003: Define clear regions in terms of GrFixedClip (Closed) Base URL: https://skia.googlesource.com/skia.git@upload_fixedcliptosrc
Patch Set: rebase Created 4 years, 3 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
« no previous file with comments | « src/gpu/vk/GrVkGpuCommandBuffer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "GrFixedClip.h"
10 #include "GrMesh.h" 11 #include "GrMesh.h"
11 #include "GrPipeline.h" 12 #include "GrPipeline.h"
12 #include "GrRenderTargetPriv.h" 13 #include "GrRenderTargetPriv.h"
13 #include "GrTextureAccess.h" 14 #include "GrTextureAccess.h"
14 #include "GrTexturePriv.h" 15 #include "GrTexturePriv.h"
15 #include "GrVkCommandBuffer.h" 16 #include "GrVkCommandBuffer.h"
16 #include "GrVkGpu.h" 17 #include "GrVkGpu.h"
17 #include "GrVkPipeline.h" 18 #include "GrVkPipeline.h"
18 #include "GrVkRenderPass.h" 19 #include "GrVkRenderPass.h"
19 #include "GrVkRenderTarget.h" 20 #include "GrVkRenderTarget.h"
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 vkResolveOps, 160 vkResolveOps,
160 vkStencilOps); 161 vkStencilOps);
161 } 162 }
162 163
163 SkASSERT(fRenderPass->isCompatible(*oldRP)); 164 SkASSERT(fRenderPass->isCompatible(*oldRP));
164 oldRP->unref(fGpu); 165 oldRP->unref(fGpu);
165 } 166 }
166 } 167 }
167 168
168 void GrVkGpuCommandBuffer::onClearStencilClip(GrRenderTarget* target, 169 void GrVkGpuCommandBuffer::onClearStencilClip(GrRenderTarget* target,
169 const SkIRect& rect, 170 const GrFixedClip& clip,
170 bool insideClip) { 171 bool insideStencilMask) {
171 SkASSERT(target); 172 SkASSERT(target);
172 173
173 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target); 174 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target);
174 GrStencilAttachment* sb = target->renderTargetPriv().getStencilAttachment(); 175 GrStencilAttachment* sb = target->renderTargetPriv().getStencilAttachment();
175 // this should only be called internally when we know we have a 176 // this should only be called internally when we know we have a
176 // stencil buffer. 177 // stencil buffer.
177 SkASSERT(sb); 178 SkASSERT(sb);
178 int stencilBitCount = sb->bits(); 179 int stencilBitCount = sb->bits();
179 180
180 // The contract with the callers does not guarantee that we preserve all bit s in the stencil 181 // The contract with the callers does not guarantee that we preserve all bit s in the stencil
181 // during this clear. Thus we will clear the entire stencil to the desired v alue. 182 // during this clear. Thus we will clear the entire stencil to the desired v alue.
182 183
183 VkClearDepthStencilValue vkStencilColor; 184 VkClearDepthStencilValue vkStencilColor;
184 memset(&vkStencilColor, 0, sizeof(VkClearDepthStencilValue)); 185 memset(&vkStencilColor, 0, sizeof(VkClearDepthStencilValue));
185 if (insideClip) { 186 if (insideStencilMask) {
186 vkStencilColor.stencil = (1 << (stencilBitCount - 1)); 187 vkStencilColor.stencil = (1 << (stencilBitCount - 1));
187 } else { 188 } else {
188 vkStencilColor.stencil = 0; 189 vkStencilColor.stencil = 0;
189 } 190 }
190 191
191 VkClearRect clearRect; 192 VkClearRect clearRect;
192 // Flip rect if necessary 193 // Flip rect if necessary
193 SkIRect vkRect = rect; 194 SkIRect vkRect;
194 195 if (!clip.scissorEnabled()) {
195 if (kBottomLeft_GrSurfaceOrigin == vkRT->origin()) { 196 vkRect.setXYWH(0, 0, vkRT->width(), vkRT->height());
196 vkRect.fTop = vkRT->height() - rect.fBottom; 197 } else if (kBottomLeft_GrSurfaceOrigin != vkRT->origin()) {
197 vkRect.fBottom = vkRT->height() - rect.fTop; 198 vkRect = clip.scissorRect();
199 } else {
200 const SkIRect& scissor = clip.scissorRect();
201 vkRect.setLTRB(scissor.fLeft, vkRT->height() - scissor.fBottom,
202 scissor.fRight, vkRT->height() - scissor.fTop);
198 } 203 }
199 204
200 clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop }; 205 clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop };
201 clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height( ) }; 206 clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height( ) };
202 207
203 clearRect.baseArrayLayer = 0; 208 clearRect.baseArrayLayer = 0;
204 clearRect.layerCount = 1; 209 clearRect.layerCount = 1;
205 210
206 uint32_t stencilIndex; 211 uint32_t stencilIndex;
207 SkAssertResult(fRenderPass->stencilAttachmentIndex(&stencilIndex)); 212 SkAssertResult(fRenderPass->stencilAttachmentIndex(&stencilIndex));
208 213
209 VkClearAttachment attachment; 214 VkClearAttachment attachment;
210 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; 215 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
211 attachment.colorAttachment = 0; // this value shouldn't matter 216 attachment.colorAttachment = 0; // this value shouldn't matter
212 attachment.clearValue.depthStencil = vkStencilColor; 217 attachment.clearValue.depthStencil = vkStencilColor;
213 218
214 fCommandBuffer->clearAttachments(fGpu, 1, &attachment, 1, &clearRect); 219 fCommandBuffer->clearAttachments(fGpu, 1, &attachment, 1, &clearRect);
215 fIsEmpty = false; 220 fIsEmpty = false;
216 } 221 }
217 222
218 void GrVkGpuCommandBuffer::onClear(GrRenderTarget* target, const SkIRect& rect, GrColor color) { 223 void GrVkGpuCommandBuffer::onClear(GrRenderTarget* target, const GrFixedClip& cl ip, GrColor color) {
219 // parent class should never let us get here with no RT 224 // parent class should never let us get here with no RT
220 SkASSERT(target); 225 SkASSERT(target);
221 226
222 VkClearColorValue vkColor; 227 VkClearColorValue vkColor;
223 GrColorToRGBAFloat(color, vkColor.float32); 228 GrColorToRGBAFloat(color, vkColor.float32);
224 229
225 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target); 230 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target);
226 231
227 if (fIsEmpty && rect.width() == target->width() && rect.height() == target-> height()) { 232 if (fIsEmpty && !clip.scissorEnabled()) {
228 // We will change the render pass to do a clear load instead 233 // We will change the render pass to do a clear load instead
229 GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_CLEAR, 234 GrVkRenderPass::LoadStoreOps vkColorOps(VK_ATTACHMENT_LOAD_OP_CLEAR,
230 VK_ATTACHMENT_STORE_OP_STORE); 235 VK_ATTACHMENT_STORE_OP_STORE);
231 GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_LOAD, 236 GrVkRenderPass::LoadStoreOps vkStencilOps(VK_ATTACHMENT_LOAD_OP_LOAD,
232 VK_ATTACHMENT_STORE_OP_STORE); 237 VK_ATTACHMENT_STORE_OP_STORE);
233 GrVkRenderPass::LoadStoreOps vkResolveOps(VK_ATTACHMENT_LOAD_OP_LOAD, 238 GrVkRenderPass::LoadStoreOps vkResolveOps(VK_ATTACHMENT_LOAD_OP_LOAD,
234 VK_ATTACHMENT_STORE_OP_STORE); 239 VK_ATTACHMENT_STORE_OP_STORE);
235 240
236 const GrVkRenderPass* oldRP = fRenderPass; 241 const GrVkRenderPass* oldRP = fRenderPass;
237 242
(...skipping 14 matching lines...) Expand all
252 SkASSERT(fRenderPass->isCompatible(*oldRP)); 257 SkASSERT(fRenderPass->isCompatible(*oldRP));
253 oldRP->unref(fGpu); 258 oldRP->unref(fGpu);
254 259
255 GrColorToRGBAFloat(color, fColorClearValue.color.float32); 260 GrColorToRGBAFloat(color, fColorClearValue.color.float32);
256 return; 261 return;
257 } 262 }
258 263
259 // We always do a sub rect clear with clearAttachments since we are inside a render pass 264 // We always do a sub rect clear with clearAttachments since we are inside a render pass
260 VkClearRect clearRect; 265 VkClearRect clearRect;
261 // Flip rect if necessary 266 // Flip rect if necessary
262 SkIRect vkRect = rect; 267 SkIRect vkRect;
263 if (kBottomLeft_GrSurfaceOrigin == vkRT->origin()) { 268 if (!clip.scissorEnabled()) {
264 vkRect.fTop = vkRT->height() - rect.fBottom; 269 vkRect.setXYWH(0, 0, vkRT->width(), vkRT->height());
265 vkRect.fBottom = vkRT->height() - rect.fTop; 270 } else if (kBottomLeft_GrSurfaceOrigin != vkRT->origin()) {
271 vkRect = clip.scissorRect();
272 } else {
273 const SkIRect& scissor = clip.scissorRect();
274 vkRect.setLTRB(scissor.fLeft, vkRT->height() - scissor.fBottom,
275 scissor.fRight, vkRT->height() - scissor.fTop);
266 } 276 }
267 clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop }; 277 clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop };
268 clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height( ) }; 278 clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height( ) };
269 clearRect.baseArrayLayer = 0; 279 clearRect.baseArrayLayer = 0;
270 clearRect.layerCount = 1; 280 clearRect.layerCount = 1;
271 281
272 uint32_t colorIndex; 282 uint32_t colorIndex;
273 SkAssertResult(fRenderPass->colorAttachmentIndex(&colorIndex)); 283 SkAssertResult(fRenderPass->colorAttachmentIndex(&colorIndex));
274 284
275 VkClearAttachment attachment; 285 VkClearAttachment attachment;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 fGpu->stats()->incNumDraws(); 442 fGpu->stats()->incNumDraws();
433 } while ((nonIdxMesh = iter.next())); 443 } while ((nonIdxMesh = iter.next()));
434 } 444 }
435 445
436 // Technically we don't have to call this here (since there is a safety chec k in 446 // Technically we don't have to call this here (since there is a safety chec k in
437 // pipelineState:setData but this will allow for quicker freeing of resource s if the 447 // pipelineState:setData but this will allow for quicker freeing of resource s if the
438 // pipelineState sits in a cache for a while. 448 // pipelineState sits in a cache for a while.
439 pipelineState->freeTempResources(fGpu); 449 pipelineState->freeTempResources(fGpu);
440 } 450 }
441 451
OLDNEW
« no previous file with comments | « src/gpu/vk/GrVkGpuCommandBuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698