12d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org#include "DMPipeTask.h"
22d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org#include "DMUtil.h"
32d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org#include "DMWriteTask.h"
42d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
52d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org#include "SamplePipeControllers.h"
62d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org#include "SkCommandLineFlags.h"
72d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org#include "SkGPipe.h"
82d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
9d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.comDEFINE_bool(pipe, true, "If true, check several pipe variants against the reference bitmap.");
102d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
112d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.orgnamespace DM {
122d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
1390b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.orgstatic uint32_t get_flags(PipeTask::Mode mode) {
142d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    uint32_t flags = 0;
1590b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    if (mode != PipeTask::kInProcess_Mode) {
162d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        flags |= SkGPipeWriter::kCrossProcess_Flag;
1790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    }
1890b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    if (mode == PipeTask::kSharedAddress_Mode) {
1990b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        flags |= SkGPipeWriter::kSharedAddressSpace_Flag;
202d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    }
212d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    return flags;
222d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org}
232d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
242d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.orgstatic const char* get_name(const uint32_t flags) {
252d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    if (flags & SkGPipeWriter::kCrossProcess_Flag &&
262d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        flags & SkGPipeWriter::kSharedAddressSpace_Flag) {
2790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        return "shared_address_space_pipe";
282d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    } else if (flags & SkGPipeWriter::kCrossProcess_Flag) {
292d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        return "cross_process_pipe";
302d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    } else {
312d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        return "pipe";
322d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    }
332d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org}
342d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
352d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.orgPipeTask::PipeTask(const Task& parent,
362d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org                   skiagm::GM* gm,
372d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org                   SkBitmap reference,
3890b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org                   Mode mode)
39ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    : CpuTask(parent)
4090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fFlags(get_flags(mode))
412d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    , fName(UnderJoin(parent.name().c_str(), get_name(fFlags)))
422d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    , fGM(gm)
432d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    , fReference(reference)
442d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    {}
452d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
462d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.orgvoid PipeTask::draw() {
472d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    SkBitmap bitmap;
48266420722e18dcc8b6d4a7379a42b8591ccd2b6dcommit-bot@chromium.org    AllocatePixels(fReference, &bitmap);
492d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
502d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    SkCanvas canvas(bitmap);
512d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    PipeController pipeController(&canvas, &SkImageDecoder::DecodeMemory);
522d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    SkGPipeWriter writer;
532d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
542d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    SkCanvas* pipeCanvas = writer.startRecording(&pipeController,
552d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org                                                 fFlags,
562d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org                                                 bitmap.width(),
572d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org                                                 bitmap.height());
582d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    pipeCanvas->concat(fGM->getInitialTransform());
592d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    fGM->draw(pipeCanvas);
602d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    writer.endRecording();
612d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
622d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    if (!BitmapsEqual(bitmap, fReference)) {
632d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        this->fail();
642d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
652d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    }
662d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org}
672d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
682d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.orgbool PipeTask::shouldSkip() const {
692d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    if (!FLAGS_pipe) {
702d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        return true;
712d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    }
722d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    if (fGM->getFlags() & skiagm::GM::kSkipPipe_Flag) {
732d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        return true;
742d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    }
752d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    if (fFlags == SkGPipeWriter::kCrossProcess_Flag &&
762d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        fGM->getFlags() & skiagm::GM::kSkipPipeCrossProcess_Flag) {
772d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org        return true;
782d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    }
792d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org    return false;
802d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org}
812d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org
822d3a7897e55a76a4dc9f27ae865d1d230163f584commit-bot@chromium.org}  // namespace DM
83