blob: 7a18b02c4f8e345016ef4aae4bf2a6b5eca53ea9 [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
95 SkYUVColorSpace getColorSpace() const { return fColorSpace; }
96
jbaumanb445a572016-06-09 13:24:48 -070097 bool isNV12() const {
98 return fNV12;
99 }
100
bsalomonf267c1e2016-02-01 13:16:14 -0800101 class GLSLProcessor : public GrGLSLFragmentProcessor {
102 public:
bsalomonf267c1e2016-02-01 13:16:14 -0800103 void emitCode(EmitArgs& args) override {
cdalton85285412016-02-18 12:37:07 -0800104 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
jbaumanb445a572016-06-09 13:24:48 -0700105 const YUVtoRGBEffect& effect = args.fFp.cast<YUVtoRGBEffect>();
bsalomonf267c1e2016-02-01 13:16:14 -0800106
107 const char* colorSpaceMatrix = nullptr;
cdalton5e58cee2016-02-11 12:49:47 -0800108 fMatrixUni = args.fUniformHandler->addUniform(kFragment_GrShaderFlag,
109 kMat44f_GrSLType, kDefault_GrSLPrecision,
110 "ColorSpaceMatrix", &colorSpaceMatrix);
bsalomonf267c1e2016-02-01 13:16:14 -0800111 fragBuilder->codeAppendf("%s = vec4(", args.fOutputColor);
bsalomon1a1aa932016-09-12 09:30:36 -0700112 fragBuilder->appendTextureLookup(args.fTexSamplers[0],
113 args.fTransformedCoords[0].c_str(),
114 args.fTransformedCoords[0].getType());
bsalomonf267c1e2016-02-01 13:16:14 -0800115 fragBuilder->codeAppend(".r,");
bsalomon1a1aa932016-09-12 09:30:36 -0700116 fragBuilder->appendTextureLookup(args.fTexSamplers[1],
117 args.fTransformedCoords[1].c_str(),
118 args.fTransformedCoords[1].getType());
jbaumanb445a572016-06-09 13:24:48 -0700119 if (effect.fNV12) {
120 fragBuilder->codeAppendf(".rg,");
121 } else {
122 fragBuilder->codeAppend(".r,");
bsalomon1a1aa932016-09-12 09:30:36 -0700123 fragBuilder->appendTextureLookup(args.fTexSamplers[2],
124 args.fTransformedCoords[2].c_str(),
125 args.fTransformedCoords[2].getType());
jbaumanb445a572016-06-09 13:24:48 -0700126 fragBuilder->codeAppendf(".g,");
127 }
128 fragBuilder->codeAppendf("1.0) * %s;", colorSpaceMatrix);
bsalomonf267c1e2016-02-01 13:16:14 -0800129 }
130
131 protected:
132 void onSetData(const GrGLSLProgramDataManager& pdman,
Brian Salomonab015ef2017-04-04 10:15:51 -0400133 const GrFragmentProcessor& processor) override {
bsalomonf267c1e2016-02-01 13:16:14 -0800134 const YUVtoRGBEffect& yuvEffect = processor.cast<YUVtoRGBEffect>();
135 switch (yuvEffect.getColorSpace()) {
136 case kJPEG_SkYUVColorSpace:
137 pdman.setMatrix4f(fMatrixUni, kJPEGConversionMatrix);
138 break;
139 case kRec601_SkYUVColorSpace:
140 pdman.setMatrix4f(fMatrixUni, kRec601ConversionMatrix);
141 break;
142 case kRec709_SkYUVColorSpace:
143 pdman.setMatrix4f(fMatrixUni, kRec709ConversionMatrix);
144 break;
145 }
146 }
147
148 private:
149 GrGLSLProgramDataManager::UniformHandle fMatrixUni;
150
151 typedef GrGLSLFragmentProcessor INHERITED;
152 };
153
154private:
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400155 YUVtoRGBEffect(sk_sp<GrTextureProxy> yProxy, sk_sp<GrTextureProxy> uProxy,
Brian Salomon587e08f2017-01-27 10:59:27 -0500156 sk_sp<GrTextureProxy> vProxy, const SkMatrix yuvMatrix[3],
157 GrSamplerParams::FilterMode uvFilterMode, SkYUVColorSpace colorSpace, bool nv12)
158 : INHERITED(kPreservesOpaqueInput_OptimizationFlag)
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400159 , fYTransform(yuvMatrix[0], yProxy.get())
160 , fYSampler(std::move(yProxy))
161 , fUTransform(yuvMatrix[1], uProxy.get())
162 , fUSampler(std::move(uProxy), uvFilterMode)
163 , fVSampler(vProxy, uvFilterMode)
Brian Salomon587e08f2017-01-27 10:59:27 -0500164 , fColorSpace(colorSpace)
165 , fNV12(nv12) {
bsalomonf267c1e2016-02-01 13:16:14 -0800166 this->initClassID<YUVtoRGBEffect>();
167 this->addCoordTransform(&fYTransform);
Brian Salomon0bbecb22016-11-17 11:38:22 -0500168 this->addTextureSampler(&fYSampler);
bsalomonf267c1e2016-02-01 13:16:14 -0800169 this->addCoordTransform(&fUTransform);
Brian Salomon0bbecb22016-11-17 11:38:22 -0500170 this->addTextureSampler(&fUSampler);
jbaumanb445a572016-06-09 13:24:48 -0700171 if (!fNV12) {
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400172 fVTransform = GrCoordTransform(yuvMatrix[2], vProxy.get());
jbaumanb445a572016-06-09 13:24:48 -0700173 this->addCoordTransform(&fVTransform);
Brian Salomon0bbecb22016-11-17 11:38:22 -0500174 this->addTextureSampler(&fVSampler);
jbaumanb445a572016-06-09 13:24:48 -0700175 }
bsalomonf267c1e2016-02-01 13:16:14 -0800176 }
177
178 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
robertphillips9cdb9922016-02-03 12:25:40 -0800179 return new GLSLProcessor;
bsalomonf267c1e2016-02-01 13:16:14 -0800180 }
181
Brian Salomon94efbf52016-11-29 13:43:05 -0500182 void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
jbaumanb445a572016-06-09 13:24:48 -0700183 b->add32(fNV12);
bsalomonf267c1e2016-02-01 13:16:14 -0800184 }
185
186 bool onIsEqual(const GrFragmentProcessor& sBase) const override {
187 const YUVtoRGBEffect& s = sBase.cast<YUVtoRGBEffect>();
jbaumanb445a572016-06-09 13:24:48 -0700188 return (fColorSpace == s.getColorSpace()) && (fNV12 == s.isNV12());
bsalomonf267c1e2016-02-01 13:16:14 -0800189 }
190
bsalomonf267c1e2016-02-01 13:16:14 -0800191 GrCoordTransform fYTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500192 TextureSampler fYSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800193 GrCoordTransform fUTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500194 TextureSampler fUSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800195 GrCoordTransform fVTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500196 TextureSampler fVSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800197 SkYUVColorSpace fColorSpace;
jbaumanb445a572016-06-09 13:24:48 -0700198 bool fNV12;
bsalomonf267c1e2016-02-01 13:16:14 -0800199
200 typedef GrFragmentProcessor INHERITED;
201};
202
203
204class RGBToYUVEffect : public GrFragmentProcessor {
205public:
206 enum OutputChannels {
207 // output color r = y, g = u, b = v, a = a
208 kYUV_OutputChannels,
209 // output color rgba = y
210 kY_OutputChannels,
211 // output color r = u, g = v, b = 0, a = a
212 kUV_OutputChannels,
213 // output color rgba = u
214 kU_OutputChannels,
215 // output color rgba = v
216 kV_OutputChannels
217 };
218
Robert Phillips1c9686b2017-06-30 08:40:28 -0400219 static sk_sp<GrFragmentProcessor> Make(sk_sp<GrFragmentProcessor> rgbFP,
220 SkYUVColorSpace colorSpace,
221 OutputChannels output) {
222 return sk_sp<GrFragmentProcessor>(new RGBToYUVEffect(std::move(rgbFP), colorSpace, output));
bsalomonf267c1e2016-02-01 13:16:14 -0800223 }
224
225 const char* name() const override { return "RGBToYUV"; }
226
227 SkYUVColorSpace getColorSpace() const { return fColorSpace; }
228
229 OutputChannels outputChannels() const { return fOutputChannels; }
230
231 class GLSLProcessor : public GrGLSLFragmentProcessor {
232 public:
robertphillips9cdb9922016-02-03 12:25:40 -0800233 GLSLProcessor() : fLastColorSpace(-1), fLastOutputChannels(-1) {}
bsalomonf267c1e2016-02-01 13:16:14 -0800234
235 void emitCode(EmitArgs& args) override {
cdalton85285412016-02-18 12:37:07 -0800236 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
bsalomonf267c1e2016-02-01 13:16:14 -0800237 OutputChannels oc = args.fFp.cast<RGBToYUVEffect>().outputChannels();
238
239 SkString outputColor("rgbColor");
240 this->emitChild(0, args.fInputColor, &outputColor, args);
241
242 const char* uniName;
243 switch (oc) {
244 case kYUV_OutputChannels:
245 fRGBToYUVUni = args.fUniformHandler->addUniformArray(
cdalton5e58cee2016-02-11 12:49:47 -0800246 kFragment_GrShaderFlag,
bsalomonf267c1e2016-02-01 13:16:14 -0800247 kVec4f_GrSLType, kDefault_GrSLPrecision,
248 "RGBToYUV", 3, &uniName);
249 fragBuilder->codeAppendf("%s = vec4(dot(rgbColor.rgb, %s[0].rgb) + %s[0].a,"
250 "dot(rgbColor.rgb, %s[1].rgb) + %s[1].a,"
251 "dot(rgbColor.rgb, %s[2].rgb) + %s[2].a,"
252 "rgbColor.a);",
253 args.fOutputColor, uniName, uniName, uniName, uniName,
254 uniName, uniName);
255 break;
256 case kUV_OutputChannels:
257 fRGBToYUVUni = args.fUniformHandler->addUniformArray(
cdalton5e58cee2016-02-11 12:49:47 -0800258 kFragment_GrShaderFlag,
bsalomonf267c1e2016-02-01 13:16:14 -0800259 kVec4f_GrSLType, kDefault_GrSLPrecision,
260 "RGBToUV", 2, &uniName);
261 fragBuilder->codeAppendf("%s = vec4(dot(rgbColor.rgb, %s[0].rgb) + %s[0].a,"
262 "dot(rgbColor.rgb, %s[1].rgb) + %s[1].a,"
263 "0.0,"
264 "rgbColor.a);",
265 args.fOutputColor, uniName, uniName, uniName, uniName);
266 break;
267 case kY_OutputChannels:
268 case kU_OutputChannels:
269 case kV_OutputChannels:
270 fRGBToYUVUni = args.fUniformHandler->addUniform(
cdalton5e58cee2016-02-11 12:49:47 -0800271 kFragment_GrShaderFlag,
bsalomonf267c1e2016-02-01 13:16:14 -0800272 kVec4f_GrSLType, kDefault_GrSLPrecision,
273 "RGBToYUorV", &uniName);
274 fragBuilder->codeAppendf("%s = vec4(dot(rgbColor.rgb, %s.rgb) + %s.a);\n",
275 args.fOutputColor, uniName, uniName);
276 break;
277 }
278 }
279
280 private:
281 void onSetData(const GrGLSLProgramDataManager& pdman,
Brian Salomonab015ef2017-04-04 10:15:51 -0400282 const GrFragmentProcessor& processor) override {
bsalomonf267c1e2016-02-01 13:16:14 -0800283 const RGBToYUVEffect& effect = processor.cast<RGBToYUVEffect>();
284 OutputChannels oc = effect.outputChannels();
285 if (effect.getColorSpace() != fLastColorSpace || oc != fLastOutputChannels) {
286
287 const float* matrix = nullptr;
288 switch (effect.getColorSpace()) {
289 case kJPEG_SkYUVColorSpace:
290 matrix = kJPEGInverseConversionMatrix;
291 break;
292 case kRec601_SkYUVColorSpace:
293 matrix = kRec601InverseConversionMatrix;
294 break;
295 case kRec709_SkYUVColorSpace:
296 matrix = kRec709InverseConversionMatrix;
297 break;
298 }
299 switch (oc) {
300 case kYUV_OutputChannels:
301 pdman.set4fv(fRGBToYUVUni, 3, matrix);
302 break;
303 case kUV_OutputChannels:
304 pdman.set4fv(fRGBToYUVUni, 2, matrix + 4);
305 break;
306 case kY_OutputChannels:
307 pdman.set4fv(fRGBToYUVUni, 1, matrix);
308 break;
309 case kU_OutputChannels:
310 pdman.set4fv(fRGBToYUVUni, 1, matrix + 4);
311 break;
312 case kV_OutputChannels:
313 pdman.set4fv(fRGBToYUVUni, 1, matrix + 8);
314 break;
315 }
316 fLastColorSpace = effect.getColorSpace();
317 }
318 }
319 GrGLSLProgramDataManager::UniformHandle fRGBToYUVUni;
320 int fLastColorSpace;
321 int fLastOutputChannels;
322
323 typedef GrGLSLFragmentProcessor INHERITED;
324 };
325
326private:
Robert Phillips1c9686b2017-06-30 08:40:28 -0400327 RGBToYUVEffect(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace,
328 OutputChannels output)
329 // This could advertise kConstantOutputForConstantInput, but doesn't seem useful.
330 : INHERITED(kPreservesOpaqueInput_OptimizationFlag)
331 , fColorSpace(colorSpace)
332 , fOutputChannels(output) {
333 this->initClassID<RGBToYUVEffect>();
334 this->registerChildProcessor(std::move(rgbFP));
335 }
336
bsalomonf267c1e2016-02-01 13:16:14 -0800337 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
robertphillips9cdb9922016-02-03 12:25:40 -0800338 return new GLSLProcessor;
bsalomonf267c1e2016-02-01 13:16:14 -0800339 }
340
Brian Salomon94efbf52016-11-29 13:43:05 -0500341 void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
bsalomonf267c1e2016-02-01 13:16:14 -0800342 // kY, kU, and kV all generate the same code, just upload different coefficients.
343 if (kU_OutputChannels == fOutputChannels || kV_OutputChannels == fOutputChannels) {
344 b->add32(kY_OutputChannels);
345 } else {
346 b->add32(fOutputChannels);
347 }
348 }
349
350 bool onIsEqual(const GrFragmentProcessor& sBase) const override {
351 const RGBToYUVEffect& s = sBase.cast<RGBToYUVEffect>();
352 return fColorSpace == s.getColorSpace() && fOutputChannels == s.outputChannels();
353 }
354
bsalomonf267c1e2016-02-01 13:16:14 -0800355 GrCoordTransform fTransform;
Brian Salomon0bbecb22016-11-17 11:38:22 -0500356 TextureSampler fTextureSampler;
bsalomonf267c1e2016-02-01 13:16:14 -0800357 SkYUVColorSpace fColorSpace;
358 OutputChannels fOutputChannels;
359
360 typedef GrFragmentProcessor INHERITED;
361};
362
363}
364
365//////////////////////////////////////////////////////////////////////////////
366
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400367sk_sp<GrFragmentProcessor> GrYUVEffect::MakeYUVToRGB(sk_sp<GrTextureProxy> yProxy,
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -0500368 sk_sp<GrTextureProxy> uProxy,
369 sk_sp<GrTextureProxy> vProxy,
370 const SkISize sizes[3],
jbaumanb445a572016-06-09 13:24:48 -0700371 SkYUVColorSpace colorSpace, bool nv12) {
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -0500372 SkASSERT(yProxy && uProxy && vProxy && sizes);
Robert Phillipsfbcef6e2017-06-15 12:07:18 -0400373 return YUVtoRGBEffect::Make(std::move(yProxy), std::move(uProxy), std::move(vProxy),
Robert Phillipsbc7a4fb2017-01-23 15:30:35 -0500374 sizes, colorSpace, nv12);
bsalomonf267c1e2016-02-01 13:16:14 -0800375}
376
bungeman06ca8ec2016-06-09 08:01:03 -0700377sk_sp<GrFragmentProcessor>
378GrYUVEffect::MakeRGBToYUV(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800379 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400380 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kYUV_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800381}
382
bungeman06ca8ec2016-06-09 08:01:03 -0700383sk_sp<GrFragmentProcessor>
384GrYUVEffect::MakeRGBToY(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800385 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400386 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kY_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800387}
388
bungeman06ca8ec2016-06-09 08:01:03 -0700389sk_sp<GrFragmentProcessor>
390GrYUVEffect::MakeRGBToUV(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800391 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400392 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kUV_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800393}
394
bungeman06ca8ec2016-06-09 08:01:03 -0700395sk_sp<GrFragmentProcessor>
396GrYUVEffect::MakeRGBToU(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800397 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400398 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kU_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800399}
400
bungeman06ca8ec2016-06-09 08:01:03 -0700401sk_sp<GrFragmentProcessor>
402GrYUVEffect::MakeRGBToV(sk_sp<GrFragmentProcessor> rgbFP, SkYUVColorSpace colorSpace) {
bsalomonf267c1e2016-02-01 13:16:14 -0800403 SkASSERT(rgbFP);
Robert Phillips1c9686b2017-06-30 08:40:28 -0400404 return RGBToYUVEffect::Make(std::move(rgbFP), colorSpace, RGBToYUVEffect::kV_OutputChannels);
bsalomonf267c1e2016-02-01 13:16:14 -0800405}