Hash :
c3a1cae4
Author :
Date :
2024-04-15T14:58:55
Use angle::SimpleMutex everywhere in libGLESv2 Only cases left that use std::mutex are: - Share group and the context ErrorSet mutexes as they need try_lock() - Anywhere mutexes are used in conjunction with std::condition_variables (as they explicitly require std::mutex) Bug: angleproject:8667 Change-Id: Ib6d68938b0886f9e7c43e023162557990ecfb300 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5453294 Reviewed-by: Roman Lavrov <romanl@google.com> Reviewed-by: Charlie Lao <cclao@google.com> Commit-Queue: 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
//
// Copyright 2021 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.
//
// CLMemoryVk.h: Defines the class interface for CLMemoryVk, implementing CLMemoryImpl.
#ifndef LIBANGLE_RENDERER_VULKAN_CLMEMORYVK_H_
#define LIBANGLE_RENDERER_VULKAN_CLMEMORYVK_H_
#include "common/SimpleMutex.h"
#include "libANGLE/renderer/vulkan/cl_types.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h"
#include "libANGLE/renderer/CLMemoryImpl.h"
#include "libANGLE/CLMemory.h"
namespace rx
{
class CLMemoryVk : public CLMemoryImpl
{
public:
~CLMemoryVk() override;
// TODO: http://anglebug.com/8587
angle::Result createSubBuffer(const cl::Buffer &buffer,
cl::MemFlags flags,
size_t size,
CLMemoryImpl::Ptr *subBufferOut) override = 0;
virtual vk::BufferHelper &getBuffer() = 0;
angle::Result getMapPtr(uint8_t **mapPtrOut);
VkBufferUsageFlags getVkUsageFlags();
VkMemoryPropertyFlags getVkMemPropertyFlags();
virtual angle::Result map() = 0;
virtual angle::Result unmap() = 0;
angle::Result copyTo(void *ptr, size_t offset, size_t size);
angle::Result copyTo(CLMemoryVk *dst, size_t srcOffset, size_t dstOffset, size_t size);
angle::Result copyFrom(const void *ptr, size_t offset, size_t size);
bool isWritable()
{
constexpr VkBufferUsageFlags kWritableUsage =
VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
return (getVkUsageFlags() & kWritableUsage) != 0;
}
virtual bool isCurrentlyInUse() const = 0;
virtual size_t getSize() const = 0;
protected:
CLMemoryVk(const cl::Memory &memory);
CLContextVk *mContext;
vk::Renderer *mRenderer;
vk::Allocation mAllocation;
angle::SimpleMutex mMapLock;
uint8_t *mMapPtr;
uint32_t mMapCount;
CLMemoryVk *mParent;
};
class CLBufferVk : public CLMemoryVk
{
public:
CLBufferVk(const cl::Buffer &buffer);
~CLBufferVk() override;
angle::Result createSubBuffer(const cl::Buffer &buffer,
cl::MemFlags flags,
size_t size,
CLMemoryImpl::Ptr *subBufferOut) override;
vk::BufferHelper &getBuffer() override { return mBuffer; }
CLBufferVk *getParent() { return static_cast<CLBufferVk *>(mParent); }
angle::Result create(void *hostPtr);
bool isSubBuffer() const { return mParent != nullptr; }
angle::Result map() override;
angle::Result unmap() override;
bool isCurrentlyInUse() const override;
size_t getSize() const override { return mMemory.getSize(); }
private:
angle::Result setDataImpl(const uint8_t *data, size_t size, size_t offset);
vk::BufferHelper mBuffer;
VkBufferCreateInfo mDefaultBufferCreateInfo;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_CLMEMORYVK_H_