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

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

Issue 25023003: Implement color filter as GrGLEffect (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
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 "GrGLProgramDesc.h" 8 #include "GrGLProgramDesc.h"
9 #include "GrBackendEffectFactory.h" 9 #include "GrBackendEffectFactory.h"
10 #include "GrDrawEffect.h" 10 #include "GrDrawEffect.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 // to a canonical value to avoid duplicate programs with different keys. 59 // to a canonical value to avoid duplicate programs with different keys.
60 60
61 bool requiresColorAttrib = !skipColor && drawState.hasColorVertexAttribute() ; 61 bool requiresColorAttrib = !skipColor && drawState.hasColorVertexAttribute() ;
62 bool requiresCoverageAttrib = !skipCoverage && drawState.hasCoverageVertexAt tribute(); 62 bool requiresCoverageAttrib = !skipCoverage && drawState.hasCoverageVertexAt tribute();
63 // we only need the local coords if we're actually going to generate effect code 63 // we only need the local coords if we're actually going to generate effect code
64 bool requiresLocalCoordAttrib = !(skipCoverage && skipColor) && 64 bool requiresLocalCoordAttrib = !(skipCoverage && skipColor) &&
65 drawState.hasLocalCoordAttribute(); 65 drawState.hasLocalCoordAttribute();
66 66
67 bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_B lendOptFlag); 67 bool colorIsTransBlack = SkToBool(blendOpts & GrDrawState::kEmitTransBlack_B lendOptFlag);
68 bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFla g) || 68 bool colorIsSolidWhite = (blendOpts & GrDrawState::kEmitCoverage_BlendOptFla g) ||
69 (!requiresColorAttrib && 0xffffffff == drawState.ge tColor()); 69 (!requiresColorAttrib && 0xffffffff == drawState.ge tColor()) ||
70 drawState.numColorStages() > 0 && !(*drawState.getC olorStage(0)->getEffect())->getWillUseInputColor();
70 71
71 int numEffects = (skipColor ? 0 : drawState.numColorStages()) + 72 int numEffects = (skipColor ? 0 : drawState.numColorStages()) +
72 (skipCoverage ? 0 : drawState.numCoverageStages()); 73 (skipCoverage ? 0 : drawState.numCoverageStages());
73 74
74 size_t newKeyLength = KeyLength(numEffects); 75 size_t newKeyLength = KeyLength(numEffects);
75 bool allocChanged; 76 bool allocChanged;
76 desc->fKey.reset(newKeyLength, SkAutoMalloc::kAlloc_OnShrink, &allocChanged) ; 77 desc->fKey.reset(newKeyLength, SkAutoMalloc::kAlloc_OnShrink, &allocChanged) ;
77 if (allocChanged || !desc->fInitialized) { 78 if (allocChanged || !desc->fInitialized) {
78 // make sure any padding in the header is zero if we we haven't used thi s allocation before. 79 // make sure any padding in the header is zero if we we haven't used thi s allocation before.
79 memset(desc->header(), 0, kHeaderSize); 80 memset(desc->header(), 0, kHeaderSize);
(...skipping 16 matching lines...) Expand all
96 } 97 }
97 if (!skipCoverage) { 98 if (!skipCoverage) {
98 for (int s = 0; s < drawState.numCoverageStages(); ++s) { 99 for (int s = 0; s < drawState.numCoverageStages(); ++s) {
99 effectKeys[currEffectKey++] = 100 effectKeys[currEffectKey++] =
100 get_key_and_update_stats(drawState.getCoverageStage(s), gpu->glC aps(), 101 get_key_and_update_stats(drawState.getCoverageStage(s), gpu->glC aps(),
101 requiresLocalCoordAttrib, &readsDst, &r eadFragPosition); 102 requiresLocalCoordAttrib, &readsDst, &r eadFragPosition);
102 } 103 }
103 } 104 }
104 105
105 header->fEmitsPointSize = isPoints; 106 header->fEmitsPointSize = isPoints;
106 header->fColorFilterXfermode = skipColor ? SkXfermode::kDst_Mode : drawState .getColorFilterMode();
107 107
108 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything 108 // Currently the experimental GS will only work with triangle prims (and it doesn't do anything
109 // other than pass through values from the VS to the FS anyway). 109 // other than pass through values from the VS to the FS anyway).
110 #if GR_GL_EXPERIMENTAL_GS 110 #if GR_GL_EXPERIMENTAL_GS
111 #if 0 111 #if 0
112 header->fExperimentalGS = gpu->caps().geometryShaderSupport(); 112 header->fExperimentalGS = gpu->caps().geometryShaderSupport();
113 #else 113 #else
114 header->fExperimentalGS = false; 114 header->fExperimentalGS = false;
115 #endif 115 #endif
116 #endif 116 #endif
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 184
185 // Set these defaults and then possibly change our mind if there is coverage . 185 // Set these defaults and then possibly change our mind if there is coverage .
186 header->fDiscardIfZeroCoverage = false; 186 header->fDiscardIfZeroCoverage = false;
187 header->fCoverageOutput = kModulate_CoverageOutput; 187 header->fCoverageOutput = kModulate_CoverageOutput;
188 188
189 // If we do have coverage determine whether it matters. 189 // If we do have coverage determine whether it matters.
190 bool separateCoverageFromColor = false; 190 bool separateCoverageFromColor = false;
191 if (!drawState.isCoverageDrawing() && !skipCoverage && 191 if (!drawState.isCoverageDrawing() && !skipCoverage &&
192 (drawState.numCoverageStages() > 0 || requiresCoverageAttrib)) { 192 (drawState.numCoverageStages() > 0 || requiresCoverageAttrib)) {
193 // color filter is applied between color/coverage computation 193 // color filter is applied between color/coverage computation
194 if (SkXfermode::kDst_Mode != header->fColorFilterXfermode) { 194 // TODO:
195 //if (SkXfermode::kDst_Mode != header->fColorFilterXfermode) {
195 separateCoverageFromColor = true; 196 separateCoverageFromColor = true;
196 } 197 //}
197 198
198 // If we're stenciling then we want to discard samples that have zero co verage 199 // If we're stenciling then we want to discard samples that have zero co verage
199 if (drawState.getStencil().doesWrite()) { 200 if (drawState.getStencil().doesWrite()) {
200 header->fDiscardIfZeroCoverage = true; 201 header->fDiscardIfZeroCoverage = true;
201 separateCoverageFromColor = true; 202 separateCoverageFromColor = true;
202 } 203 }
203 204
204 if (gpu->caps()->dualSourceBlendingSupport() && 205 if (gpu->caps()->dualSourceBlendingSupport() &&
205 !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag | 206 !(blendOpts & (GrDrawState::kEmitCoverage_BlendOptFlag |
206 GrDrawState::kCoverageAsAlpha_BlendOptFlag))) { 207 GrDrawState::kCoverageAsAlpha_BlendOptFlag))) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 253
253 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) { 254 GrGLProgramDesc& GrGLProgramDesc::operator= (const GrGLProgramDesc& other) {
254 fInitialized = other.fInitialized; 255 fInitialized = other.fInitialized;
255 if (fInitialized) { 256 if (fInitialized) {
256 size_t keyLength = other.keyLength(); 257 size_t keyLength = other.keyLength();
257 fKey.reset(keyLength); 258 fKey.reset(keyLength);
258 memcpy(fKey.get(), other.fKey.get(), keyLength); 259 memcpy(fKey.get(), other.fKey.get(), keyLength);
259 } 260 }
260 return *this; 261 return *this;
261 } 262 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698