aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm/DMPipeTask.cpp
blob: 383b51a38d966162284e3af90e40bdf5f760697d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "DMPipeTask.h"
#include "DMUtil.h"
#include "DMWriteTask.h"

#include "SamplePipeControllers.h"
#include "SkCommandLineFlags.h"
#include "SkGPipe.h"

DEFINE_bool(pipe, true, "If true, check several pipe variants against the reference bitmap.");

namespace DM {

static uint32_t get_flags(PipeTask::Mode mode) {
    uint32_t flags = 0;
    if (mode != PipeTask::kInProcess_Mode) {
        flags |= SkGPipeWriter::kCrossProcess_Flag;
    }
    if (mode == PipeTask::kSharedAddress_Mode) {
        flags |= SkGPipeWriter::kSharedAddressSpace_Flag;
    }
    return flags;
}

static const char* get_name(const uint32_t flags) {
    if (flags & SkGPipeWriter::kCrossProcess_Flag &&
        flags & SkGPipeWriter::kSharedAddressSpace_Flag) {
        return "shared-address-space-pipe";
    } else if (flags & SkGPipeWriter::kCrossProcess_Flag) {
        return "cross-process-pipe";
    } else {
        return "pipe";
    }
}

PipeTask::PipeTask(const Task& parent,
                   skiagm::GM* gm,
                   SkBitmap reference,
                   Mode mode)
    : CpuTask(parent)
    , fFlags(get_flags(mode))
    , fName(UnderJoin(parent.name().c_str(), get_name(fFlags)))
    , fGM(gm)
    , fReference(reference)
    {}

void PipeTask::draw() {
    SkBitmap bitmap;
    AllocatePixels(fReference, &bitmap);

    SkCanvas canvas(bitmap);
    PipeController pipeController(&canvas, &SkImageDecoder::DecodeMemory);
    SkGPipeWriter writer;

    SkCanvas* pipeCanvas = writer.startRecording(&pipeController,
                                                 fFlags,
                                                 bitmap.width(),
                                                 bitmap.height());
    CanvasPreflight(pipeCanvas);
    pipeCanvas->concat(fGM->getInitialTransform());
    fGM->draw(pipeCanvas);
    writer.endRecording();

    if (!BitmapsEqual(bitmap, fReference)) {
        this->fail();
        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, "GM", bitmap)));
    }
}

bool PipeTask::shouldSkip() const {
    if (!FLAGS_pipe) {
        return true;
    }
    if (fGM->getFlags() & skiagm::GM::kSkipPipe_Flag) {
        return true;
    }
    if (fFlags == SkGPipeWriter::kCrossProcess_Flag &&
        fGM->getFlags() & skiagm::GM::kSkipPipeCrossProcess_Flag) {
        return true;
    }
    return false;
}

}  // namespace DM