Commit 7daf31d8 by Mohan Maiya Committed by Commit Bot

Vulkan: Use device local memory for conversion buffers that can be converted with the GPU

When converting a vertex buffer by using GPU, the conversion buffer doesn't need to be host mappable. Hence the conversion buffer can be allocated on device local memory for faster GPU access times. Bug: angleproject:3534 Change-Id: I2efabec20186992479920bddd3abd36f9c13babc Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2108706 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 9d812d35
...@@ -96,10 +96,11 @@ ANGLE_INLINE VkMemoryPropertyFlags GetPreferredMemoryType(gl::BufferBinding targ ...@@ -96,10 +96,11 @@ ANGLE_INLINE VkMemoryPropertyFlags GetPreferredMemoryType(gl::BufferBinding targ
ConversionBuffer::ConversionBuffer(RendererVk *renderer, ConversionBuffer::ConversionBuffer(RendererVk *renderer,
VkBufferUsageFlags usageFlags, VkBufferUsageFlags usageFlags,
size_t initialSize, size_t initialSize,
size_t alignment) size_t alignment,
bool hostVisible)
: dirty(true), lastAllocationOffset(0) : dirty(true), lastAllocationOffset(0)
{ {
data.init(renderer, usageFlags, alignment, initialSize, true); data.init(renderer, usageFlags, alignment, initialSize, hostVisible);
} }
ConversionBuffer::~ConversionBuffer() = default; ConversionBuffer::~ConversionBuffer() = default;
...@@ -110,11 +111,13 @@ ConversionBuffer::ConversionBuffer(ConversionBuffer &&other) = default; ...@@ -110,11 +111,13 @@ ConversionBuffer::ConversionBuffer(ConversionBuffer &&other) = default;
BufferVk::VertexConversionBuffer::VertexConversionBuffer(RendererVk *renderer, BufferVk::VertexConversionBuffer::VertexConversionBuffer(RendererVk *renderer,
angle::FormatID formatIDIn, angle::FormatID formatIDIn,
GLuint strideIn, GLuint strideIn,
size_t offsetIn) size_t offsetIn,
bool hostVisible)
: ConversionBuffer(renderer, : ConversionBuffer(renderer,
vk::kVertexBufferUsageFlags, vk::kVertexBufferUsageFlags,
kConvertedArrayBufferInitialSize, kConvertedArrayBufferInitialSize,
vk::kVertexBufferAlignment), vk::kVertexBufferAlignment,
hostVisible),
formatID(formatIDIn), formatID(formatIDIn),
stride(strideIn), stride(strideIn),
offset(offsetIn) offset(offsetIn)
...@@ -436,7 +439,8 @@ angle::Result BufferVk::copyToBuffer(ContextVk *contextVk, ...@@ -436,7 +439,8 @@ angle::Result BufferVk::copyToBuffer(ContextVk *contextVk,
ConversionBuffer *BufferVk::getVertexConversionBuffer(RendererVk *renderer, ConversionBuffer *BufferVk::getVertexConversionBuffer(RendererVk *renderer,
angle::FormatID formatID, angle::FormatID formatID,
GLuint stride, GLuint stride,
size_t offset) size_t offset,
bool hostVisible)
{ {
for (VertexConversionBuffer &buffer : mVertexConversionBuffers) for (VertexConversionBuffer &buffer : mVertexConversionBuffers)
{ {
...@@ -446,7 +450,7 @@ ConversionBuffer *BufferVk::getVertexConversionBuffer(RendererVk *renderer, ...@@ -446,7 +450,7 @@ ConversionBuffer *BufferVk::getVertexConversionBuffer(RendererVk *renderer,
} }
} }
mVertexConversionBuffers.emplace_back(renderer, formatID, stride, offset); mVertexConversionBuffers.emplace_back(renderer, formatID, stride, offset, hostVisible);
return &mVertexConversionBuffers.back(); return &mVertexConversionBuffers.back();
} }
......
...@@ -25,7 +25,8 @@ struct ConversionBuffer ...@@ -25,7 +25,8 @@ struct ConversionBuffer
ConversionBuffer(RendererVk *renderer, ConversionBuffer(RendererVk *renderer,
VkBufferUsageFlags usageFlags, VkBufferUsageFlags usageFlags,
size_t initialSize, size_t initialSize,
size_t alignment); size_t alignment,
bool hostVisible);
~ConversionBuffer(); ~ConversionBuffer();
ConversionBuffer(ConversionBuffer &&other); ConversionBuffer(ConversionBuffer &&other);
...@@ -110,7 +111,8 @@ class BufferVk : public BufferImpl ...@@ -110,7 +111,8 @@ class BufferVk : public BufferImpl
ConversionBuffer *getVertexConversionBuffer(RendererVk *renderer, ConversionBuffer *getVertexConversionBuffer(RendererVk *renderer,
angle::FormatID formatID, angle::FormatID formatID,
GLuint stride, GLuint stride,
size_t offset); size_t offset,
bool hostVisible);
private: private:
void initializeStagingBuffer(ContextVk *contextVk, gl::BufferBinding target, size_t size); void initializeStagingBuffer(ContextVk *contextVk, gl::BufferBinding target, size_t size);
...@@ -126,7 +128,8 @@ class BufferVk : public BufferImpl ...@@ -126,7 +128,8 @@ class BufferVk : public BufferImpl
VertexConversionBuffer(RendererVk *renderer, VertexConversionBuffer(RendererVk *renderer,
angle::FormatID formatIDIn, angle::FormatID formatIDIn,
GLuint strideIn, GLuint strideIn,
size_t offsetIn); size_t offsetIn,
bool hostVisible);
~VertexConversionBuffer(); ~VertexConversionBuffer();
VertexConversionBuffer(VertexConversionBuffer &&other); VertexConversionBuffer(VertexConversionBuffer &&other);
......
...@@ -583,7 +583,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, ...@@ -583,7 +583,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
{ {
ConversionBuffer *conversion = bufferVk->getVertexConversionBuffer( ConversionBuffer *conversion = bufferVk->getVertexConversionBuffer(
renderer, intendedFormat.id, binding.getStride(), renderer, intendedFormat.id, binding.getStride(),
binding.getOffset() + attrib.relativeOffset); binding.getOffset() + attrib.relativeOffset, !bindingIsAligned);
if (conversion->dirty) if (conversion->dirty)
{ {
if (bindingIsAligned) if (bindingIsAligned)
......
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