Przeglądaj źródła

sokol_app.h: sapp_gl_get_framebuffer() wip

Andre Weissflog 1 rok temu
rodzic
commit
e55a89164a
1 zmienionych plików z 43 dodań i 4 usunięć
  1. 43 4
      sokol_app.h

+ 43 - 4
sokol_app.h

@@ -1879,6 +1879,9 @@ SOKOL_APP_API_DECL const void* sapp_wgpu_get_resolve_view(void);
 /* WebGPU: get swapchain's WGPUTextureView for the depth-stencil surface */
 /* WebGPU: get swapchain's WGPUTextureView for the depth-stencil surface */
 SOKOL_APP_API_DECL const void* sapp_wgpu_get_depth_stencil_view(void);
 SOKOL_APP_API_DECL const void* sapp_wgpu_get_depth_stencil_view(void);
 
 
+/* GL: get framebuffer object */
+SOKOL_APP_API_DECL uint32_t sapp_gl_get_framebuffer(void);
+
 /* Android: get native activity handle */
 /* Android: get native activity handle */
 SOKOL_APP_API_DECL const void* sapp_android_get_native_activity(void);
 SOKOL_APP_API_DECL const void* sapp_android_get_native_activity(void);
 
 
@@ -1990,6 +1993,10 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
 #error "sokol_app.h: Unknown platform"
 #error "sokol_app.h: Unknown platform"
 #endif
 #endif
 
 
+#if defined(SOKOL_GLCORE33) || defined(SOKOL_GLES3)
+    #define _SAPP_ANY_GL (1)
+#endif
+
 #ifndef SOKOL_API_IMPL
 #ifndef SOKOL_API_IMPL
     #define SOKOL_API_IMPL
     #define SOKOL_API_IMPL
 #endif
 #endif
@@ -2023,16 +2030,18 @@ inline void sapp_run(const sapp_desc& desc) { return sapp_run(&desc); }
         #import <MetalKit/MetalKit.h>
         #import <MetalKit/MetalKit.h>
     #endif
     #endif
     #if defined(_SAPP_MACOS)
     #if defined(_SAPP_MACOS)
-        #if !defined(SOKOL_METAL)
+        #if defined(_SAPP_ANY_GL)
             #ifndef GL_SILENCE_DEPRECATION
             #ifndef GL_SILENCE_DEPRECATION
             #define GL_SILENCE_DEPRECATION
             #define GL_SILENCE_DEPRECATION
             #endif
             #endif
             #include <Cocoa/Cocoa.h>
             #include <Cocoa/Cocoa.h>
+            #include <OpenGL/gl3.h>
         #endif
         #endif
     #elif defined(_SAPP_IOS)
     #elif defined(_SAPP_IOS)
         #import <UIKit/UIKit.h>
         #import <UIKit/UIKit.h>
-        #if !defined(SOKOL_METAL)
+        #if defined(_SAPP_ANY_GL)
             #import <GLKit/GLKit.h>
             #import <GLKit/GLKit.h>
+            #include <OpenGLES/ES3/gl.h>
         #endif
         #endif
     #endif
     #endif
     #include <AvailabilityMacros.h>
     #include <AvailabilityMacros.h>
@@ -2753,6 +2762,9 @@ typedef struct {
     PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA;
     PFNGLXSWAPINTERVALMESAPROC SwapIntervalMESA;
     PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
     PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
 
 
+    // special case glGetIntegerv
+    void (*GetIntegerv)(uint32_t pname, int32_t* data);
+
     // extension availability
     // extension availability
     bool EXT_swap_control;
     bool EXT_swap_control;
     bool MESA_swap_control;
     bool MESA_swap_control;
@@ -2770,9 +2782,14 @@ typedef struct {
 } _sapp_egl_t;
 } _sapp_egl_t;
 
 
 #endif // _SAPP_GLX
 #endif // _SAPP_GLX
-
 #endif // _SAPP_LINUX
 #endif // _SAPP_LINUX
 
 
