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

Side by Side Diff: src/effects/SkMorphologyImageFilter.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
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 The Android Open Source Project
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 "SkMorphologyImageFilter.h" 8 #include "SkMorphologyImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 340
341 typedef Gr1DKernelEffect INHERITED; 341 typedef Gr1DKernelEffect INHERITED;
342 }; 342 };
343 343
344 /////////////////////////////////////////////////////////////////////////////// 344 ///////////////////////////////////////////////////////////////////////////////
345 345
346 class GrGLMorphologyEffect : public GrGLFragmentProcessor { 346 class GrGLMorphologyEffect : public GrGLFragmentProcessor {
347 public: 347 public:
348 GrGLMorphologyEffect(const GrProcessor&); 348 GrGLMorphologyEffect(const GrProcessor&);
349 349
350 virtual void emitCode(GrGLFPBuilder*, 350 virtual void emitCode(EmitArgs&) override;
351 const GrFragmentProcessor&,
352 const char* outputColor,
353 const char* inputColor,
354 const TransformedCoordsArray&,
355 const TextureSamplerArray&) override;
356 351
357 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor KeyBuilder* b); 352 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessor KeyBuilder* b);
358 353
359 void setData(const GrGLProgramDataManager&, const GrProcessor&) override; 354 void setData(const GrGLProgramDataManager&, const GrProcessor&) override;
360 355
361 private: 356 private:
362 int width() const { return GrMorphologyEffect::WidthFromRadius(fRadius); } 357 int width() const { return GrMorphologyEffect::WidthFromRadius(fRadius); }
363 358
364 int fRadius; 359 int fRadius;
365 Gr1DKernelEffect::Direction fDirection; 360 Gr1DKernelEffect::Direction fDirection;
366 bool fUseRange; 361 bool fUseRange;
367 GrMorphologyEffect::MorphologyType fType; 362 GrMorphologyEffect::MorphologyType fType;
368 GrGLProgramDataManager::UniformHandle fPixelSizeUni; 363 GrGLProgramDataManager::UniformHandle fPixelSizeUni;
369 GrGLProgramDataManager::UniformHandle fRangeUni; 364 GrGLProgramDataManager::UniformHandle fRangeUni;
370 365
371 typedef GrGLFragmentProcessor INHERITED; 366 typedef GrGLFragmentProcessor INHERITED;
372 }; 367 };
373 368
374 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrProcessor& proc) { 369 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrProcessor& proc) {
375 const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); 370 const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>();
376 fRadius = m.radius(); 371 fRadius = m.radius();
377 fDirection = m.direction(); 372 fDirection = m.direction();
378 fUseRange = m.useRange(); 373 fUseRange = m.useRange();
379 fType = m.type(); 374 fType = m.type();
380 } 375 }
381 376
382 void GrGLMorphologyEffect::emitCode(GrGLFPBuilder* builder, 377 void GrGLMorphologyEffect::emitCode(EmitArgs& args) {
383 const GrFragmentProcessor&, 378 fPixelSizeUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visi bility,
384 const char* outputColor,
385 const char* inputColor,
386 const TransformedCoordsArray& coords,
387 const TextureSamplerArray& samplers) {
388 fPixelSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility ,
389 kFloat_GrSLType, kDefault_GrSLPrecis ion, 379 kFloat_GrSLType, kDefault_GrSLPrecis ion,
390 "PixelSize"); 380 "PixelSize");
391 const char* pixelSizeInc = builder->getUniformCStr(fPixelSizeUni); 381 const char* pixelSizeInc = args.fBuilder->getUniformCStr(fPixelSizeUni);
392 fRangeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, 382 fRangeUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibili ty,
393 kVec2f_GrSLType, kDefault_GrSLPrecis ion, 383 kVec2f_GrSLType, kDefault_GrSLPrecis ion,
394 "Range"); 384 "Range");
395 const char* range = builder->getUniformCStr(fRangeUni); 385 const char* range = args.fBuilder->getUniformCStr(fRangeUni);
396 386
397 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); 387 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
398 SkString coords2D = fsBuilder->ensureFSCoords2D(coords, 0); 388 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
399 const char* func; 389 const char* func;
400 switch (fType) { 390 switch (fType) {
401 case GrMorphologyEffect::kErode_MorphologyType: 391 case GrMorphologyEffect::kErode_MorphologyType:
402 fsBuilder->codeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", outputColor); 392 fsBuilder->codeAppendf("\t\t%s = vec4(1, 1, 1, 1);\n", args.fOutputC olor);
403 func = "min"; 393 func = "min";
404 break; 394 break;
405 case GrMorphologyEffect::kDilate_MorphologyType: 395 case GrMorphologyEffect::kDilate_MorphologyType:
406 fsBuilder->codeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); 396 fsBuilder->codeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", args.fOutputC olor);
407 func = "max"; 397 func = "max";
408 break; 398 break;
409 default: 399 default:
410 SkFAIL("Unexpected type"); 400 SkFAIL("Unexpected type");
411 func = ""; // suppress warning 401 func = ""; // suppress warning
412 break; 402 break;
413 } 403 }
414 404
415 const char* dir; 405 const char* dir;
416 switch (fDirection) { 406 switch (fDirection) {
(...skipping 13 matching lines...) Expand all
430 // coord.x -= radius * pixelSize; 420 // coord.x -= radius * pixelSize;
431 fsBuilder->codeAppendf("\t\tcoord.%s -= %d.0 * %s; \n", dir, fRadius, pixelS izeInc); 421 fsBuilder->codeAppendf("\t\tcoord.%s -= %d.0 * %s; \n", dir, fRadius, pixelS izeInc);
432 if (fUseRange) { 422 if (fUseRange) {
433 // highBound = min(highBound, coord.x + (width-1) * pixelSize); 423 // highBound = min(highBound, coord.x + (width-1) * pixelSize);
434 fsBuilder->codeAppendf("\t\tfloat highBound = min(%s.y, coord.%s + %f * %s);", 424 fsBuilder->codeAppendf("\t\tfloat highBound = min(%s.y, coord.%s + %f * %s);",
435 range, dir, float(width() - 1), pixelSizeInc); 425 range, dir, float(width() - 1), pixelSizeInc);
436 // coord.x = max(lowBound, coord.x); 426 // coord.x = max(lowBound, coord.x);
437 fsBuilder->codeAppendf("\t\tcoord.%s = max(%s.x, coord.%s);", dir, range , dir); 427 fsBuilder->codeAppendf("\t\tcoord.%s = max(%s.x, coord.%s);", dir, range , dir);
438 } 428 }
439 fsBuilder->codeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", width()); 429 fsBuilder->codeAppendf("\t\tfor (int i = 0; i < %d; i++) {\n", width());
440 fsBuilder->codeAppendf("\t\t\t%s = %s(%s, ", outputColor, func, outputColor) ; 430 fsBuilder->codeAppendf("\t\t\t%s = %s(%s, ", args.fOutputColor, func, args.f OutputColor);
441 fsBuilder->appendTextureLookup(samplers[0], "coord"); 431 fsBuilder->appendTextureLookup(args.fSamplers[0], "coord");
442 fsBuilder->codeAppend(");\n"); 432 fsBuilder->codeAppend(");\n");
443 // coord.x += pixelSize; 433 // coord.x += pixelSize;
444 fsBuilder->codeAppendf("\t\t\tcoord.%s += %s;\n", dir, pixelSizeInc); 434 fsBuilder->codeAppendf("\t\t\tcoord.%s += %s;\n", dir, pixelSizeInc);
445 if (fUseRange) { 435 if (fUseRange) {
446 // coord.x = min(highBound, coord.x); 436 // coord.x = min(highBound, coord.x);
447 fsBuilder->codeAppendf("\t\t\tcoord.%s = min(highBound, coord.%s);", dir , dir); 437 fsBuilder->codeAppendf("\t\t\tcoord.%s = min(highBound, coord.%s);", dir , dir);
448 } 438 }
449 fsBuilder->codeAppend("\t\t}\n"); 439 fsBuilder->codeAppend("\t\t}\n");
450 SkString modulate; 440 SkString modulate;
451 GrGLSLMulVarBy4f(&modulate, outputColor, inputColor); 441 GrGLSLMulVarBy4f(&modulate, args.fOutputColor, args.fInputColor);
452 fsBuilder->codeAppend(modulate.c_str()); 442 fsBuilder->codeAppend(modulate.c_str());
453 } 443 }
454 444
455 void GrGLMorphologyEffect::GenKey(const GrProcessor& proc, 445 void GrGLMorphologyEffect::GenKey(const GrProcessor& proc,
456 const GrGLSLCaps&, GrProcessorKeyBuilder* b) { 446 const GrGLSLCaps&, GrProcessorKeyBuilder* b) {
457 const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>(); 447 const GrMorphologyEffect& m = proc.cast<GrMorphologyEffect>();
458 uint32_t key = static_cast<uint32_t>(m.radius()); 448 uint32_t key = static_cast<uint32_t>(m.radius());
459 key |= (m.type() << 8); 449 key |= (m.type() << 8);
460 key |= (m.direction() << 9); 450 key |= (m.direction() << 9);
461 if (m.useRange()) key |= 1 << 10; 451 if (m.useRange()) key |= 1 << 10;
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 SkBitmap* result, SkIPoint* offset) con st { 748 SkBitmap* result, SkIPoint* offset) con st {
759 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); 749 return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset);
760 } 750 }
761 751
762 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, 752 bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
763 SkBitmap* result, SkIPoint* offset) cons t { 753 SkBitmap* result, SkIPoint* offset) cons t {
764 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); 754 return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset);
765 } 755 }
766 756
767 #endif 757 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698