diff options
author | Thomas White <taw@bitwiz.org.uk> | 2009-05-06 01:18:05 +0100 |
---|---|---|
committer | Thomas White <taw@bitwiz.org.uk> | 2009-05-06 01:18:05 +0100 |
commit | f78d8b45197942fb9e3e17e263160b4b50a862a2 (patch) | |
tree | f43a46a1a18eca29b78ad02bd59cdf46b56b442d | |
parent | e33e6606ea98abc088310d0b570fabc656c0392f (diff) |
Add cmdq+buffer test, and fix for new ioctl definition
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | gdri-buf-cmdq.c | 155 | ||||
-rw-r--r-- | gdri-cmdq-submission.c | 9 | ||||
-rw-r--r-- | utils.h | 14 |
4 files changed, 179 insertions, 8 deletions
@@ -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"); @@ -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); |