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

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: Add new pair of highp shader which brings no side effect to others 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
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);
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";
42 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColorH, outputColor);
bsalomon 2014/07/07 13:21:39 Can we only emit this if one of the highp shaders
changjun.yang 2014/07/08 02:33:59 Done.
40 switch (fPMConversion) { 43 switch (fPMConversion) {
41 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion: 44 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion:
42 builder->fsCodeAppendf( 45 builder->fsCodeAppendf(
43 "\t\t%s = vec4(ceil(%s.%s * %s.a * 255.0) / 255.0, %s.a) ;\n", 46 "\t\t%s = vec4(ceil(%s.%s * %s.a * 255.0) / 255.0, %s.a) ;\n",
44 outputColor, outputColor, swiz, outputColor, outputColor ); 47 outputColor, outputColor, swiz, outputColor, outputColor );
45 break; 48 break;
46 case GrConfigConversionEffect::kMulByAlpha_RoundDown_PMConversio n: 49 case GrConfigConversionEffect::kMulByAlpha_RoundDown_PMConversio n:
47 // Add a compensation(0.001) here to avoid the side effect o f the floor operation. 50 // Add a compensation(0.001) here to avoid the side effect o f the floor operation.
48 // In Intel GPUs, the integer value converted from floor(%s. r * 255.0) / 255.0 51 // In Intel GPUs, the integer value converted from floor(%s. r * 255.0) / 255.0
49 // is less than the integer value converted from %s.r by 1 when the %s.r is 52 // is less than the integer value converted from %s.r by 1 when the %s.r is
50 // converted from the integer value 2^n, such as 1, 2, 4, 8, etc. 53 // converted from the integer value 2^n, such as 1, 2, 4, 8, etc.
51 builder->fsCodeAppendf( 54 builder->fsCodeAppendf(
52 "\t\t%s = vec4(floor(%s.%s * %s.a * 255.0 + 0.001) / 255 .0, %s.a);\n", 55 "\t\t%s = vec4(floor(%s.%s * %s.a * 255.0 + 0.001) / 255 .0, %s.a);\n",
53 outputColor, outputColor, swiz, outputColor, outputColor ); 56 outputColor, outputColor, swiz, outputColor, outputColor );
54 break; 57 break;
55 case GrConfigConversionEffect::kDivByAlpha_RoundUp_PMConversion: 58 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", 59 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); 60 outputColor, outputColor, outputColor, swiz, outputColor , outputColor);
58 break; 61 break;
59 case GrConfigConversionEffect::kDivByAlpha_RoundDown_PMConversio n: 62 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", 63 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); 64 outputColor, outputColor, outputColor, swiz, outputColor , outputColor);
62 break; 65 break;
66 case GrConfigConversionEffect::kMulByAlpha_RoundUp_PMConversion_ HIGHP:
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_PMConversio n_HIGHP:
73 builder->fsCodeAppendf(
74 "\t\t%s = vec4(floor(%s.%s * %s.a * 255.0) / 255.0, %s.a );\n",
75 outputColorH, outputColorH, swiz, outputColorH, outputCo lorH);
76 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
77 break;
78 case GrConfigConversionEffect::kDivByAlpha_RoundUp_PMConversion_ HIGHP:
79 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",
80 outputColorH, outputColorH, outputColorH, swiz, outputCo lorH, outputColorH);
81 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
82 break;
83 case GrConfigConversionEffect::kDivByAlpha_RoundDown_PMConversio n_HIGHP:
84 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",
85 outputColorH, outputColorH, outputColorH, swiz, outputCo lorH, outputColorH);
86 builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor, output ColorH);
87 break;
63 default: 88 default:
64 SkFAIL("Unknown conversion op."); 89 SkFAIL("Unknown conversion op.");
65 break; 90 break;
66 } 91 }
67 } 92 }
68 SkString modulate; 93 SkString modulate;
69 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); 94 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor);
70 builder->fsCodeAppend(modulate.c_str()); 95 builder->fsCodeAppend(modulate.c_str());
71 } 96 }
72 97
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 } 202 }
178 desc.fFlags = kNone_GrTextureFlags; 203 desc.fFlags = kNone_GrTextureFlags;
179 SkAutoTUnref<GrTexture> dataTex(context->createUncachedTexture(desc, data, 0 )); 204 SkAutoTUnref<GrTexture> dataTex(context->createUncachedTexture(desc, data, 0 ));
180 if (!dataTex.get()) { 205 if (!dataTex.get()) {
181 return; 206 return;
182 } 207 }
183 208
184 static const PMConversion kConversionRules[][2] = { 209 static const PMConversion kConversionRules[][2] = {
185 {kDivByAlpha_RoundDown_PMConversion, kMulByAlpha_RoundUp_PMConversion}, 210 {kDivByAlpha_RoundDown_PMConversion, kMulByAlpha_RoundUp_PMConversion},
186 {kDivByAlpha_RoundUp_PMConversion, kMulByAlpha_RoundDown_PMConversion}, 211 {kDivByAlpha_RoundUp_PMConversion, kMulByAlpha_RoundDown_PMConversion},
212 {kDivByAlpha_RoundDown_PMConversion_HIGHP, kMulByAlpha_RoundUp_PMConvers ion_HIGHP},
213 {kDivByAlpha_RoundUp_PMConversion_HIGHP, kMulByAlpha_RoundDown_PMConvers ion_HIGHP},
187 }; 214 };
188 215
189 GrContext::AutoWideOpenIdentityDraw awoid(context, NULL); 216 GrContext::AutoWideOpenIdentityDraw awoid(context, NULL);
190 217
191 bool failed = true; 218 bool failed = true;
192 219
193 for (size_t i = 0; i < SK_ARRAY_COUNT(kConversionRules) && failed; ++i) { 220 for (size_t i = 0; i < SK_ARRAY_COUNT(kConversionRules) && failed; ++i) {
194 *pmToUPMRule = kConversionRules[i][0]; 221 *pmToUPMRule = kConversionRules[i][0];
195 *upmToPMRule = kConversionRules[i][1]; 222 *upmToPMRule = kConversionRules[i][1];
196 223
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 // The PM conversions assume colors are 0..255 295 // The PM conversions assume colors are 0..255
269 return NULL; 296 return NULL;
270 } 297 }
271 AutoEffectUnref effect(SkNEW_ARGS(GrConfigConversionEffect, (texture, 298 AutoEffectUnref effect(SkNEW_ARGS(GrConfigConversionEffect, (texture,
272 swapRedAndB lue, 299 swapRedAndB lue,
273 pmConversio n, 300 pmConversio n,
274 matrix))); 301 matrix)));
275 return CreateEffectRef(effect); 302 return CreateEffectRef(effect);
276 } 303 }
277 } 304 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698