blob: cf2fea3640052b1a7fd276d8bf9ffa5d1513d752 [file] [log] [blame]
bsalomon@google.coma04e8e82012-08-27 12:53:13 +00001/*
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
egdaniel605dd0f2014-11-12 08:35:25 -080013class GrInvariantOutput;
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000014
15/**
16 * This class is used to perform config conversions. Clients may want to read/write data that is
17 * unpremultiplied. Also on some systems reading/writing BGRA or RGBA is faster. In those cases we
18 * read/write using the faster path and perform an R/B swap in the shader if the client data is in
19 * the slower config.
20 */
21class GrConfigConversionEffect : public GrSingleTextureEffect {
22public:
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
bsalomon4a339522015-10-06 08:40:50 -070036 static const GrFragmentProcessor* Create(GrTexture*, bool swapRedAndBlue, PMConversion,
37 const SkMatrix&);
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000038
mtklein36352bf2015-03-25 18:17:31 -070039 const char* name() const override { return "Config Conversion"; }
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000040
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000041 bool swapsRedAndBlue() const { return fSwapRedAndBlue; }
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
53private:
bsalomon4a339522015-10-06 08:40:50 -070054 GrConfigConversionEffect(GrTexture*,
joshualitt5f10b5c2015-07-09 10:24:35 -070055 bool swapRedAndBlue,
56 PMConversion pmConversion,
57 const SkMatrix& matrix);
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000058
wangyixb1daa862015-08-18 11:29:31 -070059 GrGLFragmentProcessor* onCreateGLInstance() const override;
60
wangyix4b3050b2015-08-04 07:59:37 -070061 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override;
62
mtklein36352bf2015-03-25 18:17:31 -070063 bool onIsEqual(const GrFragmentProcessor&) const override;
bsalomon@google.com68b58c92013-01-17 16:50:08 +000064
mtklein36352bf2015-03-25 18:17:31 -070065 void onComputeInvariantOutput(GrInvariantOutput* inout) const override;
egdaniel1a8ecdf2014-10-03 06:24:12 -070066
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000067 bool fSwapRedAndBlue;
68 PMConversion fPMConversion;
69
joshualittb0a8a372014-09-23 09:50:21 -070070 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
bsalomon@google.coma04e8e82012-08-27 12:53:13 +000071
72 typedef GrSingleTextureEffect INHERITED;
73};
74
75#endif