blob: 1a46c969ef3469f4e25c4e12682030f4d0cf5f77 [file] [log] [blame]
sugoi24dcac22014-07-07 15:09:48 -07001/*
2 * Copyright 2014 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
joshualitt30ba4362014-08-21 20:18:45 -07008#include "gl/builders/GrGLProgramBuilder.h"
sugoi24dcac22014-07-07 15:09:48 -07009#include "GrYUVtoRGBEffect.h"
10
11#include "GrCoordTransform.h"
12#include "GrEffect.h"
13#include "gl/GrGLEffect.h"
14#include "GrTBackendEffectFactory.h"
15
16namespace {
17
18class YUVtoRGBEffect : public GrEffect {
19public:
bsalomon97b9ab72014-07-08 06:52:35 -070020 static GrEffect* Create(GrTexture* yTexture, GrTexture* uTexture, GrTexture* vTexture) {
bsalomon55fad7a2014-07-08 07:34:20 -070021 return SkNEW_ARGS(YUVtoRGBEffect, (yTexture, uTexture, vTexture));
sugoi24dcac22014-07-07 15:09:48 -070022 }
23
24 static const char* Name() { return "YUV to RGB"; }
25
26 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE {
27 return GrTBackendEffectFactory<YUVtoRGBEffect>::getInstance();
28 }
29
30 virtual void getConstantColorComponents(GrColor* color,
31 uint32_t* validFlags) const SK_OVERRIDE {
32 // YUV is opaque
33 *color = 0xFF;
34 *validFlags = kA_GrColorComponentFlag;
35 }
36
37 class GLEffect : public GrGLEffect {
38 public:
39 // this class always generates the same code.
bsalomon63e99f72014-07-21 08:03:14 -070040 static void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*) {}
sugoi24dcac22014-07-07 15:09:48 -070041
42 GLEffect(const GrBackendEffectFactory& factory,
43 const GrDrawEffect&)
44 : INHERITED(factory) {
45 }
46
joshualitt30ba4362014-08-21 20:18:45 -070047 virtual void emitCode(GrGLProgramBuilder* builder,
sugoi24dcac22014-07-07 15:09:48 -070048 const GrDrawEffect&,
bsalomon63e99f72014-07-21 08:03:14 -070049 const GrEffectKey&,
sugoi24dcac22014-07-07 15:09:48 -070050 const char* outputColor,
51 const char* inputColor,
52 const TransformedCoordsArray& coords,
53 const TextureSamplerArray& samplers) SK_OVERRIDE {
joshualitt30ba4362014-08-21 20:18:45 -070054 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
sugoi24dcac22014-07-07 15:09:48 -070055 const char* yuvMatrix = "yuvMatrix";
joshualitt30ba4362014-08-21 20:18:45 -070056 fsBuilder->codeAppendf("\tconst mat4 %s = mat4(1.0, 0.0, 1.402, -0.701,\n\t\t\t"
sugoi24dcac22014-07-07 15:09:48 -070057 "1.0, -0.344, -0.714, 0.529,\n\t\t\t"
58 "1.0, 1.772, 0.0, -0.886,\n\t\t\t"
59 "0.0, 0.0, 0.0, 1.0);\n",
60 yuvMatrix);
joshualitt30ba4362014-08-21 20:18:45 -070061 fsBuilder->codeAppendf("\t%s = vec4(\n\t\t", outputColor);
62 fsBuilder->appendTextureLookup(samplers[0], coords[0].c_str(), coords[0].type());
63 fsBuilder->codeAppend(".r,\n\t\t");
64 fsBuilder->appendTextureLookup(samplers[1], coords[0].c_str(), coords[0].type());
65 fsBuilder->codeAppend(".r,\n\t\t");
66 fsBuilder->appendTextureLookup(samplers[2], coords[0].c_str(), coords[0].type());
67 fsBuilder->codeAppendf(".r,\n\t\t1.0) * %s;\n", yuvMatrix);
sugoi24dcac22014-07-07 15:09:48 -070068 }
69
70 typedef GrGLEffect INHERITED;
71 };
72
73private:
74 YUVtoRGBEffect(GrTexture* yTexture, GrTexture* uTexture, GrTexture* vTexture)
bsalomon6267f812014-08-29 15:05:53 -070075 : fCoordTransform(kLocal_GrCoordSet, GrCoordTransform::MakeDivByTextureWHMatrix(yTexture),
76 yTexture)
sugoi24dcac22014-07-07 15:09:48 -070077 , fYAccess(yTexture)
78 , fUAccess(uTexture)
79 , fVAccess(vTexture) {
80 this->addCoordTransform(&fCoordTransform);
81 this->addTextureAccess(&fYAccess);
82 this->addTextureAccess(&fUAccess);
83 this->addTextureAccess(&fVAccess);
84 this->setWillNotUseInputColor();
85 }
86
87 virtual bool onIsEqual(const GrEffect& sBase) const {
88 const YUVtoRGBEffect& s = CastEffect<YUVtoRGBEffect>(sBase);
89 return fYAccess.getTexture() == s.fYAccess.getTexture() &&
90 fUAccess.getTexture() == s.fUAccess.getTexture() &&
91 fVAccess.getTexture() == s.fVAccess.getTexture();
92 }
93
94 GrCoordTransform fCoordTransform;
95 GrTextureAccess fYAccess;
96 GrTextureAccess fUAccess;
97 GrTextureAccess fVAccess;
98
99 typedef GrEffect INHERITED;
100};
101
102}
103
104//////////////////////////////////////////////////////////////////////////////
105
bsalomon83d081a2014-07-08 09:56:10 -0700106GrEffect* GrYUVtoRGBEffect::Create(GrTexture* yTexture, GrTexture* uTexture, GrTexture* vTexture) {
sugoi24dcac22014-07-07 15:09:48 -0700107 return YUVtoRGBEffect::Create(yTexture, uTexture, vTexture);
108}