wined3d: Fix some swizzles on scalars.

This commit is contained in:
H. Verbeet 2007-04-12 23:55:31 +02:00 committed by Alexandre Julliard
parent 5c19285da6
commit a79654d339
2 changed files with 33 additions and 10 deletions

View File

@ -703,11 +703,8 @@ static void shader_glsl_get_register_name(
static DWORD shader_glsl_get_write_mask(const DWORD param, char *write_mask) {
char *ptr = write_mask;
DWORD mask = param & WINED3DSP_WRITEMASK_ALL;
DWORD reg_type = shader_get_regtype(param);
/* gl_FogFragCoord, gl_PointSize and gl_FragDepth are floats, fixup the write mask. */
if (((reg_type == WINED3DSPR_RASTOUT) && ((param & WINED3DSP_REGNUM_MASK) != 0))
|| reg_type == WINED3DSPR_DEPTHOUT) {
if (shader_is_scalar(param)) {
mask = WINED3DSP_WRITEMASK_0;
} else {
*ptr++ = '.';
@ -741,12 +738,14 @@ static void shader_glsl_get_swizzle(const DWORD param, BOOL fixup, DWORD mask, c
const char *swizzle_chars = fixup ? "zyxw" : "xyzw";
char *ptr = swizzle_str;
*ptr++ = '.';
/* swizzle bits fields: wwzzyyxx */
if (mask & WINED3DSP_WRITEMASK_0) *ptr++ = swizzle_chars[swizzle & 0x03];
if (mask & WINED3DSP_WRITEMASK_1) *ptr++ = swizzle_chars[(swizzle >> 2) & 0x03];
if (mask & WINED3DSP_WRITEMASK_2) *ptr++ = swizzle_chars[(swizzle >> 4) & 0x03];
if (mask & WINED3DSP_WRITEMASK_3) *ptr++ = swizzle_chars[(swizzle >> 6) & 0x03];
if (!shader_is_scalar(param)) {
*ptr++ = '.';
/* swizzle bits fields: wwzzyyxx */
if (mask & WINED3DSP_WRITEMASK_0) *ptr++ = swizzle_chars[swizzle & 0x03];
if (mask & WINED3DSP_WRITEMASK_1) *ptr++ = swizzle_chars[(swizzle >> 2) & 0x03];
if (mask & WINED3DSP_WRITEMASK_2) *ptr++ = swizzle_chars[(swizzle >> 4) & 0x03];
if (mask & WINED3DSP_WRITEMASK_3) *ptr++ = swizzle_chars[(swizzle >> 6) & 0x03];
}
*ptr = '\0';
}

View File

@ -1847,6 +1847,30 @@ static inline BOOL shader_is_comment(DWORD token) {
return WINED3DSIO_COMMENT == (token & WINED3DSI_OPCODE_MASK);
}
/* TODO: vFace (ps_3_0) */
static inline BOOL shader_is_scalar(DWORD param) {
DWORD reg_type = shader_get_regtype(param);
switch (reg_type) {
case WINED3DSPR_RASTOUT:
if ((param & WINED3DSP_REGNUM_MASK) != 0) {
/* oFog & oPts */
return TRUE;
}
/* oPos */
return FALSE;
case WINED3DSPR_DEPTHOUT: /* oDepth */
case WINED3DSPR_CONSTBOOL: /* b# */
case WINED3DSPR_LOOP: /* aL */
case WINED3DSPR_PREDICATE: /* p0 */
return TRUE;
default:
return FALSE;
}
}
/* Internally used shader constants. Applications can use constants 0 to GL_LIMITS(vshader_constantsF) - 1,
* so upload them above that
*/