1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrConfigConversionEffect_DEFINED 9 #define GrConfigConversionEffect_DEFINED 10 11 #include "GrSingleTextureEffect.h" 12 #include "GrSwizzle.h" 13 14 class GrInvariantOutput; 15 16 /** 17 * This class is used to perform config conversions. Clients may want to read/write data that is 18 * unpremultiplied. Additionally, the channels may also be swizzled for optimal readback/upload 19 * performance. 20 */ 21 class GrConfigConversionEffect : public GrSingleTextureEffect { 22 public: 23 /** 24 * The PM->UPM or UPM->PM conversions to apply. 25 */ 26 enum PMConversion { 27 kNone_PMConversion = 0, 28 kMulByAlpha_RoundUp_PMConversion, 29 kMulByAlpha_RoundDown_PMConversion, 30 kDivByAlpha_RoundUp_PMConversion, 31 kDivByAlpha_RoundDown_PMConversion, 32 33 kPMConversionCnt 34 }; 35 36 static const GrFragmentProcessor* Create(GrTexture*, const GrSwizzle&, PMConversion, 37 const SkMatrix&); 38 name()39 const char* name() const override { return "Config Conversion"; } 40 swizzle()41 const GrSwizzle& swizzle() const { return fSwizzle; } pmConversion()42 PMConversion pmConversion() const { return fPMConversion; } 43 44 // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions 45 // for which in any PM->UPM->PM->UPM sequence the two UPM values are the same. This means that 46 // if pixels are read back to a UPM buffer, written back to PM to the GPU, and read back again 47 // both reads will produce the same result. This test is quite expensive and should not be run 48 // multiple times for a given context. 49 static void TestForPreservingPMConversions(GrContext* context, 50 PMConversion* PMToUPMRule, 51 PMConversion* UPMToPMRule); 52 53 private: 54 GrConfigConversionEffect(GrTexture*, 55 const GrSwizzle&, 56 PMConversion pmConversion, 57 const SkMatrix& matrix); 58 59 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; 60 61 void onGetGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override; 62 63 bool onIsEqual(const GrFragmentProcessor&) const override; 64 65 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; 66 67 GrSwizzle fSwizzle; 68 PMConversion fPMConversion; 69 70 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; 71 72 typedef GrSingleTextureEffect INHERITED; 73 }; 74 75 #endif 76