summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-05-06 01:18:05 +0100
committerThomas White <taw@bitwiz.org.uk>2009-05-06 01:18:05 +0100
commitf78d8b45197942fb9e3e17e263160b4b50a862a2 (patch)
treef43a46a1a18eca29b78ad02bd59cdf46b56b442d
parente33e6606ea98abc088310d0b570fabc656c0392f (diff)
Add cmdq+buffer test, and fix for new ioctl definition
-rw-r--r--Makefile9
-rw-r--r--gdri-buf-cmdq.c155
-rw-r--r--gdri-cmdq-submission.c9
-rw-r--r--utils.h14
4 files changed, 179 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index 1975ed3..bd710f8 100644
--- 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
index 0000000..614c473
--- /dev/null
+++ b/gdri-buf-cmdq.c
@@ -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;
+}
diff --git a/gdri-cmdq-submission.c b/gdri-cmdq-submission.c
index d14bcf0..02c59cb 100644
--- a/gdri-cmdq-submission.c
+++ b/gdri-cmdq-submission.c
@@ -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
--- a/utils.h
+++ b/utils.h
@@ -26,8 +26,18 @@
#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);