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)
BufferHelper::BufferHelper()
: RecordableGraphResource(CommandGraphResourceType::Buffer),
mMemoryPropertyFlags{},
mSize(0),
mCurrentWriteAccess(0),
mCurrentReadAccess(0)
{
......@@ -904,18 +905,22 @@ BufferHelper::BufferHelper()
BufferHelper::~BufferHelper() = default;
angle::Result BufferHelper::init(ContextVk *contextVk,
angle::Result BufferHelper::init(Context *context,
const VkBufferCreateInfo &createInfo,
VkMemoryPropertyFlags memoryPropertyFlags)
{
ANGLE_VK_TRY(contextVk, mBuffer.init(contextVk->getDevice(), createInfo));
return vk::AllocateBufferMemory(contextVk, memoryPropertyFlags, &mMemoryPropertyFlags, &mBuffer,
mSize = createInfo.size;
ANGLE_VK_TRY(context, mBuffer.init(context->getDevice(), createInfo));
return vk::AllocateBufferMemory(context, memoryPropertyFlags, &mMemoryPropertyFlags, &mBuffer,
&mDeviceMemory);
}
void BufferHelper::release(RendererVk *renderer)
{
mSize = 0;
renderer->releaseObject(getStoredQueueSerial(), &mBuffer);
renderer->releaseObject(getStoredQueueSerial(), &mBufferView);
renderer->releaseObject(getStoredQueueSerial(), &mDeviceMemory);
}
......@@ -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 VkBufferCopy &copyRegion)
{
// 'recordCommands' will implicitly stop any reads from using the old buffer data.
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(recordCommands(contextVk, &commandBuffer));
ANGLE_TRY(recordCommands(context, &commandBuffer));
if (mCurrentReadAccess != 0 || mCurrentWriteAccess != 0)
{
......@@ -960,6 +965,23 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk,
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::ImageHelper()
: RecordableGraphResource(CommandGraphResourceType::Image),
......
......@@ -378,7 +378,7 @@ class BufferHelper final : public RecordableGraphResource
BufferHelper();
~BufferHelper();
angle::Result init(ContextVk *contextVk,
angle::Result init(Context *context,
const VkBufferCreateInfo &createInfo,
VkMemoryPropertyFlags memoryPropertyFlags);
void release(RendererVk *renderer);
......@@ -391,17 +391,34 @@ class BufferHelper final : public RecordableGraphResource
void onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFlagBits accessType);
// Also implicitly sets up the correct barriers.
angle::Result copyFromBuffer(ContextVk *contextVk,
angle::Result copyFromBuffer(Context *context,
const Buffer &buffer,
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:
angle::Result initBufferView(Context *context, const Format &format);
// Vulkan objects.
Buffer mBuffer;
BufferView mBufferView;
DeviceMemory mDeviceMemory;
// Cached properties.
VkMemoryPropertyFlags mMemoryPropertyFlags;
VkDeviceSize mSize;
// For memory barriers.
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