xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/vk_cl_utils.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2024 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // vk_cl_utils:
7 //    Helper functions for the Vulkan Renderer in translation of vk state from/to cl state.
8 //
9 
10 #include "libANGLE/renderer/vulkan/vk_cl_utils.h"
11 #include "vulkan/vulkan_core.h"
12 
13 namespace rx
14 {
15 namespace cl_vk
16 {
17 
GetExtent(const cl::Extents & extent)18 VkExtent3D GetExtent(const cl::Extents &extent)
19 {
20     VkExtent3D vkExtent{};
21 
22     vkExtent.width  = static_cast<uint32_t>(extent.width);
23     vkExtent.height = static_cast<uint32_t>(extent.height);
24     vkExtent.depth  = static_cast<uint32_t>(extent.depth);
25 
26     return vkExtent;
27 }
28 
GetOffset(const cl::Offset & offset)29 VkOffset3D GetOffset(const cl::Offset &offset)
30 {
31     VkOffset3D vkOffset{};
32 
33     vkOffset.x = static_cast<uint32_t>(offset.x);
34     vkOffset.y = static_cast<uint32_t>(offset.y);
35     vkOffset.z = static_cast<uint32_t>(offset.z);
36 
37     return vkOffset;
38 }
39 
GetImageType(cl::MemObjectType memObjectType)40 VkImageType GetImageType(cl::MemObjectType memObjectType)
41 {
42     switch (memObjectType)
43     {
44         case cl::MemObjectType::Image1D:
45         case cl::MemObjectType::Image1D_Array:
46         case cl::MemObjectType::Image1D_Buffer:
47             return VK_IMAGE_TYPE_1D;
48         case cl::MemObjectType::Image2D:
49         case cl::MemObjectType::Image2D_Array:
50             return VK_IMAGE_TYPE_2D;
51         case cl::MemObjectType::Image3D:
52             return VK_IMAGE_TYPE_3D;
53         default:
54             // We will need to implement all the texture types for ES3+.
55             UNIMPLEMENTED();
56             return VK_IMAGE_TYPE_MAX_ENUM;
57     }
58 }
59 
GetImageViewType(cl::MemObjectType memObjectType)60 VkImageViewType GetImageViewType(cl::MemObjectType memObjectType)
61 {
62     switch (memObjectType)
63     {
64         case cl::MemObjectType::Image1D:
65             return VK_IMAGE_VIEW_TYPE_1D;
66         case cl::MemObjectType::Image1D_Array:
67             return VK_IMAGE_VIEW_TYPE_1D_ARRAY;
68         case cl::MemObjectType::Image2D:
69             return VK_IMAGE_VIEW_TYPE_2D;
70         case cl::MemObjectType::Image2D_Array:
71             return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
72         case cl::MemObjectType::Image3D:
73             return VK_IMAGE_VIEW_TYPE_3D;
74         case cl::MemObjectType::Image1D_Buffer:
75             // Image1D_Buffer has an associated buffer view and not an image view, returning max
76             // enum here.
77             return VK_IMAGE_VIEW_TYPE_MAX_ENUM;
78         default:
79             UNIMPLEMENTED();
80             return VK_IMAGE_VIEW_TYPE_MAX_ENUM;
81     }
82 }
83 
GetMemoryPropertyFlags(cl::MemFlags memFlags)84 VkMemoryPropertyFlags GetMemoryPropertyFlags(cl::MemFlags memFlags)
85 {
86     // TODO: http://anglebug.com/42267018
87     VkMemoryPropertyFlags propFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
88 
89     if (memFlags.intersects(CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR))
90     {
91         propFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
92     }
93 
94     return propFlags;
95 }
96 
GetBufferUsageFlags(cl::MemFlags memFlags)97 VkBufferUsageFlags GetBufferUsageFlags(cl::MemFlags memFlags)
98 {
99     // The buffer usage flags don't particularly affect the buffer in any known drivers, use all the
100     // bits that ANGLE needs.
101     return VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
102            VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
103            VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
104 }
105 
106 }  // namespace cl_vk
107 }  // namespace rx
108