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

Side by Side Diff: src/gpu/GrInOrderDrawBuffer.cpp

Issue 184443003: Add Gpu Tracing to Ganesh (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Partial version Created 6 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 2011 Google Inc. 2 * Copyright 2011 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 "GrInOrderDrawBuffer.h" 8 #include "GrInOrderDrawBuffer.h"
9 9
10 #include "GrBufferAllocPool.h" 10 #include "GrBufferAllocPool.h"
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 249
250 // we only attempt to concat the case when reserved verts are used with a cl ient-specified index 250 // we only attempt to concat the case when reserved verts are used with a cl ient-specified index
251 // buffer. To make this work with client-specified VBs we'd need to know if the VB was updated 251 // buffer. To make this work with client-specified VBs we'd need to know if the VB was updated
252 // between draws. 252 // between draws.
253 if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || 253 if (kReserved_GeometrySrcType != geomSrc.fVertexSrc ||
254 kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { 254 kBuffer_GeometrySrcType != geomSrc.fIndexSrc) {
255 return 0; 255 return 0;
256 } 256 }
257 // Check if there is a draw info that is compatible that uses the same VB fr om the pool and 257 // Check if there is a draw info that is compatible that uses the same VB fr om the pool and
258 // the same IB 258 // the same IB
259 if (kDraw_Cmd != fCmds.back()) { 259 if (kDraw_Cmd != stripTraceBit(fCmds.back())) {
260 return 0; 260 return 0;
261 } 261 }
262 262
263 DrawRecord* draw = &fDraws.back(); 263 DrawRecord* draw = &fDraws.back();
264 GeometryPoolState& poolState = fGeoPoolStateStack.back(); 264 GeometryPoolState& poolState = fGeoPoolStateStack.back();
265 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; 265 const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer;
266 266
267 if (!draw->isInstanced() || 267 if (!draw->isInstanced() ||
268 draw->verticesPerInstance() != info.verticesPerInstance() || 268 draw->verticesPerInstance() != info.verticesPerInstance() ||
269 draw->indicesPerInstance() != info.indicesPerInstance() || 269 draw->indicesPerInstance() != info.indicesPerInstance() ||
(...skipping 14 matching lines...) Expand all
284 int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerI nstance(); 284 int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerI nstance();
285 instancesToConcat -= draw->instanceCount(); 285 instancesToConcat -= draw->instanceCount();
286 instancesToConcat = GrMin(instancesToConcat, info.instanceCount()); 286 instancesToConcat = GrMin(instancesToConcat, info.instanceCount());
287 287
288 // update the amount of reserved vertex data actually referenced in draws 288 // update the amount of reserved vertex data actually referenced in draws
289 size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * 289 size_t vertexBytes = instancesToConcat * info.verticesPerInstance() *
290 drawState.getVertexSize(); 290 drawState.getVertexSize();
291 poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexBytes, verte xBytes); 291 poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexBytes, verte xBytes);
292 292
293 draw->adjustInstanceCount(instancesToConcat); 293 draw->adjustInstanceCount(instancesToConcat);
294
295 // update last fGpuCmdMarkers to include any additional trace markers that h ave been added
296 if (this->getActiveTraceMarkers()->count() > 0) {
297 if (fCmds.back() & 0x08) {
bsalomon 2014/03/17 17:50:38 use enum value
298 fNumMarkersPerCmd.top() += this->getActiveTraceMarkers()->count();
299 } else {
300 fNumMarkersPerCmd.push(this->getActiveTraceMarkers()->count());
301 fCmds.back() = addTraceBit(fCmds.back());
302 }
303 for (int i = 0; i < this->getActiveTraceMarkers()->count(); ++i) {
304 fGpuCmdMarkers.push(this->getActiveTraceMarkers()->getAt(i));
305 }
306 }
307
294 return instancesToConcat; 308 return instancesToConcat;
295 } 309 }
296 310
297 class AutoClipReenable { 311 class AutoClipReenable {
298 public: 312 public:
299 AutoClipReenable() : fDrawState(NULL) {} 313 AutoClipReenable() : fDrawState(NULL) {}
300 ~AutoClipReenable() { 314 ~AutoClipReenable() {
301 if (NULL != fDrawState) { 315 if (NULL != fDrawState) {
302 fDrawState->enableState(GrDrawState::kClip_StateBit); 316 fDrawState->enableState(GrDrawState::kClip_StateBit);
303 } 317 }
(...skipping 24 matching lines...) Expand all
328 this->recordClip(); 342 this->recordClip();
329 } 343 }
330 if (this->needsNewState()) { 344 if (this->needsNewState()) {
331 this->recordState(); 345 this->recordState();
332 } 346 }
333 347
334 DrawRecord* draw; 348 DrawRecord* draw;
335 if (info.isInstanced()) { 349 if (info.isInstanced()) {
336 int instancesConcated = this->concatInstancedDraw(info); 350 int instancesConcated = this->concatInstancedDraw(info);
337 if (info.instanceCount() > instancesConcated) { 351 if (info.instanceCount() > instancesConcated) {
352 // grab cmd lock
338 draw = this->recordDraw(info); 353 draw = this->recordDraw(info);
339 draw->adjustInstanceCount(-instancesConcated); 354 draw->adjustInstanceCount(-instancesConcated);
340 } else { 355 } else {
341 return; 356 return;
342 } 357 }
343 } else { 358 } else {
344 draw = this->recordDraw(info); 359 draw = this->recordDraw(info);
345 } 360 }
346 361
347 switch (this->getGeomSrc().fVertexSrc) { 362 switch (this->getGeomSrc().fVertexSrc) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 rect = &r; 449 rect = &r;
435 } 450 }
436 Clear* clr = this->recordClear(); 451 Clear* clr = this->recordClear();
437 clr->fColor = color; 452 clr->fColor = color;
438 clr->fRect = *rect; 453 clr->fRect = *rect;
439 clr->fCanIgnoreRect = canIgnoreRect; 454 clr->fCanIgnoreRect = canIgnoreRect;
440 clr->fRenderTarget = renderTarget; 455 clr->fRenderTarget = renderTarget;
441 renderTarget->ref(); 456 renderTarget->ref();
442 } 457 }
443 458
444 void GrInOrderDrawBuffer::onInstantGpuTraceEvent(const char* marker) {
445 // TODO: adds command to buffer
446 }
447
448 void GrInOrderDrawBuffer::onPushGpuTraceEvent(const char* marker) {
449 // TODO: adds command to buffer
450 }
451
452 void GrInOrderDrawBuffer::onPopGpuTraceEvent() {
453 // TODO: adds command to buffer
454 }
455
456 void GrInOrderDrawBuffer::reset() { 459 void GrInOrderDrawBuffer::reset() {
457 SkASSERT(1 == fGeoPoolStateStack.count()); 460 SkASSERT(1 == fGeoPoolStateStack.count());
458 this->resetVertexSource(); 461 this->resetVertexSource();
459 this->resetIndexSource(); 462 this->resetIndexSource();
460 int numDraws = fDraws.count(); 463 int numDraws = fDraws.count();
461 for (int d = 0; d < numDraws; ++d) { 464 for (int d = 0; d < numDraws; ++d) {
462 // we always have a VB, but not always an IB 465 // we always have a VB, but not always an IB
463 SkASSERT(NULL != fDraws[d].fVertexBuffer); 466 SkASSERT(NULL != fDraws[d].fVertexBuffer);
464 fDraws[d].fVertexBuffer->unref(); 467 fDraws[d].fVertexBuffer->unref();
465 SkSafeUnref(fDraws[d].fIndexBuffer); 468 SkSafeUnref(fDraws[d].fIndexBuffer);
466 } 469 }
467 fCmds.reset(); 470 fCmds.reset();
468 fDraws.reset(); 471 fDraws.reset();
469 fStencilPaths.reset(); 472 fStencilPaths.reset();
470 fDrawPaths.reset(); 473 fDrawPaths.reset();
471 fStates.reset(); 474 fStates.reset();
472 fClears.reset(); 475 fClears.reset();
473 fVertexPool.reset(); 476 fVertexPool.reset();
474 fIndexPool.reset(); 477 fIndexPool.reset();
475 fClips.reset(); 478 fClips.reset();
476 fClipOrigins.reset(); 479 fClipOrigins.reset();
477 fCopySurfaces.reset(); 480 fCopySurfaces.reset();
481 fGpuCmdMarkers.reset();
482 fNumMarkersPerCmd.reset();
478 fClipSet = true; 483 fClipSet = true;
479 } 484 }
480 485
481 void GrInOrderDrawBuffer::flush() { 486 void GrInOrderDrawBuffer::flush() {
482 if (fFlushing) { 487 if (fFlushing) {
483 return; 488 return;
484 } 489 }
485 490
486 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc); 491 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc);
487 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc); 492 SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc);
(...skipping 12 matching lines...) Expand all
500 GrDrawTarget::AutoClipRestore acr(fDstGpu); 505 GrDrawTarget::AutoClipRestore acr(fDstGpu);
501 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); 506 AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit);
502 507
503 GrDrawState playbackState; 508 GrDrawState playbackState;
504 GrDrawState* prevDrawState = fDstGpu->drawState(); 509 GrDrawState* prevDrawState = fDstGpu->drawState();
505 prevDrawState->ref(); 510 prevDrawState->ref();
506 fDstGpu->setDrawState(&playbackState); 511 fDstGpu->setDrawState(&playbackState);
507 512
508 GrClipData clipData; 513 GrClipData clipData;
509 514
510 int currState = 0; 515 int currState = 0;
511 int currClip = 0; 516 int currClip = 0;
512 int currClear = 0; 517 int currClear = 0;
513 int currDraw = 0; 518 int currDraw = 0;
514 int currStencilPath = 0; 519 int currStencilPath = 0;
515 int currDrawPath = 0; 520 int currDrawPath = 0;
516 int currCopySurface = 0; 521 int currCopySurface = 0;
522 int currCmdMarker = 0;
523 int currCmdMarkerIndex = 0;
517 524
518 for (int c = 0; c < numCmds; ++c) { 525 for (int c = 0; c < numCmds; ++c) {
519 switch (fCmds[c]) { 526 GpuTraceMarker newMarker("", -1);
527 if (fCmds[c] & 0x08) {
bsalomon 2014/03/17 17:50:38 use enum, or perhaps better add a function CmdHasT
528 SkString traceString = getTraceString(&fGpuCmdMarkers, currCmdMarker Index,
529 fNumMarkersPerCmd[currCmdMarke r]);
530 newMarker.fMarker = traceString.c_str();
531 fDstGpu->addGpuTraceMarker(&newMarker);
532 currCmdMarkerIndex += fNumMarkersPerCmd[currCmdMarker];
533 ++currCmdMarker;
534 }
535 switch (stripTraceBit(fCmds[c])) {
bsalomon 2014/03/17 17:50:38 this-> but really the functions should probably be
520 case kDraw_Cmd: { 536 case kDraw_Cmd: {
521 const DrawRecord& draw = fDraws[currDraw]; 537 const DrawRecord& draw = fDraws[currDraw];
522 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); 538 fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer);
523 if (draw.isIndexed()) { 539 if (draw.isIndexed()) {
524 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); 540 fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer);
525 } 541 }
526 fDstGpu->executeDraw(draw); 542 fDstGpu->executeDraw(draw);
527
528 ++currDraw; 543 ++currDraw;
529 break; 544 break;
530 } 545 }
531 case kStencilPath_Cmd: { 546 case kStencilPath_Cmd: {
532 const StencilPath& sp = fStencilPaths[currStencilPath]; 547 const StencilPath& sp = fStencilPaths[currStencilPath];
533 fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); 548 fDstGpu->stencilPath(sp.fPath.get(), sp.fFill);
534 ++currStencilPath; 549 ++currStencilPath;
535 break; 550 break;
536 } 551 }
537 case kDrawPath_Cmd: { 552 case kDrawPath_Cmd: {
(...skipping 21 matching lines...) Expand all
559 ++currClear; 574 ++currClear;
560 break; 575 break;
561 case kCopySurface_Cmd: 576 case kCopySurface_Cmd:
562 fDstGpu->copySurface(fCopySurfaces[currCopySurface].fDst.get(), 577 fDstGpu->copySurface(fCopySurfaces[currCopySurface].fDst.get(),
563 fCopySurfaces[currCopySurface].fSrc.get(), 578 fCopySurfaces[currCopySurface].fSrc.get(),
564 fCopySurfaces[currCopySurface].fSrcRect, 579 fCopySurfaces[currCopySurface].fSrcRect,
565 fCopySurfaces[currCopySurface].fDstPoint); 580 fCopySurfaces[currCopySurface].fDstPoint);
566 ++currCopySurface; 581 ++currCopySurface;
567 break; 582 break;
568 } 583 }
584 if (fCmds[c] & 0x08) {
bsalomon 2014/03/17 17:50:38 enum/function
585 fDstGpu->removeGpuTraceMarker(&newMarker);
586 }
569 } 587 }
570 // we should have consumed all the states, clips, etc. 588 // we should have consumed all the states, clips, etc.
571 SkASSERT(fStates.count() == currState); 589 SkASSERT(fStates.count() == currState);
572 SkASSERT(fClips.count() == currClip); 590 SkASSERT(fClips.count() == currClip);
573 SkASSERT(fClipOrigins.count() == currClip); 591 SkASSERT(fClipOrigins.count() == currClip);
574 SkASSERT(fClears.count() == currClear); 592 SkASSERT(fClears.count() == currClear);
575 SkASSERT(fDraws.count() == currDraw); 593 SkASSERT(fDraws.count() == currDraw);
576 SkASSERT(fCopySurfaces.count() == currCopySurface); 594 SkASSERT(fCopySurfaces.count() == currCopySurface);
595 SkASSERT(fGpuCmdMarkers.count() == currCmdMarkerIndex);
596 SkASSERT(fNumMarkersPerCmd.count() == currCmdMarker);
577 597
578 fDstGpu->setDrawState(prevDrawState); 598 fDstGpu->setDrawState(prevDrawState);
579 prevDrawState->unref(); 599 prevDrawState->unref();
580 this->reset(); 600 this->reset();
581 ++fDrawID; 601 ++fDrawID;
582 } 602 }
583 603
584 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, 604 bool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst,
585 GrSurface* src, 605 GrSurface* src,
586 const SkIRect& srcRect, 606 const SkIRect& srcRect,
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 if (fClipSet && 842 if (fClipSet &&
823 (fClips.empty() || 843 (fClips.empty() ||
824 fClips.back() != *this->getClip()->fClipStack || 844 fClips.back() != *this->getClip()->fClipStack ||
825 fClipOrigins.back() != this->getClip()->fOrigin)) { 845 fClipOrigins.back() != this->getClip()->fOrigin)) {
826 return true; 846 return true;
827 } 847 }
828 } 848 }
829 return false; 849 return false;
830 } 850 }
831 851
852 void GrInOrderDrawBuffer::addToCmdBuffer(uint8_t cmd) {
853 SkTDArray<GpuTraceMarker>* activeTraceMarkers = this->getActiveTraceMarkers( );
854 if (activeTraceMarkers->count() > 0) {
855 fCmds.push_back(addTraceBit(cmd));
856 for (int i = 0; i < activeTraceMarkers->count(); ++i) {
857 fGpuCmdMarkers.push(activeTraceMarkers->getAt(i));
858 }
859 fNumMarkersPerCmd.push(activeTraceMarkers->count());
860 } else {
861 fCmds.push_back(cmd);
862 }
863 }
864
832 void GrInOrderDrawBuffer::recordClip() { 865 void GrInOrderDrawBuffer::recordClip() {
833 fClips.push_back() = *this->getClip()->fClipStack; 866 fClips.push_back(*this->getClip()->fClipStack);
834 fClipOrigins.push_back() = this->getClip()->fOrigin; 867 fClipOrigins.push_back() = this->getClip()->fOrigin;
835 fClipSet = false; 868 fClipSet = false;
836 fCmds.push_back(kSetClip_Cmd); 869 addToCmdBuffer(kSetClip_Cmd);
bsalomon 2014/03/17 17:50:38 this-> here and below
837 } 870 }
838 871
839 void GrInOrderDrawBuffer::recordState() { 872 void GrInOrderDrawBuffer::recordState() {
840 fStates.push_back().saveFrom(this->getDrawState()); 873 fStates.push_back().saveFrom(this->getDrawState());
841 fCmds.push_back(kSetState_Cmd); 874 addToCmdBuffer(kSetState_Cmd);
842 } 875 }
843 876
844 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info) { 877 GrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info) {
845 fCmds.push_back(kDraw_Cmd); 878 addToCmdBuffer(kDraw_Cmd);
846 return &fDraws.push_back(info); 879 return &fDraws.push_back(info);
847 } 880 }
848 881
849 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { 882 GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() {
850 fCmds.push_back(kStencilPath_Cmd); 883 addToCmdBuffer(kStencilPath_Cmd);
851 return &fStencilPaths.push_back(); 884 return &fStencilPaths.push_back();
852 } 885 }
853 886
854 GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { 887 GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() {
855 fCmds.push_back(kDrawPath_Cmd); 888 addToCmdBuffer(kDrawPath_Cmd);
856 return &fDrawPaths.push_back(); 889 return &fDrawPaths.push_back();
857 } 890 }
858 891
859 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { 892 GrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() {
860 fCmds.push_back(kClear_Cmd); 893 addToCmdBuffer(kClear_Cmd);
861 return &fClears.push_back(); 894 return &fClears.push_back();
862 } 895 }
863 896
864 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { 897 GrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() {
865 fCmds.push_back(kCopySurface_Cmd); 898 addToCmdBuffer(kCopySurface_Cmd);
866 return &fCopySurfaces.push_back(); 899 return &fCopySurfaces.push_back();
867 } 900 }
868 901
869
870 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { 902 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) {
871 INHERITED::clipWillBeSet(newClipData); 903 INHERITED::clipWillBeSet(newClipData);
872 fClipSet = true; 904 fClipSet = true;
873 fClipProxyState = kUnknown_ClipProxyState; 905 fClipProxyState = kUnknown_ClipProxyState;
874 } 906 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698