Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (20)
......@@ -47,6 +47,12 @@
# include "../android/utils.h"
#endif
static const char *clientExts;
#ifdef EGL_EXT_platform_base
static PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplayEXT;
static PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC createPlatformWindowSurfaceEXT;
#endif
typedef struct vlc_gl_sys_t
{
EGLDisplay display;
......@@ -66,6 +72,26 @@ typedef struct vlc_gl_sys_t
bool is_current;
} vlc_gl_sys_t;
static bool CheckAPI(EGLDisplay dpy, const char *api)
{
const char *apis = eglQueryString(dpy, EGL_CLIENT_APIS);
return vlc_gl_StrHasToken(apis, api);
}
static bool CheckClientExt(const char *name)
{
return vlc_gl_StrHasToken(clientExts, name);
}
struct gl_api
{
const char name[10];
EGLenum api;
EGLint min_minor;
EGLint render_bit;
EGLint attr[3];
};
static int MakeCurrent (vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
......@@ -86,27 +112,74 @@ static void ReleaseCurrent (vlc_gl_t *gl)
sys->is_current = false;
}
#ifdef USE_PLATFORM_XCB
static int GetScreenNum(xcb_connection_t *conn, const xcb_screen_t *scr)
#ifdef USE_PLATFORM_WAYLAND
static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
{
xcb_screen_iterator_t i = xcb_setup_roots_iterator(xcb_get_setup(conn));
int n = 0;
vlc_gl_sys_t *sys = gl->sys;
while (scr != i.data) {
xcb_screen_next(&i);
n++;
}
return n;
wl_egl_window_resize(sys->window, width, height, 0, 0);
}
#endif
#ifdef USE_PLATFORM_WAYLAND
static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
static void DestroySurface(vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
wl_egl_window_resize(sys->window, width, height, 0, 0);
wl_egl_window_destroy(sys->window);
}
static EGLSurface CreateSurface(vlc_gl_t *gl, EGLDisplay dpy, EGLConfig config,
unsigned int width, unsigned int height)
{
# ifdef EGL_EXT_platform_base
vlc_gl_sys_t *sys = gl->sys;
EGLSurface surface;
sys->window = wl_egl_window_create(gl->surface->handle.wl, width, height);
if (sys->window == NULL)
return EGL_NO_SURFACE;
assert(CheckClientExt("EGL_EXT_platform_wayland"));
surface = createPlatformWindowSurfaceEXT(dpy, config, sys->window, NULL);
if (surface == EGL_NO_SURFACE)
wl_egl_window_destroy(sys->window);
return surface;
# else
return EGL_NO_SURFACE;
# endif
}
static void ReleaseDisplay(vlc_gl_t *gl)
{
(void) gl;
}
static EGLDisplay OpenDisplay(vlc_gl_t *gl)
{
# ifdef EGL_EXT_platform_wayland
vlc_window_t *surface = gl->surface;
EGLint attrs[] = {
EGL_NONE, EGL_TRUE,
EGL_NONE
};
# ifdef EGL_KHR_display_reference
if (CheckClientExt("EGL_KHR_display_reference"))
attrs[0] = EGL_TRACK_REFERENCES_KHR;
# endif
if (surface->type != VLC_WINDOW_TYPE_WAYLAND)
return EGL_NO_DISPLAY;
if (!CheckClientExt("EGL_EXT_platform_wayland"))
return EGL_NO_DISPLAY;
return getPlatformDisplayEXT(EGL_PLATFORM_WAYLAND_EXT, surface->display.wl,
attrs);
# else
return EGL_NO_DISPLAY;
# endif
}
#elif defined(USE_PLATFORM_X11)
static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
{
......@@ -125,7 +198,110 @@ static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
ReleaseCurrent(gl);
}
}
static void DestroySurface(vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
XUnmapWindow(sys->x11, sys->x11_win);
}
static EGLSurface CreateSurface(vlc_gl_t *gl, EGLDisplay dpy, EGLConfig config,
unsigned int width, unsigned int height)
{
vlc_gl_sys_t *sys = gl->sys;
Window win = sys->x11_win;
XResizeWindow(sys->x11, win, width, height);
XMapWindow(sys->x11, win);
# ifdef EGL_EXT_platform_base
if (CheckClientExt("EGL_EXT_platform_x11"))
return createPlatformWindowSurfaceEXT(dpy, config, &win, NULL);
# endif
return eglCreateWindowSurface(dpy, config, win, NULL);
}
static void ReleaseDisplay(vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
XCloseDisplay(sys->x11);
}
static EGLDisplay OpenDisplay(vlc_gl_t *gl)
{
vlc_window_t *surface = gl->surface;
vlc_gl_sys_t *sys = gl->sys;
if (surface->type != VLC_WINDOW_TYPE_XID || !vlc_xlib_init(VLC_OBJECT(gl)))
return EGL_NO_DISPLAY;
Display *x11 = XOpenDisplay(surface->display.x11);
if (x11 == NULL)
return EGL_NO_DISPLAY;
XWindowAttributes wa;
if (!XGetWindowAttributes(x11, surface->handle.xid, &wa))
goto error;
EGLDisplay display;
int snum = XScreenNumberOfScreen(wa.screen);
# ifdef EGL_EXT_platform_x11
if (CheckClientExt("EGL_EXT_platform_x11")) {
const EGLint attrs[] = {
EGL_PLATFORM_X11_SCREEN_EXT, snum,
EGL_NONE
};
display = getPlatformDisplayEXT(EGL_PLATFORM_X11_EXT, x11, attrs);
} else
# endif
# ifdef __unix__
if (snum == XDefaultScreen(x11))
display = eglGetDisplay(x11);
else
# endif
display = EGL_NO_DISPLAY;
if (display == EGL_NO_DISPLAY)
goto error;
unsigned long mask =
CWBackPixel | CWBorderPixel | CWBitGravity | CWColormap;
XSetWindowAttributes swa = {
.background_pixel = BlackPixelOfScreen(wa.screen),
.border_pixel = BlackPixelOfScreen(wa.screen),
.bit_gravity = NorthWestGravity,
.colormap = DefaultColormapOfScreen(wa.screen),
};
sys->x11 = x11;
sys->x11_win = XCreateWindow(x11, surface->handle.xid, 0, 0, wa.width,
wa.height, 0, DefaultDepthOfScreen(wa.screen),
InputOutput, DefaultVisualOfScreen(wa.screen),
mask, &swa);
return display;
error:
XCloseDisplay(x11);
return EGL_NO_DISPLAY;
}
#elif defined(USE_PLATFORM_XCB)
static int GetScreenNum(xcb_connection_t *conn, const xcb_screen_t *scr)
{
xcb_screen_iterator_t i = xcb_setup_roots_iterator(xcb_get_setup(conn));
int n = 0;
while (scr != i.data) {
xcb_screen_next(&i);
n++;
}
return n;
}
static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
{
vlc_gl_sys_t *sys = gl->sys;
......@@ -142,131 +318,238 @@ static void Resize (vlc_gl_t *gl, unsigned width, unsigned height)
ReleaseCurrent(gl);
}
}
#else
# define Resize (NULL)
#endif
static void SwapBuffers (vlc_gl_t *gl)
static void DestroySurface(vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
if (!sys->is_current)
{
EGLSurface s_read = eglGetCurrentSurface(EGL_READ);
EGLSurface s_draw = eglGetCurrentSurface(EGL_DRAW);
EGLContext previous_context = eglGetCurrentContext();
xcb_unmap_window(sys->conn, sys->xcb_win);
}
eglMakeCurrent(sys->display, sys->surface, sys->surface, sys->context);
eglSwapBuffers (sys->display, sys->surface);
eglMakeCurrent(sys->display, s_read, s_draw, previous_context);
static EGLSurface CreateSurface(vlc_gl_t *gl, EGLDisplay dpy, EGLConfig config,
unsigned int width, unsigned int height)
{
# ifdef EGL_EXT_platform_base
vlc_gl_sys_t *sys = gl->sys;
xcb_connection_t *conn = sys->conn;
xcb_window_t win = sys->xcb_win;
uint32_t mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
const uint32_t values[] = { width, height, };
xcb_configure_window(conn, win, mask, values);
xcb_map_window(conn, win);
assert(CheckClientExt("EGL_EXT_platform_xcb"));
return createPlatformWindowSurfaceEXT(dpy, config, &win, NULL);
# else
return EGL_NO_SURFACE;
# endif
}
static void ReleaseDisplay(vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
xcb_disconnect(sys->conn);
}
static EGLDisplay OpenDisplay(vlc_gl_t *gl)
{
# ifdef EGL_EXT_platform_xcb
vlc_window_t *surface = gl->surface;
vlc_gl_sys_t *sys = gl->sys;
xcb_connection_t *conn;
const xcb_screen_t *scr;
if (surface->type != VLC_WINDOW_TYPE_XID)
return EGL_NO_DISPLAY;
if (!CheckClientExt("EGL_EXT_platform_xcb"))
return EGL_NO_DISPLAY;
if (vlc_xcb_parent_Create(gl->obj.logger, surface, &conn,
&scr) != VLC_SUCCESS)
return EGL_NO_DISPLAY;
const EGLint attrs[] = {
EGL_PLATFORM_XCB_SCREEN_EXT, GetScreenNum(conn, scr),
EGL_NONE
};
EGLDisplay display = getPlatformDisplayEXT(EGL_PLATFORM_XCB_EXT, conn,
attrs);
if (display == EGL_NO_DISPLAY) {
xcb_disconnect(conn);
goto out;
}
else
eglSwapBuffers (sys->display, sys->surface);
xcb_window_t win = xcb_generate_id(conn);
uint32_t mask =
XCB_CW_BACK_PIXEL |
XCB_CW_BORDER_PIXEL |
XCB_CW_BIT_GRAVITY |
XCB_CW_COLORMAP;
const uint32_t values[] = {
/* XCB_CW_BACK_PIXEL */
scr->black_pixel,
/* XCB_CW_BORDER_PIXEL */
scr->black_pixel,
/* XCB_CW_BIT_GRAVITY */
XCB_GRAVITY_NORTH_WEST,
/* XCB_CW_COLORMAP */
scr->default_colormap,
};
xcb_create_window(conn, scr->root_depth, win, surface->handle.xid, 0, 0, 1,
1, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, scr->root_visual,
mask, values);
sys->conn = conn;
sys->xcb_win = win;
out:
return display;
# else
return EGL_NO_DISPLAY;
# endif
}
static void *GetSymbol(vlc_gl_t *gl, const char *procname)
#elif defined (USE_PLATFORM_ANDROID)
# define Resize (NULL)
static void DestroySurface(vlc_gl_t *gl)
{
(void) gl;
return (void *)eglGetProcAddress (procname);
AWindowHandler_releaseANativeWindow(gl->surface->handle.anativewindow,
AWindow_Video);
}
static bool CheckAPI (EGLDisplay dpy, const char *api)
static EGLSurface CreateSurface(vlc_gl_t *gl, EGLDisplay dpy, EGLConfig config,
unsigned int width, unsigned int height)
{
const char *apis = eglQueryString (dpy, EGL_CLIENT_APIS);
return vlc_gl_StrHasToken(apis, api);
ANativeWindow *anw =
AWindowHandler_getANativeWindow(gl->surface->handle.anativewindow,
AWindow_Video);
(void) width; (void) height;
return (anw != NULL) ? eglCreateWindowSurface(dpy, config, anw, NULL)
: EGL_NO_SURFACE;
}
static bool CheckClientExt(const char *name)
static void ReleaseDisplay(vlc_gl_t *gl)
{
const char *exts = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
return vlc_gl_StrHasToken(exts, name);
(void) gl;
}
struct gl_api
static EGLDisplay OpenDisplay(vlc_gl_t *gl)
{
const char name[10];
EGLenum api;
EGLint min_minor;
EGLint render_bit;
EGLint attr[3];
};
# if defined (__ANDROID__) || defined (ANDROID)
if (gl->surface->type == VLC_WINDOW_TYPE_ANDROID_NATIVE)
return eglGetDisplay(EGL_DEFAULT_DISPLAY);
# endif
return EGL_NO_DISPLAY;
}
#ifdef EGL_EXT_platform_base
static EGLDisplay GetDisplayEXT(EGLenum plat, void *dpy, const EGLint *attrs)
#else
# define Resize (NULL)
static void DestroySurface(vlc_gl_t *gl)
{
(void) gl;
}
static EGLSurface CreateSurface(vlc_gl_t *gl, EGLDisplay dpy, EGLConfig config,
unsigned int width, unsigned int height)
{
PFNEGLGETPLATFORMDISPLAYEXTPROC getDisplay =
(PFNEGLGETPLATFORMDISPLAYEXTPROC)
eglGetProcAddress("eglGetPlatformDisplayEXT");
HWND window = gl->surface->handle.hwnd;
assert(getDisplay != NULL);
return getDisplay(plat, dpy, attrs);
(void) width; (void) height;
return eglCreateWindowSurface(dpy, config, window, NULL);
}
static EGLSurface CreateWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config,
void *window, const EGLint *attrs)
static void ReleaseDisplay(vlc_gl_t *gl)
{
PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC createSurface =
(PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)
eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
(void) gl;
}
assert(createSurface != NULL);
return createSurface(dpy, config, window, attrs);
static EGLDisplay OpenDisplay(vlc_gl_t *gl)
{
# if defined (_WIN32) || defined (__VC32__) \
&& !defined (__CYGWIN__) && !defined (__SCITECH_SNAP__)
if (gl->surface->type == VLC_WINDOW_TYPE_HWND)
return eglGetDisplay(EGL_DEFAULT_DISPLAY);
# endif
return EGL_NO_DISPLAY;
}
#endif
static EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config,
void *window, const EGLint *attrs)
static void SwapBuffers (vlc_gl_t *gl)
{
EGLNativeWindowType *native = window;
vlc_gl_sys_t *sys = gl->sys;
return eglCreateWindowSurface(dpy, config, *native, attrs);
if (!sys->is_current)
{
EGLSurface s_read = eglGetCurrentSurface(EGL_READ);
EGLSurface s_draw = eglGetCurrentSurface(EGL_DRAW);
EGLContext previous_context = eglGetCurrentContext();
eglMakeCurrent(sys->display, sys->surface, sys->surface, sys->context);
eglSwapBuffers (sys->display, sys->surface);
eglMakeCurrent(sys->display, s_read, s_draw, previous_context);
}
else
eglSwapBuffers (sys->display, sys->surface);
}
static void *GetSymbol(vlc_gl_t *gl, const char *procname)
{
(void) gl;
return (void *)eglGetProcAddress (procname);
}
static void Close(vlc_gl_t *gl)
{
vlc_gl_sys_t *sys = gl->sys;
if (sys->display != EGL_NO_DISPLAY)
{
if (sys->context != EGL_NO_CONTEXT)
eglDestroyContext(sys->display, sys->context);
if (sys->surface != EGL_NO_SURFACE)
eglDestroySurface(sys->display, sys->surface);
eglTerminate(sys->display);
if (sys->context != EGL_NO_CONTEXT)
eglDestroyContext(sys->display, sys->context);
if (sys->surface != EGL_NO_SURFACE) {
eglDestroySurface(sys->display, sys->surface);
DestroySurface(gl);
}
#ifdef USE_PLATFORM_X11
if (sys->x11 != NULL)
XCloseDisplay(sys->x11);
#elif defined (USE_PLATFORM_XCB)
if (sys->conn != NULL)
xcb_disconnect(sys->conn);
#endif
#ifdef USE_PLATFORM_WAYLAND
if (sys->window != NULL)
wl_egl_window_destroy(sys->window);
#endif
#ifdef USE_PLATFORM_ANDROID
AWindowHandler_releaseANativeWindow(gl->surface->handle.anativewindow,
AWindow_Video);
#endif
eglTerminate(sys->display);
ReleaseDisplay(gl);
free (sys);
}
static bool InitEGL(void)
{
static vlc_once_t once = VLC_STATIC_ONCE;
if (unlikely(!vlc_once_begin(&once))) {
clientExts = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
#ifdef EGL_EXT_platform_base
getPlatformDisplayEXT =
(void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
createPlatformWindowSurfaceEXT =
(void *) eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
#endif
vlc_once_complete(&once);
}
return clientExts != NULL; /* check if EGL version is 1.4 or later */
}
/**
* Probe EGL display availability
*/
static int Open(vlc_gl_t *gl, const struct gl_api *api,
unsigned width, unsigned height)
{
if (!InitEGL())
return VLC_ENOTSUP;
int ret = VLC_EGENERIC;
vlc_object_t *obj = VLC_OBJECT(gl);
vlc_gl_sys_t *sys = malloc(sizeof (*sys));
if (unlikely(sys == NULL))
return VLC_ENOMEM;
const char *ext = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
if (*ext)
msg_Dbg(obj, "EGL client extensions: %s", ext);
msg_Dbg(obj, "EGL client extensions: %s", clientExts);
gl->sys = sys;
sys->display = EGL_NO_DISPLAY;
......@@ -274,186 +557,11 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
sys->context = EGL_NO_CONTEXT;
sys->is_current = false;
vlc_window_t *wnd = gl->surface;
EGLSurface (*createSurface)(EGLDisplay, EGLConfig, void *, const EGLint *)
= CreateWindowSurface;
void *window;
EGLAttrib refs_name = EGL_NONE;
EGLAttrib refs_value = EGL_FALSE;
#ifdef EGL_KHR_display_reference
if (CheckClientExt("EGL_KHR_display_reference"))
{
refs_name = EGL_TRACK_REFERENCES_KHR;
refs_value = EGL_TRUE;
sys->display = OpenDisplay(gl);
if (sys->display == EGL_NO_DISPLAY) {
free(sys);
return VLC_ENOTSUP;
}
#endif
#ifdef USE_PLATFORM_X11
sys->x11 = NULL;
if (wnd->type != VLC_WINDOW_TYPE_XID || !vlc_xlib_init(obj))
goto error;
sys->x11 = XOpenDisplay(wnd->display.x11);
if (sys->x11 == NULL)
goto error;
int snum;
{
XWindowAttributes wa;
XSetWindowAttributes swa;
if (!XGetWindowAttributes(sys->x11, wnd->handle.xid, &wa))
goto error;
snum = XScreenNumberOfScreen(wa.screen);
unsigned long mask =
CWBackPixel |
CWBorderPixel |
CWBitGravity |
CWColormap;
swa.background_pixel = BlackPixelOfScreen(wa.screen);
swa.border_pixel = BlackPixelOfScreen(wa.screen);
swa.bit_gravity = NorthWestGravity;
swa.colormap = DefaultColormapOfScreen(wa.screen);
sys->x11_win = XCreateWindow(
sys->x11, wnd->handle.xid, 0, 0, width, height, 0,
DefaultDepthOfScreen(wa.screen), InputOutput,
DefaultVisualOfScreen(wa.screen), mask, &swa);
XMapWindow(sys->x11, sys->x11_win);
}
window = &sys->x11_win;
# ifdef EGL_EXT_platform_x11
if (CheckClientExt("EGL_EXT_platform_x11"))
{
const EGLint attrs[] = {
EGL_PLATFORM_X11_SCREEN_EXT, snum,
EGL_NONE
};
sys->display = GetDisplayEXT(EGL_PLATFORM_X11_EXT, sys->x11, attrs);
createSurface = CreateWindowSurfaceEXT;
}
else
# endif
{
# ifdef __unix__
if (snum == XDefaultScreen(sys->x11))
sys->display = eglGetDisplay(sys->x11);
# endif
}
#elif defined (USE_PLATFORM_XCB)
xcb_connection_t *conn;
const xcb_screen_t *scr;
sys->conn = NULL;
if (wnd->type != VLC_WINDOW_TYPE_XID)
goto error;
# ifdef EGL_EXT_platform_xcb
if (!CheckClientExt("EGL_EXT_platform_xcb"))
goto error;
ret = vlc_xcb_parent_Create(gl->obj.logger, wnd, &conn, &scr);
if (ret == VLC_SUCCESS)
{
sys->xcb_win = xcb_generate_id(conn);
xcb_get_window_attributes_reply_t *r =
xcb_get_window_attributes_reply(conn,
xcb_get_window_attributes(conn, wnd->handle.xid), NULL);
if (r != NULL) {
uint32_t mask =
XCB_CW_BACK_PIXEL |
XCB_CW_BORDER_PIXEL |
XCB_CW_BIT_GRAVITY |
XCB_CW_COLORMAP;
const uint32_t values[] = {
/* XCB_CW_BACK_PIXEL */
scr->black_pixel,
/* XCB_CW_BORDER_PIXEL */
scr->black_pixel,
/* XCB_CW_BIT_GRAVITY */
XCB_GRAVITY_NORTH_WEST,
/* XCB_CW_COLORMAP */
scr->default_colormap,
};
xcb_create_window(conn, scr->root_depth, sys->xcb_win,
wnd->handle.xid, 0, 0, width, height, 0,
XCB_WINDOW_CLASS_INPUT_OUTPUT, scr->root_visual,
mask, values);
xcb_map_window(conn, sys->xcb_win);
}
free(r);
}
else
goto error;
sys->conn = conn;
window = &sys->xcb_win;
{
const EGLint attrs[] = {
EGL_PLATFORM_XCB_SCREEN_EXT, GetScreenNum(sys->conn, scr),
EGL_NONE
};
sys->display = GetDisplayEXT(EGL_PLATFORM_XCB_EXT, sys->conn, attrs);
createSurface = CreateWindowSurfaceEXT;
}
# endif
#elif defined (USE_PLATFORM_WAYLAND)
sys->window = NULL;
if (wnd->type != VLC_WINDOW_TYPE_WAYLAND)
goto error;
# ifdef EGL_EXT_platform_wayland
if (!CheckClientExt("EGL_EXT_platform_wayland"))
goto error;
window = wl_egl_window_create(wnd->handle.wl, width, height);
if (window == NULL)
goto error;
sys->window = window;
sys->display = GetDisplayEXT(EGL_PLATFORM_WAYLAND_EXT, wnd->display.wl,
NULL);
createSurface = CreateWindowSurfaceEXT;
# endif
#elif defined (USE_PLATFORM_WIN32)
if (wnd->type != VLC_WINDOW_TYPE_HWND)
goto error;
window = &wnd->handle.hwnd;
# if defined (_WIN32) || defined (__VC32__) \
&& !defined (__CYGWIN__) && !defined (__SCITECH_SNAP__)
sys->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
# endif
(void) width; (void) height;
#elif defined (USE_PLATFORM_ANDROID)
if (wnd->type != VLC_WINDOW_TYPE_ANDROID_NATIVE)
goto error;
ANativeWindow *anw =
AWindowHandler_getANativeWindow(wnd->handle.anativewindow,
AWindow_Video);
if (anw == NULL)
goto error;
window = &anw;
# if defined (__ANDROID__) || defined (ANDROID)
sys->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
# endif
(void) width; (void) height;
#endif
if (sys->display == EGL_NO_DISPLAY)
goto error;
/* Initialize EGL display */
EGLint major, minor;
......@@ -463,7 +571,7 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
eglQueryString(sys->display, EGL_VERSION),
eglQueryString(sys->display, EGL_VENDOR));
ext = eglQueryString(sys->display, EGL_EXTENSIONS);
const char *ext = eglQueryString(sys->display, EGL_EXTENSIONS);
if (*ext)
msg_Dbg(obj, "EGL display extensions: %s", ext);
......@@ -479,7 +587,6 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
EGL_GREEN_SIZE, 5,
EGL_BLUE_SIZE, 5,
EGL_RENDERABLE_TYPE, api->render_bit,
refs_name, refs_value,
EGL_NONE
};
EGLConfig cfgv[1];
......@@ -493,7 +600,7 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
}
/* Create a drawing surface */
sys->surface = createSurface(sys->display, cfgv[0], window, NULL);
sys->surface = CreateSurface(gl, sys->display, cfgv[0], width, height);
if (sys->surface == EGL_NO_SURFACE)
{
msg_Err (obj, "cannot create EGL window surface");
......