blob: 2d909be482c73587454221a387e4eca9558b6d34 [file] [log] [blame]
egdaniel3658f382014-09-15 07:01:59 -07001/*
egdaniel8dd688b2015-01-22 10:16:09 -08002 * Copyright 2015 Google Inc.
egdaniel3658f382014-09-15 07:01:59 -07003 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
egdaniel8dd688b2015-01-22 10:16:09 -08008#ifndef GrPipeline_DEFINED
9#define GrPipeline_DEFINED
egdaniel3658f382014-09-15 07:01:59 -070010
egdanielb109ac22014-10-07 06:45:44 -070011#include "GrColor.h"
bsalomonac856c92015-08-27 06:30:17 -070012#include "GrFragmentProcessor.h"
egdanielb109ac22014-10-07 06:45:44 -070013#include "GrGpu.h"
joshualittdbe1e6f2015-07-16 08:12:45 -070014#include "GrNonAtomicRef.h"
bsalomonac856c92015-08-27 06:30:17 -070015#include "GrPendingProgramElement.h"
kkinnunencabe20c2015-06-01 01:37:26 -070016#include "GrPrimitiveProcessor.h"
joshualitt79f8fae2014-10-28 17:59:26 -070017#include "GrProgramDesc.h"
egdanielb109ac22014-10-07 06:45:44 -070018#include "GrStencil.h"
19#include "GrTypesPriv.h"
20#include "SkMatrix.h"
21#include "SkRefCnt.h"
22
joshualitt4d8da812015-01-28 12:53:54 -080023class GrBatch;
joshualitt79f8fae2014-10-28 17:59:26 -070024class GrDeviceCoordTexture;
egdaniel8dd688b2015-01-22 10:16:09 -080025class GrPipelineBuilder;
egdaniel3658f382014-09-15 07:01:59 -070026
ethannicholasff210322015-11-24 12:10:10 -080027struct GrBatchToXPOverrides {
28 bool fUsePLSDstRead;
29};
30
31struct GrPipelineOptimizations {
32 GrProcOptInfo fColorPOI;
33 GrProcOptInfo fCoveragePOI;
34 GrBatchToXPOverrides fOverrides;
35};
36
egdaniel3658f382014-09-15 07:01:59 -070037/**
egdaniel8dd688b2015-01-22 10:16:09 -080038 * Class that holds an optimized version of a GrPipelineBuilder. It is meant to be an immutable
39 * class, and contains all data needed to set the state for a gpu draw.
egdaniel3658f382014-09-15 07:01:59 -070040 */
joshualittdbe1e6f2015-07-16 08:12:45 -070041class GrPipeline : public GrNonAtomicRef {
egdaniel3658f382014-09-15 07:01:59 -070042public:
bsalomoncb02b382015-08-12 11:14:50 -070043 ///////////////////////////////////////////////////////////////////////////
44 /// @name Creation
45
bsalomona387a112015-08-11 14:47:42 -070046 struct CreateArgs {
47 const GrPipelineBuilder* fPipelineBuilder;
48 const GrCaps* fCaps;
ethannicholasff210322015-11-24 12:10:10 -080049 GrPipelineOptimizations fOpts;
cdaltond4727922015-11-10 12:49:06 -080050 const GrScissorState* fScissor;
bsalomona387a112015-08-11 14:47:42 -070051 GrXferProcessor::DstTexture fDstTexture;
52 };
53
bsalomon47dfc362015-08-10 08:23:11 -070054 /** Creates a pipeline into a pre-allocated buffer */
ethannicholasff210322015-11-24 12:10:10 -080055 static GrPipeline* CreateAt(void* memory, const CreateArgs&, GrXPOverridesForBatch*);
egdanielb109ac22014-10-07 06:45:44 -070056
bsalomoncb02b382015-08-12 11:14:50 -070057 /// @}
58
59 ///////////////////////////////////////////////////////////////////////////
60 /// @name Comparisons
61
62 /**
joshualitt2fe79232015-08-05 12:02:27 -070063 * Returns true if these pipelines are equivalent. Coord transforms may be applied either on
64 * the GPU or the CPU. When we apply them on the CPU then the matrices need not agree in order
65 * to combine draws. Therefore we take a param that indicates whether coord transforms should be
66 * compared."
joshualitt9b989322014-12-15 14:16:27 -080067 */
bsalomoncb02b382015-08-12 11:14:50 -070068 static bool AreEqual(const GrPipeline& a, const GrPipeline& b, bool ignoreCoordTransforms);
69
70 /**
71 * Allows a GrBatch subclass to determine whether two GrBatches can combine. This is a stricter
72 * test than isEqual because it also considers blend barriers when the two batches' bounds
73 * overlap
74 */
75 static bool CanCombine(const GrPipeline& a, const SkRect& aBounds,
76 const GrPipeline& b, const SkRect& bBounds,
77 const GrCaps& caps,
78 bool ignoreCoordTransforms = false) {
79 if (!AreEqual(a, b, ignoreCoordTransforms)) {
80 return false;
81 }
82 if (a.xferBarrierType(caps)) {
83 return aBounds.fRight <= bBounds.fLeft ||
84 aBounds.fBottom <= bBounds.fTop ||
85 bBounds.fRight <= aBounds.fLeft ||
86 bBounds.fBottom <= aBounds.fTop;
87 }
88 return true;
89 }
egdaniel89af44a2014-09-26 06:15:04 -070090
91 /// @}
92
93 ///////////////////////////////////////////////////////////////////////////
bsalomon6be6f7c2015-02-26 13:05:21 -080094 /// @name GrFragmentProcessors
egdaniel89af44a2014-09-26 06:15:04 -070095
robertphillips498d7ac2015-10-30 10:11:30 -070096 // Make the renderTarget's drawTarget (if it exists) be dependent on any
97 // drawTargets in this pipeline
98 void addDependenciesTo(GrRenderTarget* rt) const;
bsalomon6be6f7c2015-02-26 13:05:21 -080099
bsalomonac856c92015-08-27 06:30:17 -0700100 int numColorFragmentProcessors() const { return fNumColorProcessors; }
101 int numCoverageFragmentProcessors() const {
102 return fFragmentProcessors.count() - fNumColorProcessors;
103 }
104 int numFragmentProcessors() const { return fFragmentProcessors.count(); }
egdaniel89af44a2014-09-26 06:15:04 -0700105
egdaniel378092f2014-12-03 10:40:13 -0800106 const GrXferProcessor* getXferProcessor() const { return fXferProcessor.get(); }
107
bsalomonac856c92015-08-27 06:30:17 -0700108 const GrFragmentProcessor& getColorFragmentProcessor(int idx) const {
109 SkASSERT(idx < this->numColorFragmentProcessors());
110 return *fFragmentProcessors[idx].get();
egdanield9aa2182014-10-09 13:47:05 -0700111 }
bsalomonac856c92015-08-27 06:30:17 -0700112
113 const GrFragmentProcessor& getCoverageFragmentProcessor(int idx) const {
114 SkASSERT(idx < this->numCoverageFragmentProcessors());
115 return *fFragmentProcessors[fNumColorProcessors + idx].get();
egdanield9aa2182014-10-09 13:47:05 -0700116 }
bsalomonac856c92015-08-27 06:30:17 -0700117
118 const GrFragmentProcessor& getFragmentProcessor(int idx) const {
119 return *fFragmentProcessors[idx].get();
bsalomonae59b772014-11-19 08:23:49 -0800120 }
egdaniel89af44a2014-09-26 06:15:04 -0700121
122 /// @}
123
egdaniel89af44a2014-09-26 06:15:04 -0700124 /**
125 * Retrieves the currently set render-target.
126 *
127 * @return The currently set render target.
128 */
bsalomon37dd3312014-11-03 08:47:23 -0800129 GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); }
egdaniel89af44a2014-09-26 06:15:04 -0700130
egdaniel89af44a2014-09-26 06:15:04 -0700131 const GrStencilSettings& getStencil() const { return fStencilSettings; }
132
bsalomon3e791242014-12-17 13:43:13 -0800133 const GrScissorState& getScissorState() const { return fScissorState; }
joshualitt54e0c122014-11-19 09:38:51 -0800134
bsalomon04ddf892014-11-19 12:36:22 -0800135 bool isHWAntialiasState() const { return SkToBool(fFlags & kHWAA_Flag); }
bsalomond79c5492015-04-27 10:07:04 -0700136 bool snapVerticesToPixelCenters() const { return SkToBool(fFlags & kSnapVertices_Flag); }
bsalomonae59b772014-11-19 08:23:49 -0800137
bsalomoncb02b382015-08-12 11:14:50 -0700138 GrXferBarrierType xferBarrierType(const GrCaps& caps) const {
139 return fXferProcessor->xferBarrierType(fRenderTarget.get(), caps);
140 }
141
egdaniel89af44a2014-09-26 06:15:04 -0700142 /**
bsalomonae59b772014-11-19 08:23:49 -0800143 * Gets whether the target is drawing clockwise, counterclockwise,
144 * or both faces.
145 * @return the current draw face(s).
egdaniel89af44a2014-09-26 06:15:04 -0700146 */
egdaniel8dd688b2015-01-22 10:16:09 -0800147 GrPipelineBuilder::DrawFace getDrawFace() const { return fDrawFace; }
bsalomonae59b772014-11-19 08:23:49 -0800148
bsalomonae59b772014-11-19 08:23:49 -0800149
150 ///////////////////////////////////////////////////////////////////////////
151
bsalomon50785a32015-02-06 07:02:37 -0800152 bool readsFragPosition() const { return fReadsFragPosition; }
joshualittdafa4d02014-12-04 08:59:10 -0800153
bsalomonae59b772014-11-19 08:23:49 -0800154private:
bsalomonc6998732015-08-10 12:01:15 -0700155 GrPipeline() { /** Initialized in factory function*/ }
bsalomon47dfc362015-08-10 08:23:11 -0700156
egdaniel89af44a2014-09-26 06:15:04 -0700157 /**
bsalomon04ddf892014-11-19 12:36:22 -0800158 * Alter the program desc and inputs (attribs and processors) based on the blend optimization.
egdaniel170f90b2014-09-16 12:54:40 -0700159 */
egdaniel8dd688b2015-01-22 10:16:09 -0800160 void adjustProgramFromOptimizations(const GrPipelineBuilder& ds,
egdaniel95131432014-12-09 11:15:43 -0800161 GrXferProcessor::OptFlags,
162 const GrProcOptInfo& colorPOI,
163 const GrProcOptInfo& coveragePOI,
bsalomonac856c92015-08-27 06:30:17 -0700164 int* firstColorProcessorIdx,
165 int* firstCoverageProcessorIdx);
egdaniela7dc0a82014-09-17 08:25:05 -0700166
egdanielc0648242014-09-22 13:17:02 -0700167 /**
168 * Calculates the primary and secondary output types of the shader. For certain output types
169 * the function may adjust the blend coefficients. After this function is called the src and dst
170 * blend coeffs will represent those used by backend API.
171 */
egdaniel8dd688b2015-01-22 10:16:09 -0800172 void setOutputStateInfo(const GrPipelineBuilder& ds, GrXferProcessor::OptFlags,
bsalomon4b91f762015-05-19 09:29:46 -0700173 const GrCaps&);
egdanielc0648242014-09-22 13:17:02 -0700174
bsalomon04ddf892014-11-19 12:36:22 -0800175 enum Flags {
bsalomonaca31fe2015-09-22 11:38:46 -0700176 kHWAA_Flag = 0x1,
177 kSnapVertices_Flag = 0x2,
bsalomon04ddf892014-11-19 12:36:22 -0800178 };
179
bsalomonae59b772014-11-19 08:23:49 -0800180 typedef GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> RenderTarget;
bsalomonac856c92015-08-27 06:30:17 -0700181 typedef GrPendingProgramElement<const GrFragmentProcessor> PendingFragmentProcessor;
182 typedef SkAutoSTArray<8, PendingFragmentProcessor> FragmentProcessorArray;
egdaniel378092f2014-12-03 10:40:13 -0800183 typedef GrPendingProgramElement<const GrXferProcessor> ProgramXferProcessor;
bsalomonae59b772014-11-19 08:23:49 -0800184 RenderTarget fRenderTarget;
bsalomon3e791242014-12-17 13:43:13 -0800185 GrScissorState fScissorState;
egdaniel89af44a2014-09-26 06:15:04 -0700186 GrStencilSettings fStencilSettings;
joshualitt4d8da812015-01-28 12:53:54 -0800187 GrPipelineBuilder::DrawFace fDrawFace;
bsalomon04ddf892014-11-19 12:36:22 -0800188 uint32_t fFlags;
egdaniel378092f2014-12-03 10:40:13 -0800189 ProgramXferProcessor fXferProcessor;
bsalomonac856c92015-08-27 06:30:17 -0700190 FragmentProcessorArray fFragmentProcessors;
bsalomon50785a32015-02-06 07:02:37 -0800191 bool fReadsFragPosition;
egdanield9aa2182014-10-09 13:47:05 -0700192
bsalomonac856c92015-08-27 06:30:17 -0700193 // This value is also the index in fFragmentProcessors where coverage processors begin.
194 int fNumColorProcessors;
egdaniel89af44a2014-09-26 06:15:04 -0700195
egdaniel89af44a2014-09-26 06:15:04 -0700196 typedef SkRefCnt INHERITED;
egdaniel3658f382014-09-15 07:01:59 -0700197};
198
199#endif