summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2009-10-18 22:58:30 +0200
committerMartin Jansa <Martin.Jansa@gmail.com>2010-02-18 15:39:26 +0100
commit0e2cdc8dc0a219519007f3a44538d2061bb90f98 (patch)
treea049d0dbb757be2926c4a0fd9619b37161ade2d4
parent8e7289d8c5c7520a7ac01b294e5af16f36d919bf (diff)
Use burst commands instead of single commands
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_cmdq.c56
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_cmdq.h8
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_context.h1
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_regs.h2
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_render.c13
-rw-r--r--src/mesa/drivers/dri/glamo/glamo_state.c33
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);
}