blob: 1704aae922dceb2f4f3b659bb34633ecddd24fb4 [file] [log] [blame]
//
// Copyright 2024 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.
//
// vk_cl_utils:
// Helper functions for the Vulkan Renderer in translation of vk state from/to cl state.
//
#include "libANGLE/renderer/vulkan/vk_cl_utils.h"
#include "vulkan/vulkan_core.h"
namespace rx
{
namespace cl_vk
{
VkExtent3D GetExtent(const cl::Extents &extent)
{
VkExtent3D vkExtent{};
vkExtent.width = static_cast<uint32_t>(extent.width);
vkExtent.height = static_cast<uint32_t>(extent.height);
vkExtent.depth = static_cast<uint32_t>(extent.depth);
return vkExtent;
}
VkOffset3D GetOffset(const cl::Offset &offset)
{
VkOffset3D vkOffset{};
vkOffset.x = static_cast<uint32_t>(offset.x);
vkOffset.y = static_cast<uint32_t>(offset.y);
vkOffset.z = static_cast<uint32_t>(offset.z);
return vkOffset;
}
VkImageType GetImageType(cl::MemObjectType memObjectType)
{
switch (memObjectType)
{
case cl::MemObjectType::Image1D:
case cl::MemObjectType::Image1D_Array:
case cl::MemObjectType::Image1D_Buffer:
return VK_IMAGE_TYPE_1D;
case cl::MemObjectType::Image2D:
case cl::MemObjectType::Image2D_Array:
return VK_IMAGE_TYPE_2D;
case cl::MemObjectType::Image3D:
return VK_IMAGE_TYPE_3D;
default:
// We will need to implement all the texture types for ES3+.
UNIMPLEMENTED();
return VK_IMAGE_TYPE_MAX_ENUM;
}
}
VkImageViewType GetImageViewType(cl::MemObjectType memObjectType)
{
switch (memObjectType)
{
case cl::MemObjectType::Image1D:
return VK_IMAGE_VIEW_TYPE_1D;
case cl::MemObjectType::Image1D_Array:
return VK_IMAGE_VIEW_TYPE_1D_ARRAY;
case cl::MemObjectType::Image2D:
return VK_IMAGE_VIEW_TYPE_2D;
case cl::MemObjectType::Image2D_Array:
return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
case cl::MemObjectType::Image3D:
return VK_IMAGE_VIEW_TYPE_3D;
case cl::MemObjectType::Image1D_Buffer:
// Image1D_Buffer has an associated buffer view and not an image view, returning max
// enum here.
return VK_IMAGE_VIEW_TYPE_MAX_ENUM;
default:
UNIMPLEMENTED();
return VK_IMAGE_VIEW_TYPE_MAX_ENUM;
}
}
VkMemoryPropertyFlags GetMemoryPropertyFlags(cl::MemFlags memFlags)
{
// TODO: http://anglebug.com/42267018
VkMemoryPropertyFlags propFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
if (memFlags.intersects(CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR))
{
propFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
}
return propFlags;
}
VkBufferUsageFlags GetBufferUsageFlags(cl::MemFlags memFlags)
{
// The buffer usage flags don't particularly affect the buffer in any known drivers, use all the
// bits that ANGLE needs.
return VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
}
} // namespace cl_vk
} // namespace rx