+#if defined(_SAPP_ANY_GL)
+typedef struct {
+    GLuint framebuffer;
+} _sapp_gl_t;
+#endif
+
 typedef struct {
 typedef struct {
     bool enabled;
     bool enabled;
     int buf_size;
     int buf_size;
@@ -2850,6 +2867,9 @@ typedef struct {
             _sapp_egl_t egl;
             _sapp_egl_t egl;
         #endif
         #endif
     #endif
     #endif
+    #if defined(_SAPP_ANY_GL)
+        _sapp_gl_t gl;
+    #endif
     char html5_canvas_selector[_SAPP_MAX_TITLE_LENGTH];
     char html5_canvas_selector[_SAPP_MAX_TITLE_LENGTH];
     char window_title[_SAPP_MAX_TITLE_LENGTH];      // UTF-8
     char window_title[_SAPP_MAX_TITLE_LENGTH];      // UTF-8
     wchar_t window_title_wide[_SAPP_MAX_TITLE_LENGTH];   // UTF-32 or UCS-2 */
     wchar_t window_title_wide[_SAPP_MAX_TITLE_LENGTH];   // UTF-32 or UCS-2 */
@@ -4127,13 +4147,16 @@ _SOKOL_PRIVATE void _sapp_macos_poll_input_events(void) {
 
 
 - (void)drawRect:(NSRect)rect {
 - (void)drawRect:(NSRect)rect {
     _SOKOL_UNUSED(rect);
     _SOKOL_UNUSED(rect);
+    #if defined(_SAPP_ANY_GL)
+    glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&_sapp.gl.framebuffer);
+    #endif
     _sapp_timing_measure(&_sapp.timing);
     _sapp_timing_measure(&_sapp.timing);
     /* Catch any last-moment input events */
     /* Catch any last-moment input events */
     _sapp_macos_poll_input_events();
     _sapp_macos_poll_input_events();
     @autoreleasepool {
     @autoreleasepool {
         _sapp_macos_frame();
         _sapp_macos_frame();
     }
     }
-    #if !defined(SOKOL_METAL)
+    #if defined(_SAPP_ANY_GL)
     [[_sapp.macos.view openGLContext] flushBuffer];
     [[_sapp.macos.view openGLContext] flushBuffer];
     #endif
     #endif
 }
 }
@@ -4656,6 +4679,9 @@ _SOKOL_PRIVATE void _sapp_ios_show_keyboard(bool shown) {
 @implementation _sapp_ios_view
 @implementation _sapp_ios_view
 - (void)drawRect:(CGRect)rect {
 - (void)drawRect:(CGRect)rect {
     _SOKOL_UNUSED(rect);
     _SOKOL_UNUSED(rect);
+    #if defined(_SAPP_ANY_GL)
+    glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*)&_sapp.gl.framebuffer);
+    #endif
     _sapp_timing_measure(&_sapp.timing);
     _sapp_timing_measure(&_sapp.timing);
     @autoreleasepool {
     @autoreleasepool {
         _sapp_ios_frame();
         _sapp_ios_frame();
@@ -6550,6 +6576,8 @@ _SOKOL_PRIVATE void _sapp_wgl_init(void) {
     SOKOL_ASSERT(_sapp.wgl.GetCurrentDC);
     SOKOL_ASSERT(_sapp.wgl.GetCurrentDC);
     _sapp.wgl.MakeCurrent = (PFN_wglMakeCurrent)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglMakeCurrent");
     _sapp.wgl.MakeCurrent = (PFN_wglMakeCurrent)(void*) GetProcAddress(_sapp.wgl.opengl32, "wglMakeCurrent");
     SOKOL_ASSERT(_sapp.wgl.MakeCurrent);
     SOKOL_ASSERT(_sapp.wgl.MakeCurrent);
+    _sapp.wgl.GetIntegerv = (void(*)(uint32_t, int32_t*) GetProcAddress(_sapp.wgl.opengl32, "glGetIntegerv");
+    SOKOL_ASSERT(_sapp.wgl.GetIntegerv);
 
 
     _sapp.wgl.msg_hwnd = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW,
     _sapp.wgl.msg_hwnd = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW,
         L"SOKOLAPP",
         L"SOKOLAPP",
@@ -6814,6 +6842,8 @@ _SOKOL_PRIVATE void _sapp_wgl_create_context(void) {
         /* FIXME: DwmIsCompositionEnabled() (see GLFW) */
         /* FIXME: DwmIsCompositionEnabled() (see GLFW) */
         _sapp.wgl.SwapIntervalEXT(_sapp.swap_interval);
         _sapp.wgl.SwapIntervalEXT(_sapp.swap_interval);
     }
     }
+    const uint32_t gl_framebuffer_binding = 0x8CA6;
+    _sapp.wgl.GetIntegerv(gl_framebuffer_binding, &_sapp.gl.framebuffer);
 }
 }
 
 
 _SOKOL_PRIVATE void _sapp_wgl_destroy_context(void) {
 _SOKOL_PRIVATE void _sapp_wgl_destroy_context(void) {
@@ -11645,6 +11675,15 @@ SOKOL_API_IMPL const void* sapp_wgpu_get_depth_stencil_view(void) {
     #endif
     #endif
 }
 }
 
 
+SOKOL_API_IMPL uint32_t sapp_gl_get_framebuffer(void) {
+    SOKOL_ASSERT(_sapp.valid);
+    #if defined(_SAPP_ANY_GL)
+        return _sapp.gl.framebuffer;
+    #else
+        return 0;
+    #endif
+}
+
 SOKOL_API_IMPL const void* sapp_android_get_native_activity(void) {
 SOKOL_API_IMPL const void* sapp_android_get_native_activity(void) {
     // NOTE: _sapp.valid is not asserted here because sapp_android_get_native_activity()
     // NOTE: _sapp.valid is not asserted here because sapp_android_get_native_activity()
     // needs to be callable from within sokol_main() (see: https://github.com/floooh/sokol/issues/708)
     // needs to be callable from within sokol_main() (see: https://github.com/floooh/sokol/issues/708)