mirror of
https://github.com/glfw/glfw.git
synced 2024-11-22 13:04:35 +00:00
Added GLFW_DOUBLEBUFFER.
This commit is contained in:
parent
281013002d
commit
c9808586b3
@ -61,6 +61,7 @@ GLFW bundles a number of dependencies in the `deps/` directory.
|
|||||||
- Added `GLFW_AUTO_ICONIFY` for controlling whether full screen windows
|
- Added `GLFW_AUTO_ICONIFY` for controlling whether full screen windows
|
||||||
automatically iconify (and restore the previous video mode) on focus loss
|
automatically iconify (and restore the previous video mode) on focus loss
|
||||||
- Added `GLFW_DONT_CARE` for indicating that any value is acceptable
|
- Added `GLFW_DONT_CARE` for indicating that any value is acceptable
|
||||||
|
- Added `GLFW_DOUBLEBUFFER` for controlling whether to use double buffering
|
||||||
- Added `GLFW_INCLUDE_ES31` for including the OpenGL ES 3.1 header
|
- Added `GLFW_INCLUDE_ES31` for including the OpenGL ES 3.1 header
|
||||||
- Added *partial and experimental* support for Wayland
|
- Added *partial and experimental* support for Wayland
|
||||||
- Bugfix: The debug context attribute was set from `GL_ARB_debug_output` even
|
- Bugfix: The debug context attribute was set from `GL_ARB_debug_output` even
|
||||||
|
@ -250,7 +250,7 @@ double time = glfwGetTime();
|
|||||||
|
|
||||||
@section quick_swap_buffers Swapping buffers
|
@section quick_swap_buffers Swapping buffers
|
||||||
|
|
||||||
GLFW windows always use double-buffering. That means that you have two
|
GLFW windows by default use double buffering. That means that you have two
|
||||||
rendering buffers; a front buffer and a back buffer. The front buffer is the
|
rendering buffers; a front buffer and a back buffer. The front buffer is the
|
||||||
one being displayed and the back buffer the one you render to.
|
one being displayed and the back buffer the one you render to.
|
||||||
|
|
||||||
|
@ -93,6 +93,7 @@ find out the actual attributes of the created window and context, use the
|
|||||||
|
|
||||||
The following hints are hard constraints:
|
The following hints are hard constraints:
|
||||||
- `GLFW_STEREO`
|
- `GLFW_STEREO`
|
||||||
|
- `GLFW_DOUBLEBUFFER`
|
||||||
- `GLFW_CLIENT_API`
|
- `GLFW_CLIENT_API`
|
||||||
|
|
||||||
The following additional hints are hard constraints if requesting an OpenGL
|
The following additional hints are hard constraints if requesting an OpenGL
|
||||||
@ -137,7 +138,8 @@ application has no preference.
|
|||||||
The `GLFW_AUX_BUFFERS` hint specifies the desired number of auxiliary
|
The `GLFW_AUX_BUFFERS` hint specifies the desired number of auxiliary
|
||||||
buffers. `GLFW_DONT_CARE` means the application has no preference.
|
buffers. `GLFW_DONT_CARE` means the application has no preference.
|
||||||
|
|
||||||
The `GLFW_STEREO` hint specifies whether to use stereoscopic rendering.
|
The `GLFW_STEREO` hint specifies whether to use stereoscopic rendering. This is
|
||||||
|
a hard constraint.
|
||||||
|
|
||||||
The `GLFW_SAMPLES` hint specifies the desired number of samples to use for
|
The `GLFW_SAMPLES` hint specifies the desired number of samples to use for
|
||||||
multisampling. Zero disables multisampling. `GLFW_DONT_CARE` means the
|
multisampling. Zero disables multisampling. `GLFW_DONT_CARE` means the
|
||||||
@ -146,6 +148,10 @@ application has no preference.
|
|||||||
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_DOUBLEBUFFER` hint specifies whether the framebuffer should be double
|
||||||
|
buffered. You nearly always want to use double buffering. This is a hard
|
||||||
|
constraint.
|
||||||
|
|
||||||
The `GLFW_REFRESH_RATE` hint specifies the desired refresh rate for full screen
|
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
|
windows. If set to zero, the highest available refresh rate will be used. This
|
||||||
hint is ignored for windowed mode windows.
|
hint is ignored for windowed mode windows.
|
||||||
@ -154,7 +160,8 @@ hint is ignored for windowed mode windows.
|
|||||||
@subsection window_hints_ctx Context related hints
|
@subsection window_hints_ctx Context related hints
|
||||||
|
|
||||||
The `GLFW_CLIENT_API` hint specifies which client API to create the context
|
The `GLFW_CLIENT_API` hint specifies which client API to create the context
|
||||||
for. Possible values are `GLFW_OPENGL_API` and `GLFW_OPENGL_ES_API`.
|
for. Possible values are `GLFW_OPENGL_API` and `GLFW_OPENGL_ES_API`. This is
|
||||||
|
a hard constraint.
|
||||||
|
|
||||||
The `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR` hints
|
The `GLFW_CONTEXT_VERSION_MAJOR` and `GLFW_CONTEXT_VERSION_MINOR` hints
|
||||||
specify the client API version that the created context must be compatible
|
specify the client API version that the created context must be compatible
|
||||||
@ -219,6 +226,7 @@ a robustness strategy.
|
|||||||
| `GLFW_REFRESH_RATE` | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE` |
|
| `GLFW_REFRESH_RATE` | 0 | 0 to `INT_MAX` or `GLFW_DONT_CARE` |
|
||||||
| `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_DOUBLEBUFFER` | `GL_TRUE` | `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` |
|
||||||
| `GLFW_CONTEXT_VERSION_MAJOR` | 1 | Any valid major version number of the chosen client API |
|
| `GLFW_CONTEXT_VERSION_MAJOR` | 1 | Any valid major version number of the chosen client API |
|
||||||
| `GLFW_CONTEXT_VERSION_MINOR` | 0 | Any valid minor version number of the chosen client API |
|
| `GLFW_CONTEXT_VERSION_MINOR` | 0 | Any valid minor version number of the chosen client API |
|
||||||
@ -468,7 +476,7 @@ used by the context. This is `GLFW_LOSE_CONTEXT_ON_RESET` or
|
|||||||
|
|
||||||
@section window_swap Swapping buffers
|
@section window_swap Swapping buffers
|
||||||
|
|
||||||
GLFW windows are always double buffered. That means that you have two
|
GLFW windows are by default double buffered. That means that you have two
|
||||||
rendering buffers; a front buffer and a back buffer. The front buffer is
|
rendering buffers; a front buffer and a back buffer. The front buffer is
|
||||||
the one being displayed and the back buffer the one you render to.
|
the one being displayed and the back buffer the one you render to.
|
||||||
|
|
||||||
|
@ -514,6 +514,7 @@ extern "C" {
|
|||||||
#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_REFRESH_RATE 0x0002100F
|
||||||
|
#define GLFW_DOUBLEBUFFER 0x00021010
|
||||||
|
|
||||||
#define GLFW_CLIENT_API 0x00022001
|
#define GLFW_CLIENT_API 0x00022001
|
||||||
#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002
|
#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002
|
||||||
|
@ -222,6 +222,12 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (desired->doublebuffer != current->doublebuffer)
|
||||||
|
{
|
||||||
|
// Double buffering is a hard constraint
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Count number of missing buffers
|
// Count number of missing buffers
|
||||||
{
|
{
|
||||||
missing = 0;
|
missing = 0;
|
||||||
|
@ -85,10 +85,9 @@ static GLboolean chooseFBConfig(const _GLFWfbconfig* desired, GLXFBConfig* resul
|
|||||||
const GLXFBConfig n = nativeConfigs[i];
|
const GLXFBConfig n = nativeConfigs[i];
|
||||||
_GLFWfbconfig* u = usableConfigs + usableCount;
|
_GLFWfbconfig* u = usableConfigs + usableCount;
|
||||||
|
|
||||||
if (!getFBConfigAttrib(n, GLX_DOUBLEBUFFER) ||
|
if (!getFBConfigAttrib(n, GLX_VISUAL_ID))
|
||||||
!getFBConfigAttrib(n, GLX_VISUAL_ID))
|
|
||||||
{
|
{
|
||||||
// Only consider double-buffered GLXFBConfigs with associated visuals
|
// Only consider GLXFBConfigs with associated visuals
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +120,11 @@ static GLboolean chooseFBConfig(const _GLFWfbconfig* desired, GLXFBConfig* resul
|
|||||||
u->accumAlphaBits = getFBConfigAttrib(n, GLX_ACCUM_ALPHA_SIZE);
|
u->accumAlphaBits = getFBConfigAttrib(n, GLX_ACCUM_ALPHA_SIZE);
|
||||||
|
|
||||||
u->auxBuffers = getFBConfigAttrib(n, GLX_AUX_BUFFERS);
|
u->auxBuffers = getFBConfigAttrib(n, GLX_AUX_BUFFERS);
|
||||||
u->stereo = getFBConfigAttrib(n, GLX_STEREO);
|
|
||||||
|
if (getFBConfigAttrib(n, GLX_STEREO))
|
||||||
|
u->stereo = GL_TRUE;
|
||||||
|
if (getFBConfigAttrib(n, GLX_DOUBLEBUFFER))
|
||||||
|
u->doublebuffer = GL_TRUE;
|
||||||
|
|
||||||
if (_glfw.glx.ARB_multisample)
|
if (_glfw.glx.ARB_multisample)
|
||||||
u->samples = getFBConfigAttrib(n, GLX_SAMPLES);
|
u->samples = getFBConfigAttrib(n, GLX_SAMPLES);
|
||||||
|
@ -200,6 +200,7 @@ struct _GLFWfbconfig
|
|||||||
int stereo;
|
int stereo;
|
||||||
int samples;
|
int samples;
|
||||||
int sRGB;
|
int sRGB;
|
||||||
|
int doublebuffer;
|
||||||
|
|
||||||
// This is defined in the context API's context.h
|
// This is defined in the context API's context.h
|
||||||
_GLFW_PLATFORM_FBCONFIG;
|
_GLFW_PLATFORM_FBCONFIG;
|
||||||
@ -325,6 +326,7 @@ struct _GLFWlibrary
|
|||||||
int samples;
|
int samples;
|
||||||
int sRGB;
|
int sRGB;
|
||||||
int refreshRate;
|
int refreshRate;
|
||||||
|
int doublebuffer;
|
||||||
int api;
|
int api;
|
||||||
int major;
|
int major;
|
||||||
int minor;
|
int minor;
|
||||||
|
@ -127,7 +127,6 @@ int _glfwCreateContext(_GLFWwindow* window,
|
|||||||
// Arbitrary array size here
|
// Arbitrary array size here
|
||||||
NSOpenGLPixelFormatAttribute attributes[40];
|
NSOpenGLPixelFormatAttribute attributes[40];
|
||||||
|
|
||||||
ADD_ATTR(NSOpenGLPFADoubleBuffer);
|
|
||||||
ADD_ATTR(NSOpenGLPFAClosestPolicy);
|
ADD_ATTR(NSOpenGLPFAClosestPolicy);
|
||||||
|
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
|
||||||
@ -180,6 +179,9 @@ int _glfwCreateContext(_GLFWwindow* window,
|
|||||||
if (fbconfig->stereo)
|
if (fbconfig->stereo)
|
||||||
ADD_ATTR(NSOpenGLPFAStereo);
|
ADD_ATTR(NSOpenGLPFAStereo);
|
||||||
|
|
||||||
|
if (fbconfig->doublebuffer)
|
||||||
|
ADD_ATTR(NSOpenGLPFADoubleBuffer);
|
||||||
|
|
||||||
if (fbconfig->samples != GLFW_DONT_CARE)
|
if (fbconfig->samples != GLFW_DONT_CARE)
|
||||||
{
|
{
|
||||||
if (fbconfig->samples == 0)
|
if (fbconfig->samples == 0)
|
||||||
|
@ -181,8 +181,7 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
// Get pixel format attributes through WGL_ARB_pixel_format
|
// Get pixel format attributes through WGL_ARB_pixel_format
|
||||||
if (!getPixelFormatAttrib(window, n, WGL_SUPPORT_OPENGL_ARB) ||
|
if (!getPixelFormatAttrib(window, n, WGL_SUPPORT_OPENGL_ARB) ||
|
||||||
!getPixelFormatAttrib(window, n, WGL_DRAW_TO_WINDOW_ARB) ||
|
!getPixelFormatAttrib(window, n, WGL_DRAW_TO_WINDOW_ARB))
|
||||||
!getPixelFormatAttrib(window, n, WGL_DOUBLE_BUFFER_ARB))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -213,13 +212,20 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
|
|||||||
u->accumAlphaBits = getPixelFormatAttrib(window, n, WGL_ACCUM_ALPHA_BITS_ARB);
|
u->accumAlphaBits = getPixelFormatAttrib(window, n, WGL_ACCUM_ALPHA_BITS_ARB);
|
||||||
|
|
||||||
u->auxBuffers = getPixelFormatAttrib(window, n, WGL_AUX_BUFFERS_ARB);
|
u->auxBuffers = getPixelFormatAttrib(window, n, WGL_AUX_BUFFERS_ARB);
|
||||||
u->stereo = getPixelFormatAttrib(window, n, WGL_STEREO_ARB);
|
|
||||||
|
if (getPixelFormatAttrib(window, n, WGL_STEREO_ARB))
|
||||||
|
u->stereo = GL_TRUE;
|
||||||
|
if (getPixelFormatAttrib(window, n, WGL_DOUBLE_BUFFER_ARB))
|
||||||
|
u->doublebuffer = GL_TRUE;
|
||||||
|
|
||||||
if (window->wgl.ARB_multisample)
|
if (window->wgl.ARB_multisample)
|
||||||
u->samples = getPixelFormatAttrib(window, n, WGL_SAMPLES_ARB);
|
u->samples = getPixelFormatAttrib(window, n, WGL_SAMPLES_ARB);
|
||||||
|
|
||||||
if (window->wgl.ARB_framebuffer_sRGB)
|
if (window->wgl.ARB_framebuffer_sRGB)
|
||||||
u->sRGB = getPixelFormatAttrib(window, n, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB);
|
{
|
||||||
|
if (getPixelFormatAttrib(window, n, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB))
|
||||||
|
u->sRGB = GL_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -236,8 +242,7 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(pfd.dwFlags & PFD_DRAW_TO_WINDOW) ||
|
if (!(pfd.dwFlags & PFD_DRAW_TO_WINDOW) ||
|
||||||
!(pfd.dwFlags & PFD_SUPPORT_OPENGL) ||
|
!(pfd.dwFlags & PFD_SUPPORT_OPENGL))
|
||||||
!(pfd.dwFlags & PFD_DOUBLEBUFFER))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -265,7 +270,11 @@ static GLboolean choosePixelFormat(_GLFWwindow* window,
|
|||||||
u->accumAlphaBits = pfd.cAccumAlphaBits;
|
u->accumAlphaBits = pfd.cAccumAlphaBits;
|
||||||
|
|
||||||
u->auxBuffers = pfd.cAuxBuffers;
|
u->auxBuffers = pfd.cAuxBuffers;
|
||||||
u->stereo = (pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE;
|
|
||||||
|
if (pfd.dwFlags & PFD_STEREO)
|
||||||
|
u->stereo = GL_TRUE;
|
||||||
|
if (pfd.dwFlags & PFD_DOUBLEBUFFER)
|
||||||
|
u->doublebuffer = GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
u->wgl = n;
|
u->wgl = n;
|
||||||
|
20
src/window.c
20
src/window.c
@ -157,6 +157,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
|
|||||||
fbconfig.stereo = _glfw.hints.stereo;
|
fbconfig.stereo = _glfw.hints.stereo;
|
||||||
fbconfig.samples = _glfw.hints.samples;
|
fbconfig.samples = _glfw.hints.samples;
|
||||||
fbconfig.sRGB = _glfw.hints.sRGB;
|
fbconfig.sRGB = _glfw.hints.sRGB;
|
||||||
|
fbconfig.doublebuffer = _glfw.hints.doublebuffer ? GL_TRUE : GL_FALSE;
|
||||||
|
|
||||||
// Set up desired window config
|
// Set up desired window config
|
||||||
wndconfig.width = width;
|
wndconfig.width = width;
|
||||||
@ -266,13 +267,15 @@ void glfwDefaultWindowHints(void)
|
|||||||
_glfw.hints.decorated = GL_TRUE;
|
_glfw.hints.decorated = GL_TRUE;
|
||||||
_glfw.hints.autoIconify = GL_TRUE;
|
_glfw.hints.autoIconify = GL_TRUE;
|
||||||
|
|
||||||
// The default is 24 bits of color, 24 bits of depth and 8 bits of stencil
|
// The default is 24 bits of color, 24 bits of depth and 8 bits of stencil,
|
||||||
_glfw.hints.redBits = 8;
|
// double buffered
|
||||||
_glfw.hints.greenBits = 8;
|
_glfw.hints.redBits = 8;
|
||||||
_glfw.hints.blueBits = 8;
|
_glfw.hints.greenBits = 8;
|
||||||
_glfw.hints.alphaBits = 8;
|
_glfw.hints.blueBits = 8;
|
||||||
_glfw.hints.depthBits = 24;
|
_glfw.hints.alphaBits = 8;
|
||||||
_glfw.hints.stencilBits = 8;
|
_glfw.hints.depthBits = 24;
|
||||||
|
_glfw.hints.stencilBits = 8;
|
||||||
|
_glfw.hints.doublebuffer = GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwWindowHint(int target, int hint)
|
GLFWAPI void glfwWindowHint(int target, int hint)
|
||||||
@ -320,6 +323,9 @@ GLFWAPI void glfwWindowHint(int target, int hint)
|
|||||||
case GLFW_REFRESH_RATE:
|
case GLFW_REFRESH_RATE:
|
||||||
_glfw.hints.refreshRate = hint;
|
_glfw.hints.refreshRate = hint;
|
||||||
break;
|
break;
|
||||||
|
case GLFW_DOUBLEBUFFER:
|
||||||
|
_glfw.hints.doublebuffer = hint;
|
||||||
|
break;
|
||||||
case GLFW_RESIZABLE:
|
case GLFW_RESIZABLE:
|
||||||
_glfw.hints.resizable = hint;
|
_glfw.hints.resizable = hint;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user