xref: /aosp_15_r20/external/skia/tools/gpu/vk/VkYcbcrSamplerHelper.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2020 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 #ifndef VkYcbcrSamplerHelper_DEFINED
9 #define VkYcbcrSamplerHelper_DEFINED
10 
11 #include "include/core/SkTypes.h"
12 
13 #ifdef SK_VULKAN
14 
15 #if defined(SK_GRAPHITE)
16 #include "include/gpu/graphite/BackendTexture.h"
17 
18 namespace skgpu::graphite {
19 class Recorder;
20 class VulkanSharedContext;
21 }
22 #endif
23 
24 
25 #include "include/gpu/ganesh/GrBackendSurface.h"
26 #include "include/gpu/ganesh/vk/GrVkTypes.h"
27 #include "include/gpu/vk/VulkanTypes.h"
28 
29 class GrDirectContext;
30 class GrVkGpu;
31 
32 // This helper will create and hold data for a Vulkan YCbCr backend texture. This format is
33 // particularly interesting because its sampler is immutable.
34 class VkYcbcrSamplerHelper {
35 public:
36 #if defined(SK_GRAPHITE)
VkYcbcrSamplerHelper(const skgpu::graphite::VulkanSharedContext * ctxt)37     VkYcbcrSamplerHelper(const skgpu::graphite::VulkanSharedContext* ctxt)
38             : fSharedCtxt(ctxt) {
39         SkASSERT(ctxt);
40         fDContext = nullptr;
41         fGrTexture = {};
42     }
43 
backendTexture()44     const skgpu::graphite::BackendTexture& backendTexture() const { return fTexture; }
45 
46     bool createBackendTexture(uint32_t width, uint32_t height);
47 #endif
48 
49     VkYcbcrSamplerHelper(GrDirectContext*);
50 
grBackendTexture()51     const GrBackendTexture& grBackendTexture() const { return fGrTexture; }
52 
53     ~VkYcbcrSamplerHelper();
54 
55     bool isYCbCrSupported();
56 
57     bool createGrBackendTexture(uint32_t width, uint32_t height);
58 
59     static int GetExpectedY(int x, int y, int width, int height);
60     static std::pair<int, int> GetExpectedUV(int x, int y, int width, int height);
61 
62 private:
63 #if defined(SK_GRAPHITE)
64     skgpu::graphite::BackendTexture             fTexture;
65     const skgpu::graphite::VulkanSharedContext* fSharedCtxt;
66 #endif
67 
68     GrVkGpu* vkGpu();
69 
70     GrDirectContext* fDContext;
71     GrBackendTexture fGrTexture;
72 
73     VkImage fImage = VK_NULL_HANDLE;
74     VkDeviceMemory fImageMemory = VK_NULL_HANDLE;
75 };
76 
77 #endif // SK_VULKAN
78 #endif // VkYcbcrSamplerHelper_DEFINED
79