Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> --- Makefile.am | 1 + src/tests/bug/108909.c | 106 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/tests/bug/108909.c
diff --git a/Makefile.am b/Makefile.am index b35e329..528650a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -74,6 +74,7 @@ bin_crucible_SOURCES = \ src/qonos/qonos.c \ src/qonos/qonos_pipeline.c \ src/tests/bug/104809.c \ + src/tests/bug/108909.c \ src/tests/bench/copy-buffer.c \ src/tests/example/basic.c \ src/tests/example/images.c \ diff --git a/src/tests/bug/108909.c b/src/tests/bug/108909.c new file mode 100644 index 0000000..1faadbf --- /dev/null +++ b/src/tests/bug/108909.c @@ -0,0 +1,106 @@ +// Copyright 2018 Intel Corporation +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice (including the next +// paragraph) shall be included in all copies or substantial portions of the +// Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +#include <inttypes.h> +#include <stdio.h> +#include "tapi/t.h" +#include "util/misc.h" + +/* This is a test for https://bugs.freedesktop.org/show_bug.cgi?id=108909 + * + * Ensure ordering of operations for between 3d pipeline and command + * streamer on Intel HW. + */ + +static void +test(void) +{ + const uint64_t initialData[] = { + 0xdeaddeadbeef, + 0xdeaddeadbeef, + 0xdeaddeadbeef, + 0xdeaddeadbeef, + }; + VkBuffer dataBuffer = qoCreateBuffer(t_device, + .size = sizeof(initialData), + .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT); + VkDeviceMemory dataMem = qoAllocBufferMemory(t_device, dataBuffer, + .properties = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + memcpy(qoMapMemory(t_device, dataMem, /*offset*/ 0, + sizeof(initialData), /*flags*/ 0), + initialData, + sizeof(initialData)); + qoBindBufferMemory(t_device, dataBuffer, dataMem, /*offset*/ 0); + + VkBuffer resultBuffer = qoCreateBuffer(t_device, + .size = sizeof(initialData), + .usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT); + VkDeviceMemory resultMem = qoAllocBufferMemory(t_device, resultBuffer, + .properties = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); + qoBindBufferMemory(t_device, resultBuffer, resultMem, /*offset*/ 0); + + VkQueryPool pool = qoCreateQueryPool(t_device, + .queryType = VK_QUERY_TYPE_TIMESTAMP, + .queryCount = ARRAY_LENGTH(initialData)); + + + /* vkCmdCopyQueryPoolResults should be ordered with regard to vkCmdCopyBuffer. */ + VkCommandBuffer cmdBuffer = qoAllocateCommandBuffer(t_device, t_cmd_pool); + qoBeginCommandBuffer(cmdBuffer); + vkCmdWriteTimestamp(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, pool, 0); + vkCmdWriteTimestamp(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, pool, 1); + vkCmdCopyBuffer(cmdBuffer, dataBuffer, resultBuffer, + 1, &(VkBufferCopy){ .srcOffset = 0, .dstOffset = 0, .size = sizeof(initialData) }); + vkCmdWriteTimestamp(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, pool, 2); + vkCmdWriteTimestamp(cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, pool, 3); + vkCmdCopyQueryPoolResults(cmdBuffer, pool, /*firstQuery*/ 0, /*queryCount*/ 4, + resultBuffer, /*dstBufferOffset*/ 0, sizeof(uint64_t), + VK_QUERY_RESULT_WAIT_BIT); + qoEndCommandBuffer(cmdBuffer); + + qoQueueSubmit(t_queue, 1, &cmdBuffer, VK_NULL_HANDLE); + qoQueueWaitIdle(t_queue); + + uint64_t *copiedResults = qoMapMemory(t_device, resultMem, /*offset*/ 0, + sizeof(initialData), /*flags*/ 0); + + for (unsigned i = 0; i < ARRAY_LENGTH(initialData); i++) { + printf("timestamp%i = 0x%016" PRIx64 "\n", + i, copiedResults[i]); + if (copiedResults[i] == initialData[i]) { + printf("Got unexpected timestamp (index=%i) 0x%016" PRIx64 "\n", + i, copiedResults[i]); + + t_fail(); + return; + } + } + + t_pass(); +} + +test_define { + .name = "bug.108909", + .start = test, + .no_image = true, +}; -- 2.20.0.rc1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit