Navigation Menu

Skip to content

Commit

Permalink
Several preshader fixes and static analysis tweaks.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Oct 25, 2011
1 parent bf298b1 commit 5af2b9c
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 12 deletions.
33 changes: 22 additions & 11 deletions mojoshader_effects.c
Expand Up @@ -27,11 +27,11 @@ void MOJOSHADER_runPreshader(const MOJOSHADER_preshader *preshader,
memset(temps, '\0', sizeof (double) * preshader->temp_count);
} // if

double dst[4];
double src[3][4];
const double *src0 = src[0];
const double *src1 = src[1];
const double *src2 = src[2];
double dst[4] = { 0, 0, 0, 0 };
double src[3][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
const double *src0 = &src[0][0];
const double *src1 = &src[1][0];
const double *src2 = &src[2][0];

MOJOSHADER_preshaderInstruction *inst = preshader->instructions;
int instit;
Expand All @@ -43,6 +43,9 @@ void MOJOSHADER_runPreshader(const MOJOSHADER_preshader *preshader,
const int elemsbytes = sizeof (double) * elems;
const int isscalarop = (inst->opcode >= scalarstart);

assert(elems >= 0);
assert(elems <= 4);

// load up our operands...
int opiter, elemiter;
for (opiter = 0; opiter < inst->operand_count-1; opiter++, operand++)
Expand All @@ -54,8 +57,9 @@ void MOJOSHADER_runPreshader(const MOJOSHADER_preshader *preshader,
case MOJOSHADER_PRESHADEROPERAND_LITERAL:
{
const double *lit = &preshader->literals[index];
assert((index + elems) <= preshader->literal_count);
if (!isscalar)
memcpy(src[opiter], lit, elemsbytes);
memcpy(&src[opiter][0], lit, elemsbytes);
else
{
const double val = *lit;
Expand Down Expand Up @@ -88,15 +92,18 @@ void MOJOSHADER_runPreshader(const MOJOSHADER_preshader *preshader,
break;

case MOJOSHADER_PRESHADEROPERAND_TEMP:
if (isscalar)
src[opiter][0] = temps[index];
else
memcpy(src[opiter], temps + index, elemsbytes);
if (temps != NULL)
{
if (isscalar)
src[opiter][0] = temps[index];
else
memcpy(src[opiter], temps + index, elemsbytes);
} // if
break;

default:
assert(0 && "unexpected preshader operand type.");
break;
return;
} // switch
} // for

Expand Down Expand Up @@ -170,7 +177,11 @@ void MOJOSHADER_runPreshader(const MOJOSHADER_preshader *preshader,

// Figure out where dst wants to be stored.
if (operand->type == MOJOSHADER_PRESHADEROPERAND_TEMP)
{
assert(preshader->temp_count >=
operand->index + (elemsbytes / sizeof (double)));
memcpy(temps + operand->index, dst, elemsbytes);
} // if
else
{
assert(operand->type == MOJOSHADER_PRESHADEROPERAND_OUTPUT);
Expand Down
2 changes: 1 addition & 1 deletion mojoshader_opengl.c
Expand Up @@ -1429,7 +1429,7 @@ static int lookup_uniforms(MOJOSHADER_glProgram *program,

if (largest > 0)
{
const size_t len = largest * sizeof (GLfloat);
const size_t len = largest * sizeof (GLfloat) * 4;
GLfloat *buf = (GLfloat *) Malloc(len);
if (buf == NULL)
return 0;
Expand Down

0 comments on commit 5af2b9c

Please sign in to comment.