// // Copyright 2022 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ReswizzleYUVOps: Adjusts swizzles for YUV channel order difference between // GLES and Vulkan // // #include "compiler/translator/tree_ops/spirv/EmulateYUVBuiltIns.h" #include "compiler/translator/StaticType.h" #include "compiler/translator/SymbolTable.h" #include "compiler/translator/tree_util/IntermNode_util.h" #include "compiler/translator/tree_util/IntermTraverse.h" #include "compiler/translator/tree_util/RunAtTheEndOfShader.h" namespace sh { namespace { // A traverser that adjusts channel order for various yuv ops. class ReswizzleYUVOpsTraverser : public TIntermTraverser { … }; // OpenGLES and Vulkan has different color component mapping for YUV. OpenGL spec maps R_gl=y, // G_gl=u, B_gl=v, but Vulkan wants R_vulkan=v, G_vulkan=y, B_vulkan=u. We want all calculation to // be in OpenGLES mapping during shader execution, but the actual buffer/image will be stored as // vulkan mapping. This means when we sample from VkImage, we need to map from vulkan order back to // GL order, which comes out to be R_gl=y=G_vulkan=1, G_gl=u=B_vulkan=2, B_gl=v=R_vulkan=0. i.e, {1, // 2, 0, 3}. This function will check if the aggregate is a texture{proj|fetch}(samplerExternal,...) // and if yes it will compose and return a swizzle node. TIntermSwizzle *CheckTextureOpWithSamplerExternal2DY2YAndSwizzle(Visit visit, TIntermAggregate *node) { … } bool ReswizzleYUVOpsTraverser::visitAggregate(Visit visit, TIntermAggregate *node) { … } bool ReswizzleYUVOpsTraverser::visitSwizzle(Visit visit, TIntermSwizzle *node) { … } // OpenGLES and Vulkan has different color component mapping for YUV. When we write YUV data, we // need to convert OpenGL mapping to vulkan's mapping, which comes out to be {2, 0, 1, 3}. bool ReswizzleYUVOpsTraverser::adjustOutput(TCompiler *compiler, TIntermBlock *root, const TIntermSymbol &yuvOutput) { … } } // anonymous namespace bool ReswizzleYUVOps(TCompiler *compiler, TIntermBlock *root, TSymbolTable *symbolTable, const TIntermSymbol *yuvOutput) { … } } // namespace sh