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

Side by Side Diff: src/gpu/GrRODrawState.cpp

Issue 504203004: Attach GrOptDrawState into shader building pipeline (Closed) Base URL: https://skia.googlesource.com/skia.git@opt2
Patch Set: Rebase Created 6 years, 3 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 | « src/gpu/GrRODrawState.h ('k') | src/gpu/gl/GrGLProgram.h » ('j') | 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 2014 Google Inc. 2 * Copyright 2014 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 #include "GrRODrawState.h" 8 #include "GrRODrawState.h"
9 9
10 #include "GrDrawTargetCaps.h" 10 #include "GrDrawTargetCaps.h"
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 GrBlendCoeff* srcCoeff, 177 GrBlendCoeff* srcCoeff,
178 GrBlendCoeff* dstCoeff) const { 178 GrBlendCoeff* dstCoeff) const {
179 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff; 179 GrBlendCoeff bogusSrcCoeff, bogusDstCoeff;
180 if (NULL == srcCoeff) { 180 if (NULL == srcCoeff) {
181 srcCoeff = &bogusSrcCoeff; 181 srcCoeff = &bogusSrcCoeff;
182 } 182 }
183 if (NULL == dstCoeff) { 183 if (NULL == dstCoeff) {
184 dstCoeff = &bogusDstCoeff; 184 dstCoeff = &bogusDstCoeff;
185 } 185 }
186 186
187 if (forceCoverage) {
188 return this->calcBlendOpts(true, srcCoeff, dstCoeff);
189 }
190
191 if (0 == (fBlendOptFlags & kInvalid_BlendOptFlag)) {
192 *srcCoeff = fOptSrcBlend;
193 *dstCoeff = fOptDstBlend;
194 return fBlendOptFlags;
195 }
196
197 fBlendOptFlags = this->calcBlendOpts(forceCoverage, srcCoeff, dstCoeff);
198 fOptSrcBlend = *srcCoeff;
199 fOptDstBlend = *dstCoeff;
200
201 return fBlendOptFlags;
202 }
203
204 GrRODrawState::BlendOptFlags GrRODrawState::calcBlendOpts(bool forceCoverage,
205 GrBlendCoeff* srcCoeff ,
206 GrBlendCoeff* dstCoeff ) const {
207 *srcCoeff = this->getSrcBlendCoeff(); 187 *srcCoeff = this->getSrcBlendCoeff();
208 *dstCoeff = this->getDstBlendCoeff(); 188 *dstCoeff = this->getDstBlendCoeff();
209 189
210 if (this->isColorWriteDisabled()) { 190 if (this->isColorWriteDisabled()) {
211 *srcCoeff = kZero_GrBlendCoeff; 191 *srcCoeff = kZero_GrBlendCoeff;
212 *dstCoeff = kOne_GrBlendCoeff; 192 *dstCoeff = kOne_GrBlendCoeff;
213 } 193 }
214 194
215 bool srcAIsOne = this->srcAlphaWillBeOne(); 195 bool srcAIsOne = this->srcAlphaWillBeOne();
216 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff || 196 bool dstCoeffIsOne = kOne_GrBlendCoeff == *dstCoeff ||
217 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne); 197 (kSA_GrBlendCoeff == *dstCoeff && srcAIsOne);
218 bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff || 198 bool dstCoeffIsZero = kZero_GrBlendCoeff == *dstCoeff ||
219 (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne); 199 (kISA_GrBlendCoeff == *dstCoeff && srcAIsOne);
220 200
221 // When coeffs are (0,1) there is no reason to draw at all, unless 201 // When coeffs are (0,1) there is no reason to draw at all, unless
222 // stenciling is enabled. Having color writes disabled is effectively 202 // stenciling is enabled. Having color writes disabled is effectively
223 // (0,1). 203 // (0,1).
224 if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne)) { 204 if ((kZero_GrBlendCoeff == *srcCoeff && dstCoeffIsOne)) {
225 if (this->getStencil().doesWrite()) { 205 if (this->getStencil().doesWrite()) {
226 return kEmitCoverage_BlendOptFlag; 206 return kEmitCoverage_BlendOptFlag;
227 } else { 207 } else {
208 *dstCoeff = kOne_GrBlendCoeff;
228 return kSkipDraw_BlendOptFlag; 209 return kSkipDraw_BlendOptFlag;
229 } 210 }
230 } 211 }
231 212
232 bool hasCoverage = forceCoverage || !this->hasSolidCoverage(); 213 bool hasCoverage = forceCoverage || !this->hasSolidCoverage();
233 214
234 // if we don't have coverage we can check whether the dst 215 // if we don't have coverage we can check whether the dst
235 // has to read at all. If not, we'll disable blending. 216 // has to read at all. If not, we'll disable blending.
236 if (!hasCoverage) { 217 if (!hasCoverage) {
237 if (dstCoeffIsZero) { 218 if (dstCoeffIsZero) {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 // Since the shader will multiply coverage and color, the only way the f inal A==1 is if 346 // Since the shader will multiply coverage and color, the only way the f inal A==1 is if
366 // coverage and color both have A==1. 347 // coverage and color both have A==1.
367 return (kA_GrColorComponentFlag & validComponentFlags & coverageComponen tFlags) && 348 return (kA_GrColorComponentFlag & validComponentFlags & coverageComponen tFlags) &&
368 0xFF == GrColorUnpackA(color) && 0xFF == GrColorUnpackA(coverage ); 349 0xFF == GrColorUnpackA(color) && 0xFF == GrColorUnpackA(coverage );
369 350
370 } 351 }
371 352
372 return (kA_GrColorComponentFlag & validComponentFlags) && 0xFF == GrColorUnp ackA(color); 353 return (kA_GrColorComponentFlag & validComponentFlags) && 0xFF == GrColorUnp ackA(color);
373 } 354 }
374 355
375 ////////////////////////////////////////////////////////////////////////////////
376
377 bool GrRODrawState::canIgnoreColorAttribute() const {
378 if (fBlendOptFlags & kInvalid_BlendOptFlag) {
379 this->getBlendOpts();
380 }
381 return SkToBool(fBlendOptFlags & (GrRODrawState::kEmitTransBlack_BlendOptFla g |
382 GrRODrawState::kEmitCoverage_BlendOptFlag) );
383 }
384
OLDNEW
« no previous file with comments | « src/gpu/GrRODrawState.h ('k') | src/gpu/gl/GrGLProgram.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698