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

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

Issue 1806983002: Update how we send draws to gpu backend to reduce state setting. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 9 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 2015 Google Inc. 2 * Copyright 2015 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 "GrVkGpu.h" 8 #include "GrVkGpu.h"
9 9
10 #include "GrContextOptions.h" 10 #include "GrContextOptions.h"
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 VK_ACCESS_HOST_WRITE_BIT, 674 VK_ACCESS_HOST_WRITE_BIT,
675 VK_ACCESS_INDEX_READ_BIT, 675 VK_ACCESS_INDEX_READ_BIT,
676 VK_PIPELINE_STAGE_HOST_BIT, 676 VK_PIPELINE_STAGE_HOST_BIT,
677 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 677 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
678 false); 678 false);
679 679
680 fCurrentCmdBuffer->bindIndexBuffer(this, ibuf); 680 fCurrentCmdBuffer->bindIndexBuffer(this, ibuf);
681 } 681 }
682 } 682 }
683 683
684 void GrVkGpu::buildProgramDesc(GrProgramDesc* desc,
685 const GrPrimitiveProcessor& primProc,
686 const GrPipeline& pipeline) const {
687 if (!GrVkProgramDescBuilder::Build(desc, primProc, pipeline, *this->vkCaps() .glslCaps())) {
688 SkDEBUGFAIL("Failed to generate GL program descriptor");
689 }
690 }
691
692 //////////////////////////////////////////////////////////////////////////////// 684 ////////////////////////////////////////////////////////////////////////////////
693 685
694 GrStencilAttachment* GrVkGpu::createStencilAttachmentForRenderTarget(const GrRen derTarget* rt, 686 GrStencilAttachment* GrVkGpu::createStencilAttachmentForRenderTarget(const GrRen derTarget* rt,
695 int width, 687 int width,
696 int height) { 688 int height) {
697 SkASSERT(rt->asTexture()); 689 SkASSERT(rt->asTexture());
698 SkASSERT(width >= rt->width()); 690 SkASSERT(width >= rt->width());
699 SkASSERT(height >= rt->height()); 691 SkASSERT(height >= rt->height());
700 692
701 int samples = rt->numStencilSamples(); 693 int samples = rt->numStencilSamples();
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 memcpy(top, bottom, tightRowBytes); 1308 memcpy(top, bottom, tightRowBytes);
1317 memcpy(bottom, tmpRow, tightRowBytes); 1309 memcpy(bottom, tmpRow, tightRowBytes);
1318 top += rowBytes; 1310 top += rowBytes;
1319 bottom -= rowBytes; 1311 bottom -= rowBytes;
1320 } 1312 }
1321 } 1313 }
1322 1314
1323 return true; 1315 return true;
1324 } 1316 }
1325 1317
1326 void GrVkGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertice s) { 1318 void GrVkGpu::onDraw(const GrPipeline& pipeline,
1327 GrRenderTarget* rt = args.fPipeline->getRenderTarget(); 1319 const GrPrimitiveProcessor& primProc,
1320 GrPrimitiveType primitiveType,
1321 const GrVertices* vertArray,
1322 int drawCount) {
1323 GrRenderTarget* rt = pipeline.getRenderTarget();
1328 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt); 1324 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt);
1329 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); 1325 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass();
1330 SkASSERT(renderPass); 1326 SkASSERT(renderPass);
1331 1327
1332 GrVkProgram* program = GrVkProgramBuilder::CreateProgram(this, args, 1328
1333 vertices.primitiveT ype(), 1329 // Get GrGLProgramDesc
bsalomon 2016/03/16 20:07:22 ?
egdaniel 2016/03/17 15:09:36 Done.
1330 GrVkProgramDesc desc;
1331 if (!GrVkProgramDescBuilder::Build(&desc, primProc, pipeline, *this->vkCaps( ).glslCaps())) {
1332 GrCapsDebugf(this->caps(), "Failed to vk program descriptor!\n");
1333 return;
1334 }
1335 GrVkProgram* program = GrVkProgramBuilder::CreateProgram(this,
1336 pipeline,
1337 primProc,
1338 primitiveType,
1339 desc,
1334 *renderPass); 1340 *renderPass);
1335 1341
1336 if (!program) { 1342 if (!program) {
1337 return; 1343 return;
1338 } 1344 }
1339 1345
1340 program->setData(this, *args.fPrimitiveProcessor, *args.fPipeline); 1346 program->setData(this, primProc, pipeline);
1341
1342 fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT);
1343 1347
1344 program->bind(this, fCurrentCmdBuffer); 1348 program->bind(this, fCurrentCmdBuffer);
1345 1349
1346 this->bindGeometry(*args.fPrimitiveProcessor, vertices);
1347
1348 // Change layout of our render target so it can be used as the color attachm ent 1350 // Change layout of our render target so it can be used as the color attachm ent
1349 VkImageLayout layout = vkRT->currentLayout(); 1351 VkImageLayout layout = vkRT->currentLayout();
1350 // Our color attachment is purely a destination and won't be read so don't n eed to flush or 1352 // Our color attachment is purely a destination and won't be read so don't n eed to flush or
1351 // invalidate any caches 1353 // invalidate any caches
1352 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(l ayout); 1354 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(l ayout);
1353 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; 1355 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
1354 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout); 1356 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
1355 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 1357 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
1356 vkRT->setImageLayout(this, 1358 vkRT->setImageLayout(this,
1357 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1359 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
1358 srcAccessMask, 1360 srcAccessMask,
1359 dstAccessMask, 1361 dstAccessMask,
1360 srcStageMask, 1362 srcStageMask,
1361 dstStageMask, 1363 dstStageMask,
1362 false); 1364 false);
1363 1365
1364 // If we are using a stencil attachment we also need to update its layout 1366 // If we are using a stencil attachment we also need to update its layout
1365 if (!args.fPipeline->getStencil().isDisabled()) { 1367 if (!pipeline.getStencil().isDisabled()) {
1366 GrStencilAttachment* stencil = vkRT->renderTargetPriv().getStencilAttach ment(); 1368 GrStencilAttachment* stencil = vkRT->renderTargetPriv().getStencilAttach ment();
1367 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil; 1369 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
1368 VkImageLayout origDstLayout = vkStencil->currentLayout(); 1370 VkImageLayout origDstLayout = vkStencil->currentLayout();
1369 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstL ayout); 1371 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstL ayout);
1370 VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_B IT | 1372 VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_B IT |
1371 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BI T; 1373 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
1372 VkPipelineStageFlags srcStageMask = 1374 VkPipelineStageFlags srcStageMask =
1373 GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); 1375 GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
1374 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; 1376 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
1375 vkStencil->setImageLayout(this, 1377 vkStencil->setImageLayout(this,
1376 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIM AL, 1378 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIM AL,
1377 srcAccessMask, 1379 srcAccessMask,
1378 dstAccessMask, 1380 dstAccessMask,
1379 srcStageMask, 1381 srcStageMask,
1380 dstStageMask, 1382 dstStageMask,
1381 false); 1383 false);
1382 } 1384 }
1383 1385
1384 if (vertices.isIndexed()) { 1386 fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT);
1385 fCurrentCmdBuffer->drawIndexed(this, 1387
1386 vertices.indexCount(), 1388 for (int i = 0; i < drawCount; ++i) {
1387 1, 1389 if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*this->caps ())) {
1388 vertices.startIndex(), 1390 this->xferBarrier(pipeline.getRenderTarget(), barrierType);
1389 vertices.startVertex(), 1391 }
1390 0); 1392
1391 } else { 1393 const GrVertices& vertices = vertArray[i];
1392 fCurrentCmdBuffer->draw(this, vertices.vertexCount(), 1, vertices.startV ertex(), 0); 1394 GrVertices::Iterator iter;
1395 const GrNonInstancedVertices* verts = iter.init(vertices);
1396 do {
1397
1398 this->bindGeometry(primProc, *verts);
1399
1400 if (vertices.isIndexed()) {
1401 fCurrentCmdBuffer->drawIndexed(this,
1402 verts->indexCount(),
1403 1,
1404 verts->startIndex(),
1405 verts->startVertex(),
1406 0);
1407 } else {
1408 fCurrentCmdBuffer->draw(this, verts->vertexCount(), 1, verts->st artVertex(), 0);
1409 }
1410
1411 fStats.incNumDraws();
1412 } while ((verts = iter.next()));
1393 } 1413 }
1394 1414
1395 fCurrentCmdBuffer->endRenderPass(this); 1415 fCurrentCmdBuffer->endRenderPass(this);
1396 1416
1397 // Technically we don't have to call this here (since there is a safety chec k in program:setData 1417 // Technically we don't have to call this here (since there is a safety chec k in program:setData
1398 // but this will allow for quicker freeing of resources if the program sits in a cache for a 1418 // but this will allow for quicker freeing of resources if the program sits in a cache for a
1399 // while. 1419 // while.
1400 program->freeTempResources(this); 1420 program->freeTempResources(this);
1401 // This free will go away once we setup a program cache, and then the cache will be responsible 1421 // This free will go away once we setup a program cache, and then the cache will be responsible
1402 // for call freeGpuResources. 1422 // for call freeGpuResources.
1403 program->freeGPUResources(this); 1423 program->freeGPUResources(this);
1404 program->unref(); 1424 program->unref();
1405 1425
1406 #if SWAP_PER_DRAW 1426 #if SWAP_PER_DRAW
1407 glFlush(); 1427 glFlush();
1408 #if defined(SK_BUILD_FOR_MAC) 1428 #if defined(SK_BUILD_FOR_MAC)
1409 aglSwapBuffers(aglGetCurrentContext()); 1429 aglSwapBuffers(aglGetCurrentContext());
1410 int set_a_break_pt_here = 9; 1430 int set_a_break_pt_here = 9;
1411 aglSwapBuffers(aglGetCurrentContext()); 1431 aglSwapBuffers(aglGetCurrentContext());
1412 #elif defined(SK_BUILD_FOR_WIN32) 1432 #elif defined(SK_BUILD_FOR_WIN32)
1413 SwapBuf(); 1433 SwapBuf();
1414 int set_a_break_pt_here = 9; 1434 int set_a_break_pt_here = 9;
1415 SwapBuf(); 1435 SwapBuf();
1416 #endif 1436 #endif
1417 #endif 1437 #endif
1418 } 1438 }
1419 1439
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698