diff options
Diffstat (limited to 'pugl')
-rw-r--r-- | pugl/detail/implementation.c | 10 | ||||
-rw-r--r-- | pugl/detail/mac.m | 14 | ||||
-rw-r--r-- | pugl/detail/mac_gl.m | 30 | ||||
-rw-r--r-- | pugl/detail/win.c | 14 | ||||
-rw-r--r-- | pugl/detail/win_gl.c | 18 | ||||
-rw-r--r-- | pugl/detail/x11.h | 5 | ||||
-rw-r--r-- | pugl/detail/x11_gl.c | 24 | ||||
-rw-r--r-- | pugl/pugl.h | 10 | ||||
-rw-r--r-- | pugl/pugl.hpp | 6 |
9 files changed, 127 insertions, 4 deletions
diff --git a/pugl/detail/implementation.c b/pugl/detail/implementation.c index 5534662..31ee643 100644 --- a/pugl/detail/implementation.c +++ b/pugl/detail/implementation.c @@ -262,6 +262,16 @@ puglSetViewHint(PuglView* view, PuglViewHint hint, int value) return PUGL_BAD_PARAMETER; } +int +puglGetViewHint(const PuglView* view, PuglViewHint hint) +{ + if (hint < PUGL_NUM_VIEW_HINTS) { + return view->hints[hint]; + } + + return PUGL_DONT_CARE; +} + PuglStatus puglSetParentWindow(PuglView* view, PuglNativeView parent) { diff --git a/pugl/detail/mac.m b/pugl/detail/mac.m index 23671ae..0c50d20 100644 --- a/pugl/detail/mac.m +++ b/pugl/detail/mac.m @@ -866,6 +866,20 @@ puglRealize(PuglView* view) const NSScreen* const screen = [NSScreen mainScreen]; const double scaleFactor = [screen backingScaleFactor]; + // Getting depth from the display mode seems tedious, just set usual values + if (view->hints[PUGL_RED_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_RED_BITS] = 8; + } + if (view->hints[PUGL_BLUE_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_BLUE_BITS] = 8; + } + if (view->hints[PUGL_GREEN_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_GREEN_BITS] = 8; + } + if (view->hints[PUGL_ALPHA_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_ALPHA_BITS] = 8; + } + if (view->frame.width == 0.0 && view->frame.height == 0.0) { if (view->defaultWidth == 0.0 && view->defaultHeight == 0.0) { return PUGL_BAD_CONFIGURATION; diff --git a/pugl/detail/mac_gl.m b/pugl/detail/mac_gl.m index 4bf6fc1..4d4f324 100644 --- a/pugl/detail/mac_gl.m +++ b/pugl/detail/mac_gl.m @@ -48,12 +48,36 @@ ? NSOpenGLProfileVersion4_1Core : NSOpenGLProfileVersion3_2Core)); - NSOpenGLPixelFormatAttribute pixelAttribs[16] = { + // Set attributes to default if they are unset + // (There is no GLX_DONT_CARE equivalent on MacOS) + if (puglview->hints[PUGL_DEPTH_BITS] == PUGL_DONT_CARE) { + puglview->hints[PUGL_DEPTH_BITS] = 0; + } + if (puglview->hints[PUGL_STENCIL_BITS] == PUGL_DONT_CARE) { + puglview->hints[PUGL_STENCIL_BITS] = 0; + } + if (puglview->hints[PUGL_SAMPLES] == PUGL_DONT_CARE) { + puglview->hints[PUGL_SAMPLES] = 1; + } + if (puglview->hints[PUGL_DOUBLE_BUFFER] == PUGL_DONT_CARE) { + puglview->hints[PUGL_DOUBLE_BUFFER] = 1; + } + if (puglview->hints[PUGL_SWAP_INTERVAL] == PUGL_DONT_CARE) { + puglview->hints[PUGL_SWAP_INTERVAL] = 1; + } + + const unsigned colorSize = (unsigned)(puglview->hints[PUGL_RED_BITS] + + puglview->hints[PUGL_BLUE_BITS] + + puglview->hints[PUGL_GREEN_BITS] + + puglview->hints[PUGL_ALPHA_BITS]); + + NSOpenGLPixelFormatAttribute pixelAttribs[17] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAAccelerated, NSOpenGLPFAOpenGLProfile, profile, - NSOpenGLPFAColorSize, 32, - NSOpenGLPFADepthSize, 32, + NSOpenGLPFAColorSize, colorSize, + NSOpenGLPFADepthSize, (unsigned)puglview->hints[PUGL_DEPTH_BITS], + NSOpenGLPFAStencilSize, (unsigned)puglview->hints[PUGL_STENCIL_BITS], NSOpenGLPFAMultisample, samples ? 1 : 0, NSOpenGLPFASampleBuffers, samples ? 1 : 0, NSOpenGLPFASamples, samples, diff --git a/pugl/detail/win.c b/pugl/detail/win.c index 4f7afee..38eca9d 100644 --- a/pugl/detail/win.c +++ b/pugl/detail/win.c @@ -166,6 +166,20 @@ puglRealize(PuglView* view) { PuglInternals* impl = view->impl; + // Getting depth from the display mode seems tedious, just set usual values + if (view->hints[PUGL_RED_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_RED_BITS] = 8; + } + if (view->hints[PUGL_BLUE_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_BLUE_BITS] = 8; + } + if (view->hints[PUGL_GREEN_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_GREEN_BITS] = 8; + } + if (view->hints[PUGL_ALPHA_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_ALPHA_BITS] = 8; + } + // Get refresh rate for resize draw timer DEVMODEA devMode = {0}; EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devMode); diff --git a/pugl/detail/win_gl.c b/pugl/detail/win_gl.c index 8cdad76..096c715 100644 --- a/pugl/detail/win_gl.c +++ b/pugl/detail/win_gl.c @@ -108,6 +108,24 @@ puglWinGlConfigure(PuglView* view) { PuglInternals* impl = view->impl; + // Set attributes to default if they are unset + // (There is no GLX_DONT_CARE equivalent on Windows) + if (view->hints[PUGL_DEPTH_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_DEPTH_BITS] = 0; + } + if (view->hints[PUGL_STENCIL_BITS] == PUGL_DONT_CARE) { + view->hints[PUGL_STENCIL_BITS] = 0; + } + if (view->hints[PUGL_SAMPLES] == PUGL_DONT_CARE) { + view->hints[PUGL_SAMPLES] = 1; + } + if (view->hints[PUGL_DOUBLE_BUFFER] == PUGL_DONT_CARE) { + view->hints[PUGL_DOUBLE_BUFFER] = 1; + } + if (view->hints[PUGL_SWAP_INTERVAL] == PUGL_DONT_CARE) { + view->hints[PUGL_SWAP_INTERVAL] = 1; + } + // clang-format off const int pixelAttrs[] = { WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, diff --git a/pugl/detail/x11.h b/pugl/detail/x11.h index cf647ed..4b0109d 100644 --- a/pugl/detail/x11.h +++ b/pugl/detail/x11.h @@ -83,5 +83,10 @@ puglX11StubConfigure(PuglView* view) pat.screen = impl->screen; impl->vi = XGetVisualInfo(impl->display, VisualScreenMask, &pat, &n); + view->hints[PUGL_RED_BITS] = impl->vi->bits_per_rgb; + view->hints[PUGL_GREEN_BITS] = impl->vi->bits_per_rgb; + view->hints[PUGL_BLUE_BITS] = impl->vi->bits_per_rgb; + view->hints[PUGL_ALPHA_BITS] = 0; + return PUGL_SUCCESS; } diff --git a/pugl/detail/x11_gl.c b/pugl/detail/x11_gl.c index e4a0ea8..228a530 100644 --- a/pugl/detail/x11_gl.c +++ b/pugl/detail/x11_gl.c @@ -71,7 +71,7 @@ puglX11GlConfigure(PuglView* view) GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_SAMPLES, view->hints[PUGL_SAMPLES], + GLX_SAMPLES, puglX11GlHintValue(view->hints[PUGL_SAMPLES]), GLX_RED_SIZE, puglX11GlHintValue(view->hints[PUGL_RED_BITS]), GLX_GREEN_SIZE, puglX11GlHintValue(view->hints[PUGL_GREEN_BITS]), GLX_BLUE_SIZE, puglX11GlHintValue(view->hints[PUGL_BLUE_BITS]), @@ -91,6 +91,23 @@ puglX11GlConfigure(PuglView* view) surface->fb_config = fbc[0]; impl->vi = glXGetVisualFromFBConfig(impl->display, fbc[0]); + view->hints[PUGL_RED_BITS] = puglX11GlGetAttrib( + display, fbc[0], GLX_RED_SIZE); + view->hints[PUGL_GREEN_BITS] = puglX11GlGetAttrib( + display, fbc[0], GLX_GREEN_SIZE); + view->hints[PUGL_BLUE_BITS] = puglX11GlGetAttrib( + display, fbc[0], GLX_BLUE_SIZE); + view->hints[PUGL_ALPHA_BITS] = puglX11GlGetAttrib( + display, fbc[0], GLX_ALPHA_SIZE); + view->hints[PUGL_DEPTH_BITS] = puglX11GlGetAttrib( + display, fbc[0], GLX_DEPTH_SIZE); + view->hints[PUGL_STENCIL_BITS] = puglX11GlGetAttrib( + display, fbc[0], GLX_STENCIL_SIZE); + view->hints[PUGL_SAMPLES] = puglX11GlGetAttrib( + display, fbc[0], GLX_SAMPLES); + view->hints[PUGL_DOUBLE_BUFFER] = puglX11GlGetAttrib( + display, fbc[0], GLX_DOUBLEBUFFER); + char msg[128]; snprintf( @@ -182,6 +199,11 @@ puglX11GlCreate(PuglView* view) GLX_DOUBLEBUFFER, &view->hints[PUGL_DOUBLE_BUFFER]); + glXQueryDrawable(display, + impl->win, + GLX_SWAP_INTERVAL_EXT, + (unsigned int*)&view->hints[PUGL_SWAP_INTERVAL]); + return PUGL_SUCCESS; } diff --git a/pugl/pugl.h b/pugl/pugl.h index c32a17d..7e27425 100644 --- a/pugl/pugl.h +++ b/pugl/pugl.h @@ -939,6 +939,16 @@ PUGL_API PuglStatus puglSetViewHint(PuglView* view, PuglViewHint hint, int value); /** + Get the value for a view hint. + + If the view has been realized, this can be used to get the actual value of a + hint which was initially set to PUGL_DONT_CARE, or has been adjusted from + the suggested value. +*/ +PUGL_API int +puglGetViewHint(const PuglView* view, PuglViewHint hint); + +/** @} @anchor frame @name Frame diff --git a/pugl/pugl.hpp b/pugl/pugl.hpp index 3072560..4968da4 100644 --- a/pugl/pugl.hpp +++ b/pugl/pugl.hpp @@ -418,6 +418,12 @@ public: puglSetViewHint(cobj(), static_cast<PuglViewHint>(hint), value)); } + /// @copydoc puglGetViewHint + int getHint(ViewHint hint) + { + return puglGetViewHint(cobj(), static_cast<PuglViewHint>(hint)); + } + /** @} @name Frame |