0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 12:02:23 +02:00
mpv/video/out/opengl/angle_dynamic.h
James Ross-Gowan e0250b9604 vo_opengl: angle: rewrite with custom swap chain
This replaces the old backend that exclusively used EGL windowing with
one that can also use ANGLE's ability to render to directly to a
texture. The advantage of this is that it allows mpv to create the swap
chain itself and this allows mpv to use a flip-mode swap chain on a HWND
(which avoids problems with DirectComposition) and to use a longer swap
chain that has six backbuffers by default (which reportedly fixes
problems with rendering 24fps video on 24Hz monitors.)

Also, "screenshot window" should now work on DXGI 1.2 and up (Windows 8
and up.)
2017-02-07 22:45:07 +11:00

88 lines
4.1 KiB
C

// Based on Khronos headers, thus MIT licensed.
#ifndef MP_ANGLE_DYNAMIC_H
#define MP_ANGLE_DYNAMIC_H
#include <stdbool.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#define ANGLE_FNS(FN) \
FN(eglBindAPI, EGLBoolean (*EGLAPIENTRY PFN_eglBindAPI)(EGLenum)) \
FN(eglBindTexImage, EGLBoolean (*EGLAPIENTRY PFN_eglBindTexImage) \
(EGLDisplay, EGLSurface, EGLint)) \
FN(eglChooseConfig, EGLBoolean (*EGLAPIENTRY PFN_eglChooseConfig) \
(EGLDisplay, const EGLint *, EGLConfig *, EGLint, EGLint *)) \
FN(eglCreateContext, EGLContext (*EGLAPIENTRY PFN_eglCreateContext) \
(EGLDisplay, EGLConfig, EGLContext, const EGLint *)) \
FN(eglCreatePbufferFromClientBuffer, EGLSurface (*EGLAPIENTRY \
PFN_eglCreatePbufferFromClientBuffer)(EGLDisplay, EGLenum, \
EGLClientBuffer, EGLConfig, const EGLint *)) \
FN(eglCreateWindowSurface, EGLSurface (*EGLAPIENTRY \
PFN_eglCreateWindowSurface)(EGLDisplay, EGLConfig, \
EGLNativeWindowType, const EGLint *)) \
FN(eglDestroyContext, EGLBoolean (*EGLAPIENTRY PFN_eglDestroyContext) \
(EGLDisplay, EGLContext)) \
FN(eglDestroySurface, EGLBoolean (*EGLAPIENTRY PFN_eglDestroySurface) \
(EGLDisplay, EGLSurface)) \
FN(eglGetConfigAttrib, EGLBoolean (*EGLAPIENTRY PFN_eglGetConfigAttrib) \
(EGLDisplay, EGLConfig, EGLint, EGLint *)) \
FN(eglGetCurrentContext, EGLContext (*EGLAPIENTRY \
PFN_eglGetCurrentContext)(void)) \
FN(eglGetCurrentDisplay, EGLDisplay (*EGLAPIENTRY \
PFN_eglGetCurrentDisplay)(void)) \
FN(eglGetDisplay, EGLDisplay (*EGLAPIENTRY PFN_eglGetDisplay) \
(EGLNativeDisplayType)) \
FN(eglGetError, EGLint (*EGLAPIENTRY PFN_eglGetError)(void)) \
FN(eglGetProcAddress, void *(*EGLAPIENTRY \
PFN_eglGetProcAddress)(const char *)) \
FN(eglInitialize, EGLBoolean (*EGLAPIENTRY PFN_eglInitialize) \
(EGLDisplay, EGLint *, EGLint *)) \
FN(eglMakeCurrent, EGLBoolean (*EGLAPIENTRY PFN_eglMakeCurrent) \
(EGLDisplay, EGLSurface, EGLSurface, EGLContext)) \
FN(eglQueryString, const char *(*EGLAPIENTRY PFN_eglQueryString) \
(EGLDisplay, EGLint)) \
FN(eglSwapBuffers, EGLBoolean (*EGLAPIENTRY PFN_eglSwapBuffers) \
(EGLDisplay, EGLSurface)) \
FN(eglSwapInterval, EGLBoolean (*EGLAPIENTRY PFN_eglSwapInterval) \
(EGLDisplay, EGLint)) \
FN(eglReleaseTexImage, EGLBoolean (*EGLAPIENTRY PFN_eglReleaseTexImage) \
(EGLDisplay, EGLSurface, EGLint)) \
FN(eglTerminate, EGLBoolean (*EGLAPIENTRY PFN_eglTerminate)(EGLDisplay)) \
FN(eglWaitClient, EGLBoolean (*EGLAPIENTRY PFN_eglWaitClient)(void))
#define ANGLE_EXT_DECL(NAME, VAR) \
extern VAR;
ANGLE_FNS(ANGLE_EXT_DECL)
bool angle_load(void);
// Source compatibility to statically linked ANGLE.
#ifndef ANGLE_NO_ALIASES
#define eglBindAPI PFN_eglBindAPI
#define eglBindTexImage PFN_eglBindTexImage
#define eglChooseConfig PFN_eglChooseConfig
#define eglCreateContext PFN_eglCreateContext
#define eglCreatePbufferFromClientBuffer PFN_eglCreatePbufferFromClientBuffer
#define eglCreateWindowSurface PFN_eglCreateWindowSurface
#define eglDestroyContext PFN_eglDestroyContext
#define eglDestroySurface PFN_eglDestroySurface
#define eglGetConfigAttrib PFN_eglGetConfigAttrib
#define eglGetCurrentContext PFN_eglGetCurrentContext
#define eglGetCurrentDisplay PFN_eglGetCurrentDisplay
#define eglGetDisplay PFN_eglGetDisplay
#define eglGetError PFN_eglGetError
#define eglGetProcAddress PFN_eglGetProcAddress
#define eglInitialize PFN_eglInitialize
#define eglMakeCurrent PFN_eglMakeCurrent
#define eglQueryString PFN_eglQueryString
#define eglReleaseTexImage PFN_eglReleaseTexImage
#define eglSwapBuffers PFN_eglSwapBuffers
#define eglSwapInterval PFN_eglSwapInterval
#define eglTerminate PFN_eglTerminate
#define eglWaitClient PFN_eglWaitClient
#endif
#endif