summaryrefslogtreecommitdiff
path: root/src/glamo-kms-exa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glamo-kms-exa.c')
-rw-r--r--src/glamo-kms-exa.c79
1 files changed, 7 insertions, 72 deletions
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;