From 1bf8338957e7acf743970122fd637248b76f65e5 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Mon, 14 Sep 2009 22:30:22 +0100 Subject: Add command queue stuff --- src/mesa/drivers/dri/glamo/glamo_cmdq.c | 102 +++++++++++++++++++++++++++++ src/mesa/drivers/dri/glamo/glamo_cmdq.h | 35 ++++++++++ src/mesa/drivers/dri/glamo/glamo_context.c | 1 + src/mesa/drivers/dri/glamo/glamo_context.h | 9 +++ 4 files changed, 147 insertions(+) create mode 100644 src/mesa/drivers/dri/glamo/glamo_cmdq.c create mode 100644 src/mesa/drivers/dri/glamo/glamo_cmdq.h diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.c b/src/mesa/drivers/dri/glamo/glamo_cmdq.c new file mode 100644 index 0000000000..f6052e9783 --- /dev/null +++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.c @@ -0,0 +1,102 @@ +/* + * Command queue submission via DRM + * + * Copyright 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + + +#include +#include + +#include "glamo_context.h" + + +/* Submit the prepared command sequence to the kernel */ +void GlamoDRMDispatch(glamoContext *gCtx) +{ + drm_glamo_cmd_buffer_t cmdbuf; + int r; + + cmdbuf.buf = (char *)gCtx->cmdq_drm; + cmdbuf.bufsz = gCtx->cmdq_drm_used * 2; /* -> bytes */ + cmdbuf.nobjs = gCtx->cmdq_obj_used; + cmdbuf.objs = gCtx->cmdq_objs; + cmdbuf.obj_pos = gCtx->cmdq_obj_pos; + + r = drmCommandWrite(gCtx->drm_fd, DRM_GLAMO_CMDBUF, + &cmdbuf, sizeof(cmdbuf)); + if ( r != 0 ) { + xf86DrvMsg(gCtx->pScreen->myNum, X_ERROR, + "DRM_GLAMO_CMDBUF failed\n"); + } + + /* Reset counts to zero for the next sequence */ + gCtx->cmdq_obj_used = 0; + gCtx->cmdq_drm_used = 0; +} + + +void GlamoDRMAddCommand(glamoContext *gCtx, uint16_t reg, + uint16_t val) +{ + if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) { + xf86DrvMsg(gCtx->pScreen->myNum, X_INFO, + "Forced command cache flush.\n"); + GlamoDRMDispatch(gCtx); + } + + /* Record command */ + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg; + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val; +} + + +void GlamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg, + struct glamo_bo *bo) +{ + if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) { + xf86DrvMsg(gCtx->pScreen->myNum, X_INFO, + "Forced command cache flush.\n"); + GlamoDRMDispatch(gCtx); + } + + /* Record object position */ + gCtx->cmdq_objs[gCtx->cmdq_obj_used] = bo->handle; + /* -> bytes */ + gCtx->cmdq_obj_pos[gCtx->cmdq_obj_used] = gCtx->cmdq_drm_used * 2; + gCtx->cmdq_obj_used++; + + /* Record command */ + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg; + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = 0x0000; + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg+2; + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = 0x0000; + + gCtx->last_buffer_object = bo; +} + + +void GlamoInitCmdqCache(glamoContext *gCtx) +{ + gCtx->cmdq_objs = malloc(1024); + gCtx->cmdq_obj_pos = malloc(1024); + gCtx->cmdq_obj_used = 0; + gCtx->cmdq_drm_used = 0; + gCtx->cmdq_drm_size = 4 * 1024; + gCtx->cmdq_drm = malloc(gCtx->cmdq_drm_size); +} diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.h b/src/mesa/drivers/dri/glamo/glamo_cmdq.h new file mode 100644 index 0000000000..aa69b31f07 --- /dev/null +++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.h @@ -0,0 +1,35 @@ +/* + * Command queue submission via DRM + * + * Copyright 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + + +#include +#include + +#include "glamo_context.h" + + +/* Submit the prepared command sequence to the kernel */ +extern void GlamoDRMDispatch(glamoContext *gCtx); +extern void GlamoDRMAddCommand(glamoContext *gCtx, uint16_t reg, + uint16_t val); +extern void GlamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg, + struct glamo_bo *bo); +extern void GlamoInitCmdqCache(glamoContext *gCtx); diff --git a/src/mesa/drivers/dri/glamo/glamo_context.c b/src/mesa/drivers/dri/glamo/glamo_context.c index ee181da4ef..a0769a27ee 100644 --- a/src/mesa/drivers/dri/glamo/glamo_context.c +++ b/src/mesa/drivers/dri/glamo/glamo_context.c @@ -148,6 +148,7 @@ GLboolean glamoCreateContext(const __GLcontextModes *glVisual, _tnl_allow_pixel_fog(ctx, GL_TRUE); _tnl_allow_vertex_fog(ctx, GL_FALSE); + glamoInitCmdq(context); glamoInitStateFuncs(ctx); glamoInitTriFuncs(ctx); diff --git a/src/mesa/drivers/dri/glamo/glamo_context.h b/src/mesa/drivers/dri/glamo/glamo_context.h index 8f4d811c61..14dbf6841e 100644 --- a/src/mesa/drivers/dri/glamo/glamo_context.h +++ b/src/mesa/drivers/dri/glamo/glamo_context.h @@ -52,6 +52,15 @@ struct glamo_context { GLint GlobalFlag; /* What needs to be updated */ + /* Command queue cache */ + uint16_t *cmdq_drm; + int cmdq_drm_used; + int cmdq_drm_size; + int cmdq_obj_used; + uint32_t *cmdq_objs; + unsigned int *cmdq_obj_pos; + + }; #define GLAMO_CONTEXT(ctx) ((glamoContextPtr)(ctx->DriverCtx)) -- cgit v1.2.3