From 9bc0ddcf09ad4aea8c4f7558aca1fe9d60467cb1 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sun, 18 Oct 2009 22:58:30 +0200 Subject: Use burst commands instead of single commands --- src/mesa/drivers/dri/glamo/glamo_cmdq.c | 56 +++++++++++++++++++----------- src/mesa/drivers/dri/glamo/glamo_cmdq.h | 8 ++--- src/mesa/drivers/dri/glamo/glamo_context.h | 1 + src/mesa/drivers/dri/glamo/glamo_regs.h | 2 +- src/mesa/drivers/dri/glamo/glamo_render.c | 13 ++++--- src/mesa/drivers/dri/glamo/glamo_state.c | 33 +++++++++--------- 6 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.c b/src/mesa/drivers/dri/glamo/glamo_cmdq.c index b35a8b4f74..a8b788ad67 100644 --- a/src/mesa/drivers/dri/glamo/glamo_cmdq.c +++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.c @@ -32,19 +32,20 @@ /* Submit the prepared command sequence to the kernel */ void glamoDRMDispatch(glamoContext *gCtx) { - drm_glamo_cmd_buffer_t cmdbuf; + drm_glamo_cmd_burst_t burst; 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; + burst.base = gCtx->cmd_burst_base; + burst.data = gCtx->cmdq_drm; + burst.bufsz = gCtx->cmdq_drm_used * 2; /* -> bytes */ + burst.nobjs = gCtx->cmdq_obj_used; + burst.objs = gCtx->cmdq_objs; + burst.obj_pos = gCtx->cmdq_obj_pos; - r = drmCommandWrite(gCtx->drm_fd, DRM_GLAMO_CMDBUF, - &cmdbuf, sizeof(cmdbuf)); + r = drmCommandWrite(gCtx->drm_fd, DRM_GLAMO_CMDBURST, + &burst, sizeof(burst)); if ( r != 0 ) { - fprintf(stderr, "DRM_GLAMO_CMDBUF failed\n"); + fprintf(stderr, "DRM_GLAMO_CMDBURST failed\n"); } /* Reset counts to zero for the next sequence */ @@ -53,24 +54,33 @@ void glamoDRMDispatch(glamoContext *gCtx) } -void glamoDRMAddCommand(glamoContext *gCtx, uint16_t reg, - uint16_t val) +void glamoDRMAddData(glamoContext *gCtx, uint32_t val, int len) { - if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) { - glamoDRMDispatch(gCtx); + if ( gCtx->cmdq_drm_used+4 > gCtx->cmdq_drm_size ) { + fprintf(stderr, "Burst command too large\n"); + return; + } + + if ( (len != 2) && (len != 4) ) { + fprintf(stderr, "Wrong command length!\n"); + return; } /* Record command */ - gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = reg; - gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val; + if ( len == 2 ) { + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val & 0xffff; + } else if ( len == 4 ) { + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val & 0x0000ffff; + gCtx->cmdq_drm[gCtx->cmdq_drm_used++] = val & 0xffff0000; + } } -void glamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg, - struct glamo_bo *bo) +void glamoDRMAddBO(glamoContext *gCtx, struct glamo_bo *bo) { - if ( gCtx->cmdq_drm_used == gCtx->cmdq_drm_size ) { - glamoDRMDispatch(gCtx); + if ( gCtx->cmdq_drm_used+4 > gCtx->cmdq_drm_size ) { + fprintf(stderr, "Burst command too large\n"); + return; } /* Record object position */ @@ -80,13 +90,17 @@ void glamoDRMAddCommandBO(glamoContext *gCtx, uint16_t reg, 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; } +void glamoDRMStartBurst(glamoContext *gCtx, uint16_t base) +{ + gCtx->cmd_burst_base = base; +} + + void glamoInitCmdqCache(glamoContext *gCtx) { gCtx->cmdq_objs = malloc(1024); diff --git a/src/mesa/drivers/dri/glamo/glamo_cmdq.h b/src/mesa/drivers/dri/glamo/glamo_cmdq.h index e51796f6b3..7420d7b4d9 100644 --- a/src/mesa/drivers/dri/glamo/glamo_cmdq.h +++ b/src/mesa/drivers/dri/glamo/glamo_cmdq.h @@ -26,10 +26,8 @@ #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 glamoDRMAddBO(glamoContext *gCtx, struct glamo_bo *bo); +extern void glamoDRMAddData(glamoContext *gCtx, uint32_t val, int len); +extern void glamoDRMStartBurst(glamoContext *gCtx, uint16_t base); extern void glamoInitCmdqCache(glamoContext *gCtx); diff --git a/src/mesa/drivers/dri/glamo/glamo_context.h b/src/mesa/drivers/dri/glamo/glamo_context.h index 376e0a4b67..0cedbb233b 100644 --- a/src/mesa/drivers/dri/glamo/glamo_context.h +++ b/src/mesa/drivers/dri/glamo/glamo_context.h @@ -51,6 +51,7 @@ struct glamo_context { driOptionCache optionCache; uint16_t *cmdq_drm; /* Command queue cache */ + uint16_t cmd_burst_base; int cmdq_drm_used; int cmdq_drm_size; int cmdq_obj_used; diff --git a/src/mesa/drivers/dri/glamo/glamo_regs.h b/src/mesa/drivers/dri/glamo/glamo_regs.h index d996c1636f..2ba3036802 100644 --- a/src/mesa/drivers/dri/glamo/glamo_regs.h +++ b/src/mesa/drivers/dri/glamo/glamo_regs.h @@ -159,6 +159,6 @@ enum glamo_register_3d G3D_STREAM_BASE_6 = REG_3D(0x1f44), G3D_STREAM_MODE_7 = REG_3D(0x1f48), G3D_STREAM_BASE_7 = REG_3D(0x1f4c), -} +}; #endif /* _GLAMO_REGS_H */ diff --git a/src/mesa/drivers/dri/glamo/glamo_render.c b/src/mesa/drivers/dri/glamo/glamo_render.c index 7908359705..10cce63837 100644 --- a/src/mesa/drivers/dri/glamo/glamo_render.c +++ b/src/mesa/drivers/dri/glamo/glamo_render.c @@ -67,6 +67,7 @@ #include "glamo_context.h" #include "glamo_tris.h" +#include "glamo_regs.h" /* * Render unclipped vertex buffers by emitting vertices directly to @@ -93,15 +94,20 @@ static void glamoFlushPrim(struct glamo_context *gCtx) if ( gCtx->prim.vb_bo == NULL ) return; - gCtx->prim.start_offset = gCtx->prim.current_offset; - - glamo_bo_subdata(gCtx->prim.vb_bo, 0, gCtx->prim.start_offset, + /* Upload to hardware */ + glamo_bo_subdata(gCtx->prim.vb_bo, 0, gCtx->prim.current_offset, gCtx->prim.vb); /* Dispatch to the hardware */ +// glamoDRMAddCommand(gCtx, G3D_STREAM_MODE_0, 4, 0x000f0300); +// glamoDRMAddCommandBO(gCtx, G3D_STREAM_BASE_0, 4, gCtx->prim.vb_bo); +// glamoDRMDispatchCmdq(gCtx); /* Please use a new BO for the next buffer */ gCtx->prim.vb_bo = NULL; + + /* Continue from new start */ + gCtx->prim.start_offset = gCtx->prim.current_offset; } @@ -146,7 +152,6 @@ static inline GLuint glamoGetCurrentMax(struct glamo_context *gCtx) static GLboolean glamoRunRender(GLcontext *ctx, struct tnl_pipeline_stage *stage) { - struct glamo_context *gCtx = GLAMO_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; GLuint i; diff --git a/src/mesa/drivers/dri/glamo/glamo_state.c b/src/mesa/drivers/dri/glamo/glamo_state.c index e93bc71a1c..407b52c862 100644 --- a/src/mesa/drivers/dri/glamo/glamo_state.c +++ b/src/mesa/drivers/dri/glamo/glamo_state.c @@ -105,24 +105,23 @@ static void glamoClear(GLcontext *ctx, GLbitfield mask) grb = glamo_renderbuffer(fb->_ColorDrawBuffers[i]); - glamoDRMAddCommandBO(gCtx, GLAMO_REG_2D_DST_ADDRL, grb->bo); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_DST_PITCH, - grb->pitch & 0x7ff); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_DST_HEIGHT, - grb->height); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_PAT_FG, gCtx->col_clear); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_COMMAND2, 0xf0 << 8); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_DST_X, fb->_Xmin); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_DST_Y, fb->_Ymin); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_RECT_WIDTH, - fb->_Xmax-fb->_Xmin); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_RECT_HEIGHT, - fb->_Ymax-fb->_Ymin); - glamoDRMAddCommand(gCtx, GLAMO_REG_2D_COMMAND3, 0); - + glamoDRMStartBurst(gCtx, GLAMO_REG_2D_DST_ADDRL); + glamoDRMAddData(gCtx, fb->_Xmin, 2); + glamoDRMAddData(gCtx, fb->_Ymin, 2); + glamoDRMAddBO(gCtx, grb->bo); + glamoDRMAddData(gCtx, grb->pitch & 0x7ff, 2); + glamoDRMAddData(gCtx, grb->height, 2); + glamoDRMAddData(gCtx, fb->_Xmax-fb->_Xmin, 2); + glamoDRMAddData(gCtx, fb->_Ymax-fb->_Ymin, 2); + glamoDRMAddData(gCtx, 0x0000, 2); + glamoDRMAddData(gCtx, 0x0000, 2); + glamoDRMAddData(gCtx, gCtx->col_clear, 2); + glamoDRMDispatch(gCtx); + + glamoDRMStartBurst(gCtx, GLAMO_REG_2D_COMMAND2); + glamoDRMAddData(gCtx, 0xf0 << 8, 2); + glamoDRMDispatch(gCtx); } - - glamoDRMDispatch(gCtx); } -- cgit v1.2.3