diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index fe462e63..b0c38973 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -183,8 +183,10 @@ typedef int sfxHandle_t; typedef int fileHandle_t; typedef int clipHandle_t; -#define PAD(x,y) (((x)+(y)-1) & ~((y)-1)) -#define PADLEN(x,y) (PAD((x), (y)) - (x)) +#define PAD(base, alignment) (((base)+(alignment)-1) & ~((alignment)-1)) +#define PADLEN(base, alignment) (PAD((base), (alignment)) - (base)) + +#define PADP(base, alignment) ((void *) PAD((intptr_t) (base), (alignment))) #ifdef __GNUC__ #define QALIGN(x) __attribute__((aligned(x))) diff --git a/code/renderer/tr_backend.c b/code/renderer/tr_backend.c index 30c93685..24cdc4e4 100644 --- a/code/renderer/tr_backend.c +++ b/code/renderer/tr_backend.c @@ -1142,6 +1142,8 @@ void RB_ExecuteRenderCommands( const void *data ) { } while ( 1 ) { + data = PADP(data, sizeof(void *)); + switch ( *(const int *)data ) { case RC_SET_COLOR: data = RB_SetColor( data ); diff --git a/code/renderer/tr_cmds.c b/code/renderer/tr_cmds.c index 108299ca..3fe476eb 100644 --- a/code/renderer/tr_cmds.c +++ b/code/renderer/tr_cmds.c @@ -195,6 +195,7 @@ void *R_GetCommandBuffer( int bytes ) { renderCommandList_t *cmdList; cmdList = &backEndData[tr.smpFrame]->commands; + bytes = PAD(bytes, sizeof(void *)); // always leave room for the end of list command if ( cmdList->used + bytes + 4 > MAX_RENDER_COMMANDS ) { diff --git a/code/renderer/tr_init.c b/code/renderer/tr_init.c index cc4d723f..16c68a95 100644 --- a/code/renderer/tr_init.c +++ b/code/renderer/tr_init.c @@ -382,7 +382,7 @@ byte *RB_ReadPixels(int x, int y, int width, int height, size_t *offset, int *pa // Allocate a few more bytes so that we can choose an alignment we like buffer = ri.Hunk_AllocateTempMemory(padwidth * height + *offset + packAlign - 1); - bufstart = (byte *) PAD((intptr_t) buffer + *offset, packAlign); + bufstart = PADP((intptr_t) buffer + *offset, packAlign); qglReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, bufstart); *offset = bufstart - buffer; @@ -780,7 +780,7 @@ const void *RB_TakeVideoFrameCmd( const void *data ) avipadwidth = PAD(linelen, AVI_LINE_PADDING); avipadlen = avipadwidth - linelen; - cBuf = (byte *) PAD((intptr_t) cmd->captureBuffer, packAlign); + cBuf = PADP(cmd->captureBuffer, packAlign); qglReadPixels(0, 0, cmd->width, cmd->height, GL_RGB, GL_UNSIGNED_BYTE, cBuf); diff --git a/code/renderer/tr_shader.c b/code/renderer/tr_shader.c index a88ba2bd..b1b4c569 100644 --- a/code/renderer/tr_shader.c +++ b/code/renderer/tr_shader.c @@ -1878,6 +1878,8 @@ static void FixRenderCommandList( int newShader ) { const void *curCmd = cmdList->cmds; while ( 1 ) { + curCmd = PADP(curCmd, sizeof(void *)); + switch ( *(const int *)curCmd ) { case RC_SET_COLOR: {