Commit 2b06054d by jchen10 Committed by Commit Bot

Vulkan: Insert a barrier after buffer copy

According to the spec(section 18.1), all copy commands are treated as transfer operations for the purposes of synchronization barriers. Some tests are flaky on Intel platform without such barriers. Bug: angleproject:2663 Bug: angleproject:2664 Change-Id: Ic8bc9a0eb000670342c0df0449257324f04ad1f8 Reviewed-on: https://chromium-review.googlesource.com/1124103 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 92da844e
......@@ -228,6 +228,27 @@ vk::Error BufferVk::setDataImpl(ContextVk *contextVk,
VkBufferCopy copyRegion = {0, offset, size};
commandBuffer->copyBuffer(stagingBuffer.getBuffer(), mBuffer, 1, &copyRegion);
// Insert a barrier to ensure copy has done.
// TODO(jie.a.chen@intel.com): Insert minimal barriers.
bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
bufferBarrier.pNext = nullptr;
bufferBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
bufferBarrier.dstAccessMask =
VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT |
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT |
VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT |
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT;
bufferBarrier.srcQueueFamilyIndex = 0;
bufferBarrier.dstQueueFamilyIndex = 0;
bufferBarrier.buffer = mBuffer.getHandle();
bufferBarrier.offset = offset;
bufferBarrier.size = static_cast<VkDeviceSize>(size);
commandBuffer->singleBufferBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, bufferBarrier);
// Immediately release staging buffer.
// TODO(jmadill): Staging buffer re-use.
renderer->releaseObject(getStoredQueueSerial(), &stagingBuffer);
......
......@@ -129,7 +129,8 @@ TEST_P(IndexBufferOffsetTest, UInt8Index)
// Test using an offset for an UInt16 index buffer
TEST_P(IndexBufferOffsetTest, UInt16Index)
{
// TODO(lucferron): Figure out why this is failing only on intel with Vulkan.
// TODO(jie.a.chen@intel.com): Re-enable the test once the driver fix is
// available in public release.
// http://anglebug.com/2663
ANGLE_SKIP_TEST_IF(IsIntel() && IsVulkan());
......
......@@ -655,7 +655,9 @@ TEST_P(StateChangeRenderTest, GenerateMipmap)
// Tests that D3D11 dirty bit updates don't forget about BufferSubData attrib updates.
TEST_P(StateChangeTest, VertexBufferUpdatedAfterDraw)
{
// TODO(lucferron): Diagnose and fix, this is just flaky on intel. http://anglebug.com/2664
// TODO(jie.a.chen@intel.com): Re-enable the test once the driver fix is
// available in public release.
// http://anglebug.com/2664.
ANGLE_SKIP_TEST_IF(IsVulkan() && IsIntel());
const std::string vs =
......
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