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

Side by Side Diff: src/gpu/effects/GrConfigConversionEffect.cpp

Issue 277323002: Make GrGLConfigConversionEffect work for Imagination and some other GPUs. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 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/effects/GrConfigConversionEffect.h ('k') | src/gpu/gl/GrGLShaderBuilder.cpp » ('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 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 #include "GrConfigConversionEffect.h" 8 #include "GrConfigConversionEffect.h"
9 #include "GrContext.h" 9 #include "GrContext.h"
10 #include "GrTBackendEffectFactory.h" 10 #include "GrTBackendEffectFactory.h"
(...skipping 11 matching lines...) Expand all
22 fPMConversion = effect.pmConversion(); 22 fPMConversion = effect.pmConversion();
23 } 23 }
24 24
25 virtual void emitCode(GrGLShaderBuilder* builder, 25 virtual void emitCode(GrGLShaderBuilder* builder,
26 const GrDrawEffect&, 26 const GrDrawEffect&,
27 EffectKey key, 27 EffectKey key,
28 const char* outputColor, 28 const char* outputColor,
29 const char* inputColor, 29 const char* inputColor,
30 const TransformedCoordsArray& coords, 30 const TransformedCoordsArray& coords,
31 const TextureSamplerArray& samplers) SK_OVERRIDE { 31 const TextureSamplerArray& samplers) SK_OVERRIDE {
32 const char* outputColorH = "outputColorH";
33 builder->fsCodeAppendf("\thighp vec4 %s;\n", outputColorH);
bsalomon 2014/07/08 13:10:15 It looks like we're still always declaring this va
changjun.yang 2014/07/09 03:02:09 Done. And looks we still need the outputColorH tho
32 builder->fsCodeAppendf("\t\t%s = ", outputColor); 34 builder->fsCodeAppendf("\t\t%s = ", outputColor);
33 builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), coords[0] .type()); 35 builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), coords[0] .type());
34 builder->fsCodeAppend(";\n"); 36 builder->fsCodeAppend(";\n");
35 if (GrConfigConversionEffect::kNone_PMConversion == fPMConversion) { 37 if (GrConfigConversionEffect::kNone_PMConversion == fPMConversion) {
36 SkASSERT(fSwapRedAndBlue); 38 SkASSERT(fSwapRedAndBlue);
37 builder->fsCodeAppendf("\t%s = %s.bgra;\n", outputColor, outputColor ); 39 builder->fsCodeAppendf("\t%s = %s.bgra;\n", outputColor, outputColor );
38 } else { 40 } else {
39 const char* swiz = fSwapRedAndBlue ? "bgr" : "rgb"; 41 const char* swiz = fSwapRedAndBlue ? "bgr" : "rgb";
40 switch (fPMConversion) { 42 switch (fPMConversion) {
41 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion: 43 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion:
(...skipping 11 matching lines...) Expand all
53 outputColor, outputColor, swiz, outputColor, outputColor ); 55 outputColor, outputColor, swiz, outputColor, outputColor );
54 break; 56 break;
55 case GrConfigConversionEffect::kDivByAlpha_RoundUp_PMConversion: 57 case GrConfigConversionEffect::kDivByAlpha_RoundUp_PMConversion:
56 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0) : vec4(ceil(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n", 58 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0) : vec4(ceil(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n",
57 outputColor, outputColor, outputColor, swiz, outputColor , outputColor); 59 outputColor, outputColor, outputColor, swiz, outputColor , outputColor);
58 break; 60 break;
59 case GrConfigConversionEffect::kDivByAlpha_RoundDown_PMConversio n: 61 case GrConfigConversionEffect::kDivByAlpha_RoundDown_PMConversio n:
60 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0) : vec4(floor(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n", 62 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0) : vec4(floor(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n",
61 outputColor, outputColor, outputColor, swiz, outputColor , outputColor); 63 outputColor, outputColor, outputColor, swiz, outputColor , outputColor);
62 break; 64 break;
65 case GrConfigConversionEffect::kMulByAlpha_RoundUp_HIGHP_PMConve rsion:
66 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColorH, outpu tColor);
67 builder->fsCodeAppendf(
68 "\t\t%s = vec4(ceil(%s.%s * %s.a * 255.0) / 255.0, %s.a) ;\n",
69 outputColorH, outputColorH, swiz, outputColorH, outputCo lorH);
70 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
71 break;
72 case GrConfigConversionEffect::kMulByAlpha_RoundDown_HIGHP_PMCon version:
73 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColorH, outpu tColor);
74 builder->fsCodeAppendf(
75 "\t\t%s = vec4(floor(%s.%s * %s.a * 255.0) / 255.0, %s.a );\n",
76 outputColorH, outputColorH, swiz, outputColorH, outputCo lorH);
77 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
78 break;
79 case GrConfigConversionEffect::kDivByAlpha_RoundUp_HIGHP_PMConve rsion:
80 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColorH, outpu tColor);
81 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0) : vec4(ceil(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n",
82 outputColorH, outputColorH, outputColorH, swiz, outputCo lorH, outputColorH);
83 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
84 break;
85 case GrConfigConversionEffect::kDivByAlpha_RoundDown_HIGHP_PMCon version:
86 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColorH, outpu tColor);
87 builder->fsCodeAppendf("\t\t%s = %s.a <= 0.0 ? vec4(0,0,0,0) : vec4(floor(%s.%s / %s.a * 255.0) / 255.0, %s.a);\n",
88 outputColorH, outputColorH, outputColorH, swiz, outputCo lorH, outputColorH);
89 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
90 break;
63 default: 91 default:
64 SkFAIL("Unknown conversion op."); 92 SkFAIL("Unknown conversion op.");
65 break; 93 break;
66 } 94 }
67 } 95 }
68 SkString modulate; 96 SkString modulate;
69 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); 97 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor);
70 builder->fsCodeAppend(modulate.c_str()); 98 builder->fsCodeAppend(modulate.c_str());
71 } 99 }
72 100
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 } 205 }
178 desc.fFlags = kNone_GrTextureFlags; 206 desc.fFlags = kNone_GrTextureFlags;
179 SkAutoTUnref<GrTexture> dataTex(context->createUncachedTexture(desc, data, 0 )); 207 SkAutoTUnref<GrTexture> dataTex(context->createUncachedTexture(desc, data, 0 ));
180 if (!dataTex.get()) { 208 if (!dataTex.get()) {
181 return; 209 return;
182 } 210 }
183 211
184 static const PMConversion kConversionRules[][2] = { 212 static const PMConversion kConversionRules[][2] = {
185 {kDivByAlpha_RoundDown_PMConversion, kMulByAlpha_RoundUp_PMConversion}, 213 {kDivByAlpha_RoundDown_PMConversion, kMulByAlpha_RoundUp_PMConversion},
186 {kDivByAlpha_RoundUp_PMConversion, kMulByAlpha_RoundDown_PMConversion}, 214 {kDivByAlpha_RoundUp_PMConversion, kMulByAlpha_RoundDown_PMConversion},
215 {kDivByAlpha_RoundDown_HIGHP_PMConversion, kMulByAlpha_RoundUp_HIGHP_PMC onversion},
216 {kDivByAlpha_RoundUp_HIGHP_PMConversion, kMulByAlpha_RoundDown_HIGHP_PMC onversion},
187 }; 217 };
188 218
189 GrContext::AutoWideOpenIdentityDraw awoid(context, NULL); 219 GrContext::AutoWideOpenIdentityDraw awoid(context, NULL);
190 220
191 bool failed = true; 221 bool failed = true;
192 222
193 for (size_t i = 0; i < SK_ARRAY_COUNT(kConversionRules) && failed; ++i) { 223 for (size_t i = 0; i < SK_ARRAY_COUNT(kConversionRules) && failed; ++i) {
194 *pmToUPMRule = kConversionRules[i][0]; 224 *pmToUPMRule = kConversionRules[i][0];
195 *upmToPMRule = kConversionRules[i][1]; 225 *upmToPMRule = kConversionRules[i][1];
196 226
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 // The PM conversions assume colors are 0..255 298 // The PM conversions assume colors are 0..255
269 return NULL; 299 return NULL;
270 } 300 }
271 AutoEffectUnref effect(SkNEW_ARGS(GrConfigConversionEffect, (texture, 301 AutoEffectUnref effect(SkNEW_ARGS(GrConfigConversionEffect, (texture,
272 swapRedAndB lue, 302 swapRedAndB lue,
273 pmConversio n, 303 pmConversio n,
274 matrix))); 304 matrix)));
275 return CreateEffectRef(effect); 305 return CreateEffectRef(effect);
276 } 306 }
277 } 307 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrConfigConversionEffect.h ('k') | src/gpu/gl/GrGLShaderBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698