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