Commit e354ff1a by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Allow DynamicBuffer suballocation in BufferVk

When allocations are made from DynamicBuffer, they suballocate from a possibly larger BufferHelper. In BufferVk, the offset of the suballocation was discarded, which limited the use of DynamicBuffer to a pool of small buffers. This change applies any such offset that may arise from suballocations everywhere, and makes BufferVk use a larger buffer size when the GL_DYNAMIC_* buffer usage hints are provided. Bug: angleproject:5719 Change-Id: I3df3317f7acff1b1b06a5e3e2bb707616a7d0512 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2738650 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent cb69b46a
...@@ -58,19 +58,19 @@ ...@@ -58,19 +58,19 @@
"src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000003.inc": "src/libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000003.inc":
"0587fb039a79680f5e314edcca3dfb59", "0587fb039a79680f5e314edcca3dfb59",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000000.inc":
"cd066053adf30bfa934859cb48b4c110", "82426086e0b5aea32d0f756a1f6e5342",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc":
"be364d154b17be183c461e5e007bb069", "55c5297c45e6735921f7c9ae43f7e1d0",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000002.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000002.inc":
"8c0c885278ee971f88944a69ffab9143", "e7453ef75a40a098663708926950f5db",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000003.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000003.inc":
"b07dc1b33f7900987168347bc08f22c3", "ccd5e83ec04092c1eace4d2d4bfa31bf",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000000.inc":
"fbba73422f7fac7b4c3534c5d99441ef", "1aa88d57de102b2f117b41fba5525ac0",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000001.inc":
"feee7f67e75256769e8a526001776f29", "3c2fa0136eedc41ab0d44af511220647",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000002.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000002.inc":
"00121428645d5f568768ea607db3d8ad", "7f95c1d62cfa29a0f3d459cc114ff6b0",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndirectLineLoop.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndirectLineLoop.comp.00000000.inc":
"ad3a31d17ca64d2c6c7119812b3689e8", "ad3a31d17ca64d2c6c7119812b3689e8",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc":
...@@ -286,11 +286,11 @@ ...@@ -286,11 +286,11 @@
"src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp.json": "src/libANGLE/renderer/vulkan/shaders/src/BlitResolveStencilNoExport.comp.json":
"8a3e9ff34eba0386edb98048547a272b", "8a3e9ff34eba0386edb98048547a272b",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp": "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp":
"a46b48d7d5b19c74eb377f275525ab8d", "6626a48fb3ec7be814a11186104e651e",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp.json": "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp.json":
"22b04129fc4a3db7dbd62adeda18577b", "22b04129fc4a3db7dbd62adeda18577b",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndexIndirectLineLoop.comp": "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndexIndirectLineLoop.comp":
"ee94f2dab39583c17cb5739199229427", "a1ba0fa618662801eadaa93398b68068",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndexIndirectLineLoop.comp.json": "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndexIndirectLineLoop.comp.json":
"f5f3eb40d8423e1027c2d47197b8f9d2", "f5f3eb40d8423e1027c2d47197b8f9d2",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndirectLineLoop.comp": "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndirectLineLoop.comp":
......
...@@ -98,15 +98,17 @@ class BufferVk : public BufferImpl ...@@ -98,15 +98,17 @@ class BufferVk : public BufferImpl
void onDataChanged() override; void onDataChanged() override;
const vk::BufferHelper &getBuffer() const const vk::BufferHelper &getBufferAndOffset(VkDeviceSize *offsetOut) const
{ {
ASSERT(isBufferValid()); ASSERT(isBufferValid());
*offsetOut = mBufferOffset;
return *mBuffer; return *mBuffer;
} }
vk::BufferHelper &getBuffer() vk::BufferHelper &getBufferAndOffset(VkDeviceSize *offsetOut)
{ {
ASSERT(isBufferValid()); ASSERT(isBufferValid());
*offsetOut = mBufferOffset;
return *mBuffer; return *mBuffer;
} }
...@@ -120,12 +122,6 @@ class BufferVk : public BufferImpl ...@@ -120,12 +122,6 @@ class BufferVk : public BufferImpl
void **mapPtr); void **mapPtr);
angle::Result unmapImpl(ContextVk *contextVk); angle::Result unmapImpl(ContextVk *contextVk);
// Calls copyBuffer internally.
angle::Result copyToBufferImpl(ContextVk *contextVk,
vk::BufferHelper *destBuffer,
uint32_t copyCount,
const VkBufferCopy *copies);
ConversionBuffer *getVertexConversionBuffer(RendererVk *renderer, ConversionBuffer *getVertexConversionBuffer(RendererVk *renderer,
angle::FormatID formatID, angle::FormatID formatID,
GLuint stride, GLuint stride,
...@@ -170,7 +166,8 @@ class BufferVk : public BufferImpl ...@@ -170,7 +166,8 @@ class BufferVk : public BufferImpl
const void *data, const void *data,
size_t size, size_t size,
VkMemoryPropertyFlags memoryPropertyFlags, VkMemoryPropertyFlags memoryPropertyFlags,
bool persistentMapRequired); bool persistentMapRequired,
gl::BufferUsage usage);
angle::Result handleDeviceLocalBufferMap(ContextVk *contextVk, angle::Result handleDeviceLocalBufferMap(ContextVk *contextVk,
VkDeviceSize offset, VkDeviceSize offset,
VkDeviceSize size, VkDeviceSize size,
...@@ -185,9 +182,7 @@ class BufferVk : public BufferImpl ...@@ -185,9 +182,7 @@ class BufferVk : public BufferImpl
void release(ContextVk *context); void release(ContextVk *context);
void markConversionBuffersDirty(); void markConversionBuffersDirty();
angle::Result acquireBufferHelper(ContextVk *contextVk, angle::Result acquireBufferHelper(ContextVk *contextVk, size_t sizeInBytes);
size_t sizeInBytes,
vk::BufferHelper **bufferHelperOut);
struct VertexConversionBuffer : public ConversionBuffer struct VertexConversionBuffer : public ConversionBuffer
{ {
...@@ -207,6 +202,7 @@ class BufferVk : public BufferImpl ...@@ -207,6 +202,7 @@ class BufferVk : public BufferImpl
}; };
vk::BufferHelper *mBuffer; vk::BufferHelper *mBuffer;
VkDeviceSize mBufferOffset;
// Pool of BufferHelpers for mBuffer to acquire from // Pool of BufferHelpers for mBuffer to acquire from
vk::DynamicBuffer mBufferPool; vk::DynamicBuffer mBufferPool;
......
...@@ -994,6 +994,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText ...@@ -994,6 +994,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText
// The offset we had the last time we bound the index buffer. // The offset we had the last time we bound the index buffer.
const GLvoid *mLastIndexBufferOffset; const GLvoid *mLastIndexBufferOffset;
VkDeviceSize mCurrentIndexBufferOffset;
gl::DrawElementsType mCurrentDrawElementsType; gl::DrawElementsType mCurrentDrawElementsType;
angle::PackedEnumMap<gl::DrawElementsType, VkIndexType> mIndexTypeMap; angle::PackedEnumMap<gl::DrawElementsType, VkIndexType> mIndexTypeMap;
......
...@@ -1213,19 +1213,20 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( ...@@ -1213,19 +1213,20 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
"VkDeviceSize too small"); "VkDeviceSize too small");
ASSERT(bufferBinding.getSize() >= 0); ASSERT(bufferBinding.getSize() >= 0);
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
VkDeviceSize bufferOffset = 0;
vk::BufferHelper &bufferHelper = bufferVk->getBufferAndOffset(&bufferOffset);
if (!cacheHit) if (!cacheHit)
{ {
VkDescriptorBufferInfo &bufferInfo = contextVk->allocDescriptorBufferInfo(); VkDescriptorBufferInfo &bufferInfo = contextVk->allocDescriptorBufferInfo();
VkWriteDescriptorSet &writeInfo = contextVk->allocWriteDescriptorSet(); VkWriteDescriptorSet &writeInfo = contextVk->allocWriteDescriptorSet();
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
VkDescriptorSet descriptorSet; VkDescriptorSet descriptorSet;
ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &shaderBuffersDesc, ANGLE_TRY(getOrAllocateShaderResourcesDescriptorSet(contextVk, &shaderBuffersDesc,
&descriptorSet)); &descriptorSet));
VkDeviceSize offset = VkDeviceSize offset =
IsDynamicDescriptor(descriptorType) ? 0 : bufferBinding.getOffset(); IsDynamicDescriptor(descriptorType) ? 0 : bufferOffset + bufferBinding.getOffset();
WriteBufferDescriptorSetBinding(bufferHelper, offset, size, descriptorSet, WriteBufferDescriptorSetBinding(bufferHelper, offset, size, descriptorSet,
descriptorType, binding, arrayElement, 0, &bufferInfo, descriptorType, binding, arrayElement, 0, &bufferInfo,
&writeInfo); &writeInfo);
...@@ -1233,7 +1234,7 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( ...@@ -1233,7 +1234,7 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet(
if (IsDynamicDescriptor(descriptorType)) if (IsDynamicDescriptor(descriptorType))
{ {
mDynamicShaderBufferDescriptorOffsets.push_back( mDynamicShaderBufferDescriptorOffsets.push_back(
static_cast<uint32_t>(bufferBinding.getOffset())); static_cast<uint32_t>(bufferOffset + bufferBinding.getOffset()));
} }
} }
...@@ -1295,13 +1296,14 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( ...@@ -1295,13 +1296,14 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet(
VkWriteDescriptorSet &writeInfo = contextVk->allocWriteDescriptorSet(); VkWriteDescriptorSet &writeInfo = contextVk->allocWriteDescriptorSet();
BufferVk *bufferVk = vk::GetImpl(bufferBinding.get()); BufferVk *bufferVk = vk::GetImpl(bufferBinding.get());
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); VkDeviceSize bufferOffset = 0;
vk::BufferHelper &bufferHelper = bufferVk->getBufferAndOffset(&bufferOffset);
VkDeviceSize size = gl::GetBoundBufferAvailableSize(bufferBinding); VkDeviceSize size = gl::GetBoundBufferAvailableSize(bufferBinding);
WriteBufferDescriptorSetBinding(bufferHelper, WriteBufferDescriptorSetBinding(
static_cast<uint32_t>(bufferBinding.getOffset()), size, bufferHelper, static_cast<uint32_t>(bufferOffset + bufferBinding.getOffset()), size,
descriptorSet, kStorageBufferDescriptorType, info.binding, descriptorSet, kStorageBufferDescriptorType, info.binding, binding,
binding, requiredOffsetAlignment, &bufferInfo, &writeInfo); requiredOffsetAlignment, &bufferInfo, &writeInfo);
writtenBindings.set(binding); writtenBindings.set(binding);
} }
......
...@@ -115,7 +115,8 @@ angle::Result SemaphoreVk::wait(gl::Context *context, ...@@ -115,7 +115,8 @@ angle::Result SemaphoreVk::wait(gl::Context *context,
for (gl::Buffer *buffer : bufferBarriers) for (gl::Buffer *buffer : bufferBarriers)
{ {
BufferVk *bufferVk = vk::GetImpl(buffer); BufferVk *bufferVk = vk::GetImpl(buffer);
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); VkDeviceSize bufferOffset = 0;
vk::BufferHelper &bufferHelper = bufferVk->getBufferAndOffset(&bufferOffset);
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer));
...@@ -169,7 +170,8 @@ angle::Result SemaphoreVk::signal(gl::Context *context, ...@@ -169,7 +170,8 @@ angle::Result SemaphoreVk::signal(gl::Context *context,
for (gl::Buffer *buffer : bufferBarriers) for (gl::Buffer *buffer : bufferBarriers)
{ {
BufferVk *bufferVk = vk::GetImpl(buffer); BufferVk *bufferVk = vk::GetImpl(buffer);
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); VkDeviceSize bufferOffset = 0;
vk::BufferHelper &bufferHelper = bufferVk->getBufferAndOffset(&bufferOffset);
ANGLE_TRY(contextVk->onBufferReleaseToExternal(bufferHelper)); ANGLE_TRY(contextVk->onBufferReleaseToExternal(bufferHelper));
vk::CommandBuffer *commandBuffer; vk::CommandBuffer *commandBuffer;
......
...@@ -505,7 +505,8 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context, ...@@ -505,7 +505,8 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context,
if (unpackBuffer) if (unpackBuffer)
{ {
BufferVk *unpackBufferVk = vk::GetImpl(unpackBuffer); BufferVk *unpackBufferVk = vk::GetImpl(unpackBuffer);
vk::BufferHelper &bufferHelper = unpackBufferVk->getBuffer(); VkDeviceSize bufferOffset = 0;
vk::BufferHelper &bufferHelper = unpackBufferVk->getBufferAndOffset(&bufferOffset);
uintptr_t offset = reinterpret_cast<uintptr_t>(pixels); uintptr_t offset = reinterpret_cast<uintptr_t>(pixels);
GLuint inputRowPitch = 0; GLuint inputRowPitch = 0;
GLuint inputDepthPitch = 0; GLuint inputDepthPitch = 0;
...@@ -515,7 +516,7 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context, ...@@ -515,7 +516,7 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context,
contextVk, gl::Extents(area.width, area.height, area.depth), formatInfo, unpack, type, contextVk, gl::Extents(area.width, area.height, area.depth), formatInfo, unpack, type,
index.usesTex3D(), &inputRowPitch, &inputDepthPitch, &inputSkipBytes)); index.usesTex3D(), &inputRowPitch, &inputDepthPitch, &inputSkipBytes));
size_t offsetBytes = static_cast<size_t>(offset + inputSkipBytes); size_t offsetBytes = static_cast<size_t>(bufferOffset + offset + inputSkipBytes);
// Note: cannot directly copy from a depth/stencil PBO. GL requires depth and stencil data // Note: cannot directly copy from a depth/stencil PBO. GL requires depth and stencil data
// to be packed, while Vulkan requires them to be separate. // to be packed, while Vulkan requires them to be separate.
...@@ -2731,10 +2732,12 @@ angle::Result TextureVk::getBufferViewAndRecordUse(ContextVk *contextVk, ...@@ -2731,10 +2732,12 @@ angle::Result TextureVk::getBufferViewAndRecordUse(ContextVk *contextVk,
} }
// Create a view for the required format. // Create a view for the required format.
const vk::BufferHelper &buffer = vk::GetImpl(mState.getBuffer().get())->getBuffer(); VkDeviceSize bufferOffset = 0;
const vk::BufferHelper &buffer =
vk::GetImpl(mState.getBuffer().get())->getBufferAndOffset(&bufferOffset);
retainBufferViews(&contextVk->getResourceUseList()); retainBufferViews(&contextVk->getResourceUseList());
return mBufferViews.getView(contextVk, buffer, *imageUniformFormat, viewOut); return mBufferViews.getView(contextVk, buffer, bufferOffset, *imageUniformFormat, viewOut);
} }
angle::Result TextureVk::initImage(ContextVk *contextVk, angle::Result TextureVk::initImage(ContextVk *contextVk,
......
...@@ -65,8 +65,9 @@ void TransformFeedbackVk::initializeXFBBuffersDesc(ContextVk *contextVk, size_t ...@@ -65,8 +65,9 @@ void TransformFeedbackVk::initializeXFBBuffersDesc(ContextVk *contextVk, size_t
if (bufferVk->isBufferValid()) if (bufferVk->isBufferValid())
{ {
mBufferHelpers[bufferIndex] = &bufferVk->getBuffer(); VkDeviceSize bufferOffset = 0;
mBufferOffsets[bufferIndex] = binding.getOffset(); mBufferHelpers[bufferIndex] = &bufferVk->getBufferAndOffset(&bufferOffset);
mBufferOffsets[bufferIndex] = binding.getOffset() + bufferOffset;
mBufferSizes[bufferIndex] = gl::GetBoundBufferAvailableSize(binding); mBufferSizes[bufferIndex] = gl::GetBoundBufferAvailableSize(binding);
} }
else else
......
...@@ -1570,7 +1570,7 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk, ...@@ -1570,7 +1570,7 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk,
constexpr uint32_t kInvocationsPerGroup = 64; constexpr uint32_t kInvocationsPerGroup = 64;
constexpr uint32_t kInvocationsPerIndex = 2; constexpr uint32_t kInvocationsPerIndex = 2;
const uint32_t kIndexCount = params.maxIndex - params.srcOffset; const uint32_t kIndexCount = params.maxIndex;
const uint32_t kGroupCount = const uint32_t kGroupCount =
UnsignedCeilDivide(kIndexCount * kInvocationsPerIndex, kInvocationsPerGroup); UnsignedCeilDivide(kIndexCount * kInvocationsPerIndex, kInvocationsPerGroup);
commandBuffer->dispatch(kGroupCount, 1, 1); commandBuffer->dispatch(kGroupCount, 1, 1);
...@@ -1620,9 +1620,9 @@ angle::Result UtilsVk::convertIndexIndirectBuffer(ContextVk *contextVk, ...@@ -1620,9 +1620,9 @@ angle::Result UtilsVk::convertIndexIndirectBuffer(ContextVk *contextVk,
vkUpdateDescriptorSets(contextVk->getDevice(), 1, &writeInfo, 0, nullptr); vkUpdateDescriptorSets(contextVk->getDevice(), 1, &writeInfo, 0, nullptr);
ConvertIndexIndirectShaderParams shaderParams = {params.srcIndirectBufOffset >> 2, ConvertIndexIndirectShaderParams shaderParams = {
params.dstIndexBufOffset >> 2, params.maxIndex, params.srcIndirectBufOffset >> 2, params.srcIndexBufOffset, params.dstIndexBufOffset >> 2,
params.dstIndirectBufOffset >> 2}; params.maxIndex, params.dstIndirectBufOffset >> 2};
uint32_t flags = vk::InternalShader::ConvertIndex_comp::kIsIndirect; uint32_t flags = vk::InternalShader::ConvertIndex_comp::kIsIndirect;
if (contextVk->getState().isPrimitiveRestartEnabled()) if (contextVk->getState().isPrimitiveRestartEnabled())
...@@ -1692,7 +1692,8 @@ angle::Result UtilsVk::convertLineLoopIndexIndirectBuffer( ...@@ -1692,7 +1692,8 @@ angle::Result UtilsVk::convertLineLoopIndexIndirectBuffer(
ConvertIndexIndirectLineLoopShaderParams shaderParams = { ConvertIndexIndirectLineLoopShaderParams shaderParams = {
params.indirectBufferOffset >> 2, params.dstIndirectBufferOffset >> 2, params.indirectBufferOffset >> 2, params.dstIndirectBufferOffset >> 2,
params.dstIndexBufferOffset >> 2, contextVk->getState().isPrimitiveRestartEnabled()}; params.srcIndexBufferOffset, params.dstIndexBufferOffset >> 2,
contextVk->getState().isPrimitiveRestartEnabled()};
uint32_t flags = GetConvertIndexIndirectLineLoopFlag(params.indicesBitsWidth); uint32_t flags = GetConvertIndexIndirectLineLoopFlag(params.indicesBitsWidth);
......
...@@ -58,6 +58,7 @@ class UtilsVk : angle::NonCopyable ...@@ -58,6 +58,7 @@ class UtilsVk : angle::NonCopyable
struct ConvertIndexIndirectParameters struct ConvertIndexIndirectParameters
{ {
uint32_t srcIndirectBufOffset = 0; uint32_t srcIndirectBufOffset = 0;
uint32_t srcIndexBufOffset = 0;
uint32_t dstIndexBufOffset = 0; uint32_t dstIndexBufOffset = 0;
uint32_t maxIndex = 0; uint32_t maxIndex = 0;
uint32_t dstIndirectBufOffset = 0; uint32_t dstIndirectBufOffset = 0;
...@@ -67,6 +68,7 @@ class UtilsVk : angle::NonCopyable ...@@ -67,6 +68,7 @@ class UtilsVk : angle::NonCopyable
{ {
uint32_t indirectBufferOffset = 0; uint32_t indirectBufferOffset = 0;
uint32_t dstIndirectBufferOffset = 0; uint32_t dstIndirectBufferOffset = 0;
uint32_t srcIndexBufferOffset = 0;
uint32_t dstIndexBufferOffset = 0; uint32_t dstIndexBufferOffset = 0;
uint32_t indicesBitsWidth = 0; uint32_t indicesBitsWidth = 0;
}; };
...@@ -301,6 +303,7 @@ class UtilsVk : angle::NonCopyable ...@@ -301,6 +303,7 @@ class UtilsVk : angle::NonCopyable
struct ConvertIndexIndirectShaderParams struct ConvertIndexIndirectShaderParams
{ {
uint32_t srcIndirectOffsetDiv4 = 0; uint32_t srcIndirectOffsetDiv4 = 0;
uint32_t srcOffset = 0;
uint32_t dstOffsetDiv4 = 0; uint32_t dstOffsetDiv4 = 0;
uint32_t maxIndex = 0; uint32_t maxIndex = 0;
uint32_t dstIndirectOffsetDiv4 = 0; uint32_t dstIndirectOffsetDiv4 = 0;
...@@ -310,6 +313,7 @@ class UtilsVk : angle::NonCopyable ...@@ -310,6 +313,7 @@ class UtilsVk : angle::NonCopyable
{ {
uint32_t cmdOffsetDiv4 = 0; uint32_t cmdOffsetDiv4 = 0;
uint32_t dstCmdOffsetDiv4 = 0; uint32_t dstCmdOffsetDiv4 = 0;
uint32_t srcOffset = 0;
uint32_t dstOffsetDiv4 = 0; uint32_t dstOffsetDiv4 = 0;
uint32_t isRestartEnabled = 0; uint32_t isRestartEnabled = 0;
}; };
......
...@@ -197,13 +197,14 @@ angle::Result VertexArrayVk::convertIndexBufferGPU(ContextVk *contextVk, ...@@ -197,13 +197,14 @@ angle::Result VertexArrayVk::convertIndexBufferGPU(ContextVk *contextVk,
nullptr)); nullptr));
mCurrentElementArrayBuffer = mTranslatedByteIndexData.getCurrentBuffer(); mCurrentElementArrayBuffer = mTranslatedByteIndexData.getCurrentBuffer();
vk::BufferHelper *dest = mTranslatedByteIndexData.getCurrentBuffer(); vk::BufferHelper *dest = mTranslatedByteIndexData.getCurrentBuffer();
vk::BufferHelper *src = &bufferVk->getBuffer(); VkDeviceSize srcBufferOffset = 0;
vk::BufferHelper *src = &bufferVk->getBufferAndOffset(&srcBufferOffset);
// Copy relevant section of the source into destination at allocated offset. Note that the // Copy relevant section of the source into destination at allocated offset. Note that the
// offset returned by allocate() above is in bytes. As is the indices offset pointer. // offset returned by allocate() above is in bytes. As is the indices offset pointer.
UtilsVk::ConvertIndexParameters params = {}; UtilsVk::ConvertIndexParameters params = {};
params.srcOffset = static_cast<uint32_t>(offsetIntoSrcData); params.srcOffset = static_cast<uint32_t>(offsetIntoSrcData + srcBufferOffset);
params.dstOffset = static_cast<uint32_t>(mCurrentElementArrayBufferOffset); params.dstOffset = static_cast<uint32_t>(mCurrentElementArrayBufferOffset);
params.maxIndex = static_cast<uint32_t>(bufferVk->getSize()); params.maxIndex = static_cast<uint32_t>(bufferVk->getSize());
...@@ -217,13 +218,16 @@ angle::Result VertexArrayVk::convertIndexBufferIndirectGPU(ContextVk *contextVk, ...@@ -217,13 +218,16 @@ angle::Result VertexArrayVk::convertIndexBufferIndirectGPU(ContextVk *contextVk,
VkDeviceSize *indirectBufferVkOffsetOut) VkDeviceSize *indirectBufferVkOffsetOut)
{ {
size_t srcDataSize = static_cast<size_t>(mCurrentElementArrayBuffer->getSize()); size_t srcDataSize = static_cast<size_t>(mCurrentElementArrayBuffer->getSize());
ASSERT(mCurrentElementArrayBuffer == VkDeviceSize elementArrayBufferOffset = 0;
&vk::GetImpl(getState().getElementArrayBuffer())->getBuffer()); ASSERT(mCurrentElementArrayBuffer == &vk::GetImpl(getState().getElementArrayBuffer())
->getBufferAndOffset(&elementArrayBufferOffset));
ASSERT(mCurrentElementArrayBufferOffset == elementArrayBufferOffset);
mTranslatedByteIndexData.releaseInFlightBuffers(contextVk); mTranslatedByteIndexData.releaseInFlightBuffers(contextVk);
mTranslatedByteIndirectData.releaseInFlightBuffers(contextVk); mTranslatedByteIndirectData.releaseInFlightBuffers(contextVk);
vk::BufferHelper *srcIndexBuf = mCurrentElementArrayBuffer; vk::BufferHelper *srcIndexBuf = mCurrentElementArrayBuffer;
VkDeviceSize srcIndexBufOffset = mCurrentElementArrayBufferOffset;
VkDeviceSize dstIndirectBufOffset; VkDeviceSize dstIndirectBufOffset;
VkDeviceSize dstIndexBufOffset; VkDeviceSize dstIndexBufOffset;
...@@ -248,6 +252,7 @@ angle::Result VertexArrayVk::convertIndexBufferIndirectGPU(ContextVk *contextVk, ...@@ -248,6 +252,7 @@ angle::Result VertexArrayVk::convertIndexBufferIndirectGPU(ContextVk *contextVk,
// offset returned by allocate() above is in bytes. As is the indices offset pointer. // offset returned by allocate() above is in bytes. As is the indices offset pointer.
UtilsVk::ConvertIndexIndirectParameters params = {}; UtilsVk::ConvertIndexIndirectParameters params = {};
params.srcIndirectBufOffset = static_cast<uint32_t>(srcIndirectBufOffset); params.srcIndirectBufOffset = static_cast<uint32_t>(srcIndirectBufOffset);
params.srcIndexBufOffset = static_cast<uint32_t>(srcIndexBufOffset);
params.dstIndexBufOffset = static_cast<uint32_t>(dstIndexBufOffset); params.dstIndexBufOffset = static_cast<uint32_t>(dstIndexBufOffset);
params.maxIndex = static_cast<uint32_t>(srcDataSize); params.maxIndex = static_cast<uint32_t>(srcDataSize);
params.dstIndirectBufOffset = static_cast<uint32_t>(dstIndirectBufOffset); params.dstIndirectBufOffset = static_cast<uint32_t>(dstIndirectBufOffset);
...@@ -264,9 +269,9 @@ angle::Result VertexArrayVk::handleLineLoopIndexIndirect(ContextVk *contextVk, ...@@ -264,9 +269,9 @@ angle::Result VertexArrayVk::handleLineLoopIndexIndirect(ContextVk *contextVk,
VkDeviceSize *indirectBufferOffsetOut) VkDeviceSize *indirectBufferOffsetOut)
{ {
ANGLE_TRY(mLineLoopHelper.streamIndicesIndirect( ANGLE_TRY(mLineLoopHelper.streamIndicesIndirect(
contextVk, glIndexType, mCurrentElementArrayBuffer, srcIndirectBuf, indirectBufferOffset, contextVk, glIndexType, mCurrentElementArrayBuffer, mCurrentElementArrayBufferOffset,
&mCurrentElementArrayBuffer, &mCurrentElementArrayBufferOffset, indirectBufferOut, srcIndirectBuf, indirectBufferOffset, &mCurrentElementArrayBuffer,
indirectBufferOffsetOut)); &mCurrentElementArrayBufferOffset, indirectBufferOut, indirectBufferOffsetOut));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -401,16 +406,19 @@ angle::Result VertexArrayVk::convertVertexBufferGPU(ContextVk *contextVk, ...@@ -401,16 +406,19 @@ angle::Result VertexArrayVk::convertVertexBufferGPU(ContextVk *contextVk,
ASSERT(conversion->dirty); ASSERT(conversion->dirty);
conversion->dirty = false; conversion->dirty = false;
VkDeviceSize srcBufferOffset = 0;
vk::BufferHelper *srcBufferHelper = &srcBuffer->getBufferAndOffset(&srcBufferOffset);
UtilsVk::ConvertVertexParameters params; UtilsVk::ConvertVertexParameters params;
params.vertexCount = numVertices; params.vertexCount = numVertices;
params.srcFormat = &srcFormat; params.srcFormat = &srcFormat;
params.destFormat = &destFormat; params.destFormat = &destFormat;
params.srcStride = binding.getStride(); params.srcStride = binding.getStride();
params.srcOffset = binding.getOffset() + relativeOffset; params.srcOffset = binding.getOffset() + relativeOffset + static_cast<size_t>(srcBufferOffset);
params.destOffset = static_cast<size_t>(conversion->lastAllocationOffset); params.destOffset = static_cast<size_t>(conversion->lastAllocationOffset);
ANGLE_TRY(contextVk->getUtils().convertVertexBuffer( ANGLE_TRY(contextVk->getUtils().convertVertexBuffer(
contextVk, conversion->data.getCurrentBuffer(), &srcBuffer->getBuffer(), params)); contextVk, conversion->data.getCurrentBuffer(), srcBufferHelper, params));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -478,12 +486,14 @@ angle::Result VertexArrayVk::syncState(const gl::Context *context, ...@@ -478,12 +486,14 @@ angle::Result VertexArrayVk::syncState(const gl::Context *context,
{ {
// Note that just updating buffer data may still result in a new // Note that just updating buffer data may still result in a new
// vk::BufferHelper allocation. // vk::BufferHelper allocation.
BufferVk *bufferVk = vk::GetImpl(bufferGL); BufferVk *bufferVk = vk::GetImpl(bufferGL);
mCurrentElementArrayBuffer = &bufferVk->getBuffer(); mCurrentElementArrayBuffer =
&bufferVk->getBufferAndOffset(&mCurrentElementArrayBufferOffset);
} }
else else
{ {
mCurrentElementArrayBuffer = nullptr; mCurrentElementArrayBuffer = nullptr;
mCurrentElementArrayBufferOffset = 0;
} }
mLineLoopBufferFirstIndex.reset(); mLineLoopBufferFirstIndex.reset();
...@@ -676,14 +686,20 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, ...@@ -676,14 +686,20 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
} }
else else
{ {
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); VkDeviceSize bufferOffset = 0;
mCurrentArrayBuffers[attribIndex] = &bufferHelper; vk::BufferHelper &bufferHelper = bufferVk->getBufferAndOffset(&bufferOffset);
mCurrentArrayBuffers[attribIndex] = &bufferHelper;
mCurrentArrayBufferHandles[attribIndex] = bufferHelper.getBuffer().getHandle(); mCurrentArrayBufferHandles[attribIndex] = bufferHelper.getBuffer().getHandle();
ASSERT(bufferOffset < bufferHelper.getSize());
VkDeviceSize availableSize = bufferHelper.getSize() - bufferOffset;
// Vulkan requires the offset is within the buffer. We use robust access // Vulkan requires the offset is within the buffer. We use robust access
// behaviour to reset the offset if it starts outside the buffer. // behaviour to reset the offset if it starts outside the buffer.
mCurrentArrayBufferOffsets[attribIndex] = mCurrentArrayBufferOffsets[attribIndex] =
binding.getOffset() < bufferVk->getSize() ? binding.getOffset() : 0; binding.getOffset() < static_cast<GLint64>(availableSize)
? binding.getOffset() + bufferOffset
: 0;
stride = binding.getStride(); stride = binding.getStride();
} }
......
...@@ -87,11 +87,6 @@ class VertexArrayVk : public VertexArrayImpl ...@@ -87,11 +87,6 @@ class VertexArrayVk : public VertexArrayImpl
return mCurrentElementArrayBufferOffset; return mCurrentElementArrayBufferOffset;
} }
void updateCurrentElementArrayBufferOffset(const GLvoid *offset)
{
mCurrentElementArrayBufferOffset = reinterpret_cast<VkDeviceSize>(offset);
}
vk::BufferHelper *getCurrentElementArrayBuffer() const { return mCurrentElementArrayBuffer; } vk::BufferHelper *getCurrentElementArrayBuffer() const { return mCurrentElementArrayBuffer; }
angle::Result convertIndexBufferGPU(ContextVk *contextVk, angle::Result convertIndexBufferGPU(ContextVk *contextVk,
......
...@@ -87,9 +87,7 @@ constexpr uint8_t kConvertIndex_comp_00000000[] = { ...@@ -87,9 +87,7 @@ constexpr uint8_t kConvertIndex_comp_00000000[] = {
// //
// uint PullIndex(uint index) // uint PullIndex(uint index)
// { // {
//
// uint srcIndex = index + srcIndexOffset; // uint srcIndex = index + srcIndexOffset;
//
// uint srcBlock = srcIndexBuf[srcIndex >> 2]; // uint srcBlock = srcIndexBuf[srcIndex >> 2];
// uint srcComponent =(srcIndex & 3); // uint srcComponent =(srcIndex & 3);
// //
......
...@@ -90,9 +90,7 @@ constexpr uint8_t kConvertIndex_comp_00000001[] = { ...@@ -90,9 +90,7 @@ constexpr uint8_t kConvertIndex_comp_00000001[] = {
// //
// uint PullIndex(uint index) // uint PullIndex(uint index)
// { // {
//
// uint srcIndex = index + srcIndexOffset; // uint srcIndex = index + srcIndexOffset;
//
// uint srcBlock = srcIndexBuf[srcIndex >> 2]; // uint srcBlock = srcIndexBuf[srcIndex >> 2];
// uint srcComponent =(srcIndex & 3); // uint srcComponent =(srcIndex & 3);
// //
......
...@@ -47,11 +47,13 @@ layout (push_constant) uniform PushConstants ...@@ -47,11 +47,13 @@ layout (push_constant) uniform PushConstants
{ {
// Read offset in bytes into the srcIndirectBuf array, divided by four. // Read offset in bytes into the srcIndirectBuf array, divided by four.
uint srcIndirectOffsetDiv4; uint srcIndirectOffsetDiv4;
// Read offset in bytes into the srcIndexBuf array.
uint srcIndexOffset;
// Write offset in bytes into the dstIndexBuf array, divided by four. // Write offset in bytes into the dstIndexBuf array, divided by four.
uint dstIndexBufOffsetDiv4; uint dstIndexBufOffsetDiv4;
// Maximum size of the read buffer. The highest index value we will convert. // Maximum size of the read buffer. The highest index value we will convert.
uint maxIndex; uint maxIndex;
// Write offset in bytes/4 of destinatio indirect buffer // Write offset in bytes/4 of destination indirect buffer
uint dstIndirectBufOffsetDiv4; uint dstIndirectBufOffsetDiv4;
}; };
...@@ -72,11 +74,7 @@ layout (push_constant) uniform PushConstants ...@@ -72,11 +74,7 @@ layout (push_constant) uniform PushConstants
uint PullIndex(uint index) uint PullIndex(uint index)
{ {
#if IsIndirect
uint srcIndex = index;
#else
uint srcIndex = index + srcIndexOffset; uint srcIndex = index + srcIndexOffset;
#endif
uint srcBlock = srcIndexBuf[srcIndex >> 2]; uint srcBlock = srcIndexBuf[srcIndex >> 2];
uint srcComponent = (srcIndex & 3); uint srcComponent = (srcIndex & 3);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#if Is32Bits #if Is32Bits
#define BITSMASK 0xffffffff #define BITSMASK 0xffffffff
#define IDXSHIFT 0
#elif Is16Bits #elif Is16Bits
#define BITSMASK 0xffff #define BITSMASK 0xffff
#define IDXSHIFT 1 // 16bits index division shift #define IDXSHIFT 1 // 16bits index division shift
...@@ -64,6 +65,8 @@ layout (push_constant) uniform PushConstants ...@@ -64,6 +65,8 @@ layout (push_constant) uniform PushConstants
uint cmdOffsetDiv4; uint cmdOffsetDiv4;
// Dst command offset in bytes into the cmdData array, divided by four. // Dst command offset in bytes into the cmdData array, divided by four.
uint dstCmdOffsetDiv4; uint dstCmdOffsetDiv4;
// Read offset in bytes into the srcData array, divided by four.
uint srcOffset;
// Write offset in bytes into the dstData array, divided by four. // Write offset in bytes into the dstData array, divided by four.
uint dstOffsetDiv4; uint dstOffsetDiv4;
// Maximum size of the read buffer. The highest index value we will convert. // Maximum size of the read buffer. The highest index value we will convert.
...@@ -81,6 +84,9 @@ layout (push_constant) uniform PushConstants ...@@ -81,6 +84,9 @@ layout (push_constant) uniform PushConstants
uint GetIndexValue(uint index) uint GetIndexValue(uint index)
{ {
// Add buffer byte offset (converted to index offset).
index += srcOffset >> (2 - IDXSHIFT);
#if Is32Bits #if Is32Bits
return srcData[index]; return srcData[index];
#elif Is16Bits || Is8Bits #elif Is16Bits || Is8Bits
......
...@@ -3081,8 +3081,11 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con ...@@ -3081,8 +3081,11 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con
bufferOffsetOut, nullptr)); bufferOffsetOut, nullptr));
*bufferOut = mDynamicIndexBuffer.getCurrentBuffer(); *bufferOut = mDynamicIndexBuffer.getCurrentBuffer();
VkDeviceSize sourceOffset = static_cast<VkDeviceSize>(elementArrayOffset); VkDeviceSize sourceBufferOffset = 0;
uint64_t unitCount = static_cast<VkDeviceSize>(indexCount); BufferHelper *sourceBuffer = &elementArrayBufferVk->getBufferAndOffset(&sourceBufferOffset);
VkDeviceSize sourceOffset = static_cast<VkDeviceSize>(elementArrayOffset) + sourceBufferOffset;
uint64_t unitCount = static_cast<VkDeviceSize>(indexCount);
angle::FixedVector<VkBufferCopy, 3> copies = { angle::FixedVector<VkBufferCopy, 3> copies = {
{sourceOffset, *bufferOffsetOut, unitCount * unitSize}, {sourceOffset, *bufferOffsetOut, unitCount * unitSize},
{sourceOffset, *bufferOffsetOut + unitCount * unitSize, unitSize}, {sourceOffset, *bufferOffsetOut + unitCount * unitSize, unitSize},
...@@ -3090,8 +3093,16 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con ...@@ -3090,8 +3093,16 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con
if (contextVk->getRenderer()->getFeatures().extraCopyBufferRegion.enabled) if (contextVk->getRenderer()->getFeatures().extraCopyBufferRegion.enabled)
copies.push_back({sourceOffset, *bufferOffsetOut + (unitCount + 1) * unitSize, 1}); copies.push_back({sourceOffset, *bufferOffsetOut + (unitCount + 1) * unitSize, 1});
ANGLE_TRY(elementArrayBufferVk->copyToBufferImpl( vk::CommandBufferAccess access;
contextVk, *bufferOut, static_cast<uint32_t>(copies.size()), copies.data())); access.onBufferTransferWrite(*bufferOut);
access.onBufferTransferRead(sourceBuffer);
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
commandBuffer->copyBuffer(sourceBuffer->getBuffer(), (*bufferOut)->getBuffer(),
static_cast<uint32_t>(copies.size()), copies.data());
ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk)); ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk));
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -3153,6 +3164,7 @@ angle::Result LineLoopHelper::streamIndices(ContextVk *contextVk, ...@@ -3153,6 +3164,7 @@ angle::Result LineLoopHelper::streamIndices(ContextVk *contextVk,
angle::Result LineLoopHelper::streamIndicesIndirect(ContextVk *contextVk, angle::Result LineLoopHelper::streamIndicesIndirect(ContextVk *contextVk,
gl::DrawElementsType glIndexType, gl::DrawElementsType glIndexType,
BufferHelper *indexBuffer, BufferHelper *indexBuffer,
VkDeviceSize indexBufferOffset,
BufferHelper *indirectBuffer, BufferHelper *indirectBuffer,
VkDeviceSize indirectBufferOffset, VkDeviceSize indirectBufferOffset,
BufferHelper **indexBufferOut, BufferHelper **indexBufferOut,
...@@ -3196,6 +3208,7 @@ angle::Result LineLoopHelper::streamIndicesIndirect(ContextVk *contextVk, ...@@ -3196,6 +3208,7 @@ angle::Result LineLoopHelper::streamIndicesIndirect(ContextVk *contextVk,
UtilsVk::ConvertLineLoopIndexIndirectParameters params = {}; UtilsVk::ConvertLineLoopIndexIndirectParameters params = {};
params.indirectBufferOffset = static_cast<uint32_t>(indirectBufferOffset); params.indirectBufferOffset = static_cast<uint32_t>(indirectBufferOffset);
params.dstIndirectBufferOffset = static_cast<uint32_t>(*indirectBufferOffsetOut); params.dstIndirectBufferOffset = static_cast<uint32_t>(*indirectBufferOffsetOut);
params.srcIndexBufferOffset = static_cast<uint32_t>(indexBufferOffset);
params.dstIndexBufferOffset = static_cast<uint32_t>(*indexBufferOffsetOut); params.dstIndexBufferOffset = static_cast<uint32_t>(*indexBufferOffsetOut);
params.indicesBitsWidth = static_cast<uint32_t>(unitSize * 8); params.indicesBitsWidth = static_cast<uint32_t>(unitSize * 8);
...@@ -3563,9 +3576,17 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk, ...@@ -3563,9 +3576,17 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk,
uint32_t regionCount, uint32_t regionCount,
const VkBufferCopy *copyRegions) const VkBufferCopy *copyRegions)
{ {
CommandBufferAccess access; // Check for self-dependency.
access.onBufferTransferRead(srcBuffer); vk::CommandBufferAccess access;
access.onBufferTransferWrite(this); if (srcBuffer->getBufferSerial() == getBufferSerial())
{
access.onBufferSelfCopy(this);
}
else
{
access.onBufferTransferRead(srcBuffer);
access.onBufferTransferWrite(this);
}
CommandBuffer *commandBuffer; CommandBuffer *commandBuffer;
ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer));
...@@ -6663,7 +6684,9 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -6663,7 +6684,9 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
if (packPixelsParams.packBuffer && if (packPixelsParams.packBuffer &&
CanCopyWithTransformForReadPixels(packPixelsParams, mFormat, readFormat)) CanCopyWithTransformForReadPixels(packPixelsParams, mFormat, readFormat))
{ {
BufferHelper &packBuffer = GetImpl(packPixelsParams.packBuffer)->getBuffer(); VkDeviceSize packBufferOffset = 0;
BufferHelper &packBuffer =
GetImpl(packPixelsParams.packBuffer)->getBufferAndOffset(&packBufferOffset);
CommandBufferAccess copyAccess; CommandBufferAccess copyAccess;
copyAccess.onBufferTransferWrite(&packBuffer); copyAccess.onBufferTransferWrite(&packBuffer);
...@@ -6676,11 +6699,12 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, ...@@ -6676,11 +6699,12 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk,
VkBufferImageCopy region = {}; VkBufferImageCopy region = {};
region.bufferImageHeight = srcExtent.height; region.bufferImageHeight = srcExtent.height;
region.bufferOffset = packPixelsParams.offset + reinterpret_cast<ptrdiff_t>(pixels); region.bufferOffset =
region.bufferRowLength = packPixelsParams.outputPitch / readFormat->pixelBytes; packBufferOffset + packPixelsParams.offset + reinterpret_cast<ptrdiff_t>(pixels);
region.imageExtent = srcExtent; region.bufferRowLength = packPixelsParams.outputPitch / readFormat->pixelBytes;
region.imageOffset = srcOffset; region.imageExtent = srcExtent;
region.imageSubresource = srcSubresource; region.imageOffset = srcOffset;
region.imageSubresource = srcSubresource;
copyCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(), copyCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(),
packBuffer.getBuffer().getHandle(), 1, &region); packBuffer.getBuffer().getHandle(), 1, &region);
...@@ -7504,6 +7528,7 @@ void BufferViewHelper::destroy(VkDevice device) ...@@ -7504,6 +7528,7 @@ void BufferViewHelper::destroy(VkDevice device)
angle::Result BufferViewHelper::getView(ContextVk *contextVk, angle::Result BufferViewHelper::getView(ContextVk *contextVk,
const BufferHelper &buffer, const BufferHelper &buffer,
VkDeviceSize bufferOffset,
const Format &format, const Format &format,
const BufferView **viewOut) const BufferView **viewOut)
{ {
...@@ -7529,7 +7554,7 @@ angle::Result BufferViewHelper::getView(ContextVk *contextVk, ...@@ -7529,7 +7554,7 @@ angle::Result BufferViewHelper::getView(ContextVk *contextVk,
viewCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO; viewCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
viewCreateInfo.buffer = buffer.getBuffer().getHandle(); viewCreateInfo.buffer = buffer.getBuffer().getHandle();
viewCreateInfo.format = viewVkFormat; viewCreateInfo.format = viewVkFormat;
viewCreateInfo.offset = mOffset; viewCreateInfo.offset = mOffset + bufferOffset;
viewCreateInfo.range = size; viewCreateInfo.range = size;
BufferView view; BufferView view;
......
...@@ -161,6 +161,8 @@ class DynamicBuffer : angle::NonCopyable ...@@ -161,6 +161,8 @@ class DynamicBuffer : angle::NonCopyable
return (mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; return (mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0;
} }
bool valid() const { return mSize != 0; }
private: private:
void reset(); void reset();
angle::Result allocateNewBuffer(ContextVk *contextVk); angle::Result allocateNewBuffer(ContextVk *contextVk);
...@@ -608,6 +610,7 @@ class LineLoopHelper final : angle::NonCopyable ...@@ -608,6 +610,7 @@ class LineLoopHelper final : angle::NonCopyable
angle::Result streamIndicesIndirect(ContextVk *contextVk, angle::Result streamIndicesIndirect(ContextVk *contextVk,
gl::DrawElementsType glIndexType, gl::DrawElementsType glIndexType,
BufferHelper *indexBuffer, BufferHelper *indexBuffer,
VkDeviceSize indexBufferOffset,
BufferHelper *indirectBuffer, BufferHelper *indirectBuffer,
VkDeviceSize indirectBufferOffset, VkDeviceSize indirectBufferOffset,
BufferHelper **indexBufferOut, BufferHelper **indexBufferOut,
...@@ -2361,6 +2364,7 @@ class BufferViewHelper final : public Resource ...@@ -2361,6 +2364,7 @@ class BufferViewHelper final : public Resource
angle::Result getView(ContextVk *contextVk, angle::Result getView(ContextVk *contextVk,
const BufferHelper &buffer, const BufferHelper &buffer,
VkDeviceSize bufferOffset,
const Format &format, const Format &format,
const BufferView **viewOut); const BufferView **viewOut);
......
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