tests: Add queue support to command buffer objects

Allow command buffer objects to submit to different queues than the
device default queue, and utilize the extant vk_testing classes.
New method names match the style of the class Vk*Obj method names are in
Google style, vk_testing methods are named consitently with extant
membmer functions.

Change-Id: I3461f78f92818a049c516469d2cdd1c0572d6dcc
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 8bc2fe1..32275c4 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -281,7 +281,7 @@
     }
 
     m_device = new VkDeviceObj(0, objs[0], m_device_extension_names, features);
-    m_device->get_device_queue();
+    m_device->SetDeviceQueue();
 
     m_depthStencil = new VkDepthStencilObj(m_device);
 
@@ -514,11 +514,15 @@
     return UINT32_MAX;
 }
 
-void VkDeviceObj::get_device_queue() {
+void VkDeviceObj::SetDeviceQueue() {
     ASSERT_NE(true, graphics_queues().empty());
     m_queue = graphics_queues()[0]->handle();
 }
 
+VkQueueObj *VkDeviceObj::GetDefaultQueue() {
+    if (graphics_queues().empty()) return nullptr;
+    return graphics_queues()[0];
+}
 VkDescriptorSetLayoutObj::VkDescriptorSetLayoutObj(const VkDeviceObj *device,
                                                    const std::vector<VkDescriptorSetLayoutBinding> &descriptor_set_bindings,
                                                    VkDescriptorSetLayoutCreateFlags flags) {
@@ -1359,8 +1363,15 @@
     return init_try(*m_device, *gp_ci);
 }
 
-VkCommandBufferObj::VkCommandBufferObj(VkDeviceObj *device, VkCommandPoolObj *pool, VkCommandBufferLevel level) {
+VkCommandBufferObj::VkCommandBufferObj(VkDeviceObj *device, VkCommandPoolObj *pool, VkCommandBufferLevel level, VkQueueObj *queue) {
     m_device = device;
+    if (queue) {
+        m_queue = queue;
+    } else {
+        m_queue = m_device->GetDefaultQueue();
+    }
+    assert(m_queue);
+
     auto create_info = vk_testing::CommandBuffer::create_info(pool->handle());
     create_info.level = level;
     init(*device, create_info);
@@ -1477,35 +1488,24 @@
 }
 
 void VkCommandBufferObj::QueueCommandBuffer(bool checkSuccess) {
-    VkFence nullFence = {VK_NULL_HANDLE};
+    VkFenceObj nullFence;
     QueueCommandBuffer(nullFence, checkSuccess);
 }
 
-void VkCommandBufferObj::QueueCommandBuffer(VkFence fence, bool checkSuccess) {
+void VkCommandBufferObj::QueueCommandBuffer(const VkFenceObj &fence, bool checkSuccess) {
     VkResult err = VK_SUCCESS;
 
-    // submit the command buffer to the universal queue
-    VkSubmitInfo submit_info;
-    submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
-    submit_info.pNext = NULL;
-    submit_info.waitSemaphoreCount = 0;
-    submit_info.pWaitSemaphores = NULL;
-    submit_info.pWaitDstStageMask = NULL;
-    submit_info.commandBufferCount = 1;
-    submit_info.pCommandBuffers = &handle();
-    submit_info.signalSemaphoreCount = 0;
-    submit_info.pSignalSemaphores = NULL;
-
-    err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
+    err = m_queue->submit(*this, fence, checkSuccess);
     if (checkSuccess) {
         ASSERT_VK_SUCCESS(err);
     }
 
-    err = vkQueueWaitIdle(m_device->m_queue);
+    err = m_queue->wait();
     if (checkSuccess) {
         ASSERT_VK_SUCCESS(err);
     }
 
+    // TODO: Determine if we really want this serialization here
     // Wait for work to finish before cleaning up.
     vkDeviceWaitIdle(m_device->device());
 }