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