[OpenGL] Set swap interval (vsync) with `gl_vsync` param

pull/58/head
jackun 4 years ago
parent 690c7e7e1f
commit e0ce0493f7
No known key found for this signature in database
GPG Key ID: 119DB3F1D05A9ED3

@ -10,6 +10,7 @@ void glXSwapBuffers(void*, void*);
void glXSwapIntervalEXT(void*, void*, int);
int glXSwapIntervalSGI(int);
int glXSwapIntervalMESA(unsigned int);
int glXGetSwapIntervalMESA(void);
bool glXMakeCurrent(void*, void*, void*);
void* glXGetProcAddress(const unsigned char*);

@ -208,18 +208,73 @@ EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) {
}
}
EXPORT_C_(void) glXSwapIntervalEXT(void *dpy, void *draw, int interval) {
#ifndef NDEBUG
std::cerr << __func__ << ": " << interval << std::endl;
#endif
gl.Load();
if (params.gl_vsync >= 0)
interval = params.gl_vsync;
gl.glXSwapIntervalEXT(dpy, draw, interval);
}
EXPORT_C_(int) glXSwapIntervalSGI(int interval) {
#ifndef NDEBUG
std::cerr << __func__ << ": " << interval << std::endl;
#endif
gl.Load();
if (params.gl_vsync >= 0)
interval = params.gl_vsync;
return gl.glXSwapIntervalSGI(interval);
}
EXPORT_C_(int) glXSwapIntervalMESA(unsigned int interval) {
#ifndef NDEBUG
std::cerr << __func__ << ": " << interval << std::endl;
#endif
gl.Load();
if (params.gl_vsync >= 0)
interval = (unsigned int)params.gl_vsync;
return gl.glXSwapIntervalMESA(interval);
}
EXPORT_C_(int) glXGetSwapIntervalMESA() {
gl.Load();
static bool first_call = true;
int interval = gl.glXGetSwapIntervalMESA();
if (first_call) {
first_call = false;
if (params.gl_vsync >= 0) {
interval = params.gl_vsync;
gl.glXSwapIntervalMESA(interval);
}
}
#ifndef NDEBUG
std::cerr << __func__ << ": " << interval << std::endl;
#endif
return interval;
}
struct func_ptr {
const char *name;
void *ptr;
};
static std::array<const func_ptr, 5> name_to_funcptr_map = {{
static std::array<const func_ptr, 9> 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(glXSwapIntervalEXT),
ADD_HOOK(glXSwapIntervalSGI),
ADD_HOOK(glXSwapIntervalMESA),
ADD_HOOK(glXGetSwapIntervalMESA),
#undef ADD_HOOK
}};

@ -71,6 +71,10 @@ bool gl_loader::Load(bool egl_only) {
reinterpret_cast<decltype(this->glXSwapIntervalMESA)>(
glXGetProcAddress((const unsigned char *)"glXSwapIntervalMESA"));
glXGetSwapIntervalMESA =
reinterpret_cast<decltype(this->glXGetSwapIntervalMESA)>(
glXGetProcAddress((const unsigned char *)"glXGetSwapIntervalMESA"));
glXMakeCurrent =
reinterpret_cast<decltype(this->glXMakeCurrent)>(
glXGetProcAddress((const unsigned char *)"glXMakeCurrent"));

@ -20,6 +20,7 @@ class gl_loader {
decltype(&::glXSwapIntervalEXT) glXSwapIntervalEXT;
decltype(&::glXSwapIntervalSGI) glXSwapIntervalSGI;
decltype(&::glXSwapIntervalMESA) glXSwapIntervalMESA;
decltype(&::glXGetSwapIntervalMESA) glXGetSwapIntervalMESA;
decltype(&::glXMakeCurrent) glXMakeCurrent;
decltype(&::glClipControl) glClipControl;

@ -151,6 +151,7 @@ parse_str(const char *str)
#define parse_width(s) parse_unsigned(s)
#define parse_height(s) parse_unsigned(s)
#define parse_vsync(s) parse_unsigned(s)
#define parse_gl_vsync(s) parse_unsigned(s)
#define parse_offset_x(s) parse_unsigned(s)
#define parse_offset_y(s) parse_unsigned(s)
#define parse_time_format(s) parse_str(s)
@ -307,6 +308,7 @@ parse_overlay_config(struct overlay_params *params,
params->refresh_config = XK_F4;
params->fps_limit = 0;
params->vsync = -1;
params->gl_vsync = -1;
params->crosshair_size = 30;
params->offset_x = 0;
params->offset_y = 0;

@ -71,6 +71,7 @@ extern "C" {
OVERLAY_PARAM_CUSTOM(control) \
OVERLAY_PARAM_CUSTOM(fps_limit) \
OVERLAY_PARAM_CUSTOM(vsync) \
OVERLAY_PARAM_CUSTOM(gl_vsync) \
OVERLAY_PARAM_CUSTOM(font_size) \
OVERLAY_PARAM_CUSTOM(toggle_hud) \
OVERLAY_PARAM_CUSTOM(toggle_logging) \
@ -127,6 +128,7 @@ struct overlay_params {
unsigned height;
int offset_x, offset_y;
unsigned vsync;
int gl_vsync;
unsigned crosshair_color, cpu_color, gpu_color, vram_color, ram_color, engine_color, io_color, frametime_color, background_color, text_color;
unsigned tableCols;
float font_size;

Loading…
Cancel
Save