diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/gpu/effects/GrConfigConversionEffect.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/gpu/effects/GrConfigConversionEffect.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,78 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrConfigConversionEffect_DEFINED +#define GrConfigConversionEffect_DEFINED + +#include "GrSingleTextureEffect.h" + +class GrEffectStage; +class GrGLConfigConversionEffect; + +/** + * This class is used to perform config conversions. Clients may want to read/write data that is + * unpremultiplied. Also on some systems reading/writing BGRA or RGBA is faster. In those cases we + * read/write using the faster path and perform an R/B swap in the shader if the client data is in + * the slower config. + */ +class GrConfigConversionEffect : public GrSingleTextureEffect { +public: + /** + * The PM->UPM or UPM->PM conversions to apply. + */ + enum PMConversion { + kNone_PMConversion = 0, + kMulByAlpha_RoundUp_PMConversion, + kMulByAlpha_RoundDown_PMConversion, + kDivByAlpha_RoundUp_PMConversion, + kDivByAlpha_RoundDown_PMConversion, + + kPMConversionCnt + }; + + // Installs an effect in the GrEffectStage to perform a config conversion. + static const GrEffectRef* Create(GrTexture*, + bool swapRedAndBlue, + PMConversion pmConversion, + const SkMatrix& matrix); + + static const char* Name() { return "Config Conversion"; } + typedef GrGLConfigConversionEffect GLEffect; + + virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; + + virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; + + bool swapsRedAndBlue() const { return fSwapRedAndBlue; } + PMConversion pmConversion() const { return fPMConversion; } + + // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions + // for which in any PM->UPM->PM->UPM sequence the two UPM values are the same. This means that + // if pixels are read back to a UPM buffer, written back to PM to the GPU, and read back again + // both reads will produce the same result. This test is quite expensive and should not be run + // multiple times for a given context. + static void TestForPreservingPMConversions(GrContext* context, + PMConversion* PMToUPMRule, + PMConversion* UPMToPMRule); + +private: + GrConfigConversionEffect(GrTexture*, + bool swapRedAndBlue, + PMConversion pmConversion, + const SkMatrix& matrix); + + virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; + + bool fSwapRedAndBlue; + PMConversion fPMConversion; + + GR_DECLARE_EFFECT_TEST; + + typedef GrSingleTextureEffect INHERITED; +}; + +#endif