blob: 5b2eb7e3aefa94d56e6ce6df207cd565c47f7e94 [file] [log] [blame]
bsalomonf267c1e2016-02-01 13:16:14 -08001/*
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
8#include "GrYUVEffect.h"
9
10#include "GrCoordTransform.h"
11#include "GrFragmentProcessor.h"
bsalomonf267c1e2016-02-01 13:16:14 -080012#include "GrProcessor.h"
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -050013#include "GrTextureProxy.h"
bsalomonf267c1e2016-02-01 13:16:14 -080014#include "glsl/GrGLSLFragmentProcessor.h"
15#include "glsl/GrGLSLFragmentShaderBuilder.h"
16#include "glsl/GrGLSLProgramDataManager.h"
17#include "glsl/GrGLSLUniformHandler.h"
18
19namespace {
20
21static const float kJPEGConversionMatrix[16] = {
22 1.0f, 0.0f, 1.402f, -0.701f,
23 1.0f, -0.34414f, -0.71414f, 0.529f,
24 1.0f, 1.772f, 0.0f, -0.886f,
25 0.0f, 0.0f, 0.0f, 1.0
26};
27
28static const float kRec601ConversionMatrix[16] = {
29 1.164f, 0.0f, 1.596f, -0.87075f,
30 1.164f, -0.391f, -0.813f, 0.52925f,
31 1.164f, 2.018f, 0.0f, -1.08175f,
32 0.0f, 0.0f, 0.0f, 1.0}
33;
34
35static const float kRec709ConversionMatrix[16] = {
36 1.164f, 0.0f, 1.793f, -0.96925f,
37 1.164f, -0.213f, -0.533f, 0.30025f,
38 1.164f, 2.112f, 0.0f, -1.12875f,
39 0.0f, 0.0f, 0.0f, 1.0f}
40;
41
42static const float kJPEGInverseConversionMatrix[16] = {
43 0.299001f, 0.586998f, 0.114001f, 0.0000821798f,
44 -0.168736f, -0.331263f, 0.499999f, 0.499954f,
45 0.499999f, -0.418686f, -0.0813131f, 0.499941f,
46 0.f, 0.f, 0.f, 1.f
47};
48
49static const float kRec601InverseConversionMatrix[16] = {
50 0.256951f, 0.504421f, 0.0977346f, 0.0625f,
51 -0.148212f, -0.290954f, 0.439166f, 0.5f,
52 0.439166f, -0.367886f, -0.0712802f, 0.5f,
53 0.f, 0.f, 0.f, 1.f
54};
55
56static const float kRec709InverseConversionMatrix[16] = {
57 0.182663f, 0.614473f, 0.061971f, 0.0625f,
58 -0.100672f, -0.338658f, 0.43933f, 0.5f,
59 0.439142f, -0.39891f, -0.040231f, 0.5f,
60 0.f, 0.f, 0.f, 1.
61};
62
63class YUVtoRGBEffect : public GrFragmentProcessor {
64public:
Robert Phillipsfbcef6e2017-06-15 12:07:18 -040065 static sk_sp<GrFragmentProcessor> Make(sk_sp<GrTextureProxy> yProxy,
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -050066 sk_sp<GrTextureProxy> uProxy,
67 sk_sp<GrTextureProxy> vProxy, const SkISize sizes[3],
jbaumanb445a572016-06-09 13:24:48 -070068 SkYUVColorSpace colorSpace, bool nv12) {
bsalomonf267c1e2016-02-01 13:16:14 -080069 SkScalar w[3], h[3];
Robert Phillips67c18d62017-01-20 12:44:06 -050070 w[0] = SkIntToScalar(sizes[0].fWidth);
71 h[0] = SkIntToScalar(sizes[0].fHeight);
72 w[1] = SkIntToScalar(sizes[1].fWidth);
73 h[1] = SkIntToScalar(sizes[1].fHeight);
74 w[2] = SkIntToScalar(sizes[2].fWidth);
75 h[2] = SkIntToScalar(sizes[2].fHeight);
76 const SkMatrix yuvMatrix[3] = {
77 SkMatrix::I(),
78 SkMatrix::MakeScale(w[1] / w[0], h[1] / h[0]),
79 SkMatrix::MakeScale(w[2] / w[0], h[2] / h[0])
80 };
Brian Salomon514baff2016-11-17 15:17:07 -050081 GrSamplerParams::FilterMode uvFilterMode =
bsalomonf267c1e2016-02-01 13:16:14 -080082 ((sizes[1].fWidth != sizes[0].fWidth) ||
83 (sizes[1].fHeight != sizes[0].fHeight) ||
84 (sizes[2].fWidth != sizes[0].fWidth) ||
85 (sizes[2].fHeight != sizes[0].fHeight)) ?
Brian Salomon514baff2016-11-17 15:17:07 -050086 GrSamplerParams::kBilerp_FilterMode :
87 GrSamplerParams::kNone_FilterMode;
jbaumanb445a572016-06-09 13:24:48 -070088 return sk_sp<GrFragmentProcessor>(new YUVtoRGBEffect(
Robert Phillipsfbcef6e2017-06-15 12:07:18 -040089 std::move(yProxy), std::move(uProxy), std::move(vProxy),
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -050090 yuvMatrix, uvFilterMode, colorSpace, nv12));
bsalomonf267c1e2016-02-01 13:16:14 -080091 }
92
93 const char* name() const override { return "YUV to RGB"; }
94
Brian Salomonfb7c83a2017-07-26 13:57:33 -040095 sk_sp<GrFragmentProcessor> clone() const override {
96 return sk_sp<GrFragmentProcessor>(new YUVtoRGBEffect(*this));
97 }
98
bsalomonf267c1e2016-02-01 13:16:14 -080099 SkYUVColorSpace getColorSpace() const { return fColorSpace; }
100
jbaumanb445a572016-06-09 13:24:48 -0700101 bool isNV12() const {
102 return fNV12;
103 }
104
bsalomonf267c1e2016-02-01 13:16:14 -0800105 class GLSLProcessor : public GrGLSLFragmentProcessor {
106 public:
bsalomonf267c1e2016-02-01 13:16:14 -0800107 void emitCode(EmitArgs& args) override {
cdalton85285412016-02-18 12:37:07 -0800108 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
jbaumanb445a572016-06-09 13:24:48 -0700109 const YUVtoRGBEffect& effect = args.fFp.cast<YUVtoRGBEffect>();
bsalomonf267c1e2016-02-01 13:16:14 -0800110
111 const char* colorSpaceMatrix = nullptr;
cdalton5e58cee2016-02-11 12:49:47 -0800112 fMatrixUni = args.fUniformHandler->addUniform(kFragment_GrShaderFlag,
113 kMat44f_GrSLType, kDefault_GrSLPrecision,
114 "ColorSpaceMatrix", &colorSpaceMatrix);
Ethan Nicholas5af9ea32017-07-28 15:19:46 -0400115 fragBuilder->codeAppendf("%s = float4(", args.fOutputColor);
bsalomon1a1aa932016-09-12 09:30:36 -0700116 fragBuilder->appendTextureLookup(args.fTexSamplers[0],
117 args.fTransformedCoords[0].c_str(),
118 args.fTransformedCoords[0].getType());
bsalomonf267c1e2016-02-01 13:16:14 -0800119 fragBuilder->codeAppend(".r,");
bsalomon1a1aa932016-09-12 09:30:36 -0700120 fragBuilder->appendTextureLookup(args.fTexSamplers[1],
121 args.fTransformedCoords[1].c_str(),
122 args.fTransformedCoords[1].getType());
jbaumanb445a572016-06-09 13:24:48 -0700123 if (effect.fNV12) {
124 fragBuilder->codeAppendf(".rg,");
125 } else {
126 fragBuilder->codeAppend(".r,");
bsalomon1a1aa932016-09-12 09:30:36 -0700127 fragBuilder->appendTextureLookup(args.fTexSamplers[2],
128 args.fTransformedCoords[2].c_str(),
129 args.fTransformedCoords[2].getType());
jbaumanb445a572016-06-09 13:24:48 -0700130 fragBuilder->codeAppendf(".g,");
131 }
132 fragBuilder->codeAppendf("1.0) * %s;", colorSpaceMatrix);
bsalomonf267c1e2016-02-01 13:16:14 -0800133 }
134
135 protected:
136 void onSetData(const GrGLSLProgramDataManager& pdman,
Brian Salomonab015ef2017-04-04 10:15:51 -0400137 const GrFragmentProcessor& processor) override {
bsalomonf267c1e2016-02-01 13:16:14 -0800138 const YUVtoRGBEffect& yuvEffect = processor.cast<YUVtoRGBEffect>();
139 switch (yuvEffect.getColorSpace()) {
140 case kJPEG_SkYUVColorSpace:
141 pdman.setMatrix4f(fMatrixUni, kJPEGConversionMatrix);
142 break;
143 case kRec601_SkYUVColorSpace:
144 pdman.setMatrix4f(fMatrixUni, kRec601ConversionMatrix);
145 break;
146 case kRec709_SkYUVColorSpace:
147 pdman.setMatrix4f(fMatrixUni, kRec709ConversionMatrix);
148 break;
149 }
150 }
151
152 private:
153 GrGLSLProgramDataManager::UniformHandle fMatrixUni;
154
155 typedef GrGLSLFragmentProcessor INHERITED;
156 };
157
158private:
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400159 YUVtoRGBEffect(sk_sp<GrTextureProxy> yProxy, sk_sp<GrTextureProxy> uProxy,
Brian Salomon587e08f2017-01-27 10:59:27 -0500160 sk_sp<GrTextureProxy> vProxy, const SkMatrix yuvMatrix[3],
161 GrSamplerParams::FilterMode uvFilterMode, SkYUVColorSpace colorSpace, bool nv12)
162 : INHERITED(kPreservesOpaqueInput_OptimizationFlag)
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400163 , fYTransform(yuvMatrix[0], yProxy.get())
164 , fYSampler(std::move(yProxy))
165 , fUTransform(yuvMatrix[1], uProxy.get())
166 , fUSampler(std::move(uProxy), uvFilterMode)
167 , fVSampler(vProxy, uvFilterMode)
Brian Salomon587e08f2017-01-27 10:59:27 -0500168 , fColorSpace(colorSpace)
169 , fNV12(nv12) {
bsalomonf267c1e2016-02-01 13:16:14 -0800170 this->initClassID<YUVtoRGBEffect>();
171 this->addCoordTransform(&fYTransform);
Brian Salomon0bbecb22016-11-17 11:38:22 -0500172 this->addTextureSampler(&fYSampler);
bsalomonf267c1e2016-02-01 13:16:14 -0800173 this->addCoordTransform(&fUTransform);
Brian Salomon0bbecb22016-11-17 11:38:22 -0500174 this->addTextureSampler(&fUSampler);
jbaumanb445a572016-06-09 13:24:48 -0700175 if (!fNV12) {
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400176 fVTransform = GrCoordTransform(yuvMatrix[2], vProxy.get());
jbaumanb445a572016-06-09 13:24:48 -0700177 this->addCoordTransform(&fVTransform);
Brian Salomon0bbecb22016-11-17 11:38:22 -0500178 this->addTextureSampler(&fVSampler);
jbaumanb445a572016-06-09 13:24:48 -0700179 }
bsalomonf267c1e2016-02-01 13:16:14 -0800180 }
181
Brian Salomonfb7c83a2017-07-26 13:57:33 -0400182 YUVtoRGBEffect(const YUVtoRGBEffect& that)
183 : INHERITED(kPreservesOpaqueInput_OptimizationFlag)
184 , fYTransform(that.fYTransform)
185 , fYSampler(that.fYSampler)
186 , fUTransform(that.fUTransform)
187 , fUSampler(that.fUSampler)
188 , fVTransform(that.fVTransform)
189 , fVSampler(that.fVSampler)
190 , fColorSpace(that.fColorSpace)
191 , fNV12(that.fNV12) {
192 this->initClassID<YUVtoRGBEffect>();
193 this->addCoordTransform(&fYTransform);
194 this->addTextureSampler(&fYSampler);
195 this->addCoordTransform(&fUTransform);
196 this->addTextureSampler(&fUSampler);
197 if (!fNV12) {
198 this->addCoordTransform(&fVTransform);
199 this->addTextureSampler(&fVSampler);
200 }
201 }
202
bsalomonf267c1e2016-02-01 13:16:14 -0800203 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
robertphillips9cdb9922016-02-03 12:25:40 -0800204 return new GLSLProcessor;
bsalomonf267c1e2016-02-01 13:16:14 -0800205 }
206
Brian Salomon94efbf52016-11-29 13:43:05 -0500207 void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
jbaumanb445a572016-06-09 13:24:48 -0700208 b->add32(fNV12);
bsalomonf267c1e2016-02-01 13:16:14 -0800209 }
210
211 bool onIsEqual(const GrFragmentProcessor& sBase) const override {
212 const YUVtoRGBEffect& s = sBase.cast<YUVtoRGBEffect>();
jbaumanb445a572016-06-09 13:24:48 -0700213 return (fColorSpace == s.getColorSpace()) && (fNV12 == s.isNV12());
bsalomonf267c1e2016-02-01 13:16:14 -0800214 }
215
bsalomonf267c1e2016-02-01 13:16:14 -0800216 GrCoordTransform fYTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500217 TextureSampler fYSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800218 GrCoordTransform fUTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500219 TextureSampler fUSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800220 GrCoordTransform fVTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500221 TextureSampler fVSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800222 SkYUVColorSpace fColorSpace;
jbaumanb445a572016-06-09 13:24:48 -0700223 bool fNV12;
bsalomonf267c1e2016-02-01 13:16:14 -0800224
225 typedef GrFragmentProcessor INHERITED;
226};
227
228
229class RGBToYUVEffect : public GrFragmentProcessor {
230public:
231 enum OutputChannels {
232 // output color r = y, g = u, b = v, a = a
233 kYUV_OutputChannels,
234 // output color rgba = y
235 kY_OutputChannels,
236 // output color r = u, g = v, b = 0, a = a
237 kUV_OutputChannels,
238 // output color rgba = u
239 kU_OutputChannels,
240 // output color rgba = v
241 kV_OutputChannels
242 };
243
Robert Phillips1c9686b2017-06-30 08:40:28 -0400244 static sk_sp<GrFragmentProcessor> Make(sk_sp<GrFragmentProcessor> rgbFP,
245 SkYUVColorSpace colorSpace,
246 OutputChannels output) {
247 return sk_sp<GrFragmentProcessor>(new RGBToYUVEffect(std::move(rgbFP), colorSpace, output));
bsalomonf267c1e2016-02-01 13:16:14 -0800248 }
249
250 const char* name() const override { return "RGBToYUV"; }
251
Brian Salomonfb7c83a2017-07-26 13:57:33 -0400252 sk_sp<GrFragmentProcessor> clone() const override {
Brian Salomon96271cd2017-07-31 16:27:23 -0400253 return Make(this->childProcessor(0).clone(), fColorSpace, fOutputChannels);
Brian Salomonfb7c83a2017-07-26 13:57:33 -0400254 }
255
bsalomonf267c1e2016-02-01 13:16:14 -0800256 SkYUVColorSpace getColorSpace() const { return fColorSpace; }
257
258 OutputChannels outputChannels() const { return fOutputChannels; }
259
260 class GLSLProcessor : public GrGLSLFragmentProcessor {
261 public:
robertphillips9cdb9922016-02-03 12:25:40 -0800262 GLSLProcessor() : fLastColorSpace(-1), fLastOutputChannels(-1) {}
bsalomonf267c1e2016-02-01 13:16:14 -0800263
264 void emitCode(EmitArgs& args) override {
cdalton85285412016-02-18 12:37:07 -0800265 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
bsalomonf267c1e2016-02-01 13:16:14 -0800266 OutputChannels oc = args.fFp.cast<RGBToYUVEffect>().outputChannels();
267
268 SkString outputColor("rgbColor");
269 this->emitChild(0, args.fInputColor, &outputColor, args);
270
271 const char* uniName;
272 switch (oc) {
273 case kYUV_OutputChannels:
274 fRGBToYUVUni = args.fUniformHandler->addUniformArray(
cdalton5e58cee2016-02-11 12:49:47 -0800275 kFragment_GrShaderFlag,
bsalomonf267c1e2016-02-01 13:16:14 -0800276 kVec4f_GrSLType, kDefault_GrSLPrecision,
277 "RGBToYUV", 3, &uniName);
Ethan Nicholas5af9ea32017-07-28 15:19:46 -0400278 fragBuilder->codeAppendf("%s = float4(dot(rgbColor.rgb, %s[0].rgb) + %s[0].a,"
bsalomonf267c1e2016-02-01 13:16:14 -0800279 "dot(rgbColor.rgb, %s[1].rgb) + %s[1].a,"
280 "dot(rgbColor.rgb, %s[2].rgb) + %s[2].a,"
281 "rgbColor.a);",
282 args.fOutputColor, uniName, uniName, uniName, uniName,
283 uniName, uniName);
284 break;
285 case kUV_OutputChannels:
286 fRGBToYUVUni = args.fUniformHandler->addUniformArray(
cdalton5e58cee2016-02-11 12:49:47 -0800287 kFragment_GrShaderFlag,
bsalomonf267c1e2016-02-01 13:16:14 -0800288 kVec4f_GrSLType, kDefault_GrSLPrecision,
289 "RGBToUV", 2, &uniName);
Ethan Nicholas5af9ea32017-07-28 15:19:46 -0400290 fragBuilder->codeAppendf("%s = float4(dot(rgbColor.rgb, %s[0].rgb) + %s[0].a,"
bsalomonf267c1e2016-02-01 13:16:14 -0800291 "dot(rgbColor.rgb, %s[1].rgb) + %s[1].a,"
292 "0.0,"
293 "rgbColor.a);",
294 args.fOutputColor, uniName, uniName, uniName, uniName);
295 break;
296 case kY_OutputChannels:
297 case kU_OutputChannels:
298 case kV_OutputChannels:
299 fRGBToYUVUni = args.fUniformHandler->addUniform(
cdalton5e58cee2016-02-11 12:49:47 -0800300 kFragment_GrShaderFlag,
bsalomonf267c1e2016-02-01 13:16:14 -0800301 kVec4f_GrSLType, kDefault_GrSLPrecision,
302 "RGBToYUorV", &uniName);
Ethan Nicholas5af9ea32017-07-28 15:19:46 -0400303 fragBuilder->codeAppendf("%s = float4(dot(rgbColor.rgb, %s.rgb) + %s.a);\n",
bsalomonf267c1e2016-02-01 13:16:14 -0800304 args.fOutputColor, uniName, uniName);
305 break;
306 }
307 }
308
309 private:
310 void onSetData(const GrGLSLProgramDataManager& pdman,
Brian Salomonab015ef2017-04-04 10:15:51 -0400311 const GrFragmentProcessor& processor) override {
bsalomonf267c1e2016-02-01 13:16:14 -0800312 const RGBToYUVEffect& effect = processor.cast<RGBToYUVEffect>();
313 OutputChannels oc = effect.outputChannels();
314 if (effect.getColorSpace() != fLastColorSpace || oc != fLastOutputChannels) {
315
316 const float* matrix = nullptr;
317 switch (effect.getColorSpace()) {
318 case kJPEG_SkYUVColorSpace:
319 matrix = kJPEGInverseConversionMatrix;
320 break;
321 case kRec601_SkYUVColorSpace:
322 matrix = kRec601InverseConversionMatrix;
323 break;
324 case kRec709_SkYUVColorSpace:
325 matrix = kRec709InverseConversionMatrix;
326 break;
327 }
328 switch (oc) {
329 case kYUV_OutputChannels:
330 pdman.set4fv(fRGBToYUVUni, 3, matrix);
331 break;
332 case kUV_OutputChannels:
333 pdman.set4fv(fRGBToYUVUni, 2, matrix + 4);
334 break;
335 case kY_OutputChannels:
336 pdman.set4fv(fRGBToYUVUni, 1, matrix);
337 break;
338 case kU_OutputChannels:
339 pdman.set4fv(fRGBToYUVUni, 1, matrix + 4);
340 break;
341 case kV_OutputChannels:
342 pdman.set4fv(fRGBToYUVUni, 1, matrix + 8);
343 break;
344 }
345 fLastColorSpace = effect.getColorSpace();
346 }
347 }
348 GrGLSLProgramDataManager::UniformHandle fRGBToYUVUni;
349 int fLastColorSpace;
350 int fLastOutputChannels;
351
352 typedef GrGLSLFragmentProcessor INHERITED;
353 };
354
355private:
Robert Phillips1c9686b2017-06-30 08:40:28 -0400356 RGBToYUVEffect(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace,
357 OutputChannels output)
358 // This could advertise kConstantOutputForConstantInput, but doesn't seem useful.
359 : INHERITED(kPreservesOpaqueInput_OptimizationFlag)
360 , fColorSpace(colorSpace)
361 , fOutputChannels(output) {
362 this->initClassID<RGBToYUVEffect>();
363 this->registerChildProcessor(std::move(rgbFP));
364 }
365
bsalomonf267c1e2016-02-01 13:16:14 -0800366 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
robertphillips9cdb9922016-02-03 12:25:40 -0800367 return new GLSLProcessor;
bsalomonf267c1e2016-02-01 13:16:14 -0800368 }
369
Brian Salomon94efbf52016-11-29 13:43:05 -0500370 void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
bsalomonf267c1e2016-02-01 13:16:14 -0800371 // kY, kU, and kV all generate the same code, just upload different coefficients.
372 if (kU_OutputChannels == fOutputChannels || kV_OutputChannels == fOutputChannels) {
373 b->add32(kY_OutputChannels);
374 } else {
375 b->add32(fOutputChannels);
376 }
377 }
378
379 bool onIsEqual(const GrFragmentProcessor& sBase) const override {
380 const RGBToYUVEffect& s = sBase.cast<RGBToYUVEffect>();
381 return fColorSpace == s.getColorSpace() && fOutputChannels == s.outputChannels();
382 }
383
bsalomonf267c1e2016-02-01 13:16:14 -0800384 GrCoordTransform fTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500385 TextureSampler fTextureSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800386 SkYUVColorSpace fColorSpace;
387 OutputChannels fOutputChannels;
388
389 typedef GrFragmentProcessor INHERITED;
390};
391
392}
393
394//////////////////////////////////////////////////////////////////////////////
395
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400396sk_sp<GrFragmentProcessor> GrYUVEffect::MakeYUVToRGB(sk_sp<GrTextureProxy> yProxy,
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -0500397 sk_sp<GrTextureProxy> uProxy,
398 sk_sp<GrTextureProxy> vProxy,
399 const SkISize sizes[3],
jbaumanb445a572016-06-09 13:24:48 -0700400 SkYUVColorSpace colorSpace, bool nv12) {
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -0500401 SkASSERT(yProxy && uProxy && vProxy && sizes);
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400402 return YUVtoRGBEffect::Make(std::move(yProxy), std::move(uProxy), std::move(vProxy),
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -0500403 sizes, colorSpace, nv12);
bsalomonf267c1e2016-02-01 13:16:14 -0800404}
405
bungeman06ca8ec2016-06-09 08:01:03 -0700406sk_sp<GrFragmentProcessor>
407GrYUVEffect::MakeRGBToYUV(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800408 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400409 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kYUV_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800410}
411
bungeman06ca8ec2016-06-09 08:01:03 -0700412sk_sp<GrFragmentProcessor>
413GrYUVEffect::MakeRGBToY(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800414 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400415 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kY_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800416}
417
bungeman06ca8ec2016-06-09 08:01:03 -0700418sk_sp<GrFragmentProcessor>
419GrYUVEffect::MakeRGBToUV(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800420 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400421 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kUV_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800422}
423
bungeman06ca8ec2016-06-09 08:01:03 -0700424sk_sp<GrFragmentProcessor>
425GrYUVEffect::MakeRGBToU(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800426 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400427 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kU_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800428}
429
bungeman06ca8ec2016-06-09 08:01:03 -0700430sk_sp<GrFragmentProcessor>
431GrYUVEffect::MakeRGBToV(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800432 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400433 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kV_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800434}