Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 5552cdf

Browse files
ShabbyXCommit Bot
authored andcommitted
Vulkan: Create buffer view for BufferHelper
Bug: angleproject:2958 Change-Id: Ifa40537bc6003486b37d5d2ac9a2b7f1f5c3d1c2 Reviewed-on: https://chromium-review.googlesource.com/c/1351115 Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
1 parent 1b17f90 commit 5552cdf

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

src/libANGLE/renderer/vulkan/vk_helpers.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -897,25 +897,30 @@ void LineLoopHelper::Draw(uint32_t count, CommandBuffer *commandBuffer)
897897
BufferHelper::BufferHelper()
898898
: RecordableGraphResource(CommandGraphResourceType::Buffer),
899899
mMemoryPropertyFlags{},
900+
mSize(0),
900901
mCurrentWriteAccess(0),
901902
mCurrentReadAccess(0)
902903
{
903904
}
904905

905906
BufferHelper::~BufferHelper() = default;
906907

907-
angle::Result BufferHelper::init(ContextVk *contextVk,
908+
angle::Result BufferHelper::init(Context *context,
908909
const VkBufferCreateInfo &createInfo,
909910
VkMemoryPropertyFlags memoryPropertyFlags)
910911
{
911-
ANGLE_VK_TRY(contextVk, mBuffer.init(contextVk->getDevice(), createInfo));
912-
return vk::AllocateBufferMemory(contextVk, memoryPropertyFlags, &mMemoryPropertyFlags, &mBuffer,
912+
mSize = createInfo.size;
913+
ANGLE_VK_TRY(context, mBuffer.init(context->getDevice(), createInfo));
914+
return vk::AllocateBufferMemory(context, memoryPropertyFlags, &mMemoryPropertyFlags, &mBuffer,
913915
&mDeviceMemory);
914916
}
915917

916918
void BufferHelper::release(RendererVk *renderer)
917919
{
920+
mSize = 0;
921+
918922
renderer->releaseObject(getStoredQueueSerial(), &mBuffer);
923+
renderer->releaseObject(getStoredQueueSerial(), &mBufferView);
919924
renderer->releaseObject(getStoredQueueSerial(), &mDeviceMemory);
920925
}
921926

@@ -930,13 +935,13 @@ void BufferHelper::onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFla
930935
}
931936
}
932937

933-
angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk,
938+
angle::Result BufferHelper::copyFromBuffer(Context *context,
934939
const Buffer &buffer,
935940
const VkBufferCopy &copyRegion)
936941
{
937942
// 'recordCommands' will implicitly stop any reads from using the old buffer data.
938943
vk::CommandBuffer *commandBuffer = nullptr;
939-
ANGLE_TRY(recordCommands(contextVk, &commandBuffer));
944+
ANGLE_TRY(recordCommands(context, &commandBuffer));
940945

941946
if (mCurrentReadAccess != 0 || mCurrentWriteAccess != 0)
942947
{
@@ -960,6 +965,23 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk,
960965
return angle::Result::Continue();
961966
}
962967

968+
angle::Result BufferHelper::initBufferView(Context *context, const Format &format)
969+
{
970+
ASSERT(!mBufferView.valid());
971+
ASSERT(format.valid());
972+
973+
VkBufferViewCreateInfo viewCreateInfo = {};
974+
viewCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
975+
viewCreateInfo.buffer = mBuffer.getHandle();
976+
viewCreateInfo.format = format.vkBufferFormat;
977+
viewCreateInfo.offset = 0;
978+
viewCreateInfo.range = mSize;
979+
980+
ANGLE_VK_TRY(context, mBufferView.init(context->getDevice(), viewCreateInfo));
981+
982+
return angle::Result::Continue();
983+
}
984+
963985
// ImageHelper implementation.
964986
ImageHelper::ImageHelper()
965987
: RecordableGraphResource(CommandGraphResourceType::Image),

src/libANGLE/renderer/vulkan/vk_helpers.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ class BufferHelper final : public RecordableGraphResource
378378
BufferHelper();
379379
~BufferHelper();
380380

381-
angle::Result init(ContextVk *contextVk,
381+
angle::Result init(Context *context,
382382
const VkBufferCreateInfo &createInfo,
383383
VkMemoryPropertyFlags memoryPropertyFlags);
384384
void release(RendererVk *renderer);
@@ -391,17 +391,34 @@ class BufferHelper final : public RecordableGraphResource
391391
void onFramebufferRead(FramebufferHelper *framebuffer, VkAccessFlagBits accessType);
392392

393393
// Also implicitly sets up the correct barriers.
394-
angle::Result copyFromBuffer(ContextVk *contextVk,
394+
angle::Result copyFromBuffer(Context *context,
395395
const Buffer &buffer,
396396
const VkBufferCopy &copyRegion);
397397

398+
angle::Result getBufferView(Context *context, const Format &format, BufferView **bufferViewOut)
399+
{
400+
// Note: currently only one view is allowed. If needs be, multiple views can be created
401+
// based on format.
402+
if (!mBufferView.valid())
403+
{
404+
ANGLE_TRY(initBufferView(context, format));
405+
}
406+
407+
*bufferViewOut = &mBufferView;
408+
return angle::Result::Continue();
409+
}
410+
398411
private:
412+
angle::Result initBufferView(Context *context, const Format &format);
413+
399414
// Vulkan objects.
400415
Buffer mBuffer;
416+
BufferView mBufferView;
401417
DeviceMemory mDeviceMemory;
402418

403419
// Cached properties.
404420
VkMemoryPropertyFlags mMemoryPropertyFlags;
421+
VkDeviceSize mSize;
405422

406423
// For memory barriers.
407424
VkFlags mCurrentWriteAccess;

0 commit comments

Comments
 (0)