mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
search_for_valid_displaymodes needs to check more than just one format
This commit is contained in:
parent
e46e47b442
commit
0ba65f32ca
@ -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()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user