Hash :
9ce9e678
Author :
Date :
2024-04-16T10:07:02
CL/Vulkan: Set storage buffer usage for cl buffers clspv is setting all the buffer objects as storage buffers, so removing the distinction on the CL MEM flags for now. Bug: angleproject:365694588 Change-Id: I3bd65457d53a6a2fb5fd5c8f2a0b8c25094ed563 Signed-off-by: Gowtham Tammana <g.tammana@samsung.com> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5916158 Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> 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 108 109 110
//
// 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"
namespace rx
{
namespace cl_vk
{
VkExtent3D GetExtentFromDescriptor(cl::ImageDescriptor desc)
{
VkExtent3D extent{};
extent.width = static_cast<uint32_t>(desc.width);
extent.height = static_cast<uint32_t>(desc.height);
extent.depth = static_cast<uint32_t>(desc.depth);
// user can supply random values for height and depth for formats that dont need them
switch (desc.type)
{
case cl::MemObjectType::Image1D:
case cl::MemObjectType::Image1D_Array:
case cl::MemObjectType::Image1D_Buffer:
extent.height = 1;
extent.depth = 1;
break;
case cl::MemObjectType::Image2D:
case cl::MemObjectType::Image2D_Array:
extent.depth = 1;
break;
default:
break;
}
return extent;
}
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;
}
} // namespace cl_vk
} // namespace rx