Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(261)

Side by Side Diff: include/gpu/GrProcessor.h

Issue 647863002: Track if all stages modulate inputColor in computeInvariantOutput (Closed) Base URL: https://skia.googlesource.com/skia.git@addSomeFunctions
Patch Set: Rebase Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrProcessor_DEFINED 8 #ifndef GrProcessor_DEFINED
9 #define GrProcessor_DEFINED 9 #define GrProcessor_DEFINED
10 10
(...skipping 20 matching lines...) Expand all
31 effect must reach 0 before the thread terminates and the pool is destroyed. To create a static 31 effect must reach 0 before the thread terminates and the pool is destroyed. To create a static
32 effect use the macro GR_CREATE_STATIC_EFFECT declared below. 32 effect use the macro GR_CREATE_STATIC_EFFECT declared below.
33 */ 33 */
34 class GrProcessor : public GrProgramElement { 34 class GrProcessor : public GrProgramElement {
35 public: 35 public:
36 SK_DECLARE_INST_COUNT(GrProcessor) 36 SK_DECLARE_INST_COUNT(GrProcessor)
37 37
38 virtual ~GrProcessor(); 38 virtual ~GrProcessor();
39 39
40 struct InvariantOutput{ 40 struct InvariantOutput{
41 InvariantOutput() : fColor(0), fValidFlags(0), fIsSingleComponent(false) {} 41 InvariantOutput() : fColor(0), fValidFlags(0), fIsSingleComponent(false) ,
42 fNonMulStageFound(false) {}
42 43
43 void mulByUnknownOpaqueColor() { 44 void mulByUnknownOpaqueColor() {
44 if (this->isOpaque()) { 45 if (this->isOpaque()) {
45 fValidFlags = kA_GrColorComponentFlag; 46 fValidFlags = kA_GrColorComponentFlag;
46 fIsSingleComponent = false; 47 fIsSingleComponent = false;
47 } else { 48 } else {
48 // Since the current state is not opaque we no longer care if th e color being 49 // Since the current state is not opaque we no longer care if th e color being
49 // multiplied is opaque. 50 // multiplied is opaque.
50 this->mulByUnknownColor(); 51 this->mulByUnknownColor();
51 } 52 }
52 } 53 }
53 54
54 void mulByUnknownColor() { 55 void mulByUnknownColor() {
55 if (this->hasZeroAlpha()) { 56 if (this->hasZeroAlpha()) {
56 this->setToTransparentBlack(); 57 this->internalSetToTransparentBlack();
57 } else { 58 } else {
58 this->setToUnknown(); 59 this->internalSetToUnknown();
59 } 60 }
60 } 61 }
61 62
62 void mulByUnknownAlpha() { 63 void mulByUnknownAlpha() {
63 if (this->hasZeroAlpha()) { 64 if (this->hasZeroAlpha()) {
64 this->setToTransparentBlack(); 65 this->internalSetToTransparentBlack();
65 } else { 66 } else {
66 // We don't need to change fIsSingleComponent in this case 67 // We don't need to change fIsSingleComponent in this case
67 fValidFlags = 0; 68 fValidFlags = 0;
68 } 69 }
69 } 70 }
70 71
71 void invalidateComponents(uint8_t invalidateFlags) { 72 void invalidateComponents(uint8_t invalidateFlags) {
72 fValidFlags &= ~invalidateFlags; 73 fValidFlags &= ~invalidateFlags;
73 fIsSingleComponent = false; 74 fIsSingleComponent = false;
74 } 75 }
75 76
76 void setToTransparentBlack() { 77 void setToTransparentBlack() {
77 fValidFlags = kRGBA_GrColorComponentFlags; 78 this->internalSetToTransparentBlack();
78 fColor = 0; 79 fNonMulStageFound = true;
79 fIsSingleComponent = true;
80 } 80 }
81 81
82 void setToOther(uint8_t validFlags, GrColor color) { 82 void setToOther(uint8_t validFlags, GrColor color) {
83 fValidFlags = validFlags; 83 fValidFlags = validFlags;
84 fColor = color; 84 fColor = color;
85 fIsSingleComponent = false; 85 fIsSingleComponent = false;
86 fNonMulStageFound = true;
86 } 87 }
87 88
88 void setToUnknown() { 89 void setToUnknown() {
89 fValidFlags = 0; 90 this->internalSetToUnknown();
90 fIsSingleComponent = false; 91 fNonMulStageFound= true;
91 } 92 }
92 93
93 bool isOpaque() const { 94 bool isOpaque() const {
94 return ((fValidFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUn packA(fColor)); 95 return ((fValidFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUn packA(fColor));
95 } 96 }
96 97
97 bool isSolidWhite() const { 98 bool isSolidWhite() const {
98 return (fValidFlags == kRGBA_GrColorComponentFlags && 0xFFFFFFFF == fColor); 99 return (fValidFlags == kRGBA_GrColorComponentFlags && 0xFFFFFFFF == fColor);
99 } 100 }
100 101
101 GrColor color() const { return fColor; } 102 GrColor color() const { return fColor; }
102 uint8_t validFlags() const { return fValidFlags; } 103 uint8_t validFlags() const { return fValidFlags; }
103 104
104 /** 105 /**
105 * If isSingleComponent is true, then the flag values for r, g, b, and a must all be the 106 * If isSingleComponent is true, then the flag values for r, g, b, and a must all be the
106 * same. If the flags are all set then all color components must be equa l. 107 * same. If the flags are all set then all color components must be equa l.
107 */ 108 */
108 SkDEBUGCODE(void validate() const;) 109 SkDEBUGCODE(void validate() const;)
109 110
110 private: 111 private:
112 void internalSetToTransparentBlack() {
113 fValidFlags = kRGBA_GrColorComponentFlags;
114 fColor = 0;
115 fIsSingleComponent = true;
116 }
117
118 void internalSetToUnknown() {
119 fValidFlags = 0;
120 fIsSingleComponent = false;
121 }
122
111 bool hasZeroAlpha() const { 123 bool hasZeroAlpha() const {
112 return ((fValidFlags & kA_GrColorComponentFlag) && 0 == GrColorUnpac kA(fColor)); 124 return ((fValidFlags & kA_GrColorComponentFlag) && 0 == GrColorUnpac kA(fColor));
113 } 125 }
114 126
115 SkDEBUGCODE(bool colorComponentsAllEqual() const;) 127 SkDEBUGCODE(bool colorComponentsAllEqual() const;)
116 /** 128 /**
117 * If alpha is valid, check that any valid R,G,B values are <= A 129 * If alpha is valid, check that any valid R,G,B values are <= A
118 */ 130 */
119 SkDEBUGCODE(bool validPreMulColor() const;) 131 SkDEBUGCODE(bool validPreMulColor() const;)
120 132
121 // Friended class that have "controller" code which loop over stages cal ling 133 // Friended class that have "controller" code which loop over stages cal ling
122 // computeInvarianteOutput(). These controllers may need to manually adj ust the internal 134 // computeInvarianteOutput(). These controllers may need to manually adj ust the internal
123 // members of InvariantOutput 135 // members of InvariantOutput
124 friend class GrDrawState; 136 friend class GrDrawState;
125 friend class GrOptDrawState; 137 friend class GrOptDrawState;
126 friend class GrPaint; 138 friend class GrPaint;
127 139
128 GrColor fColor; 140 GrColor fColor;
129 uint32_t fValidFlags; 141 uint32_t fValidFlags;
130 bool fIsSingleComponent; 142 bool fIsSingleComponent;
143 bool fNonMulStageFound;
131 }; 144 };
132 145
133 /** 146 /**
134 * This function is used to perform optimizations. When called the invarient Ouput param 147 * This function is used to perform optimizations. When called the invarient Ouput param
135 * indicate whether the input components to this effect in the FS will have known values. 148 * indicate whether the input components to this effect in the FS will have known values.
136 * In inout the validFlags member is a bitfield of GrColorComponentFlags. Th e isSingleComponent 149 * In inout the validFlags member is a bitfield of GrColorComponentFlags. Th e isSingleComponent
137 * member indicates whether the input will be 1 or 4 bytes. The function upd ates the members of 150 * member indicates whether the input will be 1 or 4 bytes. The function upd ates the members of
138 * inout to indicate known values of its output. A component of the color me mber only has 151 * inout to indicate known values of its output. A component of the color me mber only has
139 * meaning if the corresponding bit in validFlags is set. 152 * meaning if the corresponding bit in validFlags is set.
140 */ 153 */
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 * This creates an effect outside of the effect memory pool. The effect's destru ctor will be called 324 * This creates an effect outside of the effect memory pool. The effect's destru ctor will be called
312 * at global destruction time. NAME will be the name of the created GrProcessor. 325 * at global destruction time. NAME will be the name of the created GrProcessor.
313 */ 326 */
314 #define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS) \ 327 #define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS) \
315 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage; \ 328 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage; \
316 static GrFragmentProcessor* \ 329 static GrFragmentProcessor* \
317 NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS); \ 330 NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS); \
318 static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME); 331 static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME);
319 332
320 #endif 333 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698