From 5f22287cc1a3b3e9e7f6e5f871c81fc0c93aec50 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sun, 9 Aug 2009 23:18:40 +0100 Subject: Dispatch command buffer when cache is full --- src/glamo-kms-exa.c | 62 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/glamo-kms-exa.c b/src/glamo-kms-exa.c index 9c98724..99fab0c 100644 --- a/src/glamo-kms-exa.c +++ b/src/glamo-kms-exa.c @@ -118,9 +118,40 @@ 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; @@ -130,6 +161,12 @@ static inline void GlamoDRMAddCommand(GlamoPtr pGlamo, uint16_t reg, 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 */ @@ -144,31 +181,6 @@ static inline void GlamoDRMAddCommandBO(GlamoPtr pGlamo, uint16_t reg, } -/* 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; -} - - unsigned int driGetPixmapHandle(PixmapPtr pPixmap, unsigned int *flags) { struct glamo_exa_pixmap_priv *priv; -- cgit v1.2.3