summaryrefslogtreecommitdiff
path: root/gdri-buf-cmdq.c
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 /gdri-buf-cmdq.c
parente33e6606ea98abc088310d0b570fabc656c0392f (diff)
Add cmdq+buffer test, and fix for new ioctl definition
Diffstat (limited to 'gdri-buf-cmdq.c')
-rw-r--r--gdri-buf-cmdq.c155
1 files changed, 155 insertions, 0 deletions
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;
+}