1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 The Khronos Group Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Synchronization event basic tests
22 *//*--------------------------------------------------------------------*/
24 #include "vktSynchronizationBasicEventTests.hpp"
25 #include "vktTestCaseUtil.hpp"
26 #include "vktSynchronizationUtil.hpp"
29 #include "vkPlatform.hpp"
35 namespace synchronization
41 #define SHORT_FENCE_WAIT 1000ull
42 #define LONG_FENCE_WAIT ~0ull
44 tcu::TestStatus hostResetSetEventCase (Context& context)
46 const DeviceInterface& vk = context.getDeviceInterface();
47 const VkDevice device = context.getDevice();
48 const VkEventCreateInfo eventInfo =
50 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
55 Move<VkEvent> ptrEvent;
57 if (VK_SUCCESS != vk.createEvent(device, &eventInfo, DE_NULL, &event))
58 return tcu::TestStatus::fail("Couldn't create event");
60 ptrEvent = Move<VkEvent>(check<VkEvent>(event), Deleter<VkEvent>(vk, device, DE_NULL));
62 if (VK_EVENT_RESET != vk.getEventStatus(device, event))
63 return tcu::TestStatus::fail("Created event should be in unsignaled state");
65 if (VK_SUCCESS != vk.setEvent(device, event))
66 return tcu::TestStatus::fail("Couldn't set event");
68 if (VK_EVENT_SET != vk.getEventStatus(device, event))
69 return tcu::TestStatus::fail("Event should be in signaled state after set");
71 if (VK_SUCCESS != vk.resetEvent(device, event))
72 return tcu::TestStatus::fail("Couldn't reset event");
74 if (VK_EVENT_RESET != vk.getEventStatus(device, event))
75 return tcu::TestStatus::fail("Event should be in unsignaled state after reset");
77 return tcu::TestStatus::pass("Tests set and reset event on host pass");
80 tcu::TestStatus deviceResetSetEventCase (Context& context)
82 const DeviceInterface& vk = context.getDeviceInterface();
83 const VkDevice device = context.getDevice();
84 const VkQueue queue = context.getUniversalQueue();
85 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
86 const Unique<VkCommandPool> cmdPool (makeCommandPool(vk, device, queueFamilyIndex));
87 const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
88 const VkSubmitInfo submitInfo =
90 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
91 DE_NULL, // const void* pNext;
92 0u, // deUint32 waitSemaphoreCount;
93 DE_NULL, // const VkSemaphore* pWaitSemaphores;
94 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
95 1u, // deUint32 commandBufferCount;
96 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
97 0u, // deUint32 signalSemaphoreCount;
98 DE_NULL, // const VkSemaphore* pSignalSemaphores;
100 const VkEventCreateInfo eventInfo =
102 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
106 const Unique<VkEvent> event (createEvent(vk, device, &eventInfo, DE_NULL));
108 beginCommandBuffer(vk, *cmdBuffer);
109 vk.cmdSetEvent(*cmdBuffer, *event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
110 endCommandBuffer(vk, *cmdBuffer);
112 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, DE_NULL));
113 VK_CHECK(vk.queueWaitIdle(queue));
115 if (VK_EVENT_SET != vk.getEventStatus(device, *event))
116 return tcu::TestStatus::fail("Event should be in signaled state after set");
118 beginCommandBuffer(vk, *cmdBuffer);
119 vk.cmdResetEvent(*cmdBuffer, *event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
120 endCommandBuffer(vk, *cmdBuffer);
122 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, DE_NULL));
123 VK_CHECK(vk.queueWaitIdle(queue));
125 if (VK_EVENT_RESET != vk.getEventStatus(device, *event))
126 return tcu::TestStatus::fail("Event should be in unsignaled state after set");
128 return tcu::TestStatus::pass("Device set and reset event tests pass");
131 tcu::TestStatus deviceWaitForEventCase (Context& context)
133 const DeviceInterface& vk = context.getDeviceInterface();
134 const VkDevice device = context.getDevice();
135 const VkQueue queue = context.getUniversalQueue();
136 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
137 const VkFenceCreateInfo fenceInfo =
139 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
140 DE_NULL, // const void* pNext;
141 0u, // VkFenceCreateFlags flags;
143 const Unique<VkFence> fence (createFence(vk, device, &fenceInfo));
144 const Unique<VkCommandPool> cmdPool (makeCommandPool(vk, device, queueFamilyIndex));
145 const Unique<VkCommandBuffer> cmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
146 const VkSubmitInfo submitInfo =
148 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
149 DE_NULL, // const void* pNext;
150 0u, // deUint32 waitSemaphoreCount;
151 DE_NULL, // const VkSemaphore* pWaitSemaphores;
152 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
153 1u, // deUint32 commandBufferCount;
154 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
155 0u, // deUint32 signalSemaphoreCount;
156 DE_NULL, // const VkSemaphore* pSignalSemaphores;
158 const VkEventCreateInfo eventInfo =
160 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
164 const Unique<VkEvent> event (createEvent(vk, device, &eventInfo, DE_NULL));
166 beginCommandBuffer(vk, *cmdBuffer);
167 vk.cmdWaitEvents(*cmdBuffer, 1u, &event.get(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0u, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
168 endCommandBuffer(vk, *cmdBuffer);
170 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
171 if (VK_TIMEOUT != vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, SHORT_FENCE_WAIT))
172 return tcu::TestStatus::fail("Queue should not end execution");
174 if (VK_SUCCESS != vk.setEvent(device, *event))
175 return tcu::TestStatus::fail("Couldn't set event");
177 if (VK_SUCCESS != vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, LONG_FENCE_WAIT))
178 return tcu::TestStatus::fail("Queue should end execution");
180 return tcu::TestStatus::pass("Device wait for event tests pass");
183 tcu::TestStatus singleSubmissionCase (Context& context)
185 enum {SET=0, WAIT, COUNT};
186 const DeviceInterface& vk = context.getDeviceInterface();
187 const VkDevice device = context.getDevice();
188 const VkQueue queue = context.getUniversalQueue();
189 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
190 const VkFenceCreateInfo fenceInfo =
192 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
193 DE_NULL, // const void* pNext;
194 0u, // VkFenceCreateFlags flags;
196 const Unique<VkFence> fence (createFence(vk, device, &fenceInfo));
197 const Unique<VkCommandPool> cmdPool (makeCommandPool(vk, device, queueFamilyIndex));
198 const Move<VkCommandBuffer> ptrCmdBuffer[COUNT] = {makeCommandBuffer(vk, device, *cmdPool), makeCommandBuffer(vk, device, *cmdPool)};
199 VkCommandBuffer cmdBuffers[COUNT] = {*ptrCmdBuffer[SET], *ptrCmdBuffer[WAIT]};
200 const VkSubmitInfo submitInfo =
202 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
203 DE_NULL, // const void* pNext;
204 0u, // deUint32 waitSemaphoreCount;
205 DE_NULL, // const VkSemaphore* pWaitSemaphores;
206 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
207 2u, // deUint32 commandBufferCount;
208 cmdBuffers, // const VkCommandBuffer* pCommandBuffers;
209 0u, // deUint32 signalSemaphoreCount;
210 DE_NULL, // const VkSemaphore* pSignalSemaphores;
212 const VkEventCreateInfo eventInfo =
214 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
218 const Unique<VkEvent> event (createEvent(vk, device, &eventInfo, DE_NULL));
220 beginCommandBuffer(vk, cmdBuffers[SET]);
221 vk.cmdSetEvent(cmdBuffers[SET], *event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
222 endCommandBuffer(vk, cmdBuffers[SET]);
224 beginCommandBuffer(vk, cmdBuffers[WAIT]);
225 vk.cmdWaitEvents(cmdBuffers[WAIT], 1u, &event.get(),VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0u, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
226 endCommandBuffer(vk, cmdBuffers[WAIT]);
228 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
229 if (VK_SUCCESS != vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, LONG_FENCE_WAIT))
230 return tcu::TestStatus::fail("Queue should end execution");
232 return tcu::TestStatus::pass("Wait and set even on device single submission tests pass");
235 tcu::TestStatus multiSubmissionCase (Context& context)
237 enum {SET=0, WAIT, COUNT};
238 const DeviceInterface& vk = context.getDeviceInterface();
239 const VkDevice device = context.getDevice();
240 const VkQueue queue = context.getUniversalQueue();
241 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
242 const VkFenceCreateInfo fenceInfo =
244 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
245 DE_NULL, // const void* pNext;
246 0u, // VkFenceCreateFlags flags;
248 const Move<VkFence> ptrFence[COUNT] = {createFence(vk, device, &fenceInfo), createFence(vk, device, &fenceInfo)};
249 VkFence fence[COUNT] = {*ptrFence[SET], *ptrFence[WAIT]};
250 const Unique<VkCommandPool> cmdPool (makeCommandPool(vk, device, queueFamilyIndex));
251 const Move<VkCommandBuffer> ptrCmdBuffer[COUNT] = {makeCommandBuffer(vk, device, *cmdPool), makeCommandBuffer(vk, device, *cmdPool)};
252 VkCommandBuffer cmdBuffers[COUNT] = {*ptrCmdBuffer[SET], *ptrCmdBuffer[WAIT]};
253 const VkSubmitInfo submitInfo[COUNT] =
256 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
257 DE_NULL, // const void* pNext;
258 0u, // deUint32 waitSemaphoreCount;
259 DE_NULL, // const VkSemaphore* pWaitSemaphores;
260 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
261 1u, // deUint32 commandBufferCount;
262 &cmdBuffers[SET], // const VkCommandBuffer* pCommandBuffers;
263 0u, // deUint32 signalSemaphoreCount;
264 DE_NULL, // const VkSemaphore* pSignalSemaphores;
267 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
268 DE_NULL, // const void* pNext;
269 0u, // deUint32 waitSemaphoreCount;
270 DE_NULL, // const VkSemaphore* pWaitSemaphores;
271 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
272 1u, // deUint32 commandBufferCount;
273 &cmdBuffers[WAIT], // const VkCommandBuffer* pCommandBuffers;
274 0u, // deUint32 signalSemaphoreCount;
275 DE_NULL, // const VkSemaphore* pSignalSemaphores;
278 const VkEventCreateInfo eventInfo =
280 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
284 const Unique<VkEvent> event (createEvent(vk, device, &eventInfo, DE_NULL));
286 beginCommandBuffer(vk, cmdBuffers[SET]);
287 vk.cmdSetEvent(cmdBuffers[SET], *event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
288 endCommandBuffer(vk, cmdBuffers[SET]);
290 beginCommandBuffer(vk, cmdBuffers[WAIT]);
291 vk.cmdWaitEvents(cmdBuffers[WAIT], 1u, &event.get(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0u, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
292 endCommandBuffer(vk, cmdBuffers[WAIT]);
294 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo[SET], fence[SET]));
295 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo[WAIT], fence[WAIT]));
297 if (VK_SUCCESS != vk.waitForFences(device, 2u, fence, DE_TRUE, LONG_FENCE_WAIT))
298 return tcu::TestStatus::fail("Queue should end execution");
300 return tcu::TestStatus::pass("Wait and set even on device multi submission tests pass");
303 tcu::TestStatus secondaryCommandBufferCase (Context& context)
305 enum {SET=0, WAIT, COUNT};
306 const DeviceInterface& vk = context.getDeviceInterface();
307 const VkDevice device = context.getDevice();
308 const VkQueue queue = context.getUniversalQueue();
309 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
310 const VkFenceCreateInfo fenceInfo =
312 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
313 DE_NULL, // const void* pNext;
314 0u, // VkFenceCreateFlags flags;
316 const Unique<VkFence> fence (createFence(vk, device, &fenceInfo));
317 const Unique<VkCommandPool> cmdPool (makeCommandPool(vk, device, queueFamilyIndex));
318 const Move<VkCommandBuffer> primaryCmdBuffer (makeCommandBuffer(vk, device, *cmdPool));
319 const VkCommandBufferAllocateInfo cmdBufferInfo =
321 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
322 DE_NULL, // const void* pNext;
323 *cmdPool, // VkCommandPool commandPool;
324 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // VkCommandBufferLevel level;
325 1u, // deUint32 commandBufferCount;
327 const Move<VkCommandBuffer> prtCmdBuffers[COUNT] = {allocateCommandBuffer (vk, device, &cmdBufferInfo), allocateCommandBuffer (vk, device, &cmdBufferInfo)};
328 VkCommandBuffer secondaryCmdBuffers[] = {*prtCmdBuffers[SET], *prtCmdBuffers[WAIT]};
329 const VkSubmitInfo submitInfo =
331 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
332 DE_NULL, // const void* pNext;
333 0u, // deUint32 waitSemaphoreCount;
334 DE_NULL, // const VkSemaphore* pWaitSemaphores;
335 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
336 1u, // deUint32 commandBufferCount;
337 &primaryCmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
338 0u, // deUint32 signalSemaphoreCount;
339 DE_NULL, // const VkSemaphore* pSignalSemaphores;
341 const VkEventCreateInfo eventInfo =
343 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
347 const Unique<VkEvent> event (createEvent(vk, device, &eventInfo, DE_NULL));
349 const VkCommandBufferInheritanceInfo secCmdBufInheritInfo =
351 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, //VkStructureType sType;
352 DE_NULL, //const void* pNext;
353 DE_NULL, //VkRenderPass renderPass;
354 0u, //deUint32 subpass;
355 DE_NULL, //VkFramebuffer framebuffer;
356 VK_FALSE, //VkBool32 occlusionQueryEnable;
357 (VkQueryControlFlags)0u, //VkQueryControlFlags queryFlags;
358 (VkQueryPipelineStatisticFlags)0u, //VkQueryPipelineStatisticFlags pipelineStatistics;
360 const VkCommandBufferBeginInfo cmdBufferBeginInfo =
362 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
363 DE_NULL, // const void* pNext;
364 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
365 &secCmdBufInheritInfo, // const VkCommandBufferInheritanceInfo* pInheritanceInfo;
368 VK_CHECK(vk.beginCommandBuffer(secondaryCmdBuffers[SET], &cmdBufferBeginInfo));
369 vk.cmdSetEvent(secondaryCmdBuffers[SET], *event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
370 endCommandBuffer(vk, secondaryCmdBuffers[SET]);
372 VK_CHECK(vk.beginCommandBuffer(secondaryCmdBuffers[WAIT], &cmdBufferBeginInfo));
373 vk.cmdWaitEvents(secondaryCmdBuffers[WAIT], 1u, &event.get(),VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0u, DE_NULL, 0u, DE_NULL, 0u, DE_NULL);
374 endCommandBuffer(vk, secondaryCmdBuffers[WAIT]);
376 beginCommandBuffer(vk, *primaryCmdBuffer);
377 vk.cmdExecuteCommands(*primaryCmdBuffer, 2u, secondaryCmdBuffers);
378 endCommandBuffer(vk, *primaryCmdBuffer);
380 VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
381 if (VK_SUCCESS != vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, LONG_FENCE_WAIT))
382 return tcu::TestStatus::fail("Queue should end execution");
384 return tcu::TestStatus::pass("Wait and set even on device using secondary command buffers tests pass");
389 tcu::TestCaseGroup* createBasicEventTests (tcu::TestContext& testCtx)
391 de::MovePtr<tcu::TestCaseGroup> basicTests(new tcu::TestCaseGroup(testCtx, "event", "Basic event tests"));
392 addFunctionCase(basicTests.get(), "host_set_reset", "Basic event tests set and reset on host", hostResetSetEventCase);
393 addFunctionCase(basicTests.get(), "device_set_reset", "Basic event tests set and reset on device", deviceResetSetEventCase);
394 addFunctionCase(basicTests.get(), "host_set_device_wait", "Wait for event on device test", deviceWaitForEventCase);
395 addFunctionCase(basicTests.get(), "single_submit_multi_command_buffer", "Wait and set event single submission on device", singleSubmissionCase);
396 addFunctionCase(basicTests.get(), "multi_submit_multi_command_buffer", "Wait and set event mutli submission on device", multiSubmissionCase);
397 addFunctionCase(basicTests.get(), "multi_secondary_command_buffer", "Event used on secondary command buffer ", secondaryCommandBufferCase);
399 return basicTests.release();