blob: ec1d3b37d5d00dcd1d3855b01141f6411a8d91eb [file] [log] [blame]
Robert Phillips901aff02019-10-08 12:32:56 -04001/*
2 * Copyright 2019 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrProgramInfo_DEFINED
9#define GrProgramInfo_DEFINED
10
11#include "include/gpu/GrTypes.h"
12#include "src/gpu/GrPipeline.h"
13#include "src/gpu/GrPrimitiveProcessor.h"
14
15class GrProgramInfo {
16public:
17 GrProgramInfo(int numSamples,
18 GrSurfaceOrigin origin,
19 const GrPipeline& pipeline,
20 const GrPrimitiveProcessor& primProc,
21 const GrPipeline::FixedDynamicState* fixedDynamicState,
22 const GrPipeline::DynamicStateArrays* dynamicStateArrays)
23 : fNumSamples(numSamples)
24 , fOrigin(origin)
25 , fPipeline(pipeline)
26 , fPrimProc(primProc)
27 , fFixedDynamicState(fixedDynamicState)
28 , fDynamicStateArrays(dynamicStateArrays) {
29 }
30
31 int numSamples() const { return fNumSamples; }
32 GrSurfaceOrigin origin() const { return fOrigin; }
33 const GrPipeline& pipeline() const { return fPipeline; }
34 const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
35 const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
36 const GrPipeline::DynamicStateArrays* dynamicStateArrays() const { return fDynamicStateArrays; }
37
38 // TODO: can this be removed?
39 const GrTextureProxy* const* primProcProxies() const {
40 const GrTextureProxy* const* primProcProxies = nullptr;
41 if (fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures) {
42 primProcProxies = fDynamicStateArrays->fPrimitiveProcessorTextures;
43 } else if (fFixedDynamicState) {
44 primProcProxies = fFixedDynamicState->fPrimitiveProcessorTextures;
45 }
46
47 SkASSERT(SkToBool(primProcProxies) == SkToBool(fPrimProc.numTextureSamplers()));
48 return primProcProxies;
49 }
50
51 bool hasDynamicScissors() const {
52 return fPipeline.isScissorEnabled() &&
53 fDynamicStateArrays && fDynamicStateArrays->fScissorRects;
54 }
55
56 const SkIRect& dynamicScissor(int i) const {
57 SkASSERT(this->hasDynamicScissors());
58
59 return fDynamicStateArrays->fScissorRects[i];
60 }
61
62 bool hasFixedScissor() const { return fPipeline.isScissorEnabled() && fFixedDynamicState; }
63
64 const SkIRect& fixedScissor() const {
65 SkASSERT(this->hasFixedScissor());
66
67 return fFixedDynamicState->fScissorRect;
68 }
69
70 bool hasDynamicPrimProcTextures() const {
71 return fDynamicStateArrays && fDynamicStateArrays->fPrimitiveProcessorTextures;
72 }
73
74 const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
75 SkASSERT(this->hasDynamicPrimProcTextures());
76
77 return fDynamicStateArrays->fPrimitiveProcessorTextures +
78 i * fPrimProc.numTextureSamplers();
79 }
80
81 bool hasFixedPrimProcTextures() const {
82 return fFixedDynamicState && fFixedDynamicState->fPrimitiveProcessorTextures;
83 }
84
85 const GrTextureProxy* const* fixedPrimProcTextures() const {
86 SkASSERT(this->hasFixedPrimProcTextures());
87
88 return fFixedDynamicState->fPrimitiveProcessorTextures;
89 }
90
91#ifdef SK_DEBUG
92 bool isNVPR() const {
93 return fPrimProc.isPathRendering() && !fPrimProc.willUseGeoShader() &&
94 !fPrimProc.numVertexAttributes() && !fPrimProc.numInstanceAttributes();
95 }
96
97 // TODO: calculate this once in the ctor and use more widely
98 GrProcessor::CustomFeatures requestedFeatures() const {
99 GrProcessor::CustomFeatures requestedFeatures = fPrimProc.requestedFeatures();
100 for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
101 requestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
102 }
103 requestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
104 return requestedFeatures;
105 }
106#endif
107
108private:
109 const int fNumSamples;
110 const GrSurfaceOrigin fOrigin;
111 const GrPipeline& fPipeline;
112 const GrPrimitiveProcessor& fPrimProc;
113 const GrPipeline::FixedDynamicState* fFixedDynamicState;
114 const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
115};
116
117#endif