/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /************************************************************************************************** *** This file was autogenerated from GrYUVtoRGBEffect.fp; do not modify. **************************************************************************************************/ #include "GrYUVtoRGBEffect.h" #if SK_SUPPORT_GPU static const float kJPEGConversionMatrix[16] = { 1.0f, 0.0f, 1.402f, -0.703749f, 1.0f, -0.344136f, -0.714136f, 0.531211f, 1.0f, 1.772f, 0.0f, -0.889475f, 0.0f, 0.0f, 0.0f, 1.0}; static const float kRec601ConversionMatrix[16] = { 1.164f, 0.0f, 1.596f, -0.87075f, 1.164f, -0.391f, -0.813f, 0.52925f, 1.164f, 2.018f, 0.0f, -1.08175f, 0.0f, 0.0f, 0.0f, 1.0}; static const float kRec709ConversionMatrix[16] = { 1.164f, 0.0f, 1.793f, -0.96925f, 1.164f, -0.213f, -0.533f, 0.30025f, 1.164f, 2.112f, 0.0f, -1.12875f, 0.0f, 0.0f, 0.0f, 1.0f}; std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::Make(sk_sp<GrTextureProxy> yProxy, sk_sp<GrTextureProxy> uProxy, sk_sp<GrTextureProxy> vProxy, const SkISize sizes[3], SkYUVColorSpace colorSpace, bool nv12) { SkScalar w[3], h[3]; w[0] = SkIntToScalar(sizes[0].fWidth); h[0] = SkIntToScalar(sizes[0].fHeight); w[1] = SkIntToScalar(sizes[1].fWidth); h[1] = SkIntToScalar(sizes[1].fHeight); w[2] = SkIntToScalar(sizes[2].fWidth); h[2] = SkIntToScalar(sizes[2].fHeight); SkMatrix yTransform = SkMatrix::I(); SkMatrix uTransform = SkMatrix::MakeScale(w[1] / w[0], h[1] / h[0]); SkMatrix vTransform = SkMatrix::MakeScale(w[2] / w[0], h[2] / h[0]); GrSamplerState::Filter uvFilterMode = ((sizes[1].fWidth != sizes[0].fWidth) || (sizes[1].fHeight != sizes[0].fHeight) || (sizes[2].fWidth != sizes[0].fWidth) || (sizes[2].fHeight != sizes[0].fHeight)) ? GrSamplerState::Filter::kBilerp : GrSamplerState::Filter::kNearest; SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor); switch (colorSpace) { case kJPEG_SkYUVColorSpace: mat.setColMajorf(kJPEGConversionMatrix); break; case kRec601_SkYUVColorSpace: mat.setColMajorf(kRec601ConversionMatrix); break; case kRec709_SkYUVColorSpace: mat.setColMajorf(kRec709ConversionMatrix); break; } return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect( std::move(yProxy), yTransform, std::move(uProxy), uTransform, std::move(vProxy), vTransform, mat, nv12, GrSamplerState(GrSamplerState::WrapMode::kClamp, uvFilterMode))); } #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" #include "glsl/GrGLSLProgramBuilder.h" #include "GrTexture.h" #include "SkSLCPP.h" #include "SkSLUtil.h" class GrGLSLYUVtoRGBEffect : public GrGLSLFragmentProcessor { public: GrGLSLYUVtoRGBEffect() {} void emitCode(EmitArgs& args) override { GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; const GrYUVtoRGBEffect& _outer = args.fFp.cast<GrYUVtoRGBEffect>(); (void)_outer; auto ySamplerTransform = _outer.ySamplerTransform(); (void)ySamplerTransform; auto uSamplerTransform = _outer.uSamplerTransform(); (void)uSamplerTransform; auto vSamplerTransform = _outer.vSamplerTransform(); (void)vSamplerTransform; auto colorSpaceMatrix = _outer.colorSpaceMatrix(); (void)colorSpaceMatrix; auto nv12 = _outer.nv12(); (void)nv12; fColorSpaceMatrixVar = args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4x4_GrSLType, kDefault_GrSLPrecision, "colorSpaceMatrix"); SkString sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); SkString sk_TransformedCoords2D_1 = fragBuilder->ensureCoords2D(args.fTransformedCoords[1]); SkString sk_TransformedCoords2D_2 = fragBuilder->ensureCoords2D(args.fTransformedCoords[2]); fragBuilder->codeAppendf( "@if (%s) {\n %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.xy, 1.0) * " "%s;\n} else {\n %s = half4(texture(%s, %s).%s.x, texture(%s, %s).%s.x, " "texture(%s, %s).%s.x, 1.0) * %s;\n}\n", (_outer.nv12() ? "true" : "false"), args.fOutputColor, fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), sk_TransformedCoords2D_0.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), sk_TransformedCoords2D_1.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar), args.fOutputColor, fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[0]).c_str(), sk_TransformedCoords2D_0.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[0]).c_str(), fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[1]).c_str(), sk_TransformedCoords2D_1.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[1]).c_str(), fragBuilder->getProgramBuilder()->samplerVariable(args.fTexSamplers[2]).c_str(), sk_TransformedCoords2D_2.c_str(), fragBuilder->getProgramBuilder()->samplerSwizzle(args.fTexSamplers[2]).c_str(), args.fUniformHandler->getUniformCStr(fColorSpaceMatrixVar)); } private: void onSetData(const GrGLSLProgramDataManager& pdman, const GrFragmentProcessor& _proc) override { const GrYUVtoRGBEffect& _outer = _proc.cast<GrYUVtoRGBEffect>(); { float colorSpaceMatrixValue[16]; _outer.colorSpaceMatrix().asColMajorf(colorSpaceMatrixValue); pdman.setMatrix4f(fColorSpaceMatrixVar, colorSpaceMatrixValue); } } UniformHandle fColorSpaceMatrixVar; }; GrGLSLFragmentProcessor* GrYUVtoRGBEffect::onCreateGLSLInstance() const { return new GrGLSLYUVtoRGBEffect(); } void GrYUVtoRGBEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const { b->add32((int32_t)fNv12); } bool GrYUVtoRGBEffect::onIsEqual(const GrFragmentProcessor& other) const { const GrYUVtoRGBEffect& that = other.cast<GrYUVtoRGBEffect>(); (void)that; if (fYSampler != that.fYSampler) return false; if (fYSamplerTransform != that.fYSamplerTransform) return false; if (fUSampler != that.fUSampler) return false; if (fUSamplerTransform != that.fUSamplerTransform) return false; if (fVSampler != that.fVSampler) return false; if (fVSamplerTransform != that.fVSamplerTransform) return false; if (fColorSpaceMatrix != that.fColorSpaceMatrix) return false; if (fNv12 != that.fNv12) return false; return true; } GrYUVtoRGBEffect::GrYUVtoRGBEffect(const GrYUVtoRGBEffect& src) : INHERITED(kGrYUVtoRGBEffect_ClassID, src.optimizationFlags()) , fYSampler(src.fYSampler) , fYSamplerTransform(src.fYSamplerTransform) , fUSampler(src.fUSampler) , fUSamplerTransform(src.fUSamplerTransform) , fVSampler(src.fVSampler) , fVSamplerTransform(src.fVSamplerTransform) , fColorSpaceMatrix(src.fColorSpaceMatrix) , fNv12(src.fNv12) , fYSamplerCoordTransform(src.fYSamplerCoordTransform) , fUSamplerCoordTransform(src.fUSamplerCoordTransform) , fVSamplerCoordTransform(src.fVSamplerCoordTransform) { this->addTextureSampler(&fYSampler); this->addTextureSampler(&fUSampler); this->addTextureSampler(&fVSampler); this->addCoordTransform(&fYSamplerCoordTransform); this->addCoordTransform(&fUSamplerCoordTransform); this->addCoordTransform(&fVSamplerCoordTransform); } std::unique_ptr<GrFragmentProcessor> GrYUVtoRGBEffect::clone() const { return std::unique_ptr<GrFragmentProcessor>(new GrYUVtoRGBEffect(*this)); } #endif