Added back refresh rate window hint.

This commit is contained in:
Camilla Berglund 2013-05-30 20:42:50 +02:00
parent f5dc6e4007
commit 2cd34386bc
8 changed files with 55 additions and 19 deletions

View File

@ -309,6 +309,7 @@ GLFW.
* Added `GLFW_VISIBLE` window hint and parameter for controlling and polling * Added `GLFW_VISIBLE` window hint and parameter for controlling and polling
window visibility window visibility
* Added `GLFW_REPEAT` key action for repeated keys * Added `GLFW_REPEAT` key action for repeated keys
* Added `refreshRate` member to `GLFWvidmode` struct
* Added key modifier parameter to key and mouse button callbacks * Added key modifier parameter to key and mouse button callbacks
* Added `windows` simple multi-window test program * Added `windows` simple multi-window test program
* Added `sharing` simple OpenGL object sharing test program * Added `sharing` simple OpenGL object sharing test program

View File

@ -86,6 +86,10 @@ multisampling. Zero disables multisampling.
The `GLFW_SRGB_CAPABLE` hint specifies whether the framebuffer should be The `GLFW_SRGB_CAPABLE` hint specifies whether the framebuffer should be
sRGB capable. sRGB capable.
The `GLFW_REFRESH_RATE` hint specifies the desired refresh rate for full screen
windows. If set to zero, the highest available refresh rate will be used. This
hint is ignored for windowed mode windows.
@subsection window_hints_ctx Context related hints @subsection window_hints_ctx Context related hints
@ -151,6 +155,7 @@ a robustness strategy.
| `GLFW_ACCUM_ALPHA_BITS` | 0 | 0 to `INT_MAX` | | `GLFW_ACCUM_ALPHA_BITS` | 0 | 0 to `INT_MAX` |
| `GLFW_AUX_BUFFERS` | 0 | 0 to `INT_MAX` | | `GLFW_AUX_BUFFERS` | 0 | 0 to `INT_MAX` |
| `GLFW_SAMPLES` | 0 | 0 to `INT_MAX` | | `GLFW_SAMPLES` | 0 | 0 to `INT_MAX` |
| `GLFW_REFRESH_RATE` | 0 | 0 to `INT_MAX` |
| `GLFW_STEREO` | `GL_FALSE` | `GL_TRUE` or `GL_FALSE` | | `GLFW_STEREO` | `GL_FALSE` | `GL_TRUE` or `GL_FALSE` |
| `GLFW_SRGB_CAPABLE` | `GL_FALSE` | `GL_TRUE` or `GL_FALSE` | | `GLFW_SRGB_CAPABLE` | `GL_FALSE` | `GL_TRUE` or `GL_FALSE` |
| `GLFW_CLIENT_API` | `GLFW_OPENGL_API` | `GLFW_OPENGL_API` or `GLFW_OPENGL_ES_API` | | `GLFW_CLIENT_API` | `GLFW_OPENGL_API` | `GLFW_OPENGL_API` or `GLFW_OPENGL_ES_API` |

View File

@ -520,6 +520,7 @@ extern "C" {
#define GLFW_STEREO 0x0002100C #define GLFW_STEREO 0x0002100C
#define GLFW_SAMPLES 0x0002100D #define GLFW_SAMPLES 0x0002100D
#define GLFW_SRGB_CAPABLE 0x0002100E #define GLFW_SRGB_CAPABLE 0x0002100E
#define GLFW_REFRESH_RATE 0x0002100F
#define GLFW_CLIENT_API 0x00022001 #define GLFW_CLIENT_API 0x00022001
#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 #define GLFW_CONTEXT_VERSION_MAJOR 0x00022002

View File

@ -158,7 +158,8 @@ GLboolean _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired)
CGDisplayModeRef bestMode = NULL; CGDisplayModeRef bestMode = NULL;
CFArrayRef modes; CFArrayRef modes;
CFIndex count, i; CFIndex count, i;
unsigned int leastSizeDiff = UINT_MAX, leastRateDiff = UINT_MAX; unsigned int sizeDiff, leastSizeDiff = UINT_MAX;
unsigned int rateDiff, leastRateDiff = UINT_MAX;
const int bpp = desired->redBits - desired->greenBits - desired->blueBits; const int bpp = desired->redBits - desired->greenBits - desired->blueBits;
modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL);
@ -188,11 +189,14 @@ GLboolean _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired)
const int modeHeight = (int) CGDisplayModeGetHeight(mode); const int modeHeight = (int) CGDisplayModeGetHeight(mode);
const int modeRate = (int) CGDisplayModeGetRefreshRate(mode); const int modeRate = (int) CGDisplayModeGetRefreshRate(mode);
unsigned int sizeDiff = (abs(modeBPP - bpp) << 25) | sizeDiff = (abs(modeBPP - bpp) << 25) |
((modeWidth - desired->width) * (modeWidth - desired->width) + ((modeWidth - desired->width) * (modeWidth - desired->width) +
(modeHeight - desired->height) * (modeHeight - desired->height)); (modeHeight - desired->height) * (modeHeight - desired->height));
const unsigned int rateDiff = modeRate - desired->refreshRate; if (desired->refreshRate)
rateDiff = abs(modeRate - desired->refreshRate);
else
rateDiff = UINT_MAX - modeRate;
if ((sizeDiff < leastSizeDiff) || if ((sizeDiff < leastSizeDiff) ||
(sizeDiff == leastSizeDiff && rateDiff < leastRateDiff)) (sizeDiff == leastSizeDiff && rateDiff < leastRateDiff))

