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

Side by Side Diff: src/gpu/gl/GrGLProgramDesc.cpp

Issue 554833002: Calculate Primary and Secondary output types in the GrOptDrawState (Closed) Base URL: https://skia.googlesource.com/skia.git@optReadDst
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
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 "gl/builders/GrGLProgramBuilder.h" 8 #include "gl/builders/GrGLProgramBuilder.h"
9 #include "GrGLProgramDesc.h" 9 #include "GrGLProgramDesc.h"
10 #include "GrBackendEffectFactory.h" 10 #include "GrBackendEffectFactory.h"
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 213
214 if (requiresCoverageAttrib) { 214 if (requiresCoverageAttrib) {
215 header->fCoverageAttributeIndex = optState.coverageVertexAttributeIndex( ); 215 header->fCoverageAttributeIndex = optState.coverageVertexAttributeIndex( );
216 } else if (GrGLProgramDesc::kAttribute_ColorInput == header->fCoverageInput) { 216 } else if (GrGLProgramDesc::kAttribute_ColorInput == header->fCoverageInput) {
217 SkASSERT(availableAttributeIndex < GrDrawState::kMaxVertexAttribCnt); 217 SkASSERT(availableAttributeIndex < GrDrawState::kMaxVertexAttribCnt);
218 header->fCoverageAttributeIndex = availableAttributeIndex; 218 header->fCoverageAttributeIndex = availableAttributeIndex;
219 } else { 219 } else {
220 header->fCoverageAttributeIndex = -1; 220 header->fCoverageAttributeIndex = -1;
221 } 221 }
222 222
223 // Here we deal with whether/how we handle color and coverage separately. 223 header->fPrimaryOutputType = optState.getPrimaryOutputType();
224 224 header->fSecondaryOutputType = optState.getSecondaryOutputType();
225 // Set this default and then possibly change our mind if there is coverage.
226 header->fCoverageOutput = kModulate_CoverageOutput;
227
228 // If we do have coverage determine whether it matters.
229 bool separateCoverageFromColor = optState.hasGeometryProcessor();
230 if (!optState.isCoverageDrawing() &&
231 (optState.numCoverageStages() > 0 ||
232 optState.hasGeometryProcessor() ||
233 requiresCoverageAttrib)) {
234
235 if (gpu->caps()->dualSourceBlendingSupport()) {
236 if (kZero_GrBlendCoeff == dstCoeff) {
237 // write the coverage value to second color
238 header->fCoverageOutput = kSecondaryCoverage_CoverageOutput;
239 separateCoverageFromColor = true;
240 } else if (kSA_GrBlendCoeff == dstCoeff) {
241 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
242 header->fCoverageOutput = kSecondaryCoverageISA_CoverageOutput;
243 separateCoverageFromColor = true;
244 } else if (kSC_GrBlendCoeff == dstCoeff) {
245 // SA dst coeff becomes 1-(1-SA)*coverage when dst is partially covered.
246 header->fCoverageOutput = kSecondaryCoverageISC_CoverageOutput;
247 separateCoverageFromColor = true;
248 }
249 } else if (optState.readsDst() &&
250 kOne_GrBlendCoeff == srcCoeff &&
251 kZero_GrBlendCoeff == dstCoeff) {
252 header->fCoverageOutput = kCombineWithDst_CoverageOutput;
253 separateCoverageFromColor = true;
254 }
255 }
256 225
257 for (int s = 0; s < optState.numColorStages(); ++s) { 226 for (int s = 0; s < optState.numColorStages(); ++s) {
258 colorStages->push_back(&optState.getColorStage(s)); 227 colorStages->push_back(&optState.getColorStage(s));
259 } 228 }
260 SkTArray<const GrEffectStage*, true>* array;
261 if (separateCoverageFromColor) {
262 array = coverageStages;
263 } else {
264 array = colorStages;
265 }
266 for (int s = 0; s < optState.numCoverageStages(); ++s) { 229 for (int s = 0; s < optState.numCoverageStages(); ++s) {
267 array->push_back(&optState.getCoverageStage(s)); 230 coverageStages->push_back(&optState.getCoverageStage(s));
268 } 231 }
269 232
270 header->fColorEffectCnt = colorStages->count(); 233 header->fColorEffectCnt = colorStages->count();
271 header->fCoverageEffectCnt = coverageStages->count(); 234 header->fCoverageEffectCnt = coverageStages->count();
272 235
273 desc->finalize(); 236 desc->finalize();
274 return true; 237 return true;
275 } 238 }
276 239
277 void GrGLProgramDesc::finalize() { 240 void GrGLProgramDesc::finalize() {
278 int keyLength = fKey.count(); 241 int keyLength = fKey.count();
279 SkASSERT(0 == (keyLength % 4)); 242 SkASSERT(0 == (keyLength % 4));
280 *this->atOffset<uint32_t, kLengthOffset>() = SkToU32(keyLength); 243 *this->atOffset<uint32_t, kLengthOffset>() = SkToU32(keyLength);
281 244
282 uint32_t* checksum = this->atOffset<uint32_t, kChecksumOffset>(); 245 uint32_t* checksum = this->atOffset<uint32_t, kChecksumOffset>();
283 *checksum = 0; 246 *checksum = 0;
284 *checksum = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.begin()), k eyLength); 247 *checksum = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.begin()), k eyLength);
285 } 248 }
286 249
287 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) { 250 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) {
288 size_t keyLength = other.keyLength(); 251 size_t keyLength = other.keyLength();
289 fKey.reset(keyLength); 252 fKey.reset(keyLength);
290 memcpy(fKey.begin(), other.fKey.begin(), keyLength); 253 memcpy(fKey.begin(), other.fKey.begin(), keyLength);
291 return *this; 254 return *this;
292 } 255 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698