| /* | |
| * Copyright 2023 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/gpu/graphite/YUVATextureProxies.h" | |
| #include "src/core/SkImageInfoPriv.h" | |
| #include "src/gpu/graphite/TextureProxy.h" | |
| namespace skgpu::graphite { | |
| YUVATextureProxies::YUVATextureProxies(const SkYUVAInfo& yuvaInfo, | |
| TextureProxyView views[SkYUVAInfo::kMaxPlanes], | |
| SkColorType colorTypes[SkYUVAInfo::kMaxPlanes]) | |
| : fYUVAInfo(yuvaInfo) { | |
| uint32_t pixmapChannelMasks[SkYUVAInfo::kMaxPlanes]; | |
| int n = yuvaInfo.numPlanes(); | |
| if (n == 0) { | |
| *this = {}; | |
| SkASSERT(!this->isValid()); | |
| return; | |
| } | |
| fMipmapped = Mipmapped::kYes; | |
| for (int i = 0; i < n; ++i) { | |
| pixmapChannelMasks[i] = SkColorTypeChannelFlags(colorTypes[i]); | |
| if (!views[i]) { | |
| *this = {}; | |
| SkASSERT(!this->isValid()); | |
| return; | |
| } | |
| if (views[i].proxy()->mipmapped() == Mipmapped::kNo) { | |
| fMipmapped = Mipmapped::kNo; | |
| } | |
| } | |
| // Initial locations refer to the CPU pixmap channels. | |
| fYUVALocations = yuvaInfo.toYUVALocations(pixmapChannelMasks); | |
| if (fYUVALocations[0].fPlane < 0) { | |
| *this = {}; | |
| SkASSERT(!this->isValid()); | |
| return; | |
| } | |
| // Run each location through the proxy view's swizzle to get the actual texture format channel. | |
| for (int i = 0; i < SkYUVAInfo::kYUVAChannelCount; ++i) { | |
| int plane = fYUVALocations[i].fPlane; | |
| if (plane >= 0) { | |
| int chanAsIdx = static_cast<int>(fYUVALocations[i].fChannel); | |
| switch (views[plane].swizzle()[chanAsIdx]) { | |
| case 'r': fYUVALocations[i].fChannel = SkColorChannel::kR; break; | |
| case 'g': fYUVALocations[i].fChannel = SkColorChannel::kG; break; | |
| case 'b': fYUVALocations[i].fChannel = SkColorChannel::kB; break; | |
| case 'a': fYUVALocations[i].fChannel = SkColorChannel::kA; break; | |
| default: | |
| SkDEBUGFAILF("Unexpected swizzle value: %c", views[i].swizzle()[chanAsIdx]); | |
| *this = {}; | |
| SkASSERT(!this->isValid()); | |
| return; | |
| } | |
| } | |
| } | |
| for (int i = 0; i < n; ++i) { | |
| fProxies[i] = views[i].detachProxy(); | |
| } | |
| SkASSERT(this->isValid()); | |
| } | |
| } |