Home | History | Annotate | Download | only in effects
      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 
     13 class GrProcessorStage;
     14 class GrGLConfigConversionEffect;
     15 
     16 /**
     17  * This class is used to perform config conversions. Clients may want to read/write data that is
     18  * unpremultiplied. Also on some systems reading/writing BGRA or RGBA is faster. In those cases we
     19  * read/write using the faster path and perform an R/B swap in the shader if the client data is in
     20  * the slower config.
     21  */
     22 class GrConfigConversionEffect : public GrSingleTextureEffect {
     23 public:
     24     /**
     25      * The PM->UPM or UPM->PM conversions to apply.
     26      */
     27     enum PMConversion {
     28         kNone_PMConversion = 0,
     29         kMulByAlpha_RoundUp_PMConversion,
     30         kMulByAlpha_RoundDown_PMConversion,
     31         kDivByAlpha_RoundUp_PMConversion,
     32         kDivByAlpha_RoundDown_PMConversion,
     33 
     34         kPMConversionCnt
     35     };
     36 
     37     // Installs an effect in the GrProcessorStage to perform a config conversion.
     38     static const GrFragmentProcessor* Create(GrTexture*, bool swapRedAndBlue, PMConversion,
     39                                              const SkMatrix&);
     40 
     41     static const char* Name() { return "Config Conversion"; }
     42     typedef GrGLConfigConversionEffect GLProcessor;
     43 
     44     virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERRIDE;
     45 
     46     virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
     47 
     48     bool swapsRedAndBlue() const { return fSwapRedAndBlue; }
     49     PMConversion  pmConversion() const { return fPMConversion; }
     50 
     51     // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions
     52     // for which in any PM->UPM->PM->UPM sequence the two UPM values are the same. This means that
     53     // if pixels are read back to a UPM buffer, written back to PM to the GPU, and read back again
     54     // both reads will produce the same result. This test is quite expensive and should not be run
     55     // multiple times for a given context.
     56     static void TestForPreservingPMConversions(GrContext* context,
     57                                                PMConversion* PMToUPMRule,
     58                                                PMConversion* UPMToPMRule);
     59 
     60 private:
     61     GrConfigConversionEffect(GrTexture*,
     62                             bool swapRedAndBlue,
     63                             PMConversion pmConversion,
     64                             const SkMatrix& matrix);
     65 
     66     virtual bool onIsEqual(const GrProcessor&) const SK_OVERRIDE;
     67 
     68     bool            fSwapRedAndBlue;
     69     PMConversion    fPMConversion;
     70 
     71     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
     72 
     73     typedef GrSingleTextureEffect INHERITED;
     74 };
     75 
     76 #endif
     77