diff options
author | Thomas White <taw27@cam.ac.uk> | 2009-04-28 17:01:37 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2009-04-29 01:56:25 +0100 |
commit | 9bd9fc9e014c72a0ea976a32e3fa3274c7de44dd (patch) | |
tree | f91e12dbd799ed89824a8522c09d3045757032dd /gdri-cmdq-submission.c |
Initial import
Diffstat (limited to 'gdri-cmdq-submission.c')
-rw-r--r-- | gdri-cmdq-submission.c | 141 |
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; +} |