Hash :
fa70c4cb
Author :
Date :
2024-02-02T13:59:06
CL/Vulkan: Implement the buffer rect enqueues This change implements the buffer rect copy using a series of memcopies. The CL buffer rect doesn't map cleanly to the Vulkan copy buffer command due to the presence of pitches, and implementing as such will introduce more barriers in the command stream. For now we do process this command at call entry point. Bug: angleproject:379764609 Change-Id: I89a9032a4bbfa48899c448eb131a5ce048e8fd60 Signed-off-by: Gowtham Tammana <g.tammana@samsung.com> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6034035 Commit-Queue: Austin Annestrand <a.annestrand@samsung.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
//
// 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