summaryrefslogtreecommitdiff
path: root/gdri-cmdq-submission.c
diff options
context:
space:
mode:
authorThomas White <taw27@cam.ac.uk>2009-04-28 17:01:37 +0100
committerThomas White <taw@bitwiz.org.uk>2009-04-29 01:56:25 +0100
commit9bd9fc9e014c72a0ea976a32e3fa3274c7de44dd (patch)
treef91e12dbd799ed89824a8522c09d3045757032dd /gdri-cmdq-submission.c
Initial import
Diffstat (limited to 'gdri-cmdq-submission.c')
-rw-r--r--gdri-cmdq-submission.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/gdri-cmdq-submission.c b/gdri-cmdq-submission.c
new file mode 100644
index 0000000..eafe65f
--- /dev/null
+++ b/gdri-cmdq-submission.c
@@ -0,0 +1,141 @@
+/*
+ * gdri-cmdq-submission.c
+ *
+ * A small test of some Glamo DRI functions
+ *
+ * (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 <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <X11/Xmd.h>
+#include <stdint.h>
+#include <drm/drm.h>
+#include <drm/glamo_drm.h>
+
+#include "dri2.h"
+#include "glamo-regs.h"
+
+
+#define RING_LOCALS int __count = 0;
+#define OUT_REG(reg, val) cmds[__count++] = (reg); cmds[__count++] = (val);
+
+
+static int do_drm_authentication(Display *dpy)
+{
+ int scrnum;
+ Window root;
+ char *driver;
+ char *device;
+ int fd;
+ drm_magic_t magic;
+
+ /* Get default screen, root window and default visual */
+ scrnum = DefaultScreen(dpy);
+ root = RootWindow(dpy, scrnum);
+
+ /* Get device name */
+ if ( !DRI2Connect(dpy, root, &driver, &device) ) {
+ fprintf(stderr, "DRI2Connect failed\n");
+ return 1;
+ }
+
+ /* Open DRM device */
+ fd = open(device, O_RDWR);
+ if ( fd < 0 ) {
+ fprintf(stderr, "Couldn't open '%s': %s\n",
+ device, strerror(errno));
+ return 1;
+ }
+
+ /* Get an authentication token */
+ if ( drmGetMagic(fd, &magic) ) {
+ fprintf(stderr, "drmGetMagic failed\n");
+ return 1;
+ }
+
+ /* Authenticate */
+ if ( DRI2Authenticate(dpy, root, magic) == False ) {
+ fprintf(stderr, "DRI2Authenticate failed\n");
+ return 1;
+ }
+
+ return fd;
+}
+
+int main()
+{
+ Display *dpy;
+ drm_glamo_cmd_buffer_t cmdbuf;
+ uint16_t *cmds;
+ int r;
+ uint32_t offset = 0x000000;
+ RING_LOCALS;
+ int fd;
+
+ /* 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);
+
+ cmds = malloc(2*13*2);
+
+ OUT_REG(GLAMO_REG_2D_DST_ADDRL, offset & 0xffff);
+ OUT_REG(GLAMO_REG_2D_DST_ADDRH, (offset >> 16) & 0x7f);
+ OUT_REG(GLAMO_REG_2D_DST_PITCH, (480*2) & 0x7ff);
+ OUT_REG(GLAMO_REG_2D_DST_HEIGHT, 640);
+ OUT_REG(GLAMO_REG_2D_PAT_FG, 0xABCD);
+ OUT_REG(GLAMO_REG_2D_COMMAND2, 0x00aa);
+ 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_COMMAND3, 0);
+
+ cmdbuf.buf = (char *)cmds;
+ cmdbuf.bufsz = 2*13*2;
+ r = drmCommandWrite(fd, DRM_GLAMO_CMDBUF, &cmdbuf, sizeof(cmdbuf));
+ if ( r != 0 ) {
+ fprintf(stderr, "DRM_GLAMO_CMDBUF failed");
+ return 1;
+ }
+
+ printf("Success!\n");
+
+ close(fd);
+ XCloseDisplay(dpy);
+
+ return 0;
+}