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

Unified Diff: src/gpu/GrInOrderDrawBuffer.cpp

Issue 209413006: Make it possible to draw multiple paths at once to a draw target (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: address review comment 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrInOrderDrawBuffer.h ('k') | src/gpu/gl/GrGpuGL.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrInOrderDrawBuffer.cpp
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index 44bf4edab7aa7aefdae0a1d282af4dc3370a533b..d9cbc914b015a78c655a3fc7f877fd6f65bf958c 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -386,6 +386,16 @@ void GrInOrderDrawBuffer::onDraw(const DrawInfo& info) {
GrInOrderDrawBuffer::StencilPath::StencilPath() {}
GrInOrderDrawBuffer::DrawPath::DrawPath() {}
+GrInOrderDrawBuffer::DrawPaths::DrawPaths() {}
+GrInOrderDrawBuffer::DrawPaths::~DrawPaths() {
+ if (fTransforms) {
+ SkDELETE_ARRAY(fTransforms);
+ }
+ for (size_t i = 0; i < fPathCount; ++i) {
+ fPaths[i]->unref();
+ }
+ SkDELETE_ARRAY(fPaths);
+}
void GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fill) {
if (this->needsNewClip()) {
@@ -419,6 +429,38 @@ void GrInOrderDrawBuffer::onDrawPath(const GrPath* path,
}
}
+void GrInOrderDrawBuffer::onDrawPaths(size_t pathCount, const GrPath** paths,
+ const SkMatrix* transforms,
+ SkPath::FillType fill,
+ SkStrokeRec::Style stroke,
+ const GrDeviceCoordTexture* dstCopy) {
+ SkASSERT(pathCount);
+
+ if (this->needsNewClip()) {
+ this->recordClip();
+ }
+ if (this->needsNewState()) {
+ this->recordState();
+ }
+ DrawPaths* dp = this->recordDrawPaths();
+ dp->fPathCount = pathCount;
+ dp->fPaths = SkNEW_ARRAY(const GrPath*, pathCount);
+ memcpy(dp->fPaths, paths, sizeof(GrPath*) * pathCount);
+ for (size_t i = 0; i < pathCount; ++i) {
+ dp->fPaths[i]->ref();
+ }
+
+ dp->fTransforms = SkNEW_ARRAY(SkMatrix, pathCount);
+ memcpy(dp->fTransforms, transforms, sizeof(SkMatrix) * pathCount);
+
+ dp->fFill = fill;
+ dp->fStroke = stroke;
+
+ if (NULL != dstCopy) {
+ dp->fDstCopy = *dstCopy;
+ }
+}
+
void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color,
bool canIgnoreRect, GrRenderTarget* renderTarget) {
SkIRect r;
@@ -467,6 +509,7 @@ void GrInOrderDrawBuffer::reset() {
fCmds.reset();
fDraws.reset();
fStencilPaths.reset();
+ fDrawPath.reset();
fDrawPaths.reset();
fStates.reset();
fClears.reset();
@@ -513,6 +556,7 @@ void GrInOrderDrawBuffer::flush() {
int currDraw = 0;
int currStencilPath = 0;
int currDrawPath = 0;
+ int currDrawPaths = 0;
int currCopySurface = 0;
for (int c = 0; c < numCmds; ++c) {
@@ -535,12 +579,22 @@ void GrInOrderDrawBuffer::flush() {
break;
}
case kDrawPath_Cmd: {
- const DrawPath& cp = fDrawPaths[currDrawPath];
+ const DrawPath& cp = fDrawPath[currDrawPath];
fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill,
NULL != cp.fDstCopy.texture() ? &cp.fDstCopy : NULL);
++currDrawPath;
break;
}
+ case kDrawPaths_Cmd: {
+ DrawPaths& dp = fDrawPaths[currDrawPaths];
+ const GrDeviceCoordTexture* dstCopy =
+ NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL;
+ fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths,
+ dp.fTransforms, dp.fFill, dp.fStroke,
+ dstCopy);
+ ++currDrawPaths;
+ break;
+ }
case kSetState_Cmd:
fStates[currState].restoreTo(&playbackState);
++currState;
@@ -853,6 +907,11 @@ GrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() {
GrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() {
fCmds.push_back(kDrawPath_Cmd);
+ return &fDrawPath.push_back();
+}
+
+GrInOrderDrawBuffer::DrawPaths* GrInOrderDrawBuffer::recordDrawPaths() {
+ fCmds.push_back(kDrawPaths_Cmd);
return &fDrawPaths.push_back();
}
« no previous file with comments | « src/gpu/GrInOrderDrawBuffer.h ('k') | src/gpu/gl/GrGpuGL.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698