Add cmdq+buffer test, and fix for new ioctl definition
authorThomas White <taw@bitwiz.org.uk>
Wed, 6 May 2009 00:18:05 +0000 (01:18 +0100)
committerThomas White <taw@bitwiz.org.uk>
Wed, 6 May 2009 00:18:05 +0000 (01:18 +0100)
Makefile
gdri-buf-cmdq.c [new file with mode: 0644]
gdri-cmdq-submission.c
utils.h

index 1975ed3..bd710f8 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ CFLAGS=-g -W -Wall
 LIBS=-lX11 -lXext -ldrm -ldrm_glamo
 CC=gcc
 
-default: gdri-cmdq-submission gdri-mem-manager
+default: gdri-cmdq-submission gdri-mem-manager gdri-buf-cmdq
 
 .c.o:
        $(CC) -c ${CFLAGS} ${CROSS_CFLAGS} $*.c
@@ -13,12 +13,17 @@ gdri-cmdq-submission: gdri-cmdq-submission.o dri2.o utils.o
 gdri-mem-manager: gdri-mem-manager.o dri2.o utils.o
        $(CC) gdri-mem-manager.o dri2.o utils.o -o gdri-mem-manager ${LIBS}
 
+gdri-buf-cmdq: gdri-buf-cmdq.o dri2.o utils.o
+       $(CC) gdri-buf-cmdq.o dri2.o utils.o -o gdri-buf-cmdq ${LIBS}
+
 clean:
-       rm -rf dri2.o gdri-cmdq-submission.o utils.o gdri-cmdq-submission
+       rm -rf dri2.o gdri-cmdq-submission.o utils.o gdri-cmdq-submission \
+               gdri-mem-manager gdri-buf-cmdq
 
 install:
        install -d -m 755 ${PREFIX}/bin
        install -m 755 gdri-cmdq-submission ${PREFIX}/bin
        install -m 755 gdri-mem-manager ${PREFIX}/bin
+       install -m 755 gdri-buf-cmdq ${PREFIX}/bin
 
 .PHONY: clean install default
diff --git a/gdri-buf-cmdq.c b/gdri-buf-cmdq.c
new file mode 100644 (file)
index 0000000..614c473
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * gdri-buf-cmdq.c
+ *
+ * Test for Glamo referencing buffer objects from the command queue
+ *
+ * (c) 2009 Thomas White <taw@bitwiz.org.uk>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/Xlib.h>
+
+#include <X11/Xmd.h>
+#include <stdint.h>
+#include <drm/drm.h>
+#include <drm/glamo_drm.h>
+#include <drm/glamo_bo.h>
+#include <glamo_bo_gem.h>
+
+#include "dri2.h"
+#include "glamo-regs.h"
+#include "utils.h"
+
+
+int main()
+{
+       Display *dpy;
+       drm_glamo_cmd_buffer_t cmdbuf;
+       int r;
+       int fd;
+       struct glamo_bo_manager *bufmgr;
+       struct glamo_bo *bo;
+
+       RING_LOCALS;
+       uint16_t *cmds;
+       uint32_t *objs;
+       int *obj_pos;
+
+       /* Open display */
+       dpy = XOpenDisplay(NULL);
+       if ( dpy == NULL ) {
+               fprintf(stderr, "Can't open display '%s'\n",
+                       XDisplayName(NULL));
+               return 1;
+       }
+
+       fd = do_drm_authentication(dpy);
+       if ( fd < 0 ) {
+               fprintf(stderr, "Couldn't authenticate\n");
+               return 1;
+       }
+
+       bufmgr = glamo_bo_manager_gem_ctor(fd);
+       printf("Allocated a new glamo_bo_manager: 0x%p\n", bufmgr);
+
+       bo = bufmgr->funcs->bo_open(bufmgr,
+                                   0, /* handle */
+                                   480*480*2,
+                                   2,
+                                   GLAMO_GEM_DOMAIN_VRAM,
+                                   0); /* flags */
+
+       printf("Allocated a 480x480x2 byte buffer object: 0x%p\n", bo);
+       printf(" handle = %i\n", bo->handle);
+
+       cmds = malloc(1024);
+       objs = malloc(1024);
+       obj_pos = malloc(1024);
+
+       /* Render something to this buffer */
+       OUT_REG_BO(GLAMO_REG_2D_DST_ADDRL, bo->handle);
+       OUT_REG(GLAMO_REG_2D_DST_PITCH, (480*2) & 0x7ff);
+       OUT_REG(GLAMO_REG_2D_DST_HEIGHT, 480);
+       OUT_REG(GLAMO_REG_2D_PAT_FG, 0xDCBA);
+       OUT_REG(GLAMO_REG_2D_COMMAND2, 0xf000);
+       OUT_REG(GLAMO_REG_2D_ID1, 0);
+       OUT_REG(GLAMO_REG_2D_ID2, 0);
+       OUT_REG(GLAMO_REG_2D_DST_X, 0);
+       OUT_REG(GLAMO_REG_2D_DST_Y, 0);
+       OUT_REG(GLAMO_REG_2D_RECT_WIDTH, 480);
+       OUT_REG(GLAMO_REG_2D_RECT_HEIGHT, 480);
+       OUT_REG(GLAMO_REG_2D_COMMAND3, 0);
+
+       OUT_REG(GLAMO_REG_2D_PAT_FG, 0xABAB);
+       OUT_REG(GLAMO_REG_2D_DST_X, 5);
+       OUT_REG(GLAMO_REG_2D_DST_Y, 5);
+       OUT_REG(GLAMO_REG_2D_RECT_WIDTH, 470);
+       OUT_REG(GLAMO_REG_2D_RECT_HEIGHT, 470);
+       OUT_REG(GLAMO_REG_2D_COMMAND3, 0);
+
+       cmdbuf.buf = (char *)cmds;
+       cmdbuf.bufsz = 2*__count;
+       cmdbuf.objs = objs;
+       cmdbuf.obj_pos = obj_pos;
+       cmdbuf.nobjs = __nobjs;
+       r = drmCommandWrite(fd, DRM_GLAMO_CMDBUF, &cmdbuf, sizeof(cmdbuf));
+       if ( r != 0 ) {
+            fprintf(stderr, "DRM_GLAMO_CMDBUF failed");
+            return 1;
+        }
+       printf("Rendered something to the buffer\n");
+
+       /* Blit the buffer to the screen */
+       __nobjs = 0;    __count = 0;
+       OUT_REG_BO(GLAMO_REG_2D_SRC_ADDRL, bo->handle);
+       OUT_REG(GLAMO_REG_2D_SRC_PITCH, (480*2) & 0x7ff);
+       OUT_REG(GLAMO_REG_2D_DST_ADDRL, 0x0000);
+       OUT_REG(GLAMO_REG_2D_DST_ADDRH, 0x0000);
+       OUT_REG(GLAMO_REG_2D_DST_PITCH, (480*2) & 0x7ff);  /* The screen */
+       OUT_REG(GLAMO_REG_2D_DST_HEIGHT, 640);
+       OUT_REG(GLAMO_REG_2D_COMMAND2, 0xcc00);
+       OUT_REG(GLAMO_REG_2D_ID1, 0);
+       OUT_REG(GLAMO_REG_2D_ID2, 0);
+       OUT_REG(GLAMO_REG_2D_DST_X, 100);
+       OUT_REG(GLAMO_REG_2D_DST_Y, 100);
+       OUT_REG(GLAMO_REG_2D_RECT_WIDTH, 480);
+       OUT_REG(GLAMO_REG_2D_RECT_HEIGHT, 480);
+       OUT_REG(GLAMO_REG_2D_COMMAND3, 0);
+       cmdbuf.buf = (char *)cmds;
+       cmdbuf.bufsz = 2*__count;
+       cmdbuf.objs = objs;
+       cmdbuf.obj_pos = obj_pos;
+       cmdbuf.nobjs = __nobjs;
+       r = drmCommandWrite(fd, DRM_GLAMO_CMDBUF, &cmdbuf, sizeof(cmdbuf));
+       if ( r != 0 ) {
+            fprintf(stderr, "DRM_GLAMO_CMDBUF failed");
+            return 1;
+        }
+       printf("Copied the buffer to the screen\n");
+
+       bufmgr->funcs->bo_unref(bo);
+
+       glamo_bo_manager_gem_dtor(bufmgr);
+       printf("Destroyed the glamo_bo_manager.\n");
+
+       close(fd);
+       XCloseDisplay(dpy);
+
+       return 0;
+}
index d14bcf0..02c59cb 100644 (file)
@@ -69,15 +69,16 @@ int main()
        OUT_REG(GLAMO_REG_2D_COMMAND2, 0xf000);
        OUT_REG(GLAMO_REG_2D_ID1, 0);
        OUT_REG(GLAMO_REG_2D_ID2, 0);
