2012-11-15 00:39:56 +01:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "OpenGL.h"
|
|
|
|
|
|
2014-02-21 17:13:57 +01:00
|
|
|
#ifdef _WIN32
|
2017-02-16 17:47:18 +01:00
|
|
|
|
2017-03-05 17:00:08 +01:00
|
|
|
extern "C"
|
|
|
|
|
{
|
2017-02-16 17:47:18 +01:00
|
|
|
// NVIDIA Optimus: Default dGPU instead of iGPU (Driver: 302+)
|
2017-03-05 17:00:08 +01:00
|
|
|
__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
|
2017-02-16 17:47:18 +01:00
|
|
|
// AMD: Request dGPU High Performance (Driver: 13.35+)
|
2017-03-05 17:00:08 +01:00
|
|
|
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
|
2017-02-16 17:47:18 +01:00
|
|
|
}
|
|
|
|
|
|
2013-06-30 10:46:29 +02:00
|
|
|
#define OPENGL_PROC(p, n) p gl##n = nullptr
|
2017-08-13 19:41:55 +02:00
|
|
|
#define WGL_PROC(p, n) p wgl##n = nullptr
|
2013-06-30 10:46:29 +02:00
|
|
|
#define OPENGL_PROC2(p, n, tn) OPENGL_PROC(p, n)
|
2014-04-27 19:28:03 +02:00
|
|
|
#include "GLProcTable.h"
|
2013-06-30 10:46:29 +02:00
|
|
|
#undef OPENGL_PROC
|
|
|
|
|
#undef OPENGL_PROC2
|
2017-08-13 19:41:55 +02:00
|
|
|
#undef WGL_PROC
|
2014-02-21 17:13:57 +01:00
|
|
|
#endif
|
2013-06-30 10:46:29 +02:00
|
|
|
|
2017-08-13 19:41:55 +02:00
|
|
|
void gl::init()
|
2013-06-30 10:46:29 +02:00
|
|
|
{
|
2014-02-21 17:13:57 +01:00
|
|
|
#ifdef _WIN32
|
2017-08-13 19:41:55 +02:00
|
|
|
#define OPENGL_PROC(p, n) OPENGL_PROC2(p, gl##n, gl##n)
|
|
|
|
|
#define WGL_PROC(p, n) OPENGL_PROC2(p, wgl##n, wgl##n)
|
2023-07-11 20:40:30 +02:00
|
|
|
#define OPENGL_PROC2(p, n, tn) /*if(!gl##n)*/ if(!(n = reinterpret_cast<p>(wglGetProcAddress(#tn)))) rsx_log.error("OpenGL: initialization of " #tn " failed.")
|
2017-08-13 19:41:55 +02:00
|
|
|
#include "GLProcTable.h"
|
2013-06-30 10:46:29 +02:00
|
|
|
#undef OPENGL_PROC
|
2017-08-13 19:41:55 +02:00
|
|
|
#undef WGL_PROC
|
2013-06-30 10:46:29 +02:00
|
|
|
#undef OPENGL_PROC2
|
2014-02-21 17:13:57 +01:00
|
|
|
#endif
|
2017-08-13 19:41:55 +02:00
|
|
|
#ifdef __unix__
|
|
|
|
|
glewExperimental = true;
|
|
|
|
|
glewInit();
|
2019-11-20 16:53:41 +01:00
|
|
|
#ifdef HAVE_X11
|
2018-01-22 11:07:52 +01:00
|
|
|
glxewInit();
|
|
|
|
|
#endif
|
2017-08-13 19:41:55 +02:00
|
|
|
#endif
|
2013-06-30 10:46:29 +02:00
|
|
|
}
|
|
|
|
|
|
2017-08-13 19:41:55 +02:00
|
|
|
void gl::set_swapinterval(int interval)
|
2013-06-30 10:46:29 +02:00
|
|
|
{
|
2014-02-21 17:13:57 +01:00
|
|
|
#ifdef _WIN32
|
2017-08-13 19:41:55 +02:00
|
|
|
wglSwapIntervalEXT(interval);
|
2019-11-20 16:53:41 +01:00
|
|
|
#elif defined(HAVE_X11)
|
2018-01-22 11:07:52 +01:00
|
|
|
if (glXSwapIntervalEXT)
|
|
|
|
|
{
|
|
|
|
|
if (auto window = glXGetCurrentDrawable())
|
|
|
|
|
{
|
|
|
|
|
glXSwapIntervalEXT(glXGetCurrentDisplay(), window, interval);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//No existing drawable or missing swap extension, EGL?
|
2020-02-01 09:07:25 +01:00
|
|
|
rsx_log.error("Failed to set swap interval");
|
2018-01-22 11:07:52 +01:00
|
|
|
#else
|
2023-05-08 23:12:39 +02:00
|
|
|
rsx_log.error("Swap control not implemented for this platform. Vsync options not available. (interval=%d)", interval);
|
2014-02-21 17:13:57 +01:00
|
|
|
#endif
|
2018-01-22 11:07:52 +01:00
|
|
|
}
|