aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkLayerInfo.cpp15
-rw-r--r--src/core/SkLayerInfo.h77
-rw-r--r--src/core/SkPictureRecorder.cpp21
-rw-r--r--src/core/SkRecordDraw.cpp47
-rw-r--r--src/core/SkRecordDraw.h8
5 files changed, 119 insertions, 49 deletions
diff --git a/src/core/SkLayerInfo.cpp b/src/core/SkLayerInfo.cpp
new file mode 100644
index 0000000000..d427fa7c21
--- /dev/null
+++ b/src/core/SkLayerInfo.cpp
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkLayerInfo.h"
+
+SkPicture::AccelData::Key SkLayerInfo::ComputeKey() {
+ static const SkPicture::AccelData::Key gGPUID = SkPicture::AccelData::GenerateDomain();
+
+ return gGPUID;
+}
+
diff --git a/src/core/SkLayerInfo.h b/src/core/SkLayerInfo.h
new file mode 100644
index 0000000000..dd0eaf032a
--- /dev/null
+++ b/src/core/SkLayerInfo.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkLayerInfo_DEFINED
+#define SkLayerInfo_DEFINED
+
+#include "SkPicture.h"
+#include "SkTArray.h"
+
+// This class stores information about the saveLayer/restore pairs found
+// within an SkPicture. It is used by Ganesh to perform layer hoisting.
+class SkLayerInfo : public SkPicture::AccelData {
+public:
+ // Information about a given saveLayer/restore block in an SkPicture
+ class BlockInfo {
+ public:
+ BlockInfo() : fPicture(NULL), fPaint(NULL) {}
+ ~BlockInfo() { SkSafeUnref(fPicture); SkDELETE(fPaint); }
+
+ // The picture owning the layer. If the owning picture is the top-most
+ // one (i.e., the picture for which this SkLayerInfo was created) then
+ // this pointer is NULL. If it is a nested picture then the pointer
+ // is non-NULL and owns a ref on the picture.
+ const SkPicture* fPicture;
+ // The device space bounds of this layer.
+ SkRect fBounds;
+ // The pre-matrix begins as the identity and accumulates the transforms
+ // of the containing SkPictures (if any). This matrix state has to be
+ // part of the initial matrix during replay so that it will be
+ // preserved across setMatrix calls.
+ SkMatrix fPreMat;
+ // The matrix state (in the leaf picture) in which this layer's draws
+ // must occur. It will/can be overridden by setMatrix calls in the
+ // layer itself. It does not include the translation needed to map the
+ // layer's top-left point to the origin (which must be part of the
+ // initial matrix).
+ SkMatrix fLocalMat;
+ // The paint to use on restore. Can be NULL since it is optional.
+ const SkPaint* fPaint;
+ // The index of this saveLayer in the picture.
+ size_t fSaveLayerOpID;
+ // The index of the matching restore in the picture.
+ size_t fRestoreOpID;
+ // True if this saveLayer has at least one other saveLayer nested within it.
+ // False otherwise.
+ bool fHasNestedLayers;
+ // True if this saveLayer is nested within another. False otherwise.
+ bool fIsNested;
+ };
+
+ SkLayerInfo(Key key) : INHERITED(key) { }
+
+ BlockInfo& addBlock() { return fBlocks.push_back(); }
+
+ int numBlocks() const { return fBlocks.count(); }
+
+ const BlockInfo& block(int index) const {
+ SkASSERT(index < fBlocks.count());
+
+ return fBlocks[index];
+ }
+
+ // We may, in the future, need to pass in the GPUDevice in order to
+ // incorporate the clip and matrix state into the key
+ static SkPicture::AccelData::Key ComputeKey();
+
+private:
+ SkTArray<BlockInfo, true> fBlocks;
+
+ typedef SkPicture::AccelData INHERITED;
+};
+
+#endif // SkLayerInfo_DEFINED
diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp
index 160446797d..3441a0dfeb 100644
--- a/src/core/SkPictureRecorder.cpp
+++ b/src/core/SkPictureRecorder.cpp
@@ -5,6 +5,7 @@
* found in the LICENSE file.
*/
+#include "SkLayerInfo.h"
#include "SkPictureRecorder.h"
#include "SkRecord.h"
#include "SkRecordDraw.h"
@@ -12,12 +13,6 @@
#include "SkRecordOpts.h"
#include "SkTypes.h"
-// Must place SK_SUPPORT_GPU after other includes so it is defined in the
-// Android framework build.
-#if SK_SUPPORT_GPU
-#include "GrPictureUtils.h"
-#endif
-
SkPictureRecorder::SkPictureRecorder() {}
SkPictureRecorder::~SkPictureRecorder() {}
@@ -47,37 +42,29 @@ SkPicture* SkPictureRecorder::endRecording() {
// TODO: delay as much of this work until just before first playback?
SkRecordOptimize(fRecord);
-#if SK_SUPPORT_GPU
- SkAutoTUnref<GrAccelData> saveLayerData;
+ SkAutoTUnref<SkLayerInfo> saveLayerData;
if (fBBH && (fFlags & kComputeSaveLayerInfo_RecordFlag)) {
- SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey();
+ SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
- saveLayerData.reset(SkNEW_ARGS(GrAccelData, (key)));
+ saveLayerData.reset(SkNEW_ARGS(SkLayerInfo, (key)));
}
-#endif
if (fBBH.get()) {
SkRect cullRect = SkRect::MakeWH(fCullWidth, fCullHeight);
-#if SK_SUPPORT_GPU
if (saveLayerData) {
SkRecordComputeLayers(cullRect, *fRecord, fBBH.get(), saveLayerData);
} else {
-#endif
SkRecordFillBounds(cullRect, *fRecord, fBBH.get());
-#if SK_SUPPORT_GPU
}
-#endif
}
SkPicture* pict = SkNEW_ARGS(SkPicture, (fCullWidth, fCullHeight, fRecord.detach(), fBBH.get()));
-#if SK_SUPPORT_GPU
if (saveLayerData) {
pict->EXPERIMENTAL_addAccelData(saveLayerData);
}
-#endif
return pict;
}
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp
index 9075e508f7..e35e5a0a9d 100644
--- a/src/core/SkRecordDraw.cpp
+++ b/src/core/SkRecordDraw.cpp
@@ -5,13 +5,10 @@
* found in the LICENSE file.
*/
+#include "SkLayerInfo.h"
#include "SkRecordDraw.h"
#include "SkPatchUtils.h"
-#if SK_SUPPORT_GPU
-#include "GrPictureUtils.h"
-#endif
-
void SkRecordDraw(const SkRecord& record,
SkCanvas* canvas,
const SkBBoxHierarchy* bbh,
@@ -570,11 +567,10 @@ private:
SkTDArray<unsigned> fControlIndices;
};
-#if SK_SUPPORT_GPU
// SkRecord visitor to gather saveLayer/restore information.
class CollectLayers : SkNoncopyable {
public:
- CollectLayers(const SkRect& cullRect, const SkRecord& record, GrAccelData* accelData)
+ CollectLayers(const SkRect& cullRect, const SkRecord& record, SkLayerInfo* accelData)
: fSaveLayersInStack(0)
, fAccelData(accelData)
, fFillBounds(cullRect, record) {
@@ -624,10 +620,10 @@ private:
void trackSaveLayers(const DrawPicture& dp) {
// For sub-pictures, we wrap their layer information within the parent
// picture's rendering hierarchy
- SkPicture::AccelData::Key key = GrAccelData::ComputeAccelDataKey();
+ SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
- const GrAccelData* childData =
- static_cast<const GrAccelData*>(dp.picture->EXPERIMENTAL_getAccelData(key));
+ const SkLayerInfo* childData =
+ static_cast<const SkLayerInfo*>(dp.picture->EXPERIMENTAL_getAccelData(key));
if (!childData) {
// If the child layer hasn't been generated with saveLayer data we
// assume the worst (i.e., that it does contain layers which nest
@@ -638,8 +634,8 @@ private:
return;
}
- for (int i = 0; i < childData->numSaveLayers(); ++i) {
- const GrAccelData::SaveLayerInfo& src = childData->saveLayerInfo(i);
+ for (int i = 0; i < childData->numBlocks(); ++i) {
+ const SkLayerInfo::BlockInfo& src = childData->block(i);
FillBounds::Bounds newBound = fFillBounds.adjustAndMap(src.fBounds, dp.paint);
if (newBound.isEmpty()) {
@@ -648,7 +644,7 @@ private:
this->updateStackForSaveLayer();
- GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo();
+ SkLayerInfo::BlockInfo& dst = fAccelData->addBlock();
// If src.fPicture is NULL the layer is in dp.picture; otherwise
// it belongs to a sub-picture.
@@ -706,30 +702,29 @@ private:
--fSaveLayersInStack;
- GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo();
+ SkLayerInfo::BlockInfo& block = fAccelData->addBlock();
- SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most picture
+ SkASSERT(NULL == block.fPicture); // This layer is in the top-most picture
- slInfo.fBounds = fFillBounds.getBounds(sli.fStartIndex);
- slInfo.fLocalMat = fFillBounds.ctm();
- slInfo.fPreMat = SkMatrix::I();
+ block.fBounds = fFillBounds.getBounds(sli.fStartIndex);
+ block.fLocalMat = fFillBounds.ctm();
+ block.fPreMat = SkMatrix::I();
if (sli.fPaint) {
- slInfo.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint));
+ block.fPaint = SkNEW_ARGS(SkPaint, (*sli.fPaint));
}
- slInfo.fSaveLayerOpID = sli.fStartIndex;
- slInfo.fRestoreOpID = fFillBounds.currentOp();
- slInfo.fHasNestedLayers = sli.fHasNestedSaveLayer;
- slInfo.fIsNested = fSaveLayersInStack > 0;
+ block.fSaveLayerOpID = sli.fStartIndex;
+ block.fRestoreOpID = fFillBounds.currentOp();
+ block.fHasNestedLayers = sli.fHasNestedSaveLayer;
+ block.fIsNested = fSaveLayersInStack > 0;
}
// Used to collect saveLayer information for layer hoisting
int fSaveLayersInStack;
SkTDArray<SaveLayerInfo> fSaveLayerStack;
- GrAccelData* fAccelData;
+ SkLayerInfo* fAccelData;
SkRecords::FillBounds fFillBounds;
};
-#endif
} // namespace SkRecords
@@ -744,9 +739,8 @@ void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkBBoxHi
visitor.cleanUp(bbh);
}
-#if SK_SUPPORT_GPU
void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
- SkBBoxHierarchy* bbh, GrAccelData* data) {
+ SkBBoxHierarchy* bbh, SkLayerInfo* data) {
SkRecords::CollectLayers visitor(cullRect, record, data);
for (unsigned curOp = 0; curOp < record.count(); curOp++) {
@@ -756,5 +750,4 @@ void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
visitor.cleanUp(bbh);
}
-#endif
diff --git a/src/core/SkRecordDraw.h b/src/core/SkRecordDraw.h
index 8df64cbecd..9b39dd6adb 100644
--- a/src/core/SkRecordDraw.h
+++ b/src/core/SkRecordDraw.h
@@ -14,15 +14,13 @@
#include "SkMatrix.h"
#include "SkRecord.h"
+class SkLayerInfo;
+
// Fill a BBH to be used by SkRecordDraw to accelerate playback.
void SkRecordFillBounds(const SkRect& cullRect, const SkRecord&, SkBBoxHierarchy*);
-#if SK_SUPPORT_GPU
-class GrAccelData;
-
void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
- SkBBoxHierarchy* bbh, GrAccelData* data);
-#endif
+ SkBBoxHierarchy* bbh, SkLayerInfo* data);
// Draw an SkRecord into an SkCanvas. A convenience wrapper around SkRecords::Draw.
void SkRecordDraw(const SkRecord&, SkCanvas*, const SkBBoxHierarchy*, SkDrawPictureCallback*);