From 6e7ff8981f0a5e8cf558dc95fdda85dc669cd7af Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 19 Sep 2009 13:57:37 +0100 Subject: Split DRM command queue handling out to a separate file --- src/Makefile.am | 3 +- src/glamo-drm.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/glamo-drm.h | 38 +++++++++++++++++++ src/glamo-kms-exa.c | 79 ++++---------------------------------- 4 files changed, 154 insertions(+), 73 deletions(-) create mode 100644 src/glamo-drm.c create mode 100644 src/glamo-drm.h 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 + * + * 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 +#include +#include +#include + +#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 + * + * 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 +#include + +#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 #include @@ -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; iexa_buffer_markers[i] = NULL; -- cgit v1.2.3