}
};
DEF_BENCH( return (new SkRasterPipelineToSRGB); )
+
+class SkRasterPipelineReuseBench : public Benchmark {
+public:
+ enum Mode { None, Some, Full };
+
+ explicit SkRasterPipelineReuseBench(Mode mode) : fMode(mode), fName("SkRasterPipelineReuse") {
+ switch(mode) {
+ case None: fName.append("_none"); break;
+ case Some: fName.append("_some"); break;
+ case Full: fName.append("_full"); break;
+ }
+ }
+ const char* onGetName() override { return fName.c_str(); }
+ bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
+
+ void onDraw(int loops, SkCanvas*) override {
+ const int kStages = 20;
+ const auto stage = SkRasterPipeline::to_srgb; // Any stage will do. We won't call it.
+
+ switch(fMode) {
+ case None:
+ while (loops --> 0) {
+ SkRasterPipeline p;
+ for (int i = 0; i < kStages; i++) {
+ p.append(stage);
+ }
+ }
+ break;
+
+ case Some:
+ while (loops --> 0) {
+ SkRasterPipeline p(kStages);
+ for (int i = 0; i < kStages; i++) {
+ p.append(stage);
+ }
+ }
+ break;
+
+ case Full:
+ SkRasterPipeline p(kStages);
+ while (loops --> 0) {
+ p.rewind();
+ for (int i = 0; i < kStages; i++) {
+ p.append(stage);
+ }
+ }
+ break;
+ }
+ }
+
+private:
+ Mode fMode;
+ SkString fName;
+};
+DEF_BENCH( return (new SkRasterPipelineReuseBench(SkRasterPipelineReuseBench::None)); )
+DEF_BENCH( return (new SkRasterPipelineReuseBench(SkRasterPipelineReuseBench::Some)); )
+DEF_BENCH( return (new SkRasterPipelineReuseBench(SkRasterPipelineReuseBench::Full)); )
#include "SkRasterPipeline.h"
-SkRasterPipeline::SkRasterPipeline() {}
+SkRasterPipeline::SkRasterPipeline(int size_hint) {
+ fStages.reserve(size_hint);
+}
+
+void SkRasterPipeline::rewind() {
+ fStages.clear();
+}
void SkRasterPipeline::append(StockStage stage, void* ctx) {
SkASSERT(stage != from_srgb);
class SkRasterPipeline {
public:
- SkRasterPipeline();
+ SkRasterPipeline(int size_hint=0);
enum StockStage {
#define M(stage) stage,
bool empty() const { return fStages.empty(); }
+ // Cheaply reset all state so that empty() returns true.
+ void rewind();
+
private:
std::vector<Stage> fStages;
};