wayland: implement resizing for new opengl gbm
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good
This commit is contained in:
parent
232763a3e3
commit
2c3cb787d4
1 changed files with 52 additions and 5 deletions
|
|
@ -107,6 +107,7 @@ typedef struct waylandopengl {
|
||||||
EGLint config_size,
|
EGLint config_size,
|
||||||
EGLint* num_config);
|
EGLint* num_config);
|
||||||
EGLBoolean (*eglGetConfigAttrib)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value);
|
EGLBoolean (*eglGetConfigAttrib)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value);
|
||||||
|
EGLBoolean (*eglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
|
||||||
|
|
||||||
struct wl_egl_window* (*wl_egl_window_create)(struct wl_surface* surface,
|
struct wl_egl_window* (*wl_egl_window_create)(struct wl_surface* surface,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
@ -115,6 +116,7 @@ typedef struct waylandopengl {
|
||||||
int dx, int dy);
|
int dx, int dy);
|
||||||
struct gbm_device* (*gbm_create_device)(int fd);
|
struct gbm_device* (*gbm_create_device)(int fd);
|
||||||
struct gbm_surface* (*gbm_surface_create)(struct gbm_device* gbm, uint32_t width, uint32_t height, uint32_t format, uint32_t flags);
|
struct gbm_surface* (*gbm_surface_create)(struct gbm_device* gbm, uint32_t width, uint32_t height, uint32_t format, uint32_t flags);
|
||||||
|
void (*gbm_surface_destroy)(struct gbm_surface* surface);
|
||||||
|
|
||||||
struct gbm_bo* (*gbm_surface_lock_front_buffer)(struct gbm_surface* surface);
|
struct gbm_bo* (*gbm_surface_lock_front_buffer)(struct gbm_surface* surface);
|
||||||
union gbm_bo_handle (*gbm_bo_get_handle)(struct gbm_bo* bo);
|
union gbm_bo_handle (*gbm_bo_get_handle)(struct gbm_bo* bo);
|
||||||
|
|
@ -278,8 +280,10 @@ static int wcreate(MwWidget handle) {
|
||||||
EGL_FUNC(eglChooseConfig)
|
EGL_FUNC(eglChooseConfig)
|
||||||
EGL_FUNC(eglGetPlatformDisplay)
|
EGL_FUNC(eglGetPlatformDisplay)
|
||||||
EGL_FUNC(eglGetConfigAttrib)
|
EGL_FUNC(eglGetConfigAttrib)
|
||||||
|
EGL_FUNC(eglDestroySurface)
|
||||||
GBM_FUNC(gbm_create_device)
|
GBM_FUNC(gbm_create_device)
|
||||||
GBM_FUNC(gbm_surface_create)
|
GBM_FUNC(gbm_surface_create)
|
||||||
|
GBM_FUNC(gbm_surface_destroy)
|
||||||
GBM_FUNC(gbm_surface_lock_front_buffer)
|
GBM_FUNC(gbm_surface_lock_front_buffer)
|
||||||
GBM_FUNC(gbm_bo_get_handle)
|
GBM_FUNC(gbm_bo_get_handle)
|
||||||
GBM_FUNC(gbm_bo_get_stride)
|
GBM_FUNC(gbm_bo_get_stride)
|
||||||
|
|
@ -302,6 +306,7 @@ static int wcreate(MwWidget handle) {
|
||||||
#define eglGetDisplay o->eglGetDisplay
|
#define eglGetDisplay o->eglGetDisplay
|
||||||
#define wl_egl_window_resize o->wl_egl_window_resize
|
#define wl_egl_window_resize o->wl_egl_window_resize
|
||||||
#define eglCreatePlatformWindowSurface o->eglCreatePlatformWindowSurface
|
#define eglCreatePlatformWindowSurface o->eglCreatePlatformWindowSurface
|
||||||
|
#define eglDestroySurface o->eglDestroySurface
|
||||||
#define eglChooseConfig o->eglChooseConfig
|
#define eglChooseConfig o->eglChooseConfig
|
||||||
#define eglGetPlatformDisplay o->eglGetPlatformDisplay
|
#define eglGetPlatformDisplay o->eglGetPlatformDisplay
|
||||||
|
|
||||||
|
|
@ -607,6 +612,44 @@ static void frontbuffer_draw(MwWidget handle) {
|
||||||
MwLLDrawPixmap(handle->lowlevel, &r, o->frontbuffer);
|
MwLLDrawPixmap(handle->lowlevel, &r, o->frontbuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static void frontbuffer_resize(MwWidget handle) {
|
||||||
|
if(handle->lowlevel->common.type == MwLLBackendWayland) {
|
||||||
|
waylandopengl_t* o = handle->internal;
|
||||||
|
if(o->frontbuffer_data) {
|
||||||
|
free(o->frontbuffer_data);
|
||||||
|
}
|
||||||
|
if(o->frontbuffer) {
|
||||||
|
MwLLDestroyPixmap(o->frontbuffer);
|
||||||
|
}
|
||||||
|
if(o->gbm_surface) {
|
||||||
|
o->gbm_surface_destroy(o->gbm_surface);
|
||||||
|
}
|
||||||
|
if(o->egl_surface) {
|
||||||
|
eglDestroySurface(o->egl_display, o->egl_surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
o->gbm_surface = o->gbm_surface_create(o->gbm, handle->lowlevel->wayland.ww, handle->lowlevel->wayland.wh, GBM_FORMAT_ARGB8888, GBM_BO_USE_LINEAR | GBM_BO_USE_RENDERING);
|
||||||
|
|
||||||
|
/* Create a surface */
|
||||||
|
o->egl_surface = eglCreatePlatformWindowSurface(o->egl_display, o->egl_config,
|
||||||
|
o->gbm_surface, NULL);
|
||||||
|
if(o->egl_surface == EGL_NO_SURFACE) {
|
||||||
|
printf("ERROR: eglCreatePlatformWindowSurface, %0X\n", eglGetError());
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!eglMakeCurrent(o->egl_display, o->egl_surface, o->egl_surface, o->egl_context)) {
|
||||||
|
printf("ERROR: eglMakeCurrent (setup): %0X\n", eglGetError());
|
||||||
|
}
|
||||||
|
|
||||||
|
o->frontbuffer_data = malloc(handle->lowlevel->wayland.ww * handle->lowlevel->wayland.wh * 4);
|
||||||
|
memset(o->frontbuffer_data, 255, handle->lowlevel->wayland.ww * handle->lowlevel->wayland.wh * 4);
|
||||||
|
|
||||||
|
o->frontbuffer = MwLoadRaw(handle, o->frontbuffer_data, handle->lowlevel->wayland.ww, handle->lowlevel->wayland.wh);
|
||||||
|
|
||||||
|
MwVaApply(handle, MwNpixmap, o->frontbuffer, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MwClassRec MwOpenGLClassRec = {wcreate, /* create */
|
MwClassRec MwOpenGLClassRec = {wcreate, /* create */
|
||||||
|
|
@ -625,7 +668,11 @@ MwClassRec MwOpenGLClassRec = {wcreate, /* create */
|
||||||
NULL, /* key */
|
NULL, /* key */
|
||||||
func_handler, /* execute */
|
func_handler, /* execute */
|
||||||
NULL, /* tick */
|
NULL, /* tick */
|
||||||
|
#ifdef USE_WAYLAND
|
||||||
|
frontbuffer_resize, /* resize */
|
||||||
|
#else
|
||||||
NULL, /* resize */
|
NULL, /* resize */
|
||||||
|
#endif
|
||||||
NULL, /* children_update */
|
NULL, /* children_update */
|
||||||
NULL, /* children_prop_change */
|
NULL, /* children_prop_change */
|
||||||
NULL, /* clipboard */
|
NULL, /* clipboard */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue