modetest: Create buffers using libkms
authorBenjamin Franzke <benjaminfranzke@googlemail.com>
Thu, 17 Feb 2011 09:47:47 +0000 (10:47 +0100)
committerBenjamin Franzke <benjaminfranzke@googlemail.com>
Thu, 17 Feb 2011 13:06:07 +0000 (14:06 +0100)
tests/modetest/Makefile.am
tests/modetest/modetest.c

index 16f5e99..2191242 100644 (file)
@@ -1,6 +1,6 @@
 AM_CFLAGS = \
        -I$(top_srcdir)/include/drm \
-       -I$(top_srcdir)/intel/ \
+       -I$(top_srcdir)/libkms/ \
        -I$(top_srcdir) \
        $(CAIRO_CFLAGS)
 
@@ -11,5 +11,5 @@ modetest_SOURCES = \
        modetest.c
 modetest_LDADD = \
        $(top_builddir)/libdrm.la \
-       $(top_builddir)/intel/libdrm_intel.la \
+       $(top_builddir)/libkms/libkms.la \
        $(CAIRO_LIBS)
index f3a04d0..6a40820 100644 (file)
@@ -51,8 +51,7 @@
 
 #include "xf86drm.h"
 #include "xf86drmMode.h"
-#include "intel_bufmgr.h"
-#include "i915_drm.h"
+#include "libkms.h"
 
 #ifdef HAVE_CAIRO
 #include <math.h>
@@ -354,29 +353,49 @@ connector_find_mode(struct connector *c)
                c->crtc = c->encoder->crtc_id;
 }
 
