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

Side by Side Diff: src/effects/SkColorCubeFilter.cpp

Issue 1251173002: Added GrGLFragmentProcessor::EmitArgs struct for use with emitCode() (Closed) Base URL: https://skia.googlesource.com/skia@composeshader_gpu
Patch Set: Created 5 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/effects/SkBlurMaskFilter.cpp ('k') | src/effects/SkColorFilters.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 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 "SkColorCubeFilter.h" 8 #include "SkColorCubeFilter.h"
9 #include "SkColorPriv.h" 9 #include "SkColorPriv.h"
10 #include "SkOnce.h" 10 #include "SkOnce.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 int colorCubeSize() const { return fColorCubeAccess.getTexture()->width(); } 201 int colorCubeSize() const { return fColorCubeAccess.getTexture()->width(); }
202 202
203 203
204 void onComputeInvariantOutput(GrInvariantOutput*) const override; 204 void onComputeInvariantOutput(GrInvariantOutput*) const override;
205 205
206 class GLProcessor : public GrGLFragmentProcessor { 206 class GLProcessor : public GrGLFragmentProcessor {
207 public: 207 public:
208 GLProcessor(const GrProcessor&); 208 GLProcessor(const GrProcessor&);
209 virtual ~GLProcessor(); 209 virtual ~GLProcessor();
210 210
211 virtual void emitCode(GrGLFPBuilder*, 211 virtual void emitCode(EmitArgs&) override;
212 const GrFragmentProcessor&,
213 const char* outputColor,
214 const char* inputColor,
215 const TransformedCoordsArray&,
216 const TextureSamplerArray&) override;
217 212
218 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProce ssorKeyBuilder*); 213 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProce ssorKeyBuilder*);
219 214
220 void setData(const GrGLProgramDataManager&, const GrProcessor&) override ; 215 void setData(const GrGLProgramDataManager&, const GrProcessor&) override ;
221 216
222 private: 217 private:
223 GrGLProgramDataManager::UniformHandle fColorCubeSizeUni; 218 GrGLProgramDataManager::UniformHandle fColorCubeSizeUni;
224 GrGLProgramDataManager::UniformHandle fColorCubeInvSizeUni; 219 GrGLProgramDataManager::UniformHandle fColorCubeInvSizeUni;
225 220
226 typedef GrGLFragmentProcessor INHERITED; 221 typedef GrGLFragmentProcessor INHERITED;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 } 255 }
261 256
262 /////////////////////////////////////////////////////////////////////////////// 257 ///////////////////////////////////////////////////////////////////////////////
263 258
264 GrColorCubeEffect::GLProcessor::GLProcessor(const GrProcessor&) { 259 GrColorCubeEffect::GLProcessor::GLProcessor(const GrProcessor&) {
265 } 260 }
266 261
267 GrColorCubeEffect::GLProcessor::~GLProcessor() { 262 GrColorCubeEffect::GLProcessor::~GLProcessor() {
268 } 263 }
269 264
270 void GrColorCubeEffect::GLProcessor::emitCode(GrGLFPBuilder* builder, 265 void GrColorCubeEffect::GLProcessor::emitCode(EmitArgs& args) {
271 const GrFragmentProcessor&, 266 if (NULL == args.fInputColor) {
272 const char* outputColor, 267 args.fInputColor = "vec4(1)";
273 const char* inputColor,
274 const TransformedCoordsArray& coor ds,
275 const TextureSamplerArray& sampler s) {
276 if (NULL == inputColor) {
277 inputColor = "vec4(1)";
278 } 268 }
279 269
280 fColorCubeSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity, 270 fColorCubeSizeUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_ Visibility,
281 kFloat_GrSLType, kDefault_GrSLPrecis ion, 271 kFloat_GrSLType, kDefault_GrSLPrecis ion,
282 "Size"); 272 "Size");
283 const char* colorCubeSizeUni = builder->getUniformCStr(fColorCubeSizeUni); 273 const char* colorCubeSizeUni = args.fBuilder->getUniformCStr(fColorCubeSizeU ni);
284 fColorCubeInvSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Vis ibility, 274 fColorCubeInvSizeUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragme nt_Visibility,
285 kFloat_GrSLType, kDefault_GrSLPre cision, 275 kFloat_GrSLType, kDefault_GrSLPre cision,
286 "InvSize"); 276 "InvSize");
287 const char* colorCubeInvSizeUni = builder->getUniformCStr(fColorCubeInvSizeU ni); 277 const char* colorCubeInvSizeUni = args.fBuilder->getUniformCStr(fColorCubeIn vSizeUni);
288 278
289 const char* nonZeroAlpha = "nonZeroAlpha"; 279 const char* nonZeroAlpha = "nonZeroAlpha";
290 const char* unPMColor = "unPMColor"; 280 const char* unPMColor = "unPMColor";
291 const char* cubeIdx = "cubeIdx"; 281 const char* cubeIdx = "cubeIdx";
292 const char* cCoords1 = "cCoords1"; 282 const char* cCoords1 = "cCoords1";
293 const char* cCoords2 = "cCoords2"; 283 const char* cCoords2 = "cCoords2";
294 284
295 // Note: if implemented using texture3D in OpenGL ES older than OpenGL ES 3. 0, 285 // Note: if implemented using texture3D in OpenGL ES older than OpenGL ES 3. 0,
296 // the shader might need "#extension GL_OES_texture_3D : enable". 286 // the shader might need "#extension GL_OES_texture_3D : enable".
297 287
298 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 288 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
299 289
300 // Unpremultiply color 290 // Unpremultiply color
301 fsBuilder->codeAppendf("\tfloat %s = max(%s.a, 0.00001);\n", nonZeroAlpha, i nputColor); 291 fsBuilder->codeAppendf("\tfloat %s = max(%s.a, 0.00001);\n", nonZeroAlpha, a rgs.fInputColor);
302 fsBuilder->codeAppendf("\tvec4 %s = vec4(%s.rgb / %s, %s);\n", 292 fsBuilder->codeAppendf("\tvec4 %s = vec4(%s.rgb / %s, %s);\n",
303 unPMColor, inputColor, nonZeroAlpha, nonZeroAlpha); 293 unPMColor, args.fInputColor, nonZeroAlpha, nonZeroAlp ha);
304 294
305 // Fit input color into the cube. 295 // Fit input color into the cube.
306 fsBuilder->codeAppendf( 296 fsBuilder->codeAppendf(
307 "vec3 %s = vec3(%s.rg * vec2((%s - 1.0) * %s) + vec2(0.5 * %s), %s.b * ( %s - 1.0));\n", 297 "vec3 %s = vec3(%s.rg * vec2((%s - 1.0) * %s) + vec2(0.5 * %s), %s.b * ( %s - 1.0));\n",
308 cubeIdx, unPMColor, colorCubeSizeUni, colorCubeInvSizeUni, colorCubeInvS izeUni, 298 cubeIdx, unPMColor, colorCubeSizeUni, colorCubeInvSizeUni, colorCubeInvS izeUni,
309 unPMColor, colorCubeSizeUni); 299 unPMColor, colorCubeSizeUni);
310 300
311 // Compute y coord for for texture fetches. 301 // Compute y coord for for texture fetches.
312 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (floor(%s.b) + %s.g) * %s);\n", 302 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (floor(%s.b) + %s.g) * %s);\n",
313 cCoords1, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize Uni); 303 cCoords1, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize Uni);
314 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (ceil(%s.b) + %s.g) * %s);\n", 304 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (ceil(%s.b) + %s.g) * %s);\n",
315 cCoords2, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize Uni); 305 cCoords2, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize Uni);
316 306
317 // Apply the cube. 307 // Apply the cube.
318 fsBuilder->codeAppendf("%s = vec4(mix(", outputColor); 308 fsBuilder->codeAppendf("%s = vec4(mix(", args.fOutputColor);
319 fsBuilder->appendTextureLookup(samplers[0], cCoords1); 309 fsBuilder->appendTextureLookup(args.fSamplers[0], cCoords1);
320 fsBuilder->codeAppend(".rgb, "); 310 fsBuilder->codeAppend(".rgb, ");
321 fsBuilder->appendTextureLookup(samplers[0], cCoords2); 311 fsBuilder->appendTextureLookup(args.fSamplers[0], cCoords2);
322 312
323 // Premultiply color by alpha. Note that the input alpha is not modified by this shader. 313 // Premultiply color by alpha. Note that the input alpha is not modified by this shader.
324 fsBuilder->codeAppendf(".rgb, fract(%s.b)) * vec3(%s), %s.a);\n", 314 fsBuilder->codeAppendf(".rgb, fract(%s.b)) * vec3(%s), %s.a);\n",
325 cubeIdx, nonZeroAlpha, inputColor); 315 cubeIdx, nonZeroAlpha, args.fInputColor);
326 } 316 }
327 317
328 void GrColorCubeEffect::GLProcessor::setData(const GrGLProgramDataManager& pdman , 318 void GrColorCubeEffect::GLProcessor::setData(const GrGLProgramDataManager& pdman ,
329 const GrProcessor& proc) { 319 const GrProcessor& proc) {
330 const GrColorCubeEffect& colorCube = proc.cast<GrColorCubeEffect>(); 320 const GrColorCubeEffect& colorCube = proc.cast<GrColorCubeEffect>();
331 SkScalar size = SkIntToScalar(colorCube.colorCubeSize()); 321 SkScalar size = SkIntToScalar(colorCube.colorCubeSize());
332 pdman.set1f(fColorCubeSizeUni, SkScalarToFloat(size)); 322 pdman.set1f(fColorCubeSizeUni, SkScalarToFloat(size));
333 pdman.set1f(fColorCubeInvSizeUni, SkScalarToFloat(SkScalarInvert(size))); 323 pdman.set1f(fColorCubeInvSizeUni, SkScalarToFloat(SkScalarInvert(size)));
334 } 324 }
335 325
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 *array->append() = frag; 357 *array->append() = frag;
368 } else { 358 } else {
369 frag->unref(); 359 frag->unref();
370 SkDEBUGCODE(frag = NULL;) 360 SkDEBUGCODE(frag = NULL;)
371 } 361 }
372 return true; 362 return true;
373 } 363 }
374 return false; 364 return false;
375 } 365 }
376 #endif 366 #endif
OLDNEW
« no previous file with comments | « src/effects/SkBlurMaskFilter.cpp ('k') | src/effects/SkColorFilters.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698