1 /* 2 * Copyright 2018 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 /************************************************************************************************** 9 *** This file was autogenerated from GrYUVtoRGBEffect.fp; do not modify. 10 **************************************************************************************************/ 11 #include "GrYUVtoRGBEffect.h" 12 #if SK_SUPPORT_GPU 13 14 static const float kJPEGConversionMatrix[16] = { 15 1.0f, 0.0f, 1.402f, -0.703749f, 1.0f, -0.344136f, -0.714136f, 0.531211f, 16 1.0f, 1.772f, 0.0f, -0.889475f, 0.0f, 0.0f, 0.0f, 1.0}; 17 18 static const float kRec601ConversionMatrix[16] = { 19 1.164f, 0.0f, 1.596f, -0.87075f, 1.164f, -0.391f, -0.813f, 0.52925f, 20 1.164f, 2.018f, 0.0f, -1.08175f, 0.0f, 0.0f, 0.0f, 1.0}; 21 22 static const float kRec709ConversionMatrix[16] = { 23 1.164f, 0.0f, 1.793f, -0.96925f, 1.164f, -0.213f, -0.533f, 0.30025f, 24 1.164f, 2.112f, 0.0f, -1.12875f, 0.0f, 0.0f, 0.0f, 1.0f}; 25 26 std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::Make(sk_sp<GrTextureProxy> yProxy, 27 sk_sp<GrTextureProxy> 28 uProxy, 29 sk_sp<GrTextureProxy> 30 vProxy, 31 const SkISize sizes[3], 32 SkYUVColorSpace colorSpace, 33 bool nv12) { 34 SkScalar w[3], h[3]; 35 w[0] = SkIntToScalar(sizes[0].fWidth); 36 h[0] = SkIntToScalar(sizes[0].fHeight); 37 w[1] = SkIntToScalar(sizes[1].fWidth); 38 h[1] = SkIntToScalar(sizes[1].fHeight); 39 w[2] = SkIntToScalar(sizes[2].fWidth); 40 h[2] = SkIntToScalar(sizes[2].fHeight); 41 SkMatrix yTransform = SkMatrix::I(); 42 SkMatrix uTransform = SkMatrix::MakeScale(w[1] / w[0], h[1] / h[0]); 43 SkMatrix vTransform = SkMatrix::MakeScale(w[2] / w[0], h[2] / h[0]); 44 GrSamplerState::Filter uvFilterMode = 45 ((sizes[1].fWidth != sizes[0].fWidth) || (sizes[1].fHeight != sizes[0].fHeight) || 46 (sizes[2].fWidth != sizes[0].fWidth) || (sizes[2].fHeight != sizes[0].fHeight)) 47 ? GrSamplerState::Filter::kBilerp 48 : GrSamplerState::Filter::kNearest; 49 SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor); 50 switch (colorSpace) { 51 case kJPEG_SkYUVColorSpace: 52 mat.setColMajorf(kJPEGConversionMatrix); 53 break; 54 case kRec601_SkYUVColorSpace: 55 mat.setColMajorf(kRec601ConversionMatrix); 56 break; 57 case kRec709_SkYUVColorSpace: 58 mat.setColMajorf(kRec709ConversionMatrix); 59 break; 60 } 61 return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect( 62 std::move(yProxy), yTransform, std::move(uProxy), uTransform, std::move(vProxy), 63 vTransform, mat, nv12, GrSamplerState(GrSamplerState::WrapMode::kClamp, uvFilterMode))); 64 } 65 #include "glsl/GrGLSLFragmentProcessor.h" 66 #include "glsl/GrGLSLFragmentShaderBuilder.h" 67 #include "glsl/GrGLSLProgramBuilder.h" 68 #include "GrTexture.h" 69 #include "SkSLCPP.h" 70 #include "SkSLUtil.h" 71 class GrGLSLYUVtoRGBEffect : public GrGLSLFragmentProcessor { 72 public: 73 GrGLSLYUVtoRGBEffect() {} 74 void emitCode(EmitArgs& args) override { 75 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 76 const GrYUVtoRGBEffect& _outer = args.fFp.cast<GrYUVtoRGBEffect>(); 77 (void)_outer; 78 auto ySamplerTransform = _outer.ySamplerTransform(); 79 (void)ySamplerTransform; 80 auto uSamplerTransform = _outer.uSamplerTransform(); 81 (void)uSamplerTransform; 82 auto vSamplerTransform = _outer.vSamplerTransform(); 83 (void)vSamplerTransform; 84 auto colorSpaceMatrix = _outer.colorSpaceMatrix(); 85 (void)colorSpaceMatrix; 86 auto nv12 = _outer.nv12(); 87 (void)nv12; 88 fColorSpaceMatrixVar = 89 args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4x4_GrSLType, 90 kDefault_GrSLPrecision, "colorSpaceMatrix"); 91 SkString sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); 92 SkString sk_TransformedCoords2D_1 = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]); 93 SkString sk_TransformedCoords2D_2 = fragBuilder->ensureCoords2D(args.fTransformedCoords[2]); 94 fragBuilder->codeAppendf( 95 "@if (%s) {\n %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.xy, 1.0) * " 96 "%s;\n} else {\n %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.x, " 97 "texture(%s, %s).%s.x, 1.0) * %s;\n}\n", 98 (_outer.nv12() ? "true" : "false"), args.fOutputColor, 99 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), 100 sk_TransformedCoords2D_0.c_str(), 101 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), 102 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), 103 sk_TransformedCoords2D_1.c_str(), 104 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), 105 args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar), args.fOutputColor, 106 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), 107 sk_TransformedCoords2D_0.c_str(), 108 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), 109 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), 110 sk_TransformedCoords2D_1.c_str(), 111 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), 112 fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[2]).c_str(), 113 sk_TransformedCoords2D_2.c_str(), 114 fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[2]).c_str(), 115 args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar)); 116 } 117 118 private: 119 void onSetData(const GrGLSLProgramDataManager& pdman, 120 const GrFragmentProcessor& _proc) override { 121 const GrYUVtoRGBEffect& _outer = _proc.cast<GrYUVtoRGBEffect>(); 122 { 123 float colorSpaceMatrixValue[16]; 124 _outer.colorSpaceMatrix().asColMajorf(colorSpaceMatrixValue); 125 pdman.setMatrix4f(fColorSpaceMatrixVar, colorSpaceMatrixValue); 126 } 127 } 128 UniformHandle fColorSpaceMatrixVar; 129 }; 130 GrGLSLFragmentProcessor* GrYUVtoRGBEffect::onCreateGLSLInstance() const { 131 return new GrGLSLYUVtoRGBEffect(); 132 } 133 void GrYUVtoRGBEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, 134 GrProcessorKeyBuilder* b) const { 135 b->add32((int32_t)fNv12); 136 } 137 bool GrYUVtoRGBEffect::onIsEqual(const GrFragmentProcessor& other) const { 138 const GrYUVtoRGBEffect& that = other.cast<GrYUVtoRGBEffect>(); 139 (void)that; 140 if (fYSampler != that.fYSampler) return false; 141 if (fYSamplerTransform != that.fYSamplerTransform) return false; 142 if (fUSampler != that.fUSampler) return false; 143 if (fUSamplerTransform != that.fUSamplerTransform) return false; 144 if (fVSampler != that.fVSampler) return false; 145 if (fVSamplerTransform != that.fVSamplerTransform) return false; 146 if (fColorSpaceMatrix != that.fColorSpaceMatrix) return false; 147 if (fNv12 != that.fNv12) return false; 148 return true; 149 } 150 GrYUVtoRGBEffect::GrYUVtoRGBEffect(const GrYUVtoRGBEffect& src) 151 : INHERITED(kGrYUVtoRGBEffect_ClassID, src.optimizationFlags()) 152 , fYSampler(src.fYSampler) 153 , fYSamplerTransform(src.fYSamplerTransform) 154 , fUSampler(src.fUSampler) 155 , fUSamplerTransform(src.fUSamplerTransform) 156 , fVSampler(src.fVSampler) 157 , fVSamplerTransform(src.fVSamplerTransform) 158 , fColorSpaceMatrix(src.fColorSpaceMatrix) 159 , fNv12(src.fNv12) 160 , fYSamplerCoordTransform(src.fYSamplerCoordTransform) 161 , fUSamplerCoordTransform(src.fUSamplerCoordTransform) 162 , fVSamplerCoordTransform(src.fVSamplerCoordTransform) { 163 this->addTextureSampler(&fYSampler); 164 this->addTextureSampler(&fUSampler); 165 this->addTextureSampler(&fVSampler); 166 this->addCoordTransform(&fYSamplerCoordTransform); 167 this->addCoordTransform(&fUSamplerCoordTransform); 168 this->addCoordTransform(&fVSamplerCoordTransform); 169 } 170 std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::clone() const { 171 return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect(*this)); 172 } 173 #endif 174