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)18VkExtent3D 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)29VkOffset3D 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)40VkImageType 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)60VkImageViewType 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)84VkMemoryPropertyFlags 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)97VkBufferUsageFlags 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