• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2021 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 // CLMemoryVk.h: Defines the class interface for CLMemoryVk, implementing CLMemoryImpl.
7 
8 #ifndef LIBANGLE_RENDERER_VULKAN_CLMEMORYVK_H_
9 #define LIBANGLE_RENDERER_VULKAN_CLMEMORYVK_H_
10 
11 #include "common/SimpleMutex.h"
12 
13 #include "libANGLE/renderer/vulkan/cl_types.h"
14 #include "libANGLE/renderer/vulkan/vk_helpers.h"
15 
16 #include "libANGLE/renderer/CLMemoryImpl.h"
17 
18 #include "libANGLE/CLMemory.h"
19 
20 namespace rx
21 {
22 
23 class CLMemoryVk : public CLMemoryImpl
24 {
25   public:
26     ~CLMemoryVk() override;
27 
28     // TODO: http://anglebug.com/8587
29     angle::Result createSubBuffer(const cl::Buffer &buffer,
30                                   cl::MemFlags flags,
31                                   size_t size,
32                                   CLMemoryImpl::Ptr *subBufferOut) override = 0;
33 
34     virtual vk::BufferHelper &getBuffer() = 0;
35     angle::Result getMapPtr(uint8_t **mapPtrOut);
36 
37     VkBufferUsageFlags getVkUsageFlags();
38     VkMemoryPropertyFlags getVkMemPropertyFlags();
39 
40     virtual angle::Result map()   = 0;
41     virtual angle::Result unmap() = 0;
42     angle::Result copyTo(void *ptr, size_t offset, size_t size);
43     angle::Result copyTo(CLMemoryVk *dst, size_t srcOffset, size_t dstOffset, size_t size);
44     angle::Result copyFrom(const void *ptr, size_t offset, size_t size);
45 
isWritable()46     bool isWritable()
47     {
48         constexpr VkBufferUsageFlags kWritableUsage =
49             VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
50         return (getVkUsageFlags() & kWritableUsage) != 0;
51     }
52 
53     virtual bool isCurrentlyInUse() const = 0;
54     virtual size_t getSize() const        = 0;
55 
56   protected:
57     CLMemoryVk(const cl::Memory &memory);
58 
59     CLContextVk *mContext;
60     vk::Renderer *mRenderer;
61     vk::Allocation mAllocation;
62     angle::SimpleMutex mMapLock;
63     uint8_t *mMapPtr;
64     uint32_t mMapCount;
65     CLMemoryVk *mParent;
66 };
67 
68 class CLBufferVk : public CLMemoryVk
69 {
70   public:
71     CLBufferVk(const cl::Buffer &buffer);
72     ~CLBufferVk() override;
73 
74     angle::Result createSubBuffer(const cl::Buffer &buffer,
75                                   cl::MemFlags flags,
76                                   size_t size,
77                                   CLMemoryImpl::Ptr *subBufferOut) override;
78 
getBuffer()79     vk::BufferHelper &getBuffer() override { return mBuffer; }
getParent()80     CLBufferVk *getParent() { return static_cast<CLBufferVk *>(mParent); }
81 
82     angle::Result create(void *hostPtr);
83 
isSubBuffer()84     bool isSubBuffer() const { return mParent != nullptr; }
85 
86     angle::Result map() override;
87     angle::Result unmap() override;
88 
89     bool isCurrentlyInUse() const override;
getSize()90     size_t getSize() const override { return mMemory.getSize(); }
91 
92   private:
93     angle::Result setDataImpl(const uint8_t *data, size_t size, size_t offset);
94 
95     vk::BufferHelper mBuffer;
96     VkBufferCreateInfo mDefaultBufferCreateInfo;
97 };
98 
99 }  // namespace rx
100 
101 #endif  // LIBANGLE_RENDERER_VULKAN_CLMEMORYVK_H_
102