blob: c1b77b4b51a443e3f848b75ec2011e575468e101 [file] [log] [blame]
Ethan Nicholas7461a4a2017-12-21 14:18:01 -05001/*
Ethan Nicholas130fb3f2018-02-01 12:14:34 -05002 * Copyright 2018 Google Inc.
Ethan Nicholas7461a4a2017-12-21 14:18:01 -05003 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Ethan Nicholas130fb3f2018-02-01 12:14:34 -05008/**************************************************************************************************
9 *** This file was autogenerated from GrYUVtoRGBEffect.fp; do not modify.
10 **************************************************************************************************/
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050011#include "GrYUVtoRGBEffect.h"
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050012
13static const float kJPEGConversionMatrix[16] = {
14 1.0f, 0.0f, 1.402f, -0.703749f, 1.0f, -0.344136f, -0.714136f, 0.531211f,
15 1.0f, 1.772f, 0.0f, -0.889475f, 0.0f, 0.0f, 0.0f, 1.0};
16
17static const float kRec601ConversionMatrix[16] = {
18 1.164f, 0.0f, 1.596f, -0.87075f, 1.164f, -0.391f, -0.813f, 0.52925f,
19 1.164f, 2.018f, 0.0f, -1.08175f, 0.0f, 0.0f, 0.0f, 1.0};
20
21static const float kRec709ConversionMatrix[16] = {
22 1.164f, 0.0f, 1.793f, -0.96925f, 1.164f, -0.213f, -0.533f, 0.30025f,
23 1.164f, 2.112f, 0.0f, -1.12875f, 0.0f, 0.0f, 0.0f, 1.0f};
24
25std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::Make(sk_sp<GrTextureProxy> yProxy,
26 sk_sp<GrTextureProxy>
27 uProxy,
28 sk_sp<GrTextureProxy>
29 vProxy,
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050030 SkYUVColorSpace colorSpace,
31 bool nv12) {
32 SkScalar w[3], h[3];
Weiliang Chen3e95e572018-05-30 15:15:23 -040033 w[0] = SkIntToScalar(yProxy->width());
34 h[0] = SkIntToScalar(yProxy->height());
35 w[1] = SkIntToScalar(uProxy->width());
36 h[1] = SkIntToScalar(uProxy->height());
37 w[2] = SkIntToScalar(vProxy->width());
38 h[2] = SkIntToScalar(vProxy->height());
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050039 SkMatrix yTransform = SkMatrix::I();
40 SkMatrix uTransform = SkMatrix::MakeScale(w[1] / w[0], h[1] / h[0]);
41 SkMatrix vTransform = SkMatrix::MakeScale(w[2] / w[0], h[2] / h[0]);
42 GrSamplerState::Filter uvFilterMode =
Weiliang Chen3e95e572018-05-30 15:15:23 -040043 ((uProxy->width() != yProxy->width()) || (uProxy->height() != yProxy->height()) ||
44 (vProxy->width() != yProxy->width()) || (vProxy->height() != yProxy->height()))
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050045 ? GrSamplerState::Filter::kBilerp
46 : GrSamplerState::Filter::kNearest;
Ethan Nicholas92c7fa62017-12-22 11:00:58 -050047 SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050048 switch (colorSpace) {
49 case kJPEG_SkYUVColorSpace:
50 mat.setColMajorf(kJPEGConversionMatrix);
51 break;
52 case kRec601_SkYUVColorSpace:
53 mat.setColMajorf(kRec601ConversionMatrix);
54 break;
55 case kRec709_SkYUVColorSpace:
56 mat.setColMajorf(kRec709ConversionMatrix);
57 break;
58 }
59 return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect(
60 std::move(yProxy), yTransform, std::move(uProxy), uTransform, std::move(vProxy),
61 vTransform, mat, nv12, GrSamplerState(GrSamplerState::WrapMode::kClamp, uvFilterMode)));
62}
Robert Phillipsba5c4392018-07-25 12:37:14 -040063
64SkString GrYUVtoRGBEffect::dumpInfo() const {
65 SkString str;
66 str.appendf("Y: %d %d U: %d %d V: %d %d\n",
67 fYSampler.proxy()->uniqueID().asUInt(),
68 fYSampler.proxy()->underlyingUniqueID().asUInt(),
69 fUSampler.proxy()->uniqueID().asUInt(),
70 fUSampler.proxy()->underlyingUniqueID().asUInt(),
71 fVSampler.proxy()->uniqueID().asUInt(),
72 fVSampler.proxy()->underlyingUniqueID().asUInt());
73
74 return str;
75}
Ethan Nicholas7461a4a2017-12-21 14:18:01 -050076#include "glsl/GrGLSLFragmentProcessor.h"
77#include "glsl/GrGLSLFragmentShaderBuilder.h"
78#include "glsl/GrGLSLProgramBuilder.h"
79#include "GrTexture.h"
80#include "SkSLCPP.h"
81#include "SkSLUtil.h"
82class GrGLSLYUVtoRGBEffect : public GrGLSLFragmentProcessor {
83public:
84 GrGLSLYUVtoRGBEffect() {}
85 void emitCode(EmitArgs& args) override {
86 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
87 const GrYUVtoRGBEffect& _outer = args.fFp.cast<GrYUVtoRGBEffect>();
88 (void)_outer;
89 auto ySamplerTransform = _outer.ySamplerTransform();
90 (void)ySamplerTransform;
91 auto uSamplerTransform = _outer.uSamplerTransform();
92 (void)uSamplerTransform;
93 auto vSamplerTransform = _outer.vSamplerTransform();
94 (void)vSamplerTransform;
95 auto colorSpaceMatrix = _outer.colorSpaceMatrix();
96 (void)colorSpaceMatrix;
97 auto nv12 = _outer.nv12();
98 (void)nv12;
99 fColorSpaceMatrixVar =
100 args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4x4_GrSLType,
101 kDefault_GrSLPrecision, "colorSpaceMatrix");
102 SkString sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]);
103 SkString sk_TransformedCoords2D_1 = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]);
104 SkString sk_TransformedCoords2D_2 = fragBuilder->ensureCoords2D(args.fTransformedCoords[2]);
105 fragBuilder->codeAppendf(
106 "@if (%s) {\n %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.xy, 1.0) * "
107 "%s;\n} else {\n %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.x, "
108 "texture(%s, %s).%s.x, 1.0) * %s;\n}\n",
109 (_outer.nv12() ? "true" : "false"), args.fOutputColor,
110 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(),
111 sk_TransformedCoords2D_0.c_str(),
112 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(),
113 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(),
114 sk_TransformedCoords2D_1.c_str(),
115 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(),
116 args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar), args.fOutputColor,
117 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(),
118 sk_TransformedCoords2D_0.c_str(),
119 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(),
120 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(),
121 sk_TransformedCoords2D_1.c_str(),
122 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(),
123 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[2]).c_str(),
124 sk_TransformedCoords2D_2.c_str(),
125 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[2]).c_str(),
126 args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar));
127 }
128
129private:
130 void onSetData(const GrGLSLProgramDataManager& pdman,
131 const GrFragmentProcessor& _proc) override {
132 const GrYUVtoRGBEffect& _outer = _proc.cast<GrYUVtoRGBEffect>();
Michael Ludwiga4275592018-08-31 10:52:47 -0400133 { pdman.setSkMatrix44(fColorSpaceMatrixVar, (_outer.colorSpaceMatrix())); }
Ethan Nicholas7461a4a2017-12-21 14:18:01 -0500134 }
135 UniformHandle fColorSpaceMatrixVar;
136};
137GrGLSLFragmentProcessor* GrYUVtoRGBEffect::onCreateGLSLInstance() const {
138 return new GrGLSLYUVtoRGBEffect();
139}
140void GrYUVtoRGBEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
141 GrProcessorKeyBuilder* b) const {
142 b->add32((int32_t)fNv12);
143}
144bool GrYUVtoRGBEffect::onIsEqual(const GrFragmentProcessor& other) const {
145 const GrYUVtoRGBEffect& that = other.cast<GrYUVtoRGBEffect>();
146 (void)that;
147 if (fYSampler != that.fYSampler) return false;
148 if (fYSamplerTransform != that.fYSamplerTransform) return false;
149 if (fUSampler != that.fUSampler) return false;
150 if (fUSamplerTransform != that.fUSamplerTransform) return false;
151 if (fVSampler != that.fVSampler) return false;
152 if (fVSamplerTransform != that.fVSamplerTransform) return false;
153 if (fColorSpaceMatrix != that.fColorSpaceMatrix) return false;
154 if (fNv12 != that.fNv12) return false;
155 return true;
156}
157GrYUVtoRGBEffect::GrYUVtoRGBEffect(const GrYUVtoRGBEffect& src)
158 : INHERITED(kGrYUVtoRGBEffect_ClassID, src.optimizationFlags())
159 , fYSampler(src.fYSampler)
160 , fYSamplerTransform(src.fYSamplerTransform)
161 , fUSampler(src.fUSampler)
162 , fUSamplerTransform(src.fUSamplerTransform)
163 , fVSampler(src.fVSampler)
164 , fVSamplerTransform(src.fVSamplerTransform)
165 , fColorSpaceMatrix(src.fColorSpaceMatrix)
166 , fNv12(src.fNv12)
167 , fYSamplerCoordTransform(src.fYSamplerCoordTransform)
168 , fUSamplerCoordTransform(src.fUSamplerCoordTransform)
169 , fVSamplerCoordTransform(src.fVSamplerCoordTransform) {
Brian Salomonf7dcd762018-07-30 14:48:15 -0400170 this->setTextureSamplerCnt(3);
Ethan Nicholas7461a4a2017-12-21 14:18:01 -0500171 this->addCoordTransform(&fYSamplerCoordTransform);
172 this->addCoordTransform(&fUSamplerCoordTransform);
173 this->addCoordTransform(&fVSamplerCoordTransform);
174}
175std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::clone() const {
176 return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect(*this));
177}
Brian Salomonf7dcd762018-07-30 14:48:15 -0400178const GrFragmentProcessor::TextureSampler& GrYUVtoRGBEffect::onTextureSampler(int index) const {
179 return IthTextureSampler(index, fYSampler, fUSampler, fVSampler);
180}