summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-09-19 13:57:37 +0100
committerThomas White <taw@bitwiz.org.uk>2009-09-19 13:57:37 +0100
commit6e7ff8981f0a5e8cf558dc95fdda85dc669cd7af (patch)
tree23d40dfaf083373f4a578c0c102038d5a871b187
parent759e89065f87fd138bdaee001a467632dc8c04e0 (diff)
Split DRM command queue handling out to a separate file
-rw-r--r--src/Makefile.am3
-rw-r--r--src/glamo-drm.c107
-rw-r--r--src/glamo-drm.h38
-rw-r--r--src/glamo-kms-exa.c79
4 files changed, 154 insertions, 73 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 374be96..a1e8d0a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -40,4 +40,5 @@ glamo_drv_la_SOURCES = \
glamo-kms-crtc.c \
glamo-kms-output.c \
glamo-dri2.c \
- glamo-kms-exa.c
+ glamo-kms-exa.c \
+ glamo-drm.c
diff --git a/src/glamo-drm.c b/src/glamo-drm.c
new file mode 100644
index 0000000..aac93bb
--- /dev/null
+++ b/src/glamo-drm.c
@@ -0,0 +1,107 @@
+/*
+ * DRI for the SMedia Glamo3362 X.org Driver
+ *
+ * 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
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <xf86.h>
+#include <xf86drm.h>
+#include <glamo_drm.h>
+#include <glamo_bo.h>
+
+#include "glamo.h"
+
+
+/* Submit the prepared command sequence to the kernel */
+void GlamoDRMDispatch(GlamoPtr pGlamo)
+{
+ drm_glamo_cmd_buffer_t cmdbuf;
+ int r;
+
+ cmdbuf.buf = (char *)pGlamo->cmdq_drm;
+ cmdbuf.bufsz = pGlamo->cmdq_drm_used * 2; /* -> bytes */
+ cmdbuf.nobjs = pGlamo->cmdq_obj_used;
+ cmdbuf.objs = pGlamo->cmdq_objs;
+ cmdbuf.obj_pos = pGlamo->cmdq_obj_pos;
+
+ r = drmCommandWrite(pGlamo->drm_fd, DRM_GLAMO_CMDBUF,
+ &cmdbuf, sizeof(cmdbuf));
+ if ( r != 0 ) {
+ xf86DrvMsg(pGlamo->pScreen->myNum, X_ERROR,
+ "DRM_GLAMO_CMDBUF failed\n");
+ }
+
+ /* Reset counts to zero for the next sequence */
+ pGlamo->cmdq_obj_used = 0;
+ pGlamo->cmdq_drm_used = 0;
+}
+
+
+void GlamoDRMAddCommand(GlamoPtr pGlamo, uint16_t reg, uint16_t val)
+{
+ if ( pGlamo->cmdq_drm_used == pGlamo->cmdq_drm_size ) {
+ xf86DrvMsg(pGlamo->pScreen->myNum, X_INFO,
+ "Forced command cache flush.\n");
+ GlamoDRMDispatch(pGlamo);
+ }
+
+ /* Record command */
+ pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = reg;
+ pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = val;
+}
+
+
+void GlamoDRMAddCommandBO(GlamoPtr pGlamo, uint16_t reg, struct glamo_bo *bo)
+{
+ if ( pGlamo->cmdq_drm_used == pGlamo->cmdq_drm_size ) {
+ xf86DrvMsg(pGlamo->pScreen->myNum, X_INFO,
+ "Forced command cache flush.\n");
+ GlamoDRMDispatch(pGlamo);
+ }
+
+ /* Record object position */
+ pGlamo->cmdq_objs[pGlamo->cmdq_obj_used] = bo->handle;
+ /* -> bytes */
+ pGlamo->cmdq_obj_pos[pGlamo->cmdq_obj_used] = pGlamo->cmdq_drm_used * 2;
+ pGlamo->cmdq_obj_used++;
+
+ /* Record command */
+ pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = reg;
+ pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = 0x0000;
+ pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = reg+2;
+ pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = 0x0000;
+
+ pGlamo->last_buffer_object = bo;
+}
+
+
+void GlamoDRMInit(GlamoPtr pGlamo)
+{
+ pGlamo->cmdq_objs = malloc(1024);
+ pGlamo->cmdq_obj_pos = malloc(1024);
+ pGlamo->cmdq_obj_used = 0;
+ pGlamo->cmdq_drm_used = 0;
+ pGlamo->cmdq_drm_size = 4 * 1024;
+ pGlamo->cmdq_drm = malloc(pGlamo->cmdq_drm_size);
+}
diff --git a/src/glamo-drm.h b/src/glamo-drm.h
new file mode 100644
index 0000000..6e0693f
--- /dev/null
+++ b/src/glamo-drm.h
@@ -0,0 +1,38 @@
+/*
+ * DRI for the SMedia Glamo3362 X.org Driver
+ *
+ * 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
+ *
+ */
+
+
+#ifndef _GLAMO_DRM_H
+#define _GLAMO_DRM_H
+
+#include <stdint.h>
+#include <glamo_bo.h>
+
+#include "glamo.h"
+
+extern void GlamoDRMInit(GlamoPtr pGlamo);
+extern void GlamoDRMDispatch(GlamoPtr pGlamo);
+extern void GlamoDRMAddCommand(GlamoPtr pGlamo, uint16_t reg, uint16_t val);
+extern void GlamoDRMAddCommandBO(GlamoPtr pGlamo, uint16_t reg,
+ struct glamo_bo *bo);
+
+#endif /* _GLAMO_DRM_H */
diff --git a/src/glamo-kms-exa.c b/src/glamo-kms-exa.c
index 557ba60..ec116ab 100644
--- a/src/glamo-kms-exa.c
+++ b/src/glamo-kms-exa.c
@@ -55,6 +55,7 @@
#include "glamo.h"
#include "glamo-regs.h"
#include "glamo-kms-exa.h"
+#include "glamo-drm.h"
#include <drm/glamo_drm.h>
#include <drm/glamo_bo.h>
@@ -114,71 +115,6 @@ static const CARD8 GLAMOBltRop[16] = {
};
-/* Submit the prepared command sequence to the kernel */
-static void GlamoDRMDispatch(GlamoPtr pGlamo)
-{
- drm_glamo_cmd_buffer_t cmdbuf;
- int r;
-
- cmdbuf.buf = (char *)pGlamo->cmdq_drm;
- cmdbuf.bufsz = pGlamo->cmdq_drm_used * 2; /* -> bytes */
- cmdbuf.nobjs = pGlamo->cmdq_obj_used;
- cmdbuf.objs = pGlamo->cmdq_objs;
- cmdbuf.obj_pos = pGlamo->cmdq_obj_pos;
-
- r = drmCommandWrite(pGlamo->drm_fd, DRM_GLAMO_CMDBUF,
- &cmdbuf, sizeof(cmdbuf));
- if ( r != 0 ) {
- xf86DrvMsg(pGlamo->pScreen->myNum, X_ERROR,
- "DRM_GLAMO_CMDBUF failed\n");
- }
-
- /* Reset counts to zero for the next sequence */
- pGlamo->cmdq_obj_used = 0;
- pGlamo->cmdq_drm_used = 0;
-}
-
-
-static inline void GlamoDRMAddCommand(GlamoPtr pGlamo, uint16_t reg,
- uint16_t val)
-{
- if ( pGlamo->cmdq_drm_used == pGlamo->cmdq_drm_size ) {
- xf86DrvMsg(pGlamo->pScreen->myNum, X_INFO,
- "Forced command cache flush.\n");
- GlamoDRMDispatch(pGlamo);
- }
-
- /* Record command */
- pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = reg;
- pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = val;
-}
-
-
-static inline void GlamoDRMAddCommandBO(GlamoPtr pGlamo, uint16_t reg,
- struct glamo_bo *bo)
-{
- if ( pGlamo->cmdq_drm_used == pGlamo->cmdq_drm_size ) {
- xf86DrvMsg(pGlamo->pScreen->myNum, X_INFO,
- "Forced command cache flush.\n");
- GlamoDRMDispatch(pGlamo);
- }
-
- /* Record object position */
- pGlamo->cmdq_objs[pGlamo->cmdq_obj_used] = bo->handle;
- /* -> bytes */
- pGlamo->cmdq_obj_pos[pGlamo->cmdq_obj_used] = pGlamo->cmdq_drm_used * 2;
- pGlamo->cmdq_obj_used++;
-
- /* Record command */
- pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = reg;
- pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = 0x0000;
- pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = reg+2;
- pGlamo->cmdq_drm[pGlamo->cmdq_drm_used++] = 0x0000;
-
- pGlamo->last_buffer_object = bo;
-}
-
-
unsigned int driGetPixmapHandle(PixmapPtr pPixmap, unsigned int *flags)
{
struct glamo_exa_pixmap_priv *priv;
@@ -262,8 +198,9 @@ static Bool GlamoKMSExaPrepareCopy(PixmapPtr pSrc, PixmapPtr pDst, int dx, int d
priv_dst = exaGetPixmapDriverPrivate(pDst);
if (pSrc->drawable.bitsPerPixel != 16 ||
- pDst->drawable.bitsPerPixel != 16)
+ pDst->drawable.bitsPerPixel != 16) {
GLAMO_FALLBACK(("Only 16bpp is supported"));
+ }
mask = FbFullMask(16);
if ((pm & mask) != mask) {
@@ -440,6 +377,9 @@ static Bool GlamoKMSExaPrepareAccess(PixmapPtr pPix, int index)
return TRUE;
}
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "PrepareAccess (%i)\n",
+ driver_priv->bo->handle);
+
/* Return as quickly as possible if we have a mapping already */
if ( driver_priv->bo->virtual ) {
pPix->devPrivate.ptr = driver_priv->bo->virtual;
@@ -619,12 +559,7 @@ void GlamoKMSExaInit(ScrnInfoPtr pScrn)
exa->WaitMarker = GlamoKMSExaWaitMarker;
/* Prepare temporary buffers */
- pGlamo->cmdq_objs = malloc(1024);
- pGlamo->cmdq_obj_pos = malloc(1024);
- pGlamo->cmdq_obj_used = 0;
- pGlamo->cmdq_drm_used = 0;
- pGlamo->cmdq_drm_size = 4 * 1024;
- pGlamo->cmdq_drm = malloc(pGlamo->cmdq_drm_size);
+ GlamoDRMInit(pGlamo);
pGlamo->last_buffer_object = NULL;
for ( i=0; i<NUM_EXA_BUFFER_MARKERS; i++ ) {
pGlamo->exa_buffer_markers[i] = NULL;