зеркало из https://github.com/AvaloniaUI/angle.git
Vulkan: Move LineLoopHelper graph work into BufferVk.
Bug: angleproject:2828 Change-Id: Ie6bcdd10e2de415615db2bfb0b6fa17c392455b0 Reviewed-on: https://chromium-review.googlesource.com/1235655 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Frank Henigman <fjhenigman@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Родитель
beb0c946de
Коммит
50e6eaaee6
|
@ -283,4 +283,15 @@ const vk::Buffer &BufferVk::getVkBuffer() const
|
|||
return mBuffer;
|
||||
}
|
||||
|
||||
angle::Result BufferVk::copyToBuffer(ContextVk *contextVk,
|
||||
VkBuffer destbuffer,
|
||||
uint32_t copyCount,
|
||||
const VkBufferCopy *copies)
|
||||
{
|
||||
vk::CommandBuffer *commandBuffer;
|
||||
ANGLE_TRY(recordCommands(contextVk, &commandBuffer));
|
||||
commandBuffer->copyBuffer(mBuffer.getHandle(), destbuffer, copyCount, copies);
|
||||
return angle::Result::Continue();
|
||||
}
|
||||
|
||||
} // namespace rx
|
||||
|
|
|
@ -61,6 +61,12 @@ class BufferVk : public BufferImpl, public vk::CommandGraphResource
|
|||
angle::Result mapImpl(ContextVk *contextVk, void **mapPtr);
|
||||
angle::Result unmapImpl(ContextVk *contextVk);
|
||||
|
||||
// Calls copyBuffer internally.
|
||||
angle::Result copyToBuffer(ContextVk *contextVk,
|
||||
VkBuffer destbuffer,
|
||||
uint32_t copyCount,
|
||||
const VkBufferCopy *copies);
|
||||
|
||||
private:
|
||||
angle::Result setDataImpl(ContextVk *contextVk,
|
||||
const uint8_t *data,
|
||||
|
|
|
@ -370,7 +370,7 @@ LineLoopHelper::LineLoopHelper(RendererVk *renderer)
|
|||
|
||||
LineLoopHelper::~LineLoopHelper() = default;
|
||||
|
||||
angle::Result LineLoopHelper::getIndexBufferForDrawArrays(ContextVk *context,
|
||||
angle::Result LineLoopHelper::getIndexBufferForDrawArrays(ContextVk *contextVk,
|
||||
const gl::DrawCallParams &drawCallParams,
|
||||
VkBuffer *bufferHandleOut,
|
||||
VkDeviceSize *offsetOut)
|
||||
|
@ -378,8 +378,8 @@ angle::Result LineLoopHelper::getIndexBufferForDrawArrays(ContextVk *context,
|
|||
uint32_t *indices = nullptr;
|
||||
size_t allocateBytes = sizeof(uint32_t) * (drawCallParams.vertexCount() + 1);
|
||||
|
||||
mDynamicIndexBuffer.releaseRetainedBuffers(context->getRenderer());
|
||||
ANGLE_TRY(mDynamicIndexBuffer.allocate(context, allocateBytes,
|
||||
mDynamicIndexBuffer.releaseRetainedBuffers(contextVk->getRenderer());
|
||||
ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes,
|
||||
reinterpret_cast<uint8_t **>(&indices), bufferHandleOut,
|
||||
offsetOut, nullptr));
|
||||
|
||||
|
@ -397,12 +397,12 @@ angle::Result LineLoopHelper::getIndexBufferForDrawArrays(ContextVk *context,
|
|||
// Since we are not using the VK_MEMORY_PROPERTY_HOST_COHERENT_BIT flag when creating the
|
||||
// device memory in the StreamingBuffer, we always need to make sure we flush it after
|
||||
// writing.
|
||||
ANGLE_TRY(mDynamicIndexBuffer.flush(context));
|
||||
ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk));
|
||||
|
||||
return angle::Result::Continue();
|
||||
}
|
||||
|
||||
angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *context,
|
||||
angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *contextVk,
|
||||
BufferVk *elementArrayBufferVk,
|
||||
GLenum glIndexType,
|
||||
int indexCount,
|
||||
|
@ -413,14 +413,14 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con
|
|||
if (glIndexType == GL_UNSIGNED_BYTE)
|
||||
{
|
||||
// Needed before reading buffer or we could get stale data.
|
||||
ANGLE_TRY(context->getRenderer()->finish(context));
|
||||
ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
|
||||
|
||||
void *srcDataMapping = nullptr;
|
||||
ANGLE_TRY(elementArrayBufferVk->mapImpl(context, &srcDataMapping));
|
||||
ANGLE_TRY(streamIndices(context, glIndexType, indexCount,
|
||||
ANGLE_TRY(elementArrayBufferVk->mapImpl(contextVk, &srcDataMapping));
|
||||
ANGLE_TRY(streamIndices(contextVk, glIndexType, indexCount,
|
||||
static_cast<const uint8_t *>(srcDataMapping) + elementArrayOffset,
|
||||
bufferHandleOut, bufferOffsetOut));
|
||||
ANGLE_TRY(elementArrayBufferVk->unmapImpl(context));
|
||||
ANGLE_TRY(elementArrayBufferVk->unmapImpl(contextVk));
|
||||
return angle::Result::Continue();
|
||||
}
|
||||
|
||||
|
@ -431,8 +431,8 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con
|
|||
auto unitSize = (indexType == VK_INDEX_TYPE_UINT16 ? sizeof(uint16_t) : sizeof(uint32_t));
|
||||
size_t allocateBytes = unitSize * (indexCount + 1) + 1;
|
||||
|
||||
mDynamicIndexBuffer.releaseRetainedBuffers(context->getRenderer());
|
||||
ANGLE_TRY(mDynamicIndexBuffer.allocate(context, allocateBytes,
|
||||
mDynamicIndexBuffer.releaseRetainedBuffers(contextVk->getRenderer());
|
||||
ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes,
|
||||
reinterpret_cast<uint8_t **>(&indices), bufferHandleOut,
|
||||
bufferOffsetOut, nullptr));
|
||||
|
||||
|
@ -442,21 +442,16 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con
|
|||
{sourceOffset, *bufferOffsetOut, unitCount * unitSize},
|
||||
{sourceOffset, *bufferOffsetOut + unitCount * unitSize, unitSize},
|
||||
};
|
||||
if (context->getRenderer()->getFeatures().extraCopyBufferRegion)
|
||||
if (contextVk->getRenderer()->getFeatures().extraCopyBufferRegion)
|
||||
copies.push_back({sourceOffset, *bufferOffsetOut + (unitCount + 1) * unitSize, 1});
|
||||
|
||||
vk::CommandBuffer *commandBuffer;
|
||||
ANGLE_TRY(recordCommands(context, &commandBuffer));
|
||||
|
||||
elementArrayBufferVk->addReadDependency(this);
|
||||
commandBuffer->copyBuffer(elementArrayBufferVk->getVkBuffer().getHandle(), *bufferHandleOut,
|
||||
copies.size(), copies.data());
|
||||
|
||||
ANGLE_TRY(mDynamicIndexBuffer.flush(context));
|
||||
ANGLE_TRY(elementArrayBufferVk->copyToBuffer(contextVk, *bufferHandleOut, copies.size(),
|
||||
copies.data()));
|
||||
ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk));
|
||||
return angle::Result::Continue();
|
||||
}
|
||||
|
||||
angle::Result LineLoopHelper::streamIndices(ContextVk *context,
|
||||
angle::Result LineLoopHelper::streamIndices(ContextVk *contextVk,
|
||||
GLenum glIndexType,
|
||||
GLsizei indexCount,
|
||||
const uint8_t *srcPtr,
|
||||
|
@ -469,7 +464,7 @@ angle::Result LineLoopHelper::streamIndices(ContextVk *context,
|
|||
|
||||
auto unitSize = (indexType == VK_INDEX_TYPE_UINT16 ? sizeof(uint16_t) : sizeof(uint32_t));
|
||||
size_t allocateBytes = unitSize * (indexCount + 1);
|
||||
ANGLE_TRY(mDynamicIndexBuffer.allocate(context, allocateBytes,
|
||||
ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes,
|
||||
reinterpret_cast<uint8_t **>(&indices), bufferHandleOut,
|
||||
bufferOffsetOut, nullptr));
|
||||
|
||||
|
@ -491,7 +486,7 @@ angle::Result LineLoopHelper::streamIndices(ContextVk *context,
|
|||
memcpy(indices + unitSize * indexCount, srcPtr, unitSize);
|
||||
}
|
||||
|
||||
ANGLE_TRY(mDynamicIndexBuffer.flush(context));
|
||||
ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk));
|
||||
return angle::Result::Continue();
|
||||
}
|
||||
|
||||
|
|
|
@ -132,18 +132,18 @@ class DynamicDescriptorPool final : angle::NonCopyable
|
|||
//
|
||||
// If the user wants to draw a loop between [v1, v2, v3], we will create an indexed buffer with
|
||||
// these indexes: [0, 1, 2, 3, 0] to emulate the loop.
|
||||
class LineLoopHelper final : public vk::CommandGraphResource
|
||||
class LineLoopHelper final : angle::NonCopyable
|
||||
{
|
||||
public:
|
||||
LineLoopHelper(RendererVk *renderer);
|
||||
~LineLoopHelper();
|
||||
|
||||
angle::Result getIndexBufferForDrawArrays(ContextVk *context,
|
||||
angle::Result getIndexBufferForDrawArrays(ContextVk *contextVk,
|
||||
const gl::DrawCallParams &drawCallParams,
|
||||
VkBuffer *bufferHandleOut,
|
||||
VkDeviceSize *offsetOut);
|
||||
|
||||
angle::Result getIndexBufferForElementArrayBuffer(ContextVk *context,
|
||||
angle::Result getIndexBufferForElementArrayBuffer(ContextVk *contextVk,
|
||||
BufferVk *elementArrayBufferVk,
|
||||
GLenum glIndexType,
|
||||
int indexCount,
|
||||
|
@ -151,7 +151,7 @@ class LineLoopHelper final : public vk::CommandGraphResource
|
|||
VkBuffer *bufferHandleOut,
|
||||
VkDeviceSize *bufferOffsetOut);
|
||||
|
||||
angle::Result streamIndices(ContextVk *context,
|
||||
angle::Result streamIndices(ContextVk *contextVk,
|
||||
GLenum glIndexType,
|
||||
GLsizei indexCount,
|
||||
const uint8_t *srcPtr,
|
||||
|
|
|
@ -1096,6 +1096,10 @@ TEST_P(LineLoopStateChangeTest, DrawElementsThenDrawArrays)
|
|||
// Draw line loop using a drawArrays followed by an hourglass with drawElements.
|
||||
TEST_P(LineLoopStateChangeTest, DrawArraysThenDrawElements)
|
||||
{
|
||||
// http://anglebug.com/2856: Seems to fail on older drivers and pass on newer.
|
||||
// Tested failing on 18.3.3 and passing on 18.9.2.
|
||||
ANGLE_SKIP_TEST_IF(IsAMD() && IsVulkan() && IsWindows());
|
||||
|
||||
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
|
||||
glUseProgram(program);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче