1ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon/*
2ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * Copyright 2014 Google Inc.
3ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon *
4ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * Use of this source code is governed by a BSD-style license that can be
5ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * found in the LICENSE file.
6ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon */
7ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
8ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#ifndef GrPendingProcessorStage_DEFINED
9ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#define GrPendingProcessorStage_DEFINED
10ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
11ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "GrFragmentStage.h"
12ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "GrCoordTransform.h"
13ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "GrFragmentProcessor.h"
14ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "GrPendingProgramElement.h"
15ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
16ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon/**
17ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * This a baked variant of GrFragmentStage, as recorded in GrOptDrawState.
18ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon */
19ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomonclass GrPendingFragmentStage {
20ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomonpublic:
2140d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt    GrPendingFragmentStage(const GrFragmentStage& stage) : fProc(stage.processor()) {}
22ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
23ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    GrPendingFragmentStage(const GrPendingFragmentStage& that) { *this = that; }
24ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
25ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    GrPendingFragmentStage& operator=(const GrPendingFragmentStage& that) {
26ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        fProc.reset(that.fProc.get());
27ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        return *this;
28ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
29ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
30ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    bool operator==(const GrPendingFragmentStage& that) const {
3140d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt        return this->processor()->isEqual(*that.processor());
32ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
33ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
34ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    bool operator!=(const GrPendingFragmentStage& that) const { return !(*this == that); }
35ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
36ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    /**
37ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon     * For a coord transform on the fragment processor, does it or the coord change matrix (if
38ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon     * relevant) contain perspective?
39ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon     */
40ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    bool isPerspectiveCoordTransform(int matrixIndex) const {
4140d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt        const GrCoordTransform& coordTransform = this->processor()->coordTransform(matrixIndex);
42ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        uint32_t type = coordTransform.getMatrix().getType();
43ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        return SkToBool(SkMatrix::kPerspective_Mask & type);
44ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
45ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
46ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    const char* name() const { return fProc->name(); }
47ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
4840d4bd8dafe9ed844f29a3de3d8965672248ee73joshualitt    const GrFragmentProcessor* processor() const { return fProc.get(); }
49ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
50ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomonprotected:
51ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    GrPendingProgramElement<const GrFragmentProcessor>  fProc;
52ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon};
53ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#endif
54