View File

@ -280,6 +280,7 @@ struct _GLFWlibrary
GLboolean decorated; GLboolean decorated;
int samples; int samples;
GLboolean sRGB; GLboolean sRGB;
int refreshRate;
int clientAPI; int clientAPI;
int glMajor; int glMajor;
int glMinor; int glMinor;

View File

@ -230,7 +230,10 @@ const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor,
(current->height - desired->height) * (current->height - desired->height) *
(current->height - desired->height)); (current->height - desired->height));
if (desired->refreshRate)
rateDiff = abs(current->refreshRate - desired->refreshRate); rateDiff = abs(current->refreshRate - desired->refreshRate);
else
rateDiff = UINT_MAX - current->refreshRate;
if ((colorDiff < leastColorDiff) || if ((colorDiff < leastColorDiff) ||
(colorDiff == leastColorDiff && sizeDiff < leastSizeDiff) || (colorDiff == leastColorDiff && sizeDiff < leastSizeDiff) ||

View File

@ -201,11 +201,13 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
wndconfig.resizable = GL_TRUE; wndconfig.resizable = GL_TRUE;
wndconfig.visible = GL_TRUE; wndconfig.visible = GL_TRUE;
// Set up desired video mode
window->videoMode.width = width; window->videoMode.width = width;
window->videoMode.height = height; window->videoMode.height = height;
window->videoMode.redBits = fbconfig.redBits; window->videoMode.redBits = Max(_glfw.hints.redBits, 0);
window->videoMode.greenBits = fbconfig.greenBits; window->videoMode.greenBits = Max(_glfw.hints.greenBits, 0);
window->videoMode.blueBits = fbconfig.blueBits; window->videoMode.blueBits = Max(_glfw.hints.blueBits, 0);
window->videoMode.refreshRate = Max(_glfw.hints.refreshRate, 0);
} }
window->monitor = wndconfig.monitor; window->monitor = wndconfig.monitor;
@ -322,6 +324,9 @@ GLFWAPI void glfwWindowHint(int target, int hint)
case GLFW_STEREO: case GLFW_STEREO:
_glfw.hints.stereo = hint; _glfw.hints.stereo = hint;
break; break;
case GLFW_REFRESH_RATE:
_glfw.hints.refreshRate = hint;
break;
case GLFW_RESIZABLE: case GLFW_RESIZABLE:
_glfw.hints.resizable = hint; _glfw.hints.resizable = hint;
break; break;

View File

@ -67,28 +67,43 @@ void _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired)
{ {
if (_glfw.x11.randr.available) if (_glfw.x11.randr.available)
{ {
int i; int i, j;
XRRScreenResources* sr; XRRScreenResources* sr;
XRRCrtcInfo* ci; XRRCrtcInfo* ci;
XRROutputInfo* oi;
RRMode bestMode = 0; RRMode bestMode = 0;
unsigned int leastSizeDiff = UINT_MAX, leastRateDiff = UINT_MAX; unsigned int sizeDiff, leastSizeDiff = UINT_MAX;
unsigned int rateDiff, leastRateDiff = UINT_MAX;
sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root); sr = XRRGetScreenResources(_glfw.x11.display, _glfw.x11.root);
ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc);
oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output);
for (i = 0; i < sr->nmode; i++) for (i = 0; i < sr->nmode; i++)
{ {
XRRModeInfo* mi = sr->modes + i; const XRRModeInfo* mi = sr->modes + i;
if (mi->modeFlags & RR_Interlace) if (mi->modeFlags & RR_Interlace)
continue; continue;
const unsigned int sizeDiff = (mi->width - desired->width) * for (j = 0; j < oi->nmode; j++)
{
if (oi->modes[j] == mi->id)
break;
}
if (j == oi->nmode)
continue;
sizeDiff = (mi->width - desired->width) *
(mi->width - desired->width) + (mi->width - desired->width) +
(mi->height - desired->height) * (mi->height - desired->height) *
(mi->height - desired->height); (mi->height - desired->height);
const unsigned int rateDiff = abs(calculateRefreshRate(mi) - desired->refreshRate); if (desired->refreshRate)
rateDiff = abs(calculateRefreshRate(mi) - desired->refreshRate);
else
rateDiff = UINT_MAX - calculateRefreshRate(mi);
if ((sizeDiff < leastSizeDiff) || if ((sizeDiff < leastSizeDiff) ||
(sizeDiff == leastSizeDiff && rateDiff < leastRateDiff)) (sizeDiff == leastSizeDiff && rateDiff < leastRateDiff))
@ -110,6 +125,7 @@ void _glfwSetVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired)
ci->outputs, ci->outputs,
ci->noutput); ci->noutput);
XRRFreeOutputInfo(oi);
XRRFreeCrtcInfo(ci); XRRFreeCrtcInfo(ci);
XRRFreeScreenResources(sr); XRRFreeScreenResources(sr);
} }