-       OUT_REG(GLAMO_REG_2D_DST_X, 20);
-       OUT_REG(GLAMO_REG_2D_DST_Y, 20);
-       OUT_REG(GLAMO_REG_2D_RECT_WIDTH, 100);
-       OUT_REG(GLAMO_REG_2D_RECT_HEIGHT, 50);
+       OUT_REG(GLAMO_REG_2D_DST_X, 100);
+       OUT_REG(GLAMO_REG_2D_DST_Y, 100);
+       OUT_REG(GLAMO_REG_2D_RECT_WIDTH, 280);
+       OUT_REG(GLAMO_REG_2D_RECT_HEIGHT, 440);
 
        OUT_REG(GLAMO_REG_2D_COMMAND3, 0);
 
        cmdbuf.buf = (char *)cmds;
        cmdbuf.bufsz = 2*__count;
+       cmdbuf.nobjs = 0;
        r = drmCommandWrite(fd, DRM_GLAMO_CMDBUF, &cmdbuf, sizeof(cmdbuf));
        if ( r != 0 ) {
             fprintf(stderr, "DRM_GLAMO_CMDBUF failed");
diff --git a/utils.h b/utils.h
index 0f19435..8b7430a 100644 (file)
--- a/utils.h
+++ b/utils.h
 
 #include <X11/Xmd.h>
 
-#define RING_LOCALS int __count = 0;
-#define OUT_REG(reg, val) cmds[__count++] = (reg); cmds[__count++] = (val);
+#define RING_LOCALS int __count = 0;   \
+                   int __nobjs = 0;
+
+#define OUT_REG(reg, val) cmds[__count++] = (reg);     \
+                         cmds[__count++] = (val);
+
+#define OUT_REG_BO(reg, bo) objs[__nobjs] = bo;                        \
+                           obj_pos[__nobjs++] = __count;       \
+                           cmds[__count++] = (reg);            \
+                           cmds[__count++] = 0x0000;           \
+                           cmds[__count++] = (reg+2);          \
+                           cmds[__count++] = 0x0000;
 
 extern int do_drm_authentication(Display *dpy);