Commit 5552cdf0 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Create buffer view for BufferHelper

Bug: angleproject:2958 Change-Id: Ifa40537bc6003486b37d5d2ac9a2b7f1f5c3d1c2 Reviewed-on: https://chromium-review.googlesource.com/c/1351115Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 1b17f90b
...@@ -897,6 +897,7 @@ void LineLoopHelper::Draw(uint32_t count, CommandBuffer *commandBuffer) ...@@ -897,6 +897,7 @@ void LineLoopHelper::Draw(uint32_t count, CommandBuffer *commandBuffer)
BufferHelper::BufferHelper() BufferHelper::BufferHelper()
: RecordableGraphResource(CommandGraphResourceType::Buffer), : RecordableGraphResource(CommandGraphResourceType::Buffer),
mMemoryPropertyFlags{}, mMemoryPropertyFlags{},
mSize(0),
mCurrentWriteAccess(0), mCurrentWriteAccess(0),
mCurrentReadAccess(0) mCurrentReadAccess(0)
{ {
...@@ -904,18 +905,22 @@ BufferHelper::BufferHelper() ...@@ -904,18 +905,22 @@ BufferHelper::BufferHelper()
BufferHelper::~BufferHelper() = default; BufferHelper::~BufferHelper() = default;
angle::Result BufferHelper::init(ContextVk *contextVk, angle::Result BufferHelper::init(Context *context,
const VkBufferCreateInfo &createInfo, const VkBufferCreateInfo &createInfo,
VkMemoryPropertyFlags memoryPropertyFlags) VkMemoryPropertyFlags memoryPropertyFlags)
{ {
ANGLE_VK_TRY(contextVk, mBuffer.init(contextVk->getDevice(), createInfo)); mSize = createInfo.size;
return vk::AllocateBufferMemory(contextVk, memoryPropertyFlags, &mMemoryPropertyFlags, &mBuffer, ANGLE_VK_TRY(context, mBuffer.init(context->getDevice(), createInfo));
return vk::AllocateBufferMemory(context, memoryPropertyFlags, &mMemoryPropertyFlags, &mBuffer,
&mDeviceMemory); &mDeviceMemory);
} }
void BufferHelper::release(RendererVk *renderer) void BufferHelper::release(RendererVk *renderer)
{ {
mSize = 0;
renderer->releaseObject(getStoredQueueSerial(), &mBuffer); renderer->releaseObject(getStoredQueueSerial(), &mBuffer);
renderer->releaseObject(getStoredQueueSerial(), &mBufferView);
renderer->releaseObject(getStoredQueueSerial(), &mDeviceMemory); renderer->releaseObject(getStoredQueueSerial(), &mDeviceMemory);
} }
...@@ -930,13 +935,13 @@ void BufferHelper::onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFla ...@@ -930,13 +935,13 @@ void BufferHelper::onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFla
} }
} }
angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk, angle::Result BufferHelper::copyFromBuffer(Context *context,
const Buffer &buffer, const Buffer &buffer,
const VkBufferCopy &copyRegion) const VkBufferCopy &copyRegion)
{ {
// 'recordCommands' will implicitly stop any reads from using the old buffer data. // 'recordCommands' will implicitly stop any reads from using the old buffer data.
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(recordCommands(contextVk, &commandBuffer)); ANGLE_TRY(recordCommands(context, &commandBuffer));
if (mCurrentReadAccess != 0 || mCurrentWriteAccess != 0) if (mCurrentReadAccess != 0 || mCurrentWriteAccess != 0)
{ {
...@@ -960,6 +965,23 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk, ...@@ -960,6 +965,23 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk,
return angle::Result::Continue(); return angle::Result::Continue();
} }
angle::Result BufferHelper::initBufferView(Context *context, const Format &format)
{
ASSERT(!mBufferView.valid());
ASSERT(format.valid());
VkBufferViewCreateInfo viewCreateInfo = {};
viewCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
viewCreateInfo.buffer = mBuffer.getHandle();
viewCreateInfo.format = format.vkBufferFormat;
viewCreateInfo.offset = 0;
viewCreateInfo.range = mSize;
ANGLE_VK_TRY(context, mBufferView.init(context->getDevice(), viewCreateInfo));
return angle::Result::Continue();
}
// ImageHelper implementation. // ImageHelper implementation.
ImageHelper::ImageHelper() ImageHelper::ImageHelper()
: RecordableGraphResource(CommandGraphResourceType::Image), : RecordableGraphResource(CommandGraphResourceType::Image),
......
...@@ -378,7 +378,7 @@ class BufferHelper final : public RecordableGraphResource ...@@ -378,7 +378,7 @@ class BufferHelper final : public RecordableGraphResource
BufferHelper(); BufferHelper();
~BufferHelper(); ~BufferHelper();
angle::Result init(ContextVk *contextVk, angle::Result init(Context *context,
const VkBufferCreateInfo &createInfo, const VkBufferCreateInfo &createInfo,
VkMemoryPropertyFlags memoryPropertyFlags); VkMemoryPropertyFlags memoryPropertyFlags);
void release(RendererVk *renderer); void release(RendererVk *renderer);
...@@ -391,17 +391,34 @@ class BufferHelper final : public RecordableGraphResource ...@@ -391,17 +391,34 @@ class BufferHelper final : public RecordableGraphResource
void onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFlagBits accessType); void onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFlagBits accessType);
// Also implicitly sets up the correct barriers. // Also implicitly sets up the correct barriers.
angle::Result copyFromBuffer(ContextVk *contextVk, angle::Result copyFromBuffer(Context *context,
const Buffer &buffer, const Buffer &buffer,
const VkBufferCopy &copyRegion); const VkBufferCopy &copyRegion);
angle::Result getBufferView(Context *context, const Format &format, BufferView **bufferViewOut)
{
// Note: currently only one view is allowed. If needs be, multiple views can be created
// based on format.
if (!mBufferView.valid())
{
ANGLE_TRY(initBufferView(context, format));
}
*bufferViewOut = &mBufferView;
return angle::Result::Continue();
}
private: private:
angle::Result initBufferView(Context *context, const Format &format);
// Vulkan objects. // Vulkan objects.
Buffer mBuffer; Buffer mBuffer;
BufferView mBufferView;
DeviceMemory mDeviceMemory; DeviceMemory mDeviceMemory;
// Cached properties. // Cached properties.
VkMemoryPropertyFlags mMemoryPropertyFlags; VkMemoryPropertyFlags mMemoryPropertyFlags;
VkDeviceSize mSize;
// For memory barriers. // For memory barriers.
VkFlags mCurrentWriteAccess; VkFlags mCurrentWriteAccess;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment