summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-09-14 22:30:22 +0100
committerMartin Jansa <Martin.Jansa@gmail.com>2010-02-18 15:39:23 +0100
commit505a36df96ba03de0f898272417fe651a0a341d0 (patch)
treebf21fcf69727eeef27846ff9a97def664a5a60d4
parent1047cee792542775db4452c902e97230693398dd (diff)
Add command queue stuff
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_cmdq.c102
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_cmdq.h35
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_context.c1
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_context.h9
4 files changed, 147 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.c b/src/mesa/drivers/dri/glamo/glamo_cmdq.c
new file mode 100644
index 0000000000..f6052e9783
--- /dev/null
+++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.c
@@ -0,0 +1,102 @@
+/*
+ * Command queue submission via DRM
+ *
+ * Copyright 2009 Thomas White <taw@bitwiz.org.uk>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+
+#include <stdint.h>
+#include <glamo_bo.h>
+
+#include "glamo_context.h"
+
+
+/* Submit the prepared command sequence to the kernel */
+void GlamoDRMDispatch(glamoContext *gCtx)
+{
+ drm_glamo_cmd_buffer_t cmdbuf;
+ int r;
+
+ cmdbuf.buf = (char *)gCtx->cmdq_drm;
+ cmdbuf.bufsz = gCtx->cmdq_drm_used * 2; /* -> bytes */
+ cmdbuf.nobjs = gCtx->cmdq_obj_used;
+ cmdbuf.objs = gCtx->cmdq_objs;
+ cmdbuf.obj_pos = gCtx->cmdq_obj_pos;
+
+ r = drmCommandWrite(gCtx->drm_fd, DRM_GLAMO_CMDBUF,
+ &cmdbuf, sizeof(cmdbuf));
+ if ( r != 0 ) {
+ xf86DrvMsg(gCtx->pScreen->myNum, X_ERROR,
+ "DRM_GLAMO_CMDBUF failed\n");
+ }
+
+ /* Reset counts to zero for the next sequence */
+ gCtx->cmdq_obj_used = 0;
+ gCtx->cmdq_drm_used = 0;
+}
+
+
+void GlamoDRMAddCommand(glamoContext *gCtx, uint16_t reg,
+ uint16_t val)
+{
+ if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) {
+ xf86DrvMsg(gCtx->pScreen->myNum, X_INFO,
+ "Forced command cache flush.\n");
+ GlamoDRMDispatch(gCtx);
+ }
+
+ /* Record command */
+ gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg;
+ gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val;
+}
+
+
+void GlamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg,
+ struct glamo_bo *bo)
+{
+ if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) {
+ xf86DrvMsg(gCtx->pScreen->myNum, X_INFO,
+ "Forced command cache flush.\n");
+ GlamoDRMDispatch(gCtx);
+ }
+
+ /* Record object position */
+ gCtx->cmdq_objs[gCtx->cmdq_obj_used] = bo->handle;
+ /* -> bytes */
+ gCtx->cmdq_obj_pos[gCtx->cmdq_obj_used] = gCtx->cmdq_drm_used * 2;
+ gCtx->cmdq_obj_used++;
+
+ /* Record command */
+ gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg;
+ gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = 0x0000;
+ gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg+2;
+ gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = 0x0000;
+
+ gCtx->last_buffer_object = bo;
+}
+
+
+void GlamoInitCmdqCache(glamoContext *gCtx)
+{
+ gCtx->cmdq_objs = malloc(1024);
+ gCtx->cmdq_obj_pos = malloc(1024);
+ gCtx->cmdq_obj_used = 0;
+ gCtx->cmdq_drm_used = 0;
+ gCtx->cmdq_drm_size = 4 * 1024;
+ gCtx->cmdq_drm = malloc(gCtx->cmdq_drm_size);
+}
diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.h b/src/mesa/drivers/dri/glamo/glamo_cmdq.h
new file mode 100644
index 0000000000..aa69b31f07
--- /dev/null
+++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.h
@@ -0,0 +1,35 @@
+/*
+ * Command queue submission via DRM
+ *
+ * Copyright 2009 Thomas White <taw@bitwiz.org.uk>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+
+#include <stdint.h>
+#include <glamo_bo.h>
+
+#include "glamo_context.h"
+
+
+/* Submit the prepared command sequence to the kernel */
+extern void GlamoDRMDispatch(glamoContext *gCtx);
+extern void GlamoDRMAddCommand(glamoContext *gCtx, uint16_t reg,
+ uint16_t val);
+extern void GlamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg,
+ struct glamo_bo *bo);
+extern void GlamoInitCmdqCache(glamoContext *gCtx);
diff --git a/src/mesa/drivers/dri/glamo/glamo_context.c b/src/mesa/drivers/dri/glamo/glamo_context.c
index ee181da4ef..a0769a27ee 100644
--- a/src/mesa/drivers/dri/glamo/glamo_context.c
+++ b/src/mesa/drivers/dri/glamo/glamo_context.c
@@ -148,6 +148,7 @@ GLboolean glamoCreateContext(const __GLcontextModes *glVisual,
_tnl_allow_pixel_fog(ctx, GL_TRUE);
_tnl_allow_vertex_fog(ctx, GL_FALSE);
+ glamoInitCmdq(context);
glamoInitStateFuncs(ctx);
glamoInitTriFuncs(ctx);
diff --git a/src/mesa/drivers/dri/glamo/glamo_context.h b/src/mesa/drivers/dri/glamo/glamo_context.h
index 8f4d811c61..14dbf6841e 100644
--- a/src/mesa/drivers/dri/glamo/glamo_context.h
+++ b/src/mesa/drivers/dri/glamo/glamo_context.h
@@ -52,6 +52,15 @@ struct glamo_context {
GLint GlobalFlag; /* What needs to be updated */
+ /* Command queue cache */
+ uint16_t *cmdq_drm;
+ int cmdq_drm_used;
+ int cmdq_drm_size;
+ int cmdq_obj_used;
+ uint32_t *cmdq_objs;
+ unsigned int *cmdq_obj_pos;
+
+
};
#define GLAMO_CONTEXT(ctx) ((glamoContextPtr)(ctx->DriverCtx))