Choose better alignment for heavy-duty rendering structures, patch by Matt Turner (#4981)

This commit is contained in:
Thilo Schulz 2011-05-09 23:39:40 +00:00
parent 185d2d6b60
commit 5f63ab9160
5 changed files with 11 additions and 4 deletions

View file

@ -183,8 +183,10 @@ typedef int sfxHandle_t;
typedef int fileHandle_t; typedef int fileHandle_t;
typedef int clipHandle_t; typedef int clipHandle_t;
#define PAD(x,y) (((x)+(y)-1) & ~((y)-1)) #define PAD(base, alignment) (((base)+(alignment)-1) & ~((alignment)-1))
#define PADLEN(x,y) (PAD((x), (y)) - (x)) #define PADLEN(base, alignment) (PAD((base), (alignment)) - (base))
#define PADP(base, alignment) ((void *) PAD((intptr_t) (base), (alignment)))
#ifdef __GNUC__ #ifdef __GNUC__
#define QALIGN(x) __attribute__((aligned(x))) #define QALIGN(x) __attribute__((aligned(x)))

View file

@ -1142,6 +1142,8 @@ void RB_ExecuteRenderCommands( const void *data ) {
} }
while ( 1 ) { while ( 1 ) {
data = PADP(data, sizeof(void *));
switch ( *(const int *)data ) { switch ( *(const int *)data ) {
case RC_SET_COLOR: case RC_SET_COLOR:
data = RB_SetColor( data ); data = RB_SetColor( data );

View file

@ -195,6 +195,7 @@ void *R_GetCommandBuffer( int bytes ) {
renderCommandList_t *cmdList; renderCommandList_t *cmdList;
cmdList = &backEndData[tr.smpFrame]->commands; cmdList = &backEndData[tr.smpFrame]->commands;
bytes = PAD(bytes, sizeof(void *));
// always leave room for the end of list command // always leave room for the end of list command
if ( cmdList->used + bytes + 4 > MAX_RENDER_COMMANDS ) { if ( cmdList->used + bytes + 4 > MAX_RENDER_COMMANDS ) {

View file

@ -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 // Allocate a few more bytes so that we can choose an alignment we like
buffer = ri.Hunk_AllocateTempMemory(padwidth * height + *offset + packAlign - 1); 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); qglReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, bufstart);
*offset = bufstart - buffer; *offset = bufstart - buffer;
@ -780,7 +780,7 @@ const void *RB_TakeVideoFrameCmd( const void *data )
avipadwidth = PAD(linelen, AVI_LINE_PADDING); avipadwidth = PAD(linelen, AVI_LINE_PADDING);
avipadlen = avipadwidth - linelen; 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, qglReadPixels(0, 0, cmd->width, cmd->height, GL_RGB,
GL_UNSIGNED_BYTE, cBuf); GL_UNSIGNED_BYTE, cBuf);

View file

@ -1878,6 +1878,8 @@ static void FixRenderCommandList( int newShader ) {
const void *curCmd = cmdList->cmds; const void *curCmd = cmdList->cmds;
while ( 1 ) { while ( 1 ) {
curCmd = PADP(curCmd, sizeof(void *));
switch ( *(const int *)curCmd ) { switch ( *(const int *)curCmd ) {
case RC_SET_COLOR: case RC_SET_COLOR:
{ {