[Openchrome-devel] xf86-video-openchrome: src/via_driver.c src/via_driver.h src/via_memmgr.c src/via_memmgr.h

James Simmons jsimmons at kemper.freedesktop.org
Sun Apr 21 07:19:32 PDT 2013


 src/via_driver.c |   58 +++++++++++++++++++++++++++++++++++++++++--------------
 src/via_driver.h |    1 
 src/via_memmgr.c |   32 +++++++++++++++++++++++++-----
 src/via_memmgr.h |    2 -
 4 files changed, 73 insertions(+), 20 deletions(-)

New commits:
commit 3808a3b88e474f9549b06388c8bc323c4cb0b4b9
Author: James Simmons <jsimmons at infradead.org>
Date:   Sun Apr 21 10:19:24 2013 -0400

    Integrate the different formats now supported by libdrm. This makes allocating buffers for KMS planes in the future much easier

diff --git a/src/via_driver.c b/src/via_driver.c
index fd91910..52a5bea 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -772,13 +772,42 @@ VIAGetRec(ScrnInfoPtr pScrn)
     return ret;
 } /* VIAGetRec */
 
+static int
+map_legacy_formats(int bpp, int depth)
+{
+	int fmt = DRM_FORMAT_XRGB8888;
+
+	switch (bpp) {
+	case 8:
+		fmt = DRM_FORMAT_C8;
+		break;
+	case 16:
+		if (depth == 15)
+			fmt = DRM_FORMAT_XRGB1555;
+		else
+			fmt = DRM_FORMAT_RGB565;
+		break;
+	case 24:
+		fmt = DRM_FORMAT_RGB888;
+		break;
+	case 32:
+		if (depth == 24)
+			fmt = DRM_FORMAT_XRGB8888;
+		else if (depth == 30)
+			fmt = DRM_FORMAT_XRGB2101010;
+	default:
+		break;
+	}
+	return fmt;
+}
+
 static Bool
 via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 {
     xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
     drmmode_crtc_private_ptr drmmode_crtc = xf86_config->crtc[0]->driver_private;
+    int old_width, old_height, old_dwidth, format;
     drmmode_ptr drmmode = drmmode_crtc->drmmode;
-    int old_width, old_height, old_dwidth, pitch;
     int cpp = (scrn->bitsPerPixel + 7) >> 3;
     struct buffer_object *old_front = NULL;
     ScreenPtr screen = scrn->pScreen;
@@ -790,28 +819,28 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
     if (scrn->virtualX == width && scrn->virtualY == height)
         return TRUE;
 
-    xf86DrvMsg(scrn->scrnIndex, X_INFO,
-                "Allocate new frame buffer %dx%d stride\n",
-                width, height);
-
     old_width = scrn->virtualX;
     old_height = scrn->virtualY;
     old_dwidth = scrn->displayWidth;
     old_fb_id = drmmode->fb_id;
     old_front = drmmode->front_bo;
 
-    pitch = width * cpp;
-    drmmode->front_bo = drm_bo_alloc_surface(scrn, &pitch, height, 0,
+    format = map_legacy_formats(scrn->bitsPerPixel, scrn->depth);
+    drmmode->front_bo = drm_bo_alloc_surface(scrn, width, height, format,
                                             16, TTM_PL_FLAG_VRAM);
     if (!drmmode->front_bo)
         goto fail;
 
+    xf86DrvMsg(scrn->scrnIndex, X_INFO,
+                "Allocate new frame buffer %dx%d stride %d\n",
+                width, height, drmmode->front_bo->pitch);
+
     new_pixels = drm_bo_map(scrn, drmmode->front_bo);
     if (!new_pixels)
         goto fail;
 
     if (pVia->shadowFB) {
-        new_pixels = malloc(height * pitch);
+        new_pixels = malloc(height * drmmode->front_bo->pitch);
         if (!new_pixels)
             goto fail;
         free(pVia->ShadowPtr);
@@ -819,10 +848,11 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
     }
     scrn->virtualX = width;
     scrn->virtualY = height;
-    scrn->displayWidth = pitch / cpp;
+    scrn->displayWidth = drmmode->front_bo->pitch / cpp;
 
     ppix = screen->GetScreenPixmap(screen);
-    if (!screen->ModifyPixmapHeader(ppix, width, height, -1, -1, pitch,
+    if (!screen->ModifyPixmapHeader(ppix, width, height, -1, -1,
+                                    drmmode->front_bo->pitch,
                                     new_pixels))
         goto fail;
 
@@ -1768,7 +1798,7 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
     VIAPtr pVia = VIAPTR(pScrn);
-    int pitch;
+    int format;
 
     pScrn->pScreen = pScreen;
     pScrn->displayWidth = pScrn->virtualX;
@@ -1797,9 +1827,9 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
     if (!drm_bo_manager_init(pScrn))
         return FALSE;
 
-    pitch = pScrn->virtualX * pScrn->bitsPerPixel >> 3;
-    pVia->drmmode.front_bo = drm_bo_alloc_surface(pScrn, &pitch, pScrn->virtualY,
-                                                    0, 16, TTM_PL_FLAG_VRAM);
+    format = map_legacy_formats(pScrn->bitsPerPixel, pScrn->depth);
+    pVia->drmmode.front_bo = drm_bo_alloc_surface(pScrn, pScrn->virtualX, pScrn->virtualY,
+                                                    format, 16, TTM_PL_FLAG_VRAM);
     if (!pVia->drmmode.front_bo)
         return FALSE;
 
diff --git a/src/via_driver.h b/src/via_driver.h
index 80f13fb..f82fdda 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -61,6 +61,7 @@
 #include "xf86dri.h"
 #include "sarea.h"
 #include "dri.h"
+#include "drm_fourcc.h"
 #include "GL/glxint.h"
 #include "via_dri.h"
 #include "via_drmclient.h"
diff --git a/src/via_memmgr.c b/src/via_memmgr.c
index 187e3a8..5d4cc3f 100644
--- a/src/via_memmgr.c
+++ b/src/via_memmgr.c
@@ -68,15 +68,36 @@ viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn,
 }
 
 struct buffer_object *
-drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int *pitch, unsigned int height,
+drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int width, unsigned int height,
                     int format, unsigned int alignment, int domain)
 {
     struct buffer_object *obj = NULL;
+    int pitch;
 
-    *pitch = ALIGN_TO(*pitch, alignment);
-    obj = drm_bo_alloc(pScrn, *pitch * height, alignment, domain);
-    if (obj)
-        obj->pitch = *pitch;
+    switch (format) {
+    case DRM_FORMAT_C8:
+        pitch = width;
+        break;
+
+    case DRM_FORMAT_XRGB1555:
+    case DRM_FORMAT_RGB565:
+        pitch = width * 2;
+        break;
+
+    case DRM_FORMAT_RGB888:
+        pitch = width * 3;
+        break;
+
+    case DRM_FORMAT_XRGB2101010:
+    case DRM_FORMAT_XRGB8888:
+        pitch = width * 4;
+        break;
+    }
+
+    pitch = ALIGN_TO(pitch, alignment);
+    obj = drm_bo_alloc(pScrn, pitch * height, alignment, domain);
+    if (!obj->pitch)
+        obj->pitch = pitch;
     return obj;
 }
 
@@ -135,6 +156,7 @@ drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int alignment, int d
                     obj->map_offset = args.map_handle;
                     obj->offset = args.offset;
                     obj->handle = args.handle;
+                    obj->pitch = args.pitch;
                     obj->size = args.size;
                     obj->domain = domain;
                     DEBUG(ErrorF("%lu bytes of DRI2 memory allocated at %lx, handle %lu\n",
diff --git a/src/via_memmgr.h b/src/via_memmgr.h
index b1b625c..e80cb84 100644
--- a/src/via_memmgr.h
+++ b/src/via_memmgr.h
@@ -44,7 +44,7 @@ struct buffer_object {
 Bool drm_bo_manager_init(ScrnInfoPtr pScrn);
 
 struct buffer_object *
-drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int *pitch, unsigned int height,
+drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int width, unsigned int height,
                     int format, unsigned int alignment, int domain);
 struct buffer_object *
 drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int alignment,


More information about the Openchrome-devel mailing list