From f78d8b45197942fb9e3e17e263160b4b50a862a2 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Wed, 6 May 2009 01:18:05 +0100 Subject: Add cmdq+buffer test, and fix for new ioctl definition --- gdri-buf-cmdq.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 gdri-buf-cmdq.c (limited to 'gdri-buf-cmdq.c') 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 + * + * 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 . + * + */ + + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#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; +} -- cgit v1.2.3