[OpenGL] Add glXSwapBuffersMscOML and disable XGetGeometry

pull/197/head
jackun 4 years ago
parent 9d1b548f69
commit beee2b08c7
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -18,6 +18,8 @@ void* glXGetProcAddress(const unsigned char*);
void* glXGetProcAddressARB(const unsigned char*);
int glXQueryDrawable(void *dpy, void* glxdraw, int attr, unsigned int * value);
int64_t glXSwapBuffersMscOML(void* dpy, void* drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
unsigned int eglSwapBuffers( void*, void* );
#ifdef __cplusplus

@ -103,9 +103,8 @@ EXPORT_C_(int) glXMakeCurrent(void* dpy, void* drawable, void* ctx) {
return ret;
}
EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) {
glx.Load();
static void do_imgui_swap(void *dpy, void *drawable)
{
if (!is_blacklisted()) {
imgui_create(glx.GetCurrentContext());
@ -114,7 +113,7 @@ EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) {
// glXQueryDrawable is buggy, use XGetGeometry instead
Window unused_window;
int unused;
static bool xgetgeom_failed = false;
static bool xgetgeom_failed = true; // FIXME XGetGeometry may not like the drawable so disable for now
if (xgetgeom_failed || !g_x11->XGetGeometry((Display*)dpy,
(Window)drawable, &unused_window,
&unused, &unused,
@ -132,7 +131,12 @@ EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) {
imgui_render(width, height);
}
}
EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) {
glx.Load();
do_imgui_swap(dpy, drawable);
glx.SwapBuffers(dpy, drawable);
if (!is_blacklisted() && fps_limit_stats.targetFrameTime > 0){
@ -142,6 +146,21 @@ EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) {
}
}
EXPORT_C_(int64_t) glXSwapBuffersMscOML(void* dpy, void* drawable, int64_t target_msc, int64_t divisor, int64_t remainder)
{
glx.Load();
do_imgui_swap(dpy, drawable);
int64_t ret = glx.SwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder);
if (!is_blacklisted() && fps_limit_stats.targetFrameTime > 0){
fps_limit_stats.frameStart = os_time_get_nano();
FpsLimiter(fps_limit_stats);
fps_limit_stats.frameEnd = os_time_get_nano();
}
return ret;
}
EXPORT_C_(void) glXSwapIntervalEXT(void *dpy, void *draw, int interval) {
#ifndef NDEBUG
std::cerr << __func__ << ": " << interval << std::endl;
@ -205,13 +224,14 @@ struct func_ptr {
void *ptr;
};
static std::array<const func_ptr, 9> name_to_funcptr_map = {{
static std::array<const func_ptr, 10> name_to_funcptr_map = {{
#define ADD_HOOK(fn) { #fn, (void *) fn }
ADD_HOOK(glXGetProcAddress),
ADD_HOOK(glXGetProcAddressARB),
ADD_HOOK(glXCreateContext),
ADD_HOOK(glXMakeCurrent),
ADD_HOOK(glXSwapBuffers),
ADD_HOOK(glXSwapBuffersMscOML),
ADD_HOOK(glXSwapIntervalEXT),
ADD_HOOK(glXSwapIntervalSGI),

@ -66,6 +66,14 @@ bool glx_loader::Load() {
return false;
}
SwapBuffersMscOML =
reinterpret_cast<decltype(this->SwapBuffersMscOML)>(
GetProcAddress((const unsigned char *)"glXSwapBuffersMscOML"));
/*if (!SwapBuffersMscOML) {
CleanUp(true);
return false;
}*/
SwapIntervalEXT =
reinterpret_cast<decltype(this->SwapIntervalEXT)>(
GetProcAddress((const unsigned char *)"glXSwapIntervalEXT"));

@ -22,6 +22,7 @@ class glx_loader {
decltype(&::glXMakeCurrent) MakeCurrent;
decltype(&::glXGetCurrentContext) GetCurrentContext;
decltype(&::glXQueryDrawable) QueryDrawable;
decltype(&::glXSwapBuffersMscOML) SwapBuffersMscOML;
private:
void CleanUp(bool unload);

Loading…
Cancel
Save