Use MAKE_SWIZZLE4() macro in a few more places.
Clean up the parse_extended_swizzle_mask() and parse_swizzle_mask() functions.
This commit is contained in:
+101
-122
@@ -41,7 +41,7 @@
|
||||
#include "nvfragprog.h"
|
||||
#include "arbprogparse.h"
|
||||
#include "grammar_mesa.h"
|
||||
|
||||
#include "program.h"
|
||||
#include "dispatch.h"
|
||||
|
||||
#ifndef __extension__
|
||||
@@ -2395,100 +2395,85 @@ parse_masked_address_reg (GLcontext * ctx, GLubyte ** inst,
|
||||
/**
|
||||
* Parse out a swizzle mask.
|
||||
*
|
||||
* The values in the input stream are:
|
||||
* COMPONENT_X -> x/r
|
||||
* COMPONENT_Y -> y/g
|
||||
* COMPONENT_Z-> z/b
|
||||
* COMPONENT_W-> w/a
|
||||
*
|
||||
* The values in the output mask are:
|
||||
* 0 -> x/r
|
||||
* 1 -> y/g
|
||||
* 2 -> z/b
|
||||
* 3 -> w/a
|
||||
* Basically convert COMPONENT_X/Y/Z/W to SWIZZLE_X/Y/Z/W
|
||||
*
|
||||
* The len parameter allows us to grab 4 components for a vector
|
||||
* swizzle, or just 1 component for a scalar src register selection
|
||||
*/
|
||||
static GLuint
|
||||
parse_swizzle_mask (GLubyte ** inst, GLubyte * mask, GLint len)
|
||||
static void
|
||||
parse_swizzle_mask(GLubyte ** inst, GLubyte *swizzle, GLint len)
|
||||
{
|
||||
GLint a;
|
||||
GLint i;
|
||||
|
||||
for (a = 0; a < 4; a++)
|
||||
mask[a] = a;
|
||||
for (i = 0; i < 4; i++)
|
||||
swizzle[i] = i;
|
||||
|
||||
for (a = 0; a < len; a++) {
|
||||
for (i = 0; i < len; i++) {
|
||||
switch (*(*inst)++) {
|
||||
case COMPONENT_X:
|
||||
mask[a] = 0;
|
||||
swizzle[i] = SWIZZLE_X;
|
||||
break;
|
||||
|
||||
case COMPONENT_Y:
|
||||
mask[a] = 1;
|
||||
swizzle[i] = SWIZZLE_Y;
|
||||
break;
|
||||
|
||||
case COMPONENT_Z:
|
||||
mask[a] = 2;
|
||||
swizzle[i] = SWIZZLE_Z;
|
||||
break;
|
||||
|
||||
case COMPONENT_W:
|
||||
mask[a] = 3;
|
||||
swizzle[i] = SWIZZLE_W;
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "bad component in parse_swizzle_mask()");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
static GLuint
|
||||
parse_extended_swizzle_mask(GLubyte **inst, GLubyte *mask, GLubyte *negate)
|
||||
{
|
||||
GLint a;
|
||||
GLubyte swz;
|
||||
|
||||
*negate = 0x0;
|
||||
for (a = 0; a < 4; a++) {
|
||||
if (parse_sign (inst) == -1)
|
||||
*negate |= (1 << a);
|
||||
/**
|
||||
* Parse an extended swizzle mask which is a sequence of
|
||||
* four x/y/z/w/0/1 tokens.
|
||||
* \return swizzle four swizzle values
|
||||
* \return negateMask four element bitfield
|
||||
*/
|
||||
static void
|
||||
parse_extended_swizzle_mask(GLubyte **inst, GLubyte swizzle[4],
|
||||
GLubyte *negateMask)
|
||||
{
|
||||
GLint i;
|
||||
|
||||
*negateMask = 0x0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
GLubyte swz;
|
||||
if (parse_sign(inst) == -1)
|
||||
*negateMask |= (1 << i);
|
||||
|
||||
swz = *(*inst)++;
|
||||
|
||||
switch (swz) {
|
||||
case COMPONENT_0:
|
||||
mask[a] = SWIZZLE_ZERO;
|
||||
swizzle[i] = SWIZZLE_ZERO;
|
||||
break;
|
||||
case COMPONENT_1:
|
||||
mask[a] = SWIZZLE_ONE;
|
||||
swizzle[i] = SWIZZLE_ONE;
|
||||
break;
|
||||
case COMPONENT_X:
|
||||
mask[a] = SWIZZLE_X;
|
||||
swizzle[i] = SWIZZLE_X;
|
||||
break;
|
||||
case COMPONENT_Y:
|
||||
mask[a] = SWIZZLE_Y;
|
||||
swizzle[i] = SWIZZLE_Y;
|
||||
break;
|
||||
case COMPONENT_Z:
|
||||
mask[a] = SWIZZLE_Z;
|
||||
swizzle[i] = SWIZZLE_Z;
|
||||
break;
|
||||
case COMPONENT_W:
|
||||
mask[a] = SWIZZLE_W;
|
||||
swizzle[i] = SWIZZLE_W;
|
||||
break;
|
||||
|
||||
default:
|
||||
_mesa_problem(NULL, "bad case in parse_extended_swizzle_mask()");
|
||||
return;
|
||||
}
|
||||
#if 0
|
||||
if (swz == 0)
|
||||
mask[a] = SWIZZLE_ZERO;
|
||||
else if (swz == 1)
|
||||
mask[a] = SWIZZLE_ONE;
|
||||
else
|
||||
mask[a] = swz - 2;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2657,37 +2642,33 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head,
|
||||
/**
|
||||
*/
|
||||
static GLuint
|
||||
parse_fp_vector_src_reg (GLcontext * ctx, GLubyte ** inst,
|
||||
struct var_cache **vc_head, struct arb_program *Program,
|
||||
struct fp_src_register *reg )
|
||||
parse_fp_vector_src_reg(GLcontext * ctx, GLubyte ** inst,
|
||||
struct var_cache **vc_head,
|
||||
struct arb_program *program,
|
||||
struct fp_src_register *reg)
|
||||
{
|
||||
|
||||
GLint File;
|
||||
GLint Index;
|
||||
GLboolean Negate;
|
||||
GLubyte Swizzle[4];
|
||||
GLboolean IsRelOffset;
|
||||
GLint file;
|
||||
GLint index;
|
||||
GLboolean negate;
|
||||
GLubyte swizzle[4];
|
||||
GLboolean isRelOffset;
|
||||
|
||||
/* Grab the sign */
|
||||
Negate = (parse_sign (inst) == -1) ? 0xf : 0x0;
|
||||
negate = (parse_sign (inst) == -1) ? 0xf : 0x0;
|
||||
|
||||
/* And the src reg */
|
||||
if (parse_src_reg (ctx, inst, vc_head, Program, &File, &Index, &IsRelOffset))
|
||||
if (parse_src_reg(ctx, inst, vc_head, program, &file, &index, &isRelOffset))
|
||||
return 1;
|
||||
|
||||
/* finally, the swizzle */
|
||||
parse_swizzle_mask (inst, Swizzle, 4);
|
||||
parse_swizzle_mask(inst, swizzle, 4);
|
||||
|
||||
reg->File = File;
|
||||
reg->Index = Index;
|
||||
reg->File = file;
|
||||
reg->Index = index;
|
||||
reg->Abs = 0; /* NV only */
|
||||
reg->NegateAbs = 0; /* NV only */
|
||||
reg->NegateBase = Negate;
|
||||
reg->Swizzle = (Swizzle[0] << 0 |
|
||||
Swizzle[1] << 3 |
|
||||
Swizzle[2] << 6 |
|
||||
Swizzle[3] << 9);
|
||||
|
||||
reg->NegateBase = negate;
|
||||
reg->Swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1], swizzle[2], swizzle[3]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2732,7 +2713,7 @@ parse_fp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst,
|
||||
return 1;
|
||||
|
||||
/* finally, the swizzle */
|
||||
parse_swizzle_mask (inst, Swizzle, 1);
|
||||
parse_swizzle_mask(inst, Swizzle, 1);
|
||||
|
||||
reg->File = File;
|
||||
reg->Index = Index;
|
||||
@@ -3036,20 +3017,20 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst,
|
||||
return 1;
|
||||
|
||||
{
|
||||
GLubyte Swizzle[4];
|
||||
GLubyte swizzle[4];
|
||||
GLubyte negateMask;
|
||||
GLint File, Index;
|
||||
GLint file, index;
|
||||
|
||||
if (parse_src_reg(ctx, inst, vc_head, Program, &File, &Index, &rel))
|
||||
if (parse_src_reg(ctx, inst, vc_head, Program, &file, &index, &rel))
|
||||
return 1;
|
||||
parse_extended_swizzle_mask (inst, Swizzle, &negateMask);
|
||||
fp->SrcReg[0].File = File;
|
||||
fp->SrcReg[0].Index = Index;
|
||||
parse_extended_swizzle_mask(inst, swizzle, &negateMask);
|
||||
fp->SrcReg[0].File = file;
|
||||
fp->SrcReg[0].Index = index;
|
||||
fp->SrcReg[0].NegateBase = negateMask;
|
||||
fp->SrcReg[0].Swizzle = (Swizzle[0] << 0 |
|
||||
Swizzle[1] << 3 |
|
||||
Swizzle[2] << 6 |
|
||||
Swizzle[3] << 9);
|
||||
fp->SrcReg[0].Swizzle = MAKE_SWIZZLE4(swizzle[0],
|
||||
swizzle[1],
|
||||
swizzle[2],
|
||||
swizzle[3]);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -3170,35 +3151,33 @@ parse_vp_address_reg (GLcontext * ctx, GLubyte ** inst,
|
||||
/**
|
||||
*/
|
||||
static GLuint
|
||||
parse_vp_vector_src_reg (GLcontext * ctx, GLubyte ** inst,
|
||||
struct var_cache **vc_head, struct arb_program *Program,
|
||||
struct vp_src_register *reg )
|
||||
parse_vp_vector_src_reg(GLcontext * ctx, GLubyte ** inst,
|
||||
struct var_cache **vc_head,
|
||||
struct arb_program *program,
|
||||
struct vp_src_register *reg )
|
||||
{
|
||||
|
||||
GLint File;
|
||||
GLint Index;
|
||||
GLboolean Negate;
|
||||
GLubyte Swizzle[4];
|
||||
GLboolean IsRelOffset;
|
||||
GLint file;
|
||||
GLint index;
|
||||
GLboolean negate;
|
||||
GLubyte swizzle[4];
|
||||
GLboolean isRelOffset;
|
||||
|
||||
/* Grab the sign */
|
||||
Negate = (parse_sign (inst) == -1) ? 0xf : 0x0;
|
||||
negate = (parse_sign (inst) == -1) ? 0xf : 0x0;
|
||||
|
||||
/* And the src reg */
|
||||
if (parse_src_reg (ctx, inst, vc_head, Program, &File, &Index, &IsRelOffset))
|
||||
if (parse_src_reg (ctx, inst, vc_head, program, &file, &index, &isRelOffset))
|
||||
return 1;
|
||||
|
||||
/* finally, the swizzle */
|
||||
parse_swizzle_mask (inst, Swizzle, 4);
|
||||
parse_swizzle_mask(inst, swizzle, 4);
|
||||
|
||||
reg->File = File;
|
||||
reg->Index = Index;
|
||||
reg->Swizzle = ((Swizzle[0] << 0) |
|
||||
(Swizzle[1] << 3) |
|
||||
(Swizzle[2] << 6) |
|
||||
(Swizzle[3] << 9));
|
||||
reg->Negate = Negate;
|
||||
reg->RelAddr = IsRelOffset;
|
||||
reg->File = file;
|
||||
reg->Index = index;
|
||||
reg->Swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1],
|
||||
swizzle[2], swizzle[3]);
|
||||
reg->Negate = negate;
|
||||
reg->RelAddr = isRelOffset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3223,7 +3202,7 @@ parse_vp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst,
|
||||
return 1;
|
||||
|
||||
/* finally, the swizzle */
|
||||
parse_swizzle_mask (inst, Swizzle, 1);
|
||||
parse_swizzle_mask(inst, Swizzle, 1);
|
||||
|
||||
reg->File = File;
|
||||
reg->Index = Index;
|
||||
@@ -3421,25 +3400,25 @@ parse_vp_instruction (GLcontext * ctx, GLubyte ** inst,
|
||||
break;
|
||||
}
|
||||
{
|
||||
GLubyte Swizzle[4];
|
||||
GLubyte NegateMask;
|
||||
GLboolean RelAddr;
|
||||
GLint File, Index;
|
||||
GLubyte swizzle[4];
|
||||
GLubyte negateMask;
|
||||
GLboolean relAddr;
|
||||
GLint file, index;
|
||||
|
||||
if (parse_vp_dst_reg(ctx, inst, vc_head, Program, &vp->DstReg))
|
||||
return 1;
|
||||
|
||||
if (parse_src_reg(ctx, inst, vc_head, Program, &File, &Index, &RelAddr))
|
||||
if (parse_src_reg(ctx, inst, vc_head, Program, &file, &index, &relAddr))
|
||||
return 1;
|
||||
parse_extended_swizzle_mask (inst, Swizzle, &NegateMask);
|
||||
vp->SrcReg[0].File = File;
|
||||
vp->SrcReg[0].Index = Index;
|
||||
vp->SrcReg[0].Negate = NegateMask;
|
||||
vp->SrcReg[0].Swizzle = (Swizzle[0] << 0 |
|
||||
Swizzle[1] << 3 |
|
||||
Swizzle[2] << 6 |
|
||||
Swizzle[3] << 9);
|
||||
vp->SrcReg[0].RelAddr = RelAddr;
|
||||
parse_extended_swizzle_mask (inst, swizzle, &negateMask);
|
||||
vp->SrcReg[0].File = file;
|
||||
vp->SrcReg[0].Index = index;
|
||||
vp->SrcReg[0].Negate = negateMask;
|
||||
vp->SrcReg[0].Swizzle = MAKE_SWIZZLE4(swizzle[0],
|
||||
swizzle[1],
|
||||
swizzle[2],
|
||||
swizzle[3]);
|
||||
vp->SrcReg[0].RelAddr = relAddr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user