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(