intel: implement intelQueueSubmit()
diff --git a/icd/intel/queue.c b/icd/intel/queue.c
index 04bdaf7..ef84685 100644
--- a/icd/intel/queue.c
+++ b/icd/intel/queue.c
@@ -25,6 +25,7 @@
 #include "kmd/winsys.h"
 #include "cmd.h"
 #include "dev.h"
+#include "fence.h"
 #include "queue.h"
 
 XGL_RESULT intel_queue_create(struct intel_dev *dev,
@@ -32,6 +33,20 @@
                               struct intel_queue **queue_ret)
 {
     struct intel_queue *queue;
+    enum intel_ring_type ring;
+
+    switch (type) {
+    case XGL_QUEUE_TYPE_GRAPHICS:
+    case XGL_QUEUE_TYPE_COMPUTE:
+        ring = INTEL_RING_RENDER;
+        break;
+    case XGL_QUEUE_TYPE_DMA:
+        ring = INTEL_RING_BLT;
+        break;
+    default:
+        return XGL_ERROR_INVALID_VALUE;
+        break;
+    }
 
     queue = (struct intel_queue *) intel_base_create(dev, sizeof(*queue),
             dev->base.dbg, XGL_DBG_OBJECT_QUEUE, NULL, 0);
@@ -39,6 +54,7 @@
         return XGL_ERROR_OUT_OF_MEMORY;
 
     queue->dev = dev;
+    queue->ring = ring;
 
     *queue_ret = queue;
 
@@ -58,6 +74,20 @@
         XGL_SUCCESS : XGL_ERROR_UNKNOWN;
 }
 
+XGL_RESULT intel_queue_submit(struct intel_queue *queue,
+                              struct intel_cmd *cmd)
+{
+    struct intel_winsys *winsys = queue->dev->winsys;
+    int err;
+
+    err = intel_winsys_submit_bo(winsys, queue->ring,
+            cmd->bo, cmd->used * sizeof(uint32_t), 0);
+
+    queue->last_submitted_cmd = cmd;
+
+    return (err) ? XGL_ERROR_UNKNOWN : XGL_SUCCESS;
+}
+
 XGL_RESULT XGLAPI intelQueueSetGlobalMemReferences(
     XGL_QUEUE                                   queue,
     XGL_UINT                                    memRefCount,
@@ -79,15 +109,33 @@
 }
 
 XGL_RESULT XGLAPI intelQueueSubmit(
-    XGL_QUEUE                                   queue,
+    XGL_QUEUE                                   queue_,
     XGL_UINT                                    cmdBufferCount,
     const XGL_CMD_BUFFER*                       pCmdBuffers,
     XGL_UINT                                    memRefCount,
     const XGL_MEMORY_REF*                       pMemRefs,
-    XGL_FENCE                                   fence)
+    XGL_FENCE                                   fence_)
 {
-    /* need XGL_CMD_BUFFER first */
-    return XGL_ERROR_UNAVAILABLE;
+    struct intel_queue *queue = intel_queue(queue_);
+    XGL_RESULT ret = XGL_SUCCESS;
+    XGL_UINT i;
+
+    for (i = 0; i < cmdBufferCount; i++) {
+        struct intel_cmd *cmd = intel_cmd(pCmdBuffers[i]);
+
+        ret = intel_queue_submit(queue, cmd);
+        if (ret != XGL_SUCCESS)
+            break;
+    }
+
+    if (ret == XGL_SUCCESS && fence_ != XGL_NULL_HANDLE) {
+        struct intel_fence *fence = intel_fence(fence_);
+        intel_fence_set_cmd(fence, queue->last_submitted_cmd);
+    }
+
+    /* XGL_MEMORY_REFs are ignored as the winsys already knows them */
+
+    return ret;
 }
 
 XGL_RESULT XGLAPI intelOpenSharedQueueSemaphore(