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

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

Issue 23018003: Rename GrGLUniformManager to GrGLUniform and ref GrGLUniforms directly Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 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
« no previous file with comments | « src/effects/SkMagnifierImageFilter.cpp ('k') | src/effects/SkMorphologyImageFilter.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 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 "SkMatrixConvolutionImageFilter.h" 8 #include "SkMatrixConvolutionImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
11 #include "SkFlattenableBuffers.h" 11 #include "SkFlattenableBuffers.h"
12 #include "SkRect.h" 12 #include "SkRect.h"
13 #include "SkUnPreMultiply.h" 13 #include "SkUnPreMultiply.h"
14 14
15 #if SK_SUPPORT_GPU 15 #if SK_SUPPORT_GPU
16 #include "gl/GrGLEffect.h" 16 #include "gl/GrGLEffect.h"
17 #include "gl/GrGLEffectMatrix.h" 17 #include "gl/GrGLEffectMatrix.h"
18 #include "effects/GrSingleTextureEffect.h" 18 #include "effects/GrSingleTextureEffect.h"
19 #include "GrTBackendEffectFactory.h" 19 #include "GrTBackendEffectFactory.h"
20 #include "GrTexture.h" 20 #include "GrTexture.h"
21 #include "SkMatrix.h" 21 #include "SkMatrix.h"
22 22 #include "gl/GrGLShaderBuilder.h"
23 #endif 23 #endif
24 24
25 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(const SkISize& ke rnelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input) 25 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(const SkISize& ke rnelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input)
26 : INHERITED(input), 26 : INHERITED(input),
27 fKernelSize(kernelSize), 27 fKernelSize(kernelSize),
28 fGain(gain), 28 fGain(gain),
29 fBias(bias), 29 fBias(bias),
30 fTarget(target), 30 fTarget(target),
31 fTileMode(tileMode), 31 fTileMode(tileMode),
32 fConvolveAlpha(convolveAlpha) { 32 fConvolveAlpha(convolveAlpha) {
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 const GrDrawEffect& effect); 321 const GrDrawEffect& effect);
322 virtual void emitCode(GrGLShaderBuilder*, 322 virtual void emitCode(GrGLShaderBuilder*,
323 const GrDrawEffect&, 323 const GrDrawEffect&,
324 EffectKey, 324 EffectKey,
325 const char* outputColor, 325 const char* outputColor,
326 const char* inputColor, 326 const char* inputColor,
327 const TextureSamplerArray&) SK_OVERRIDE; 327 const TextureSamplerArray&) SK_OVERRIDE;
328 328
329 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 329 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
330 330
331 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 331 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
332 332
333 private: 333 private:
334 typedef GrGLUniformManager::UniformHandle UniformHandle;
335 typedef SkMatrixConvolutionImageFilter::TileMode TileMode; 334 typedef SkMatrixConvolutionImageFilter::TileMode TileMode;
336 SkISize fKernelSize; 335 SkISize fKernelSize;
337 TileMode fTileMode; 336 TileMode fTileMode;
338 bool fConvolveAlpha; 337 bool fConvolveAlpha;
339 338
340 UniformHandle fKernelUni; 339 GrGLUniform* fKernelUni;
341 UniformHandle fImageIncrementUni; 340 GrGLUniform* fImageIncrementUni;
342 UniformHandle fTargetUni; 341 GrGLUniform* fTargetUni;
343 UniformHandle fGainUni; 342 GrGLUniform* fGainUni;
344 UniformHandle fBiasUni; 343 GrGLUniform* fBiasUni;
345 344
346 GrGLEffectMatrix fEffectMatrix; 345 GrGLEffectMatrix fEffectMatrix;
347 346
348 typedef GrGLEffect INHERITED; 347 typedef GrGLEffect INHERITED;
349 }; 348 };
350 349
351 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa ctory& factory, 350 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa ctory& factory,
352 const GrDrawEffect& dra wEffect) 351 const GrDrawEffect& dra wEffect)
353 : INHERITED(factory) 352 : INHERITED(factory)
354 , fKernelUni(GrGLUniformManager::kInvalidUniformHandle) 353 , fKernelUni(NULL)
355 , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle) 354 , fImageIncrementUni(NULL)
356 , fTargetUni(GrGLUniformManager::kInvalidUniformHandle) 355 , fTargetUni(NULL)
357 , fGainUni(GrGLUniformManager::kInvalidUniformHandle) 356 , fGainUni(NULL)
358 , fBiasUni(GrGLUniformManager::kInvalidUniformHandle) 357 , fBiasUni(NULL)
359 , fEffectMatrix(drawEffect.castEffect<GrMatrixConvolutionEffect>().coordsTyp e()) { 358 , fEffectMatrix(drawEffect.castEffect<GrMatrixConvolutionEffect>().coordsTyp e()) {
360 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti onEffect>(); 359 const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvoluti onEffect>();
361 fKernelSize = m.kernelSize(); 360 fKernelSize = m.kernelSize();
362 fTileMode = m.tileMode(); 361 fTileMode = m.tileMode();
363 fConvolveAlpha = m.convolveAlpha(); 362 fConvolveAlpha = m.convolveAlpha();
364 } 363 }
365 364
366 static void appendTextureLookup(GrGLShaderBuilder* builder, 365 static void appendTextureLookup(GrGLShaderBuilder* builder,
367 const GrGLShaderBuilder::TextureSampler& sampler , 366 const GrGLShaderBuilder::TextureSampler& sampler ,
368 const char* coord, 367 const char* coord,
(...skipping 16 matching lines...) Expand all
385 } 384 }
386 385
387 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, 386 void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder,
388 const GrDrawEffect&, 387 const GrDrawEffect&,
389 EffectKey key, 388 EffectKey key,
390 const char* outputColor, 389 const char* outputColor,
391 const char* inputColor, 390 const char* inputColor,
392 const TextureSamplerArray& samplers) { 391 const TextureSamplerArray& samplers) {
393 const char* coords; 392 const char* coords;
394 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); 393 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords);
395 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type,
396 kVec2f_GrSLType, "ImageIncrement");
397 fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTyp e,
398 kFloat_GrSLType, "Kernel", fKernelS ize.width() * fKernelSize.height());
399 fTargetUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
400 kVec2f_GrSLType, "Target");
401 fGainUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
402 kFloat_GrSLType, "Gain");
403 fBiasUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
404 kFloat_GrSLType, "Bias");
405 394
406 const char* target = builder->getUniformCStr(fTargetUni); 395 GrGLShaderBuilder::Uniform* imageIncrementUni =
407 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); 396 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL Type, "ImageIncrement");
408 const char* kernel = builder->getUniformCStr(fKernelUni); 397 fImageIncrementUni = imageIncrementUni->glUniform();
409 const char* gain = builder->getUniformCStr(fGainUni); 398
410 const char* bias = builder->getUniformCStr(fBiasUni); 399 GrGLShaderBuilder::Uniform* kernelUni =
400 builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType,
401 kFloat_GrSLType, "Kernel", fKernelSize.width() * fKernelSize.height());
402 fKernelUni = kernelUni->glUniform();
403
404 GrGLShaderBuilder::Uniform* targetUni =
405 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL Type, "Target");
406 fTargetUni = targetUni->glUniform();
407
408 GrGLShaderBuilder::Uniform* gainUni =
409 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL Type, "Gain");
410 fGainUni = gainUni->glUniform();
411
412 GrGLShaderBuilder::Uniform* biasUni =
413 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL Type, "Bias");
414 fBiasUni = biasUni->glUniform();
415
416 const char* target = targetUni->c_str();
417 const char* imgInc = imageIncrementUni->c_str();
418 const char* kernel = kernelUni->c_str();
419 const char* gain = gainUni->c_str();
420 const char* bias = biasUni->c_str();
411 int kWidth = fKernelSize.width(); 421 int kWidth = fKernelSize.width();
412 int kHeight = fKernelSize.height(); 422 int kHeight = fKernelSize.height();
413 423
414 builder->fsCodeAppend("\t\tvec4 sum = vec4(0, 0, 0, 0);\n"); 424 builder->fsCodeAppend("\t\tvec4 sum = vec4(0, 0, 0, 0);\n");
415 builder->fsCodeAppendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, i mgInc); 425 builder->fsCodeAppendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, i mgInc);
416 builder->fsCodeAppendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight); 426 builder->fsCodeAppendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight);
417 builder->fsCodeAppendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth); 427 builder->fsCodeAppendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth);
418 builder->fsCodeAppendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth ); 428 builder->fsCodeAppendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth );
419 builder->fsCodeAppendf("\t\t\t\tvec2 coord2 = coord + vec2(x, y) * %s;\n", i mgInc); 429 builder->fsCodeAppendf("\t\t\t\tvec2 coord2 = coord + vec2(x, y) * %s;\n", i mgInc);
420 builder->fsCodeAppend("\t\t\t\tvec4 c = "); 430 builder->fsCodeAppend("\t\t\t\tvec4 c = ");
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 key |= m.tileMode() << 7; 468 key |= m.tileMode() << 7;
459 key |= m.convolveAlpha() ? 1 << 9 : 0; 469 key |= m.convolveAlpha() ? 1 << 9 : 0;
460 key <<= GrGLEffectMatrix::kKeyBits; 470 key <<= GrGLEffectMatrix::kKeyBits;
461 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), 471 EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(),
462 drawEffect, 472 drawEffect,
463 m.coordsType(), 473 m.coordsType(),
464 m.texture(0)); 474 m.texture(0));
465 return key | matrixKey; 475 return key | matrixKey;
466 } 476 }
467 477
468 void GrGLMatrixConvolutionEffect::setData(const GrGLUniformManager& uman, 478 void GrGLMatrixConvolutionEffect::setData(const GrGLContext& context,
469 const GrDrawEffect& drawEffect) { 479 const GrDrawEffect& drawEffect) {
470 const GrMatrixConvolutionEffect& conv = drawEffect.castEffect<GrMatrixConvol utionEffect>(); 480 const GrMatrixConvolutionEffect& conv = drawEffect.castEffect<GrMatrixConvol utionEffect>();
471 GrTexture& texture = *conv.texture(0); 481 GrTexture& texture = *conv.texture(0);
472 // the code we generated was for a specific kernel size 482 // the code we generated was for a specific kernel size
473 GrAssert(conv.kernelSize() == fKernelSize); 483 GrAssert(conv.kernelSize() == fKernelSize);
474 GrAssert(conv.tileMode() == fTileMode); 484 GrAssert(conv.tileMode() == fTileMode);
475 float imageIncrement[2]; 485 float imageIncrement[2];
476 float ySign = texture.origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; 486 float ySign = texture.origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f;
477 imageIncrement[0] = 1.0f / texture.width(); 487 imageIncrement[0] = 1.0f / texture.width();
478 imageIncrement[1] = ySign / texture.height(); 488 imageIncrement[1] = ySign / texture.height();
479 uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); 489 fImageIncrementUni->set2fv(context, 0, 1, imageIncrement);
480 uman.set2fv(fTargetUni, 0, 1, conv.target()); 490 fTargetUni->set2fv(context, 0, 1, conv.target());
481 uman.set1fv(fKernelUni, 0, fKernelSize.width() * fKernelSize.height(), conv. kernel()); 491 fKernelUni->set1fv(context, 0, fKernelSize.width() * fKernelSize.height(), c onv.kernel());
482 uman.set1f(fGainUni, conv.gain()); 492 fGainUni->set1f(context, conv.gain());
483 uman.set1f(fBiasUni, conv.bias()); 493 fBiasUni->set1f(context, conv.bias());
484 fEffectMatrix.setData(uman, 494 fEffectMatrix.setData(context,
485 conv.getMatrix(), 495 conv.getMatrix(),
486 drawEffect, 496 drawEffect,
487 conv.texture(0)); 497 conv.texture(0));
488 } 498 }
489 499
490 GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, 500 GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture,
491 const SkISize& kernelSize, 501 const SkISize& kernelSize,
492 const SkScalar* kernel, 502 const SkScalar* kernel,
493 SkScalar gain, 503 SkScalar gain,
494 SkScalar bias, 504 SkScalar bias,
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 fBias, 588 fBias,
579 fTarget, 589 fTarget,
580 fTileMode, 590 fTileMode,
581 fConvolveAlpha); 591 fConvolveAlpha);
582 return true; 592 return true;
583 } 593 }
584 594
585 /////////////////////////////////////////////////////////////////////////////// 595 ///////////////////////////////////////////////////////////////////////////////
586 596
587 #endif 597 #endif
OLDNEW
« no previous file with comments | « src/effects/SkMagnifierImageFilter.cpp ('k') | src/effects/SkMorphologyImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698