summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXuelian <xuelian.bai@samsung.com>2020-02-17 20:39:44 +0800
committerXuelian Bai <xuelian.bai@samsung.com>2021-10-11 10:13:00 +0800
commitc1f194c1e0f0e18c3b1161da8fa0fe7ecef90546 (patch)
treef1e8b2d38c20580ed3c336af37ad3c9927b230a5
parente907caa29817d31de44ead2fc77dd65fb70ae976 (diff)
downloadmesa-c1f194c1e0f0e18c3b1161da8fa0fe7ecef90546.tar.gz
mesa-c1f194c1e0f0e18c3b1161da8fa0fe7ecef90546.tar.bz2
mesa-c1f194c1e0f0e18c3b1161da8fa0fe7ecef90546.zip
Add Pbuffer support on Tizen platform
Merged old commit: commit f409ef598976a4fd4f74ab4695478b1fc1651c06 Author: Zhaowei Yuan <zhaowei.yuan@samsung.com> 1. Add EGL_PBUFFER_BIT to surface_type if maskes match 2. Alloc local buffer when render buffer type is "FRONT_LEFT" which will be used by Pbuffer commit b0dec10d0d0fbc7f77623016f3d986122f718f8b Author: Xuelian Bai <xuelian.bai@samsung.com> Fix crash when query a pbuffer surface Pbuffer is not created via TPL, so when query a pbuffer surface, we can only call _eglQuerySurface instead of TPL APIs. Change-Id: Ib9990973f228374a95f60157a3b79069529a62b2 Signed-off-by: Xuelian Bai <xuelian.bai@samsung.com>
-rwxr-xr-xsrc/egl/drivers/dri2/platform_tizen.c96
1 files changed, 68 insertions, 28 deletions
diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
index bc188273318..5e35eebecef 100755
--- a/src/egl/drivers/dri2/platform_tizen.c
+++ b/src/egl/drivers/dri2/platform_tizen.c
@@ -49,6 +49,8 @@
#include <wayland-client.h>
#include <drm-uapi/drm_fourcc.h>
+#include <drm_fourcc.h>
+
int tbm_bufmgr_fd = -1;
static void tizen_free_local_buffers(struct dri2_egl_surface *dri2_surf);
@@ -363,6 +365,7 @@ tizen_create_surface(_EGLDisplay *disp, EGLint type,
_eglError(EGL_BAD_NATIVE_PIXMAP, "tizen_create_surface needs valid native pixmap");
goto cleanup_surface;
}
+
ret = tpl_display_get_native_pixmap_info(dri2_dpy->tpl_display,
(tpl_handle_t)native_window,
&dri2_surf->base.Width,
@@ -375,17 +378,16 @@ tizen_create_surface(_EGLDisplay *disp, EGLint type,
}
tpl_surf_type = TPL_SURFACE_TYPE_PIXMAP;
- } else {
- _eglError(EGL_BAD_NATIVE_WINDOW, "tizen_create_surface does not support PBuffer");
- goto cleanup_surface;
}
- dri2_surf->tpl_surface = tpl_surface_create(dri2_dpy->tpl_display,
+ if(type == EGL_WINDOW_BIT || type == EGL_PIXMAP_BIT) {
+ dri2_surf->tpl_surface = tpl_surface_create(dri2_dpy->tpl_display,
(tpl_handle_t)native_window,
tpl_surf_type,
dri2_surf->tbm_format);
- if (!dri2_surf->tpl_surface)
- goto cleanup_surface;
+ if (!dri2_surf->tpl_surface)
+ goto cleanup_surface;
+ }
if (!dri2_create_drawable(dri2_dpy, config, dri2_surf, dri2_surf)) {
_eglError(EGL_BAD_ALLOC, "createNewDrawable");
@@ -455,7 +457,8 @@ tizen_destroy_surface(_EGLDisplay *disp, _EGLSurface *surf)
dri2_dpy->core->destroyDrawable(dri2_surf->dri_drawable);
- tpl_object_unreference((tpl_object_t *)dri2_surf->tpl_surface);
+ if (dri2_surf->tpl_surface)
+ tpl_object_unreference((tpl_object_t *)dri2_surf->tpl_surface);
dri2_fini_surface(surf);
@@ -926,26 +929,28 @@ tizen_query_surface(_EGLDisplay *dpy, _EGLSurface *surf,
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
int width = 0, height = 0;
- if (tpl_display_get_native_window_info(dri2_dpy->tpl_display,
- dri2_surf->native_win,
- &width, &height, NULL, 0, 0) != TPL_ERROR_NONE)
- return EGL_FALSE;
-
- switch (attribute) {
- case EGL_WIDTH:
- if (dri2_surf->base.Type == EGL_WINDOW_BIT && dri2_surf->native_win) {
- *value = width;
- return EGL_TRUE;
- }
- break;
- case EGL_HEIGHT:
- if (dri2_surf->base.Type == EGL_WINDOW_BIT && dri2_surf->native_win) {
- *value = height;
- return EGL_TRUE;
- }
- break;
- default:
- break;
+ if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
+ if (tpl_display_get_native_window_info(dri2_dpy->tpl_display,
+ dri2_surf->native_win,
+ &width, &height, NULL, 0, 0) != TPL_ERROR_NONE)
+ return EGL_FALSE;
+
+ switch (attribute) {
+ case EGL_WIDTH:
+ if (dri2_surf->native_win) {
+ *value = width;
+ return EGL_TRUE;
+ }
+ break;
+ case EGL_HEIGHT:
+ if (dri2_surf->native_win) {
+ *value = height;
+ return EGL_TRUE;
+ }
+ break;
+ default:
+ break;
+ }
}
return _eglQuerySurface(dpy, surf, attribute, value);
}
@@ -1034,6 +1039,9 @@ tizen_get_buffers_parse_attachments(struct dri2_egl_surface *dri2_surf,
break;
}
/* fall through for pbuffers */
+ case __DRI_BUFFER_FRONT_LEFT:
+ if (dri2_surf->base.Type != EGL_PBUFFER_BIT)
+ break;
case __DRI_BUFFER_DEPTH:
case __DRI_BUFFER_STENCIL:
case __DRI_BUFFER_ACCUM:
@@ -1046,7 +1054,6 @@ tizen_get_buffers_parse_attachments(struct dri2_egl_surface *dri2_surf,
num_buffers++;
}
break;
- case __DRI_BUFFER_FRONT_LEFT:
case __DRI_BUFFER_FRONT_RIGHT:
case __DRI_BUFFER_FAKE_FRONT_LEFT:
case __DRI_BUFFER_FAKE_FRONT_RIGHT:
@@ -1217,6 +1224,16 @@ tizen_add_configs(_EGLDisplay *dpy)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
int count, i;
+ struct rgba_masks {
+ unsigned int red;
+ unsigned int green;
+ unsigned int blue;
+ unsigned int alpha;
+ } pbuffer_masks[] = {
+ { 0xff0000, 0xff00, 0xff, 0xff000000 }, /* ARGB8888 */
+ { 0xff0000, 0xff00, 0xff, 0x0 }, /* RGB888 */
+ { 0x00f800, 0x07e0, 0x1f, 0x0 }, /* RGB565 */
+ };
for (i = 0, count = 0; dri2_dpy->driver_configs[i]; i++) {
struct dri2_egl_config *dri2_cfg;
@@ -1228,6 +1245,8 @@ tizen_add_configs(_EGLDisplay *dpy)
EGL_NONE,
};
tpl_result_t res;
+ struct rgba_masks masks;
+ int j;
dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
__DRI_ATTRIB_RED_SIZE, &red);
@@ -1252,6 +1271,27 @@ tizen_add_configs(_EGLDisplay *dpy)
if (res == TPL_ERROR_NONE)
surface_type |= EGL_PIXMAP_BIT;
+ dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
+ __DRI_ATTRIB_RED_MASK, &masks.red);
+ dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
+ __DRI_ATTRIB_GREEN_MASK, &masks.green);
+ dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
+ __DRI_ATTRIB_BLUE_MASK, &masks.blue);
+ dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
+ __DRI_ATTRIB_ALPHA_MASK, &masks.alpha);
+
+ for (j = 0; j < ARRAY_SIZE(pbuffer_masks); j++) {
+ const struct rgba_masks *pbuffer_mask = &pbuffer_masks[j];
+
+ if (pbuffer_mask->red == masks.red &&
+ pbuffer_mask->green == masks.green &&
+ pbuffer_mask->blue == masks.blue &&
+ pbuffer_mask->alpha == masks.alpha) {
+ surface_type |= EGL_PBUFFER_BIT;
+ break;
+ }
+ }
+
if (!surface_type)
continue;