blob: 53595f0c34ecbd21e7124ab314389630f691d9f2 [file] [log] [blame]
/*===========================================================================*/
/* */
/* Mesa-3.0 DirectX 6 Driver Build 5 */
/* */
/* By Leigh McRae */
/* */
/* http://www.altsoftware.com/ */
/* */
/* Copyright (c) 1999-1998 alt.software inc. All Rights Reserved */
/*===========================================================================*/
#include "D3DHAL.h"
/*===========================================================================*/
/* Macros. */
/*===========================================================================*/
#define SRCBLEND_MAP(gl,d3d,fall) if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwSrcBlendCaps & d3d ) \
{ \
sprintf( buffer, "SRC Blend: %s -> %s", # gl, # d3d ); \
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
pShared->dwSrcBlendCaps[index] = d3d; \
} \
else \
{ \
sprintf( buffer, "SRC Blend: %s -> %s", # gl, # fall ); \
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
pShared->dwSrcBlendCaps[index] = fall; \
}
#define DSTBLEND_MAP(gl,d3d,fall) if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwDestBlendCaps & d3d ) \
{ \
sprintf( buffer, "DST Blend: %s -> %s", # gl, # d3d ); \
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
pShared->dwDestBlendCaps[index] = d3d; \
} \
else \
{ \
sprintf( buffer, "DST Blend: %s -> %s", # gl, # fall ); \
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), buffer )); \
pShared->dwDestBlendCaps[index] = fall; \
}
/*===========================================================================*/
/* I use this function to handle the fact that the D3D texture blending and */
/* OpenGL texture blending functions don't map one to one. Also there is the*/
/* problem with cards not supporting all the D3D functions. So I use the CAPS*/
/* of the card to make a table of functions that will have defaults for the */
/* unsupported functions. */
/* So first I fill the table with the fallback function then I check to see */
/* if the card supports the requested function. If it does I replace the */
/* default thats already in the array. Now order does matter as I used an */
/* enum type in D3DShared.h so that the mapping would be a little easier. */
/*===========================================================================*/
/* RETURN: */
/*===========================================================================*/
void AlphaBlendTableHAL( PMESAD3DHAL pHAL )
{
PMESAD3DSHARED pShared = &pHAL->shared;
int index;
char buffer[128];
DPF(( DBG_FUNC, "AlphaBlendTableHAL();" ));
/* Make the fallback for the Source blend. */
for( index = 0; index < 14; index++ )
{
switch( index )
{
case s_zero:
SRCBLEND_MAP( GL_ZERO, D3DBLEND_ZERO, D3DBLEND_ONE );
break;
case s_one:
SRCBLEND_MAP( GL_ONE, D3DBLEND_ONE, D3DBLEND_ONE );
break;
case s_dst_color:
SRCBLEND_MAP( GL_DST_COLOR, D3DBLEND_DESTCOLOR, D3DBLEND_ONE );
break;
case s_one_minus_dst_color:
SRCBLEND_MAP( GL_ONE_MINUS_DST_COLOR, D3DBLEND_INVDESTCOLOR, D3DBLEND_ONE );
break;
case s_src_alpha:
SRCBLEND_MAP( GL_SRC_ALPHA, D3DBLEND_SRCALPHA, D3DBLEND_ONE );
break;
case s_one_minus_src_alpha:
SRCBLEND_MAP( GL_ONE_MINUS_SRC_ALPHA, D3DBLEND_INVSRCALPHA, D3DBLEND_ONE );
break;
case s_dst_alpha:
SRCBLEND_MAP( GL_DST_ALPHA, D3DBLEND_DESTALPHA, D3DBLEND_ONE );
break;
case s_one_minus_dst_alpha:
SRCBLEND_MAP( GL_ONE_MINUS_DST_ALPHA, D3DBLEND_INVDESTALPHA, D3DBLEND_ONE );
break;
case s_src_alpha_saturate:
SRCBLEND_MAP( GL_SRC_ALPHA_SATURATE, D3DBLEND_SRCALPHASAT, D3DBLEND_ONE );
break;
case s_constant_color:
SRCBLEND_MAP( GL_CONSTANT_COLOR, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
break;
case s_one_minus_constant_color:
SRCBLEND_MAP( GL_ONE_MINUS_CONSTANT_COLOR, D3DBLEND_INVSRCCOLOR, D3DBLEND_ONE );
break;
case s_constant_alpha:
SRCBLEND_MAP( GL_CONSTANT_ALPHA, D3DBLEND_BOTHSRCALPHA, D3DBLEND_ONE );
break;
case s_one_minus_constant_alpha:
SRCBLEND_MAP( GL_ONE_MINUS_CONSTANT_ALPHA, D3DBLEND_BOTHINVSRCALPHA, D3DBLEND_ONE );
break;
}
}
/* Make the fallback for the Destination blend. */
for( index = 0; index < 14; index++ )
{
switch( index )
{
case d_zero:
DSTBLEND_MAP( GL_ZERO, D3DBLEND_ZERO, D3DBLEND_ONE );
break;
case d_one:
DSTBLEND_MAP( GL_ONE, D3DBLEND_ONE, D3DBLEND_ONE );
break;
case d_src_color:
DSTBLEND_MAP( GL_SRC_COLOR, D3DBLEND_SRCCOLOR, D3DBLEND_ONE );
break;
case d_one_minus_src_color:
DSTBLEND_MAP( GL_ONE_MINUS_SRC_COLOR, D3DBLEND_INVSRCCOLOR, D3DBLEND_ONE );
break;
case d_src_alpha:
DSTBLEND_MAP( GL_SRC_ALPHA, D3DBLEND_SRCALPHA, D3DBLEND_ONE );
break;
case d_one_minus_src_alpha:
DSTBLEND_MAP( GL_ONE_MINUS_SRC_ALPHA, D3DBLEND_INVSRCALPHA, D3DBLEND_ONE );
break;
case d_dst_alpha:
DSTBLEND_MAP( GL_DST_ALPHA, D3DBLEND_DESTALPHA, D3DBLEND_ONE );
break;
case d_one_minus_dst_alpha:
DSTBLEND_MAP( GL_ONE_MINUS_DST_ALPHA, D3DBLEND_INVDESTALPHA, D3DBLEND_ONE );
break;
case d_constant_color:
DSTBLEND_MAP( GL_CONSTANT_COLOR, D3DBLEND_DESTCOLOR, D3DBLEND_ONE );
break;
case d_one_minus_constant_color:
DSTBLEND_MAP( GL_ONE_MINUS_CONSTANT_COLOR, D3DBLEND_INVDESTCOLOR, D3DBLEND_ONE );
break;
case d_constant_alpha:
DSTBLEND_MAP( GL_CONSTANT_ALPHAR, D3DBLEND_BOTHSRCALPHA, D3DBLEND_ONE );
break;
case d_one_minus_constant_alpha:
DSTBLEND_MAP( GL_ONE_MINUS_CONSTANT_ALPHA, D3DBLEND_BOTHINVSRCALPHA, D3DBLEND_ONE );
break;
}
}
/* Make the fallbacks for the texture functions. */
for( index = 0; index < 4; index++ )
{
switch( index )
{
case d3dtblend_decal:
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_DECAL" ));
pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
}
else
{
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_MODULATE" ));
pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
}
else
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECAL -> D3DTBLEND_ADD" ));
pShared->dwTexFunc[index] = D3DTBLEND_ADD;
}
}
break;
case d3dtblend_decalalpha:
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECALALPHA )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPHA -> D3DTBLEND_DECALALPHA" ));
pShared->dwTexFunc[index] = D3DTBLEND_DECALALPHA;
}
else
{
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPA -> D3DTBLEND_DECAL" ));
pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
}
else
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_DECALALPHA -> D3DTBLEND_ADD" ));
pShared->dwTexFunc[index] = D3DTBLEND_ADD;
}
}
break;
case d3dtblend_modulate:
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_MODULATE" ));
pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
}
else
{
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATEALPHA )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_MODULATEALPHA" ));
pShared->dwTexFunc[index] = D3DTBLEND_MODULATEALPHA;
}
else if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_DECAL" ));
pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
}
else
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATE -> D3DTBLEND_ADD" ));
pShared->dwTexFunc[index] = D3DTBLEND_ADD;
}
}
break;
case d3dtblend_modulatealpha:
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATEALPHA )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_MODULATEALPHA" ));
pShared->dwTexFunc[index] = D3DTBLEND_MODULATEALPHA;
}
else
{
if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_MODULATE )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_MODULATE" ));
pShared->dwTexFunc[index] = D3DTBLEND_MODULATE;
}
else if ( pHAL->D3DHWDevDesc.dpcTriCaps.dwTextureBlendCaps & D3DTBLEND_DECAL )
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_DECALE" ));
pShared->dwTexFunc[index] = D3DTBLEND_DECAL;
}
else
{
DPF(( (DBG_CNTX_INFO|DBG_TXT_INFO), "D3DTBLEND_MODULATEALPHA -> D3DTBLEND_ADD" ));
pShared->dwTexFunc[index] = D3DTBLEND_ADD;
}
}
break;
}
}
}