-static drm_intel_bo *
-allocate_buffer(drm_intel_bufmgr *bufmgr,
+static struct kms_bo *
+allocate_buffer(struct kms_driver *kms,
                int width, int height, int *stride)
 {
-       int size;
+       struct kms_bo *bo;
+       unsigned bo_attribs[] = {
+               KMS_WIDTH,   0,
+               KMS_HEIGHT,  0,
+               KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
+               KMS_TERMINATE_PROP_LIST
+       };
+       int ret;
+
+       bo_attribs[1] = width;
+       bo_attribs[3] = height;
+
+       ret = kms_bo_create(kms, bo_attribs, &bo);
+       if (ret) {
+               fprintf(stderr, "failed to alloc buffer: %s\n",
+                       strerror(-ret));
+               return NULL;
+       }
 
-       /* Scan-out has a 64 byte alignment restriction */
-       size = (width + 63) & -64;
-       *stride = size;
-       size *= height;
+       ret = kms_bo_get_prop(bo, KMS_PITCH, stride);
+       if (ret) {
+               fprintf(stderr, "failed to retreive buffer stride: %s\n",
+                       strerror(-ret));
+               kms_bo_destroy(&bo);
+               return NULL;
+       }
 
-       return drm_intel_bo_alloc(bufmgr, "frontbuffer", size, 0);
+       return bo;
 }
 
 static void
-make_pwetty(drm_intel_bo *bo, int width, int height, int stride)
+make_pwetty(void *data, int width, int height, int stride)
 {
 #ifdef HAVE_CAIRO
        cairo_surface_t *surface;
        cairo_t *cr;
        int x, y;
 
-       surface = cairo_image_surface_create_for_data(bo->virtual,
+       surface = cairo_image_surface_create_for_data(data,
                                                      CAIRO_FORMAT_ARGB32,
                                                      width, height,
                                                      stride);
@@ -415,29 +434,29 @@ make_pwetty(drm_intel_bo *bo, int width, int height, int stride)
 }
 
 static int
-create_test_buffer(drm_intel_bufmgr *bufmgr,
-                  int width, int height, int *stride_out, drm_intel_bo **bo_out)
+create_test_buffer(struct kms_driver *kms,
+                  int width, int height, int *stride_out,
+                  struct kms_bo **bo_out)
 {
-       drm_intel_bo *bo;
+       struct kms_bo *bo;
        int ret, i, j, stride;
+       void *virtual;
 
-       bo = allocate_buffer(bufmgr, width, height, &stride);
-       if (!bo) {
-               fprintf(stderr, "failed to alloc buffer: %s\n",
-                       strerror(errno));
+       bo = allocate_buffer(kms, width, height, &stride);
+       if (!bo)
                return -1;
-       }
 
-       ret = drm_intel_gem_bo_map_gtt(bo);
+       ret = kms_bo_map(bo, &virtual);
        if (ret) {
-               fprintf(stderr, "failed to GTT map buffer: %s\n",
-                       strerror(errno));
+               fprintf(stderr, "failed to map buffer: %s\n",
+                       strerror(-ret));
+               kms_bo_destroy(&bo);
                return -1;
        }
 
        /* paint the buffer with colored tiles */
        for (j = 0; j < height; j++) {
-               uint32_t *fb_ptr = (uint32_t*)((char*)bo->virtual + j * stride);
+               uint32_t *fb_ptr = (uint32_t*)((char*)virtual + j * stride);
                for (i = 0; i < width; i++) {
                        div_t d = div(i, width);
                        fb_ptr[i] =
@@ -446,9 +465,9 @@ create_test_buffer(drm_intel_bufmgr *bufmgr,
                }
        }
 
-       make_pwetty(bo, width, height, stride);
+       make_pwetty(virtual, width, height, stride);
 
-       drm_intel_gem_bo_unmap_gtt(bo);
+       kms_bo_unmap(bo);
 
        *bo_out = bo;
        *stride_out = stride;
@@ -456,32 +475,29 @@ create_test_buffer(drm_intel_bufmgr *bufmgr,
 }
 
 static int
-create_grey_buffer(drm_intel_bufmgr *bufmgr,
-                  int width, int height, int *stride_out, drm_intel_bo **bo_out)
+create_grey_buffer(struct kms_driver *kms,
+                  int width, int height, int *stride_out,
+                  struct kms_bo **bo_out)
 {
-       drm_intel_bo *bo;
+       struct kms_bo *bo;
        int size, ret, stride;
+       void *virtual;
 
-       /* Mode size at 32 bpp */
-       stride = width * 4;
-       size = stride * height;
-
-       bo = drm_intel_bo_alloc(bufmgr, "frontbuffer", size, 4096);
-       if (!bo) {
-               fprintf(stderr, "failed to alloc buffer: %s\n",
-                       strerror(errno));
+       bo = allocate_buffer(kms, width, height, &stride);
+       if (!bo)
                return -1;
-       }
 
-       ret = drm_intel_gem_bo_map_gtt(bo);
+       ret = kms_bo_map(bo, &virtual);
        if (ret) {
-               fprintf(stderr, "failed to GTT map buffer: %s\n",
-                       strerror(errno));
+               fprintf(stderr, "failed to map buffer: %s\n",
+                       strerror(-ret));
+               kms_bo_destroy(&bo);
                return -1;
        }
 
-       memset(bo->virtual, 0x77, size);
-       drm_intel_gem_bo_unmap_gtt(bo);
+       size = stride * height;
+       memset(virtual, 0x77, size);
+       kms_bo_unmap(bo);
 
        *bo_out = bo;
        *stride_out = stride;
@@ -521,10 +537,11 @@ page_flip_handler(int fd, unsigned int frame,
 static void
 set_mode(struct connector *c, int count, int page_flip)
 {
-       drm_intel_bufmgr *bufmgr;
-       drm_intel_bo *bo, *other_bo;
+       struct kms_driver *kms;
+       struct kms_bo *bo, *other_bo;
        unsigned int fb_id, other_fb_id;
        int i, ret, width, height, x, stride;
+       unsigned handle;
        drmEventContext evctx;
 
        width = 0;
@@ -538,17 +555,18 @@ set_mode(struct connector *c, int count, int page_flip)
                        height = c[i].mode->vdisplay;
        }
 
-       bufmgr = drm_intel_bufmgr_gem_init(fd, 2<<20);
-       if (!bufmgr) {
-               fprintf(stderr, "failed to init bufmgr: %s\n", strerror(errno));
+       ret = kms_create(fd, &kms);
+       if (ret) {
+               fprintf(stderr, "failed to create kms driver: %s\n",
+                       strerror(-ret));
                return;
        }
 
-       if (create_test_buffer(bufmgr, width, height, &stride, &bo))
+       if (create_test_buffer(kms, width, height, &stride, &bo))
                return;
 
-       ret = drmModeAddFB(fd, width, height, 32, 32, stride, bo->handle,
-                          &fb_id);
+       kms_bo_get_prop(bo, KMS_HANDLE, &handle);
+       ret = drmModeAddFB(fd, width, height, 32, 32, stride, handle, &fb_id);
        if (ret) {
                fprintf(stderr, "failed to add fb: %s\n", strerror(errno));
                return;
@@ -574,11 +592,12 @@ set_mode(struct connector *c, int count, int page_flip)
 
        if (!page_flip)
                return;
-
-       if (create_grey_buffer(bufmgr, width, height, &stride, &other_bo))
+       
+       if (create_grey_buffer(kms, width, height, &stride, &other_bo))
                return;
 
-       ret = drmModeAddFB(fd, width, height, 32, 32, stride, other_bo->handle,
+       kms_bo_get_prop(other_bo, KMS_HANDLE, &handle);
+       ret = drmModeAddFB(fd, width, height, 32, 32, stride, handle,
                           &other_fb_id);
        if (ret) {
                fprintf(stderr, "failed to add fb: %s\n", strerror(errno));
@@ -640,6 +659,10 @@ set_mode(struct connector *c, int count, int page_flip)
 
                drmHandleEvent(fd, &evctx);
        }
+
+       kms_bo_destroy(&bo);
+       kms_bo_destroy(&other_bo);
+       kms_destroy(&kms);
 }
 
 extern char *optarg;
@@ -665,6 +688,9 @@ void usage(char *name)
 
 static int page_flipping_supported(int fd)
 {
+       /*FIXME: generic ioctl needed? */
+       return 1;
+#if 0
        int ret, value;
        struct drm_i915_getparam gp;
 
@@ -678,6 +704,7 @@ static int page_flipping_supported(int fd)
        }
 
        return *gp.value;
+#endif
 }
 
 int main(int argc, char **argv)