Pixel format selection now favours a format with a number of samples

closer to the one requested on Windows.

Patch D1384 by Benoit Bolsee.
This commit is contained in:
Antony Riakiotakis 2015-07-20 10:59:30 +02:00
parent 05ee9d2dd0
commit 422ffd252a
2 changed files with 61 additions and 30 deletions

@ -475,7 +475,7 @@ static void makeAttribList(
out.push_back(numOfAASamples);
out.push_back(WGL_SAMPLE_BUFFERS_ARB);
out.push_back(1);
out.push_back(GL_TRUE);
}
if (sRGB) {
@ -489,7 +489,7 @@ static void makeAttribList(
int GHOST_ContextWGL::_choose_pixel_format_arb_2(
bool stereoVisual,
int numOfAASamples,
int *numOfAASamples,
bool needAlpha,
bool needStencil,
bool sRGB,
@ -502,12 +502,12 @@ int GHOST_ContextWGL::_choose_pixel_format_arb_2(
int samples;
// guard against some insanely high number of samples
if (numOfAASamples > 64) {
if (*numOfAASamples > 64) {
fprintf(stderr, "Warning! Clamping number of samples to 64.\n");
samples = 64;
}
else {
samples = numOfAASamples;
samples = *numOfAASamples;
}
// request a format with as many samples as possible, but not more than requested
@ -542,46 +542,78 @@ int GHOST_ContextWGL::_choose_pixel_format_arb_2(
int actualSamples;
wglGetPixelFormatAttribivARB(m_hDC, iPixelFormat, 0, 1, iQuery, &actualSamples);
if (actualSamples != numOfAASamples) {
if (actualSamples != *numOfAASamples) {
fprintf(stderr,
"Warning! Unable to find a multisample pixel format that supports exactly %d samples. "
"Substituting one that uses %d samples.\n",
numOfAASamples, actualSamples);
*numOfAASamples, actualSamples);
m_numOfAASamples = actualSamples; // set context property to actual value
*numOfAASamples = actualSamples; // set context property to actual value
}
}
else {
*numOfAASamples = 0;
}
return iPixelFormat;
}
int GHOST_ContextWGL::_choose_pixel_format_arb_1(
bool stereoVisual,
int GHOST_ContextWGL::_choose_pixel_format_arb_1(bool stereoVisual,
int numOfAASamples,
bool needAlpha,
bool needStencil,
bool sRGB,
int &swapMethodOut)
int *swapMethodOut)
{
int iPixelFormat;
int copyPixelFormat = 0;
int undefPixelFormat = 0;
int exchPixelFormat = 0;
int copyNumOfAASamples = 0;
int undefNumOfAASamples = 0;
int exchNumOfAASamples = 0;
swapMethodOut = WGL_SWAP_COPY_ARB;
iPixelFormat = _choose_pixel_format_arb_2(
stereoVisual, numOfAASamples, needAlpha, needStencil, sRGB, swapMethodOut);
*swapMethodOut = WGL_SWAP_COPY_ARB;
copyNumOfAASamples = numOfAASamples;
copyPixelFormat = _choose_pixel_format_arb_2(
stereoVisual, &copyNumOfAASamples, needAlpha, needStencil, sRGB, *swapMethodOut);
if (iPixelFormat == 0) {
swapMethodOut = WGL_SWAP_UNDEFINED_ARB;
iPixelFormat = _choose_pixel_format_arb_2(
stereoVisual, numOfAASamples, needAlpha, needStencil, sRGB, swapMethodOut);
if (copyPixelFormat == 0 || copyNumOfAASamples < numOfAASamples) {
*swapMethodOut = WGL_SWAP_UNDEFINED_ARB;
undefNumOfAASamples = numOfAASamples;
undefPixelFormat = _choose_pixel_format_arb_2(
stereoVisual, &undefNumOfAASamples, needAlpha, needStencil, sRGB, *swapMethodOut);
if (undefPixelFormat == 0 || undefNumOfAASamples < numOfAASamples) {
*swapMethodOut = WGL_SWAP_EXCHANGE_ARB;
exchNumOfAASamples = numOfAASamples;
exchPixelFormat = _choose_pixel_format_arb_2(
stereoVisual, &exchNumOfAASamples, needAlpha, needStencil, sRGB, *swapMethodOut);
if (exchPixelFormat == 0 || exchNumOfAASamples < numOfAASamples) {
// the number of AA samples cannot be met, take the highest
if (undefPixelFormat != 0 && undefNumOfAASamples >= exchNumOfAASamples) {
exchNumOfAASamples = undefNumOfAASamples;
exchPixelFormat = undefPixelFormat;
*swapMethodOut = WGL_SWAP_UNDEFINED_ARB;
}
if (copyPixelFormat != 0 && copyNumOfAASamples >= exchNumOfAASamples) {
exchNumOfAASamples = copyNumOfAASamples;
exchPixelFormat = copyPixelFormat;
*swapMethodOut = WGL_SWAP_COPY_ARB;
}
}
iPixelFormat = exchPixelFormat;
m_numOfAASamples = exchNumOfAASamples;
}
else {
iPixelFormat = undefPixelFormat;
m_numOfAASamples = undefNumOfAASamples;
}
}
if (iPixelFormat == 0) {
swapMethodOut = WGL_SWAP_EXCHANGE_ARB;
iPixelFormat = _choose_pixel_format_arb_2(
stereoVisual, numOfAASamples, needAlpha, needStencil, sRGB, swapMethodOut);
else {
iPixelFormat = copyPixelFormat;
m_numOfAASamples = copyNumOfAASamples;
}
return iPixelFormat;
}
@ -602,7 +634,7 @@ int GHOST_ContextWGL::choose_pixel_format_arb(
needAlpha,
needStencil,
sRGB,
swapMethodOut);
&swapMethodOut);
if (iPixelFormat == 0 && stereoVisual) {
fprintf(stderr, "Warning! Unable to find a stereo pixel format.\n");
@ -613,7 +645,7 @@ int GHOST_ContextWGL::choose_pixel_format_arb(
needAlpha,
needStencil,
sRGB,
swapMethodOut);
&swapMethodOut);
m_stereoVisual = false; // set context property to actual value
}

@ -148,11 +148,10 @@ private:
bool needAlpha,
bool needStencil,
bool sRGB,
int &swapMethodOut);
int *swapMethodOut);
int _choose_pixel_format_arb_2(
bool stereoVisual,
int numOfAASamples,
int _choose_pixel_format_arb_2(bool stereoVisual,
int *numOfAASamples,
bool needAlpha,
bool needStencil,
bool sRGB,