Bring the texcombine fixes to the trunk.
This commit is contained in:
@@ -1038,8 +1038,8 @@
|
||||
#define HC_HTXnTBA_MASK 0x000000ff
|
||||
#define HC_HTXnTRAH_SHIFT 16
|
||||
#define HC_HTXnTRAL_SHIFT 8
|
||||
/* HC_SubA_HTXnTBLCsat 0x0080
|
||||
*-- Define the input texture.
|
||||
|
||||
/*-- Define the input texture, for below
|
||||
*/
|
||||
#define HC_XTC_TOPC 0x00000000
|
||||
#define HC_XTC_InvTOPC 0x00000010
|
||||
@@ -1057,7 +1057,7 @@
|
||||
#define HC_XTC_Acur 0x00000008
|
||||
#define HC_XTC_HTXnTBLRC 0x00000009
|
||||
#define HC_XTC_Ctexnext 0x0000000a
|
||||
/*--
|
||||
/** HC_SubA_HTXnTBLCsat 0x0080
|
||||
*/
|
||||
#define HC_HTXnTBLCsat_MASK 0x00800000
|
||||
#define HC_HTXnTBLCa_MASK 0x000fc000
|
||||
@@ -1137,8 +1137,6 @@
|
||||
#define HC_HTXnTBLCshift_2 0x00000800
|
||||
#define HC_HTXnTBLCshift_No 0x00001000
|
||||
#define HC_HTXnTBLCshift_DotP 0x00001800
|
||||
/*=* John Sheng [2003.7.18] texture combine *=*/
|
||||
|
||||
#define HC_HTXnTBLAop_Add 0x00000000
|
||||
#define HC_HTXnTBLAop_Sub 0x00000080
|
||||
#define HC_HTXnTBLAop_Min 0x00000100
|
||||
|
||||
@@ -250,11 +250,11 @@ static const char * const card_extensions[] =
|
||||
"GL_ARB_point_parameters",
|
||||
"GL_ARB_texture_env_add",
|
||||
"GL_ARB_texture_env_combine",
|
||||
"GL_ARB_texture_env_dot3",
|
||||
/* "GL_ARB_texture_env_dot3", */
|
||||
"GL_ARB_texture_mirrored_repeat",
|
||||
"GL_EXT_stencil_wrap",
|
||||
"GL_EXT_texture_env_combine",
|
||||
"GL_EXT_texture_env_dot3",
|
||||
/* "GL_EXT_texture_env_dot3", */
|
||||
"GL_EXT_texture_lod_bias",
|
||||
"GL_EXT_secondary_color",
|
||||
"GL_EXT_fog_coord",
|
||||
@@ -273,7 +273,9 @@ static const struct tnl_pipeline_stage *via_pipeline[] = {
|
||||
&_tnl_texgen_stage,
|
||||
&_tnl_texture_transform_stage,
|
||||
/* REMOVE: point attenuation stage */
|
||||
#if 0
|
||||
&_via_fastrender_stage, /* ADD: unclipped rastersetup-to-dma */
|
||||
#endif
|
||||
&_tnl_render_stage,
|
||||
0,
|
||||
};
|
||||
|
||||
@@ -355,8 +355,9 @@ extern void viaXMesaSetFrontClipRects(viaContextPtr vmesa);
|
||||
extern void viaReAllocateBuffers(GLframebuffer *drawbuffer);
|
||||
extern void viaXMesaWindowMoved(viaContextPtr vmesa);
|
||||
|
||||
extern void viaTexCombineState(viaContextPtr vmesa,
|
||||
const struct gl_tex_env_combine_state * combine, unsigned unit );
|
||||
extern GLboolean viaTexCombineState(viaContextPtr vmesa,
|
||||
const struct gl_tex_env_combine_state * combine,
|
||||
unsigned unit );
|
||||
|
||||
/* Via hw already adjusted for GL pixel centers:
|
||||
*/
|
||||
|
||||
@@ -325,6 +325,16 @@ void viaEmitState(viaContextPtr vmesa)
|
||||
OUT_RING( (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa_0 );
|
||||
OUT_RING( (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc_0 );
|
||||
OUT_RING( (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias_0 );
|
||||
|
||||
if (0) {
|
||||
fprintf(stderr, "emitted Ca_0 %08x\n", vmesa->regHTXnTBLRCa_0);
|
||||
fprintf(stderr, "emitted Cb_0 %08x\n", vmesa->regHTXnTBLRCb_0);
|
||||
fprintf(stderr, "emitted Cc_0 %08x\n", vmesa->regHTXnTBLRCc_0);
|
||||
fprintf(stderr, "emitted Cbias_0 %08x\n", vmesa->regHTXnTBLRCbias_0);
|
||||
fprintf(stderr, "emitted Aa_0 %08x\n", vmesa->regHTXnTBLRAa_0);
|
||||
fprintf(stderr, "emitted Fog_0 %08x\n", vmesa->regHTXnTBLRFog_0);
|
||||
}
|
||||
|
||||
ADVANCE_RING();
|
||||
|
||||
if (t->regTexFM == HC_HTXnFM_Index8) {
|
||||
@@ -841,7 +851,7 @@ get_wrap_mode( GLenum sWrap, GLenum tWrap )
|
||||
}
|
||||
|
||||
|
||||
static void viaChooseTextureState(GLcontext *ctx)
|
||||
static GLboolean viaChooseTextureState(GLcontext *ctx)
|
||||
{
|
||||
viaContextPtr vmesa = VIA_CONTEXT(ctx);
|
||||
struct gl_texture_unit *texUnit0 = &ctx->Texture.Unit[0];
|
||||
@@ -928,7 +938,8 @@ static void viaChooseTextureState(GLcontext *ctx)
|
||||
|
||||
if (VIA_DEBUG) fprintf(stderr, "texUnit0->EnvMode %x\n",texUnit0->EnvMode);
|
||||
|
||||
viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 );
|
||||
if (!viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 ))
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (texUnit1->_ReallyEnabled) {
|
||||
@@ -986,7 +997,8 @@ static void viaChooseTextureState(GLcontext *ctx)
|
||||
vmesa->regHTXnMPMD_1 |= get_wrap_mode( texObj->WrapS,
|
||||
texObj->WrapT );
|
||||
|
||||
viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 );
|
||||
if (!viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 ))
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (VIA_DEBUG) {
|
||||
@@ -1007,6 +1019,7 @@ static void viaChooseTextureState(GLcontext *ctx)
|
||||
}
|
||||
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static void viaChooseColorState(GLcontext *ctx)
|
||||
@@ -1533,8 +1546,10 @@ void viaValidateState( GLcontext *ctx )
|
||||
viaContextPtr vmesa = VIA_CONTEXT(ctx);
|
||||
|
||||
if (vmesa->newState & _NEW_TEXTURE) {
|
||||
viaChooseTextureState(ctx);
|
||||
viaUpdateTextureState(ctx); /* May modify vmesa->Fallback */
|
||||
GLboolean ok = (viaChooseTextureState(ctx) &&
|
||||
viaUpdateTextureState(ctx));
|
||||
|
||||
FALLBACK(vmesa, VIA_FALLBACK_TEXTURE, !ok);
|
||||
}
|
||||
|
||||
if (vmesa->newState & _NEW_COLOR)
|
||||
|
||||
@@ -92,7 +92,7 @@ struct via_texture_object_t {
|
||||
};
|
||||
|
||||
viaTextureObjectPtr viaAllocTextureObject(struct gl_texture_object *texObj);
|
||||
void viaUpdateTextureState(GLcontext *ctx);
|
||||
GLboolean viaUpdateTextureState(GLcontext *ctx);
|
||||
void viaInitTextureFuncs(struct dd_function_table * functions);
|
||||
void viaInitTextures(GLcontext *ctx);
|
||||
|
||||
|
||||
@@ -58,7 +58,6 @@
|
||||
#define INPUT_B_SHIFT 7
|
||||
#define INPUT_C_SHIFT 0
|
||||
#define INPUT_CBias_SHIFT 14
|
||||
#define INPUT_ABias_SHIFT 3
|
||||
|
||||
#define CONST_ONE (HC_XTC_0 | HC_XTC_InvTOPC)
|
||||
|
||||
@@ -73,6 +72,11 @@ static const unsigned alpha_operand_modifier[2] = {
|
||||
0, HC_XTA_InvTOPA
|
||||
};
|
||||
|
||||
static const unsigned bias_alpha_operand_modifier[2] = {
|
||||
0, HC_HTXnTBLAbias_Inv
|
||||
};
|
||||
|
||||
|
||||
static const unsigned c_shift_table[3] = {
|
||||
HC_HTXnTBLCshift_No, HC_HTXnTBLCshift_1, HC_HTXnTBLCshift_2
|
||||
};
|
||||
@@ -102,15 +106,16 @@ static const unsigned a_shift_table[3] = {
|
||||
* KW: needs attention to the case where texunit 1 is enabled but
|
||||
* texunit 0 is not.
|
||||
*/
|
||||
void
|
||||
GLboolean
|
||||
viaTexCombineState( viaContextPtr vmesa,
|
||||
const struct gl_tex_env_combine_state * combine,
|
||||
unsigned unit )
|
||||
{
|
||||
unsigned color_arg[3];
|
||||
unsigned alpha_arg[3];
|
||||
unsigned color = 0;
|
||||
unsigned alpha = 0;
|
||||
unsigned bias_alpha_arg[3];
|
||||
unsigned color = HC_HTXnTBLCsat_MASK;
|
||||
unsigned alpha = HC_HTXnTBLAsat_MASK;
|
||||
unsigned bias = 0;
|
||||
unsigned op = 0;
|
||||
unsigned a_shift = combine->ScaleShiftA;
|
||||
@@ -118,11 +123,18 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
unsigned i;
|
||||
unsigned constant_color[3];
|
||||
unsigned ordered_constant_color[4];
|
||||
unsigned constant_alpha = 0;
|
||||
unsigned constant_alpha[3];
|
||||
unsigned bias_alpha = 0;
|
||||
unsigned abc_alpha = 0;
|
||||
const struct gl_texture_unit const * texUnit = & vmesa->glCtx->Texture.Unit[unit];
|
||||
unsigned env_color[4];
|
||||
|
||||
/* It seems that the color clamping can be overwhelmed at the 4x
|
||||
* scale settings, necessitating this fallback:
|
||||
*/
|
||||
if (c_shift == 2 || a_shift == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
CLAMPED_FLOAT_TO_UBYTE(env_color[0], texUnit->EnvColor[0]);
|
||||
CLAMPED_FLOAT_TO_UBYTE(env_color[1], texUnit->EnvColor[1]);
|
||||
@@ -131,6 +143,7 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
|
||||
(void) memset( constant_color, 0, sizeof( constant_color ) );
|
||||
(void) memset( ordered_constant_color, 0, sizeof( ordered_constant_color ) );
|
||||
(void) memset( constant_alpha, 0, sizeof( constant_alpha ) );
|
||||
|
||||
for ( i = 0 ; i < combine->_NumArgsRGB ; i++ ) {
|
||||
const GLint op = combine->OperandRGB[i] - GL_SRC_COLOR;
|
||||
@@ -177,30 +190,6 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
}
|
||||
}
|
||||
|
||||
for ( i = 0 ; i < combine->_NumArgsA ; i++ ) {
|
||||
const GLint op = combine->OperandA[i] - GL_SRC_ALPHA;
|
||||
|
||||
switch ( combine->SourceA[i] ) {
|
||||
case GL_TEXTURE:
|
||||
alpha_arg[i] = HC_XTA_Atex;
|
||||
alpha_arg[i] += alpha_operand_modifier[op];
|
||||
break;
|
||||
case GL_CONSTANT:
|
||||
alpha_arg[i] = HC_XTA_HTXnTBLRA;
|
||||
constant_alpha = (op == 0)
|
||||
? env_color[3] : ~(env_color[3]) & 0x000000ff;
|
||||
break;
|
||||
case GL_PRIMARY_COLOR:
|
||||
alpha_arg[i] = HC_XTA_Adif;
|
||||
alpha_arg[i] += alpha_operand_modifier[op];
|
||||
break;
|
||||
case GL_PREVIOUS:
|
||||
alpha_arg[i] = (unit == 0) ? HC_XTA_Adif : HC_XTA_Acur;
|
||||
alpha_arg[i] += alpha_operand_modifier[op];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* On the Unichrome, all combine operations take on some form of:
|
||||
*
|
||||
@@ -210,30 +199,32 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
* and mask modes are currently unused. With the exception of DOT3, all
|
||||
* standard GL_COMBINE modes can be implemented simply by selecting the
|
||||
* correct inputs for A, B, C, and Bias and the correct operation for op.
|
||||
*
|
||||
* NOTE: xBias (when read from the constant registers) is signed,
|
||||
* and scaled to fit -255..255 in 8 bits, ie 0x1 == 2.
|
||||
*/
|
||||
|
||||
color = HC_HTXnTBLCsat_MASK;
|
||||
alpha = HC_HTXnTBLAsat_MASK;
|
||||
|
||||
switch( combine->ModeRGB ) {
|
||||
/* Ca = 0, Cb = 0, Cc = 0, Cbias = arg0
|
||||
/* Ca = 1.0, Cb = arg0, Cc = 0, Cbias = 0
|
||||
*/
|
||||
case GL_REPLACE:
|
||||
bias |= (color_arg[0] << INPUT_CBias_SHIFT);
|
||||
ordered_constant_color[3] = constant_color[0];
|
||||
color |= ((CONST_ONE << INPUT_A_SHIFT) |
|
||||
(color_arg[0] << INPUT_B_SHIFT));
|
||||
|
||||
ordered_constant_color[1] = constant_color[0];
|
||||
break;
|
||||
|
||||
/* Ca = arg[0], Cb = arg[1], Cc = 0, Cbias = 0
|
||||
*/
|
||||
case GL_MODULATE:
|
||||
color |= (color_arg[0] << INPUT_A_SHIFT)
|
||||
| (color_arg[1] << INPUT_B_SHIFT);
|
||||
color |= ((color_arg[0] << INPUT_A_SHIFT) |
|
||||
(color_arg[1] << INPUT_B_SHIFT));
|
||||
|
||||
ordered_constant_color[0] = constant_color[0];
|
||||
ordered_constant_color[1] = constant_color[1];
|
||||
break;
|
||||
|
||||
/* Ca = 1.0, Cb = arg[0], Cc = 0, Cbias = arg[1]
|
||||
/* Ca = 1.0, Cb = arg[0], Cc = arg[1], Cbias = 0
|
||||
*/
|
||||
case GL_ADD:
|
||||
case GL_SUBTRACT:
|
||||
@@ -241,25 +232,26 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
op |= HC_HTXnTBLCop_Sub;
|
||||
}
|
||||
|
||||
color |= (color_arg[0] << INPUT_B_SHIFT)
|
||||
| (CONST_ONE << INPUT_A_SHIFT);
|
||||
|
||||
bias |= (color_arg[1] << INPUT_CBias_SHIFT);
|
||||
ordered_constant_color[1] = constant_color[0];
|
||||
ordered_constant_color[3] = constant_color[1];
|
||||
break;
|
||||
|
||||
/* Ca = 0, Cb = arg[0], Cc = arg[1], Cbias = 0.5
|
||||
*/
|
||||
case GL_ADD_SIGNED:
|
||||
color |= (color_arg[0] << INPUT_B_SHIFT)
|
||||
| (color_arg[1] << INPUT_C_SHIFT);
|
||||
bias |= HC_HTXnTBLCbias_HTXnTBLRC;
|
||||
op |= HC_HTXnTBLCop_Sub;
|
||||
color |= ((CONST_ONE << INPUT_A_SHIFT) |
|
||||
(color_arg[0] << INPUT_B_SHIFT) |
|
||||
(color_arg[1] << INPUT_C_SHIFT));
|
||||
|
||||
ordered_constant_color[1] = constant_color[0];
|
||||
ordered_constant_color[2] = constant_color[1];
|
||||
ordered_constant_color[3] = 0x00808080;
|
||||
break;
|
||||
|
||||
/* Ca = 1.0, Cb = arg[0], Cc = arg[1], Cbias = -0.5
|
||||
*/
|
||||
case GL_ADD_SIGNED:
|
||||
color |= ((CONST_ONE << INPUT_A_SHIFT) |
|
||||
(color_arg[0] << INPUT_B_SHIFT) |
|
||||
(color_arg[1] << INPUT_C_SHIFT));
|
||||
|
||||
bias |= HC_HTXnTBLCbias_HTXnTBLRC;
|
||||
|
||||
ordered_constant_color[1] = constant_color[0];
|
||||
ordered_constant_color[2] = constant_color[1];
|
||||
ordered_constant_color[3] = 0x00bfbfbf; /* -.5 */
|
||||
break;
|
||||
|
||||
/* Ca = arg[2], Cb = arg[0], Cc = arg[1], Cbias = arg[1]
|
||||
@@ -267,17 +259,19 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
case GL_INTERPOLATE:
|
||||
op |= HC_HTXnTBLCop_Sub;
|
||||
|
||||
color |= (color_arg[2] << INPUT_A_SHIFT) |
|
||||
(color_arg[0] << INPUT_B_SHIFT) |
|
||||
(color_arg[1] << INPUT_C_SHIFT);
|
||||
color |= ((color_arg[2] << INPUT_A_SHIFT) |
|
||||
(color_arg[0] << INPUT_B_SHIFT) |
|
||||
(color_arg[1] << INPUT_C_SHIFT));
|
||||
|
||||
bias |= (color_arg[1] << INPUT_CBias_SHIFT);
|
||||
|
||||
ordered_constant_color[0] = constant_color[2];
|
||||
ordered_constant_color[1] = constant_color[0];
|
||||
ordered_constant_color[2] = constant_color[1];
|
||||
ordered_constant_color[3] = constant_color[1];
|
||||
ordered_constant_color[3] = (constant_color[1] >> 1) & 0x7f7f7f;
|
||||
break;
|
||||
|
||||
#if 0
|
||||
/* At this point this code is completely untested. It appears that the
|
||||
* Unichrome has the same limitation as the Radeon R100. The only
|
||||
* supported post-scale when doing DOT3 bumpmapping is 1x.
|
||||
@@ -288,41 +282,88 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
case GL_DOT3_RGBA:
|
||||
c_shift = 2;
|
||||
a_shift = 2;
|
||||
color |= (color_arg[0] << INPUT_A_SHIFT) |
|
||||
(color_arg[1] << INPUT_B_SHIFT);
|
||||
color |= ((color_arg[0] << INPUT_A_SHIFT) |
|
||||
(color_arg[1] << INPUT_B_SHIFT));
|
||||
op |= HC_HTXnTBLDOT4;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* The alpha blend stage has the annoying quirk of not having a
|
||||
* hard-wired 0 input, like the color stage. As a result, we have
|
||||
* to program the constant register with 0 and use that as our
|
||||
* 0 input.
|
||||
*
|
||||
* (xA * (xB op xC) + xBias) << xShift
|
||||
*
|
||||
*/
|
||||
|
||||
for ( i = 0 ; i < combine->_NumArgsA ; i++ ) {
|
||||
const GLint op = combine->OperandA[i] - GL_SRC_ALPHA;
|
||||
|
||||
switch ( combine->SourceA[i] ) {
|
||||
case GL_TEXTURE:
|
||||
alpha_arg[i] = HC_XTA_Atex;
|
||||
alpha_arg[i] += alpha_operand_modifier[op];
|
||||
bias_alpha_arg[i] = HC_HTXnTBLAbias_Atex;
|
||||
bias_alpha_arg[i] += bias_alpha_operand_modifier[op];
|
||||
break;
|
||||
case GL_CONSTANT:
|
||||
alpha_arg[i] = HC_XTA_HTXnTBLRA;
|
||||
bias_alpha_arg[i] = HC_HTXnTBLAbias_HTXnTBLRAbias;
|
||||
constant_alpha[i] = (op == 0) ? env_color[3] : (~env_color[3] & 0xff);
|
||||
break;
|
||||
case GL_PRIMARY_COLOR:
|
||||
alpha_arg[i] = HC_XTA_Adif;
|
||||
alpha_arg[i] += alpha_operand_modifier[op];
|
||||
bias_alpha_arg[i] = HC_HTXnTBLAbias_Adif;
|
||||
bias_alpha_arg[i] += bias_alpha_operand_modifier[op];
|
||||
break;
|
||||
case GL_PREVIOUS:
|
||||
alpha_arg[i] = (unit == 0) ? HC_XTA_Adif : HC_XTA_Acur;
|
||||
alpha_arg[i] += alpha_operand_modifier[op];
|
||||
bias_alpha_arg[i] = (unit == 0) ? HC_HTXnTBLAbias_Adif : HC_HTXnTBLAbias_Acur;
|
||||
bias_alpha_arg[i] += bias_alpha_operand_modifier[op];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch( combine->ModeA ) {
|
||||
/* Aa = 0, Ab = 0, Ac = 0, Abias = arg0
|
||||
*/
|
||||
case GL_REPLACE:
|
||||
bias |= (alpha_arg[0] << INPUT_ABias_SHIFT);
|
||||
alpha |= ((HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
|
||||
(HC_XTA_HTXnTBLRA << INPUT_B_SHIFT) |
|
||||
(HC_XTA_HTXnTBLRA << INPUT_C_SHIFT));
|
||||
abc_alpha = 0;
|
||||
|
||||
alpha |= (HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
|
||||
(HC_XTA_HTXnTBLRA << INPUT_B_SHIFT) |
|
||||
(HC_XTA_HTXnTBLRA << INPUT_C_SHIFT);
|
||||
bias |= bias_alpha_arg[0];
|
||||
bias_alpha = constant_alpha[0] >> 1;
|
||||
break;
|
||||
|
||||
/* Aa = arg[0], Ab = arg[1], Ac = 0, Abias = 0
|
||||
*/
|
||||
case GL_MODULATE:
|
||||
alpha |= (alpha_arg[1] << INPUT_A_SHIFT)
|
||||
| (alpha_arg[0] << INPUT_B_SHIFT)
|
||||
| (HC_XTA_HTXnTBLRA << INPUT_C_SHIFT);
|
||||
alpha |= ((alpha_arg[1] << INPUT_A_SHIFT) |
|
||||
(alpha_arg[0] << INPUT_B_SHIFT) |
|
||||
(HC_XTA_HTXnTBLRA << INPUT_C_SHIFT));
|
||||
|
||||
bias |= (HC_XTA_HTXnTBLRA << INPUT_ABias_SHIFT);
|
||||
abc_alpha = ((constant_alpha[1] << HC_HTXnTBLRAa_SHIFT) |
|
||||
(constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
|
||||
(0 << HC_HTXnTBLRAc_SHIFT));
|
||||
|
||||
bias |= HC_HTXnTBLAbias_HTXnTBLRAbias;
|
||||
bias_alpha = 0;
|
||||
break;
|
||||
|
||||
/* Aa = 0, Ab = arg[0], Ac = 0, Abias = arg[1]
|
||||
/* Aa = 1.0, Ab = arg[0], Ac = arg[1], Abias = 0
|
||||
*/
|
||||
case GL_ADD:
|
||||
case GL_SUBTRACT:
|
||||
@@ -330,22 +371,30 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
op |= HC_HTXnTBLAop_Sub;
|
||||
}
|
||||
|
||||
alpha |= (HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
|
||||
(alpha_arg[0] << INPUT_B_SHIFT) |
|
||||
(HC_XTA_HTXnTBLRA << INPUT_C_SHIFT);
|
||||
bias |= (alpha_arg[1] << INPUT_ABias_SHIFT);
|
||||
alpha |= ((HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
|
||||
(alpha_arg[0] << INPUT_B_SHIFT) |
|
||||
(alpha_arg[1] << INPUT_C_SHIFT));
|
||||
|
||||
abc_alpha = ((0xff << HC_HTXnTBLRAa_SHIFT) |
|
||||
(constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
|
||||
(constant_alpha[1] << HC_HTXnTBLRAc_SHIFT));
|
||||
|
||||
bias |= HC_HTXnTBLAbias_HTXnTBLRAbias;
|
||||
bias_alpha = 0;
|
||||
break;
|
||||
|
||||
/* Aa = 0, Ab = arg[0], Ac = arg[1], Abias = 0.5
|
||||
/* Aa = 1.0, Ab = arg[0], Ac = arg[1], Abias = -0.5
|
||||
*/
|
||||
case GL_ADD_SIGNED:
|
||||
op |= HC_HTXnTBLAop_Sub;
|
||||
alpha |= ((HC_XTA_HTXnTBLRA << INPUT_A_SHIFT) |
|
||||
(alpha_arg[0] << INPUT_B_SHIFT) |
|
||||
(alpha_arg[1] << INPUT_C_SHIFT));
|
||||
abc_alpha = ((0xff << HC_HTXnTBLRAa_SHIFT) |
|
||||
(constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
|
||||
(constant_alpha[1] << HC_HTXnTBLRAc_SHIFT));
|
||||
|
||||
alpha |= (alpha_arg[0] << INPUT_B_SHIFT)
|
||||
| (alpha_arg[1] << INPUT_C_SHIFT);
|
||||
bias |= (HC_XTA_HTXnTBLRA << INPUT_ABias_SHIFT);
|
||||
|
||||
bias_alpha = 0x00000080;
|
||||
bias |= HC_HTXnTBLAbias_HTXnTBLRAbias;
|
||||
bias_alpha = 0xbf;
|
||||
break;
|
||||
|
||||
/* Aa = arg[2], Ab = arg[0], Ac = arg[1], Abias = arg[1]
|
||||
@@ -353,10 +402,15 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
case GL_INTERPOLATE:
|
||||
op |= HC_HTXnTBLAop_Sub;
|
||||
|
||||
alpha |= (alpha_arg[2] << INPUT_A_SHIFT) |
|
||||
(alpha_arg[0] << INPUT_B_SHIFT) |
|
||||
(alpha_arg[1] << INPUT_C_SHIFT);
|
||||
bias |= (alpha_arg[1] << INPUT_ABias_SHIFT);
|
||||
alpha |= ((alpha_arg[2] << INPUT_A_SHIFT) |
|
||||
(alpha_arg[0] << INPUT_B_SHIFT) |
|
||||
(alpha_arg[1] << INPUT_C_SHIFT));
|
||||
abc_alpha = ((constant_alpha[2] << HC_HTXnTBLRAa_SHIFT) |
|
||||
(constant_alpha[0] << HC_HTXnTBLRAb_SHIFT) |
|
||||
(constant_alpha[1] << HC_HTXnTBLRAc_SHIFT));
|
||||
|
||||
bias |= bias_alpha_arg[1];
|
||||
bias_alpha = constant_alpha[1] >> 1;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -370,7 +424,8 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
vmesa->regHTXnTBLCsat_0 = color;
|
||||
vmesa->regHTXnTBLAsat_0 = alpha;
|
||||
vmesa->regHTXnTBLCop_0 = op | bias;
|
||||
vmesa->regHTXnTBLRAa_0 = bias_alpha | (constant_alpha << 16);
|
||||
vmesa->regHTXnTBLRAa_0 = abc_alpha;
|
||||
vmesa->regHTXnTBLRFog_0 = bias_alpha;
|
||||
|
||||
vmesa->regHTXnTBLRCa_0 = ordered_constant_color[0];
|
||||
vmesa->regHTXnTBLRCb_0 = ordered_constant_color[1];
|
||||
@@ -383,12 +438,15 @@ viaTexCombineState( viaContextPtr vmesa,
|
||||
vmesa->regHTXnTBLCsat_1 = color;
|
||||
vmesa->regHTXnTBLAsat_1 = alpha;
|
||||
vmesa->regHTXnTBLCop_1 = op | bias;
|
||||
vmesa->regHTXnTBLRAa_1 = bias_alpha | (constant_alpha << 16);
|
||||
vmesa->regHTXnTBLRAa_1 = abc_alpha;
|
||||
vmesa->regHTXnTBLRFog_1 = bias_alpha;
|
||||
|
||||
vmesa->regHTXnTBLRCa_1 = ordered_constant_color[0];
|
||||
vmesa->regHTXnTBLRCb_1 = ordered_constant_color[1];
|
||||
vmesa->regHTXnTBLRCc_1 = ordered_constant_color[2];
|
||||
vmesa->regHTXnTBLRCbias_1 = ordered_constant_color[3];
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -1052,6 +1052,7 @@ void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode)
|
||||
vmesa->Fallback |= bit;
|
||||
if (oldfallback == 0) {
|
||||
VIA_FLUSH_DMA(vmesa);
|
||||
if (0) fprintf(stderr, "ENTER FALLBACK %x\n", bit);
|
||||
_swsetup_Wakeup(ctx);
|
||||
vmesa->renderIndex = ~0;
|
||||
}
|
||||
@@ -1061,6 +1062,8 @@ void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode)
|
||||
if (oldfallback == bit) {
|
||||
_swrast_flush( ctx );
|
||||
|
||||
if (0) fprintf(stderr, "LEAVE FALLBACK %x\n", bit);
|
||||
|
||||
tnl->Driver.Render.Start = viaRenderStart;
|
||||
tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive;
|
||||
tnl->Driver.Render.Finish = viaRenderFinish;
|
||||
@@ -1082,6 +1085,18 @@ void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode)
|
||||
}
|
||||
}
|
||||
|
||||
static void viaRunPipeline( GLcontext *ctx )
|
||||
{
|
||||
viaContextPtr vmesa = VIA_CONTEXT(ctx);
|
||||
|
||||
if (vmesa->newState) {
|
||||
vmesa->newRenderState |= vmesa->newState;
|
||||
viaValidateState( ctx );
|
||||
}
|
||||
|
||||
_tnl_run_pipeline( ctx );
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* Initialization. */
|
||||
@@ -1099,7 +1114,7 @@ void viaInitTriFuncs(GLcontext *ctx)
|
||||
firsttime = 0;
|
||||
}
|
||||
|
||||
tnl->Driver.RunPipeline = _tnl_run_pipeline;
|
||||
tnl->Driver.RunPipeline = viaRunPipeline;
|
||||
tnl->Driver.Render.Start = viaRenderStart;
|
||||
tnl->Driver.Render.Finish = viaRenderFinish;
|
||||
tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive;
|
||||
|
||||
Reference in New Issue
Block a user