search_for_valid_displaymodes needs to check more than just one format

This commit is contained in:
David Rose 2004-02-06 14:16:03 +00:00
parent e46e47b442
commit 0ba65f32ca

View File

@ -527,30 +527,40 @@ search_for_valid_displaymode(DXScreenData &scrn,
D3DFORMAT *pSuggestedPixFmt, D3DFORMAT *pSuggestedPixFmt,
bool bForce16bppZBuffer, bool bForce16bppZBuffer,
bool bVerboseMode) { bool bVerboseMode) {
bVerboseMode = true;
// Use this list of format modes when trying to find a valid graphics
// format for the card. Formats are scanned in the order listed.
static D3DFORMAT valid_formats[] = {
D3DFMT_X8R8G8B8,
D3DFMT_A2B10G10R10,
D3DFMT_R5G6B5,
D3DFMT_X1R5G5B5,
};
static const int num_valid_formats = (sizeof(valid_formats) / sizeof(D3DFORMAT));
assert(IS_VALID_PTR(scrn.pD3D9)); assert(IS_VALID_PTR(scrn.pD3D9));
HRESULT hr; HRESULT hr;
#ifndef NDEBUG
// no longer true, due to special_check_fullscreen_res, where lowvidmem cards are allowed higher resolutions
// if (_dxgsg->scrn.bIsLowVidMemCard)
// nassertv((RequestedX_Size==640)&&(RequestedY_Size==480));
#endif
*pSuggestedPixFmt = D3DFMT_UNKNOWN; *pSuggestedPixFmt = D3DFMT_UNKNOWN;
*pSupportedScreenDepthsMask = 0x0; *pSupportedScreenDepthsMask = 0x0;
*pCouldntFindAnyValidZBuf = false; *pCouldntFindAnyValidZBuf = false;
int cNumModes = scrn.pD3D9->GetAdapterModeCount(scrn.CardIDNum, D3DFMT_A8R8G8B8);
D3DDISPLAYMODE BestDispMode;
ZeroMemory(&BestDispMode,sizeof(BestDispMode));
// if (bVerboseMode)
{
wdxdisplay9_cat.info() wdxdisplay9_cat.info()
<< "searching for valid display modes at res: (" << "searching for valid display modes at res: ("
<< RequestedX_Size << "," << RequestedY_Size << RequestedX_Size << "," << RequestedY_Size
<< "), TotalModes: " << cNumModes << endl; << ")" << endl;
// iterate through all the formats we might support, and check the
// card for each one.
for (int fi = 0; fi < num_valid_formats; ++fi) {
int cNumModes = scrn.pD3D9->GetAdapterModeCount(scrn.CardIDNum, valid_formats[fi]);
D3DDISPLAYMODE BestDispMode;
ZeroMemory(&BestDispMode,sizeof(BestDispMode));
if (bVerboseMode || wdxdisplay9_cat.is_spam()) {
wdxdisplay9_cat.info()
<< "TotalModes with format " << D3DFormatStr(valid_formats[fi])
<< ": " << cNumModes << endl;
} }
// ignore memory based checks for min res 640x480. some cards just // ignore memory based checks for min res 640x480. some cards just
@ -568,7 +578,7 @@ search_for_valid_displaymode(DXScreenData &scrn,
for (int i=0; i < cNumModes; i++) { for (int i=0; i < cNumModes; i++) {
D3DDISPLAYMODE dispmode; D3DDISPLAYMODE dispmode;
hr = scrn.pD3D9->EnumAdapterModes(scrn.CardIDNum,D3DFMT_A8R8G8B8,i,&dispmode); hr = scrn.pD3D9->EnumAdapterModes(scrn.CardIDNum,valid_formats[fi],i,&dispmode);
if (FAILED(hr)) { if (FAILED(hr)) {
wdxdisplay9_cat.error() wdxdisplay9_cat.error()
<< "EnumAdapterDisplayMode failed for device #" << "EnumAdapterDisplayMode failed for device #"
@ -720,38 +730,35 @@ search_for_valid_displaymode(DXScreenData &scrn,
<< "Validated Mode (" << RequestedX_Size << "x" << "Validated Mode (" << RequestedX_Size << "x"
<< RequestedY_Size << "," << D3DFormatStr(dispmode.Format) << endl; << RequestedY_Size << "," << D3DFormatStr(dispmode.Format) << endl;
if (*pSuggestedPixFmt == D3DFMT_UNKNOWN) {
// Prefer the first format on the list we find.
// note: this chooses 32bpp, which may not be preferred over 16 for
// memory & speed reasons on some older cards in particular
*pSuggestedPixFmt = dispmode.Format;
}
switch (dispmode.Format) { switch (dispmode.Format) {
case D3DFMT_X1R5G5B5:
*pSupportedScreenDepthsMask |= X1R5G5B5_FLAG;
break;
case D3DFMT_X8R8G8B8: case D3DFMT_X8R8G8B8:
*pSupportedScreenDepthsMask |= X8R8G8B8_FLAG; *pSupportedScreenDepthsMask |= X8R8G8B8_FLAG;
break; break;
case D3DFMT_R8G8B8: case D3DFMT_A2B10G10R10:
*pSupportedScreenDepthsMask |= R8G8B8_FLAG; *pSupportedScreenDepthsMask |= A2B10G10R10_FLAG;
break; break;
case D3DFMT_R5G6B5: case D3DFMT_R5G6B5:
*pSupportedScreenDepthsMask |= R5G6B5_FLAG; *pSupportedScreenDepthsMask |= R5G6B5_FLAG;
break; break;
case D3DFMT_X1R5G5B5:
*pSupportedScreenDepthsMask |= X1R5G5B5_FLAG;
break;
default: default:
// Render target formats should be only D3DFMT_X1R5G5B5, // Render target formats should be only one of valid_formats,
// D3DFMT_R5G6B5, D3DFMT_X8R8G8B8 (or R8G8B8?) // above.
wdxdisplay9_cat.error() wdxdisplay9_cat.error()
<< "unrecognized supported fmt "<< D3DFormatStr(dispmode.Format) << "unrecognized supported fmt "<< D3DFormatStr(dispmode.Format)
<< " returned by EnumAdapterDisplayModes!\n"; << " returned by EnumAdapterDisplayModes!\n";
} }
} }
// note: this chooses 32bpp, which may not be preferred over 16 for
// memory & speed reasons on some older cards in particular
if (*pSupportedScreenDepthsMask & X8R8G8B8_FLAG) {
*pSuggestedPixFmt = D3DFMT_X8R8G8B8;
} else if (*pSupportedScreenDepthsMask & R8G8B8_FLAG) {
*pSuggestedPixFmt = D3DFMT_R8G8B8;
} else if (*pSupportedScreenDepthsMask & R5G6B5_FLAG) {
*pSuggestedPixFmt = D3DFMT_R5G6B5;
} else if (*pSupportedScreenDepthsMask & X1R5G5B5_FLAG) {
*pSuggestedPixFmt = D3DFMT_X1R5G5B5;
} }
if (bVerboseMode || wdxdisplay9_cat.is_spam()) { if (bVerboseMode || wdxdisplay9_cat.is_spam()) {