mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-15 22:58:05 +02:00
egl: Unify the EGLint/EGLAttrib paths in eglCreateSync* (v3)
Pre-patch, there were two code paths for parsing EGLSync attribute
lists: one path for old-style EGLint lists, used by eglCreateSyncKHR,
and another for new-style EGLAttrib lists, used by eglCreateSync (1.5)
and eglCreateSync64 (EGL_KHR_cl_event2).
There were two attrib_list parsing functions,
_eglParseSyncAttribList(_EGLSync *sync, const EGLint *attrib_list)
_eglParseSyncAttribList64(_EGLSync *sync, const EGLattrib *attrib_list)
This patch unifies the two attrib_list parsing functions into one,
_eglParseSyncAttribList(_EGLSync *sync, const EGLattrib *attrib_list)
Many internal EGLSync function signatures had *two* attrib_list
parameters to accomodate both code paths: one parameter was an EGLint
list and other an EGLAttrib list. At most one of the parameters was
allowed to be non-null. This patch removes the `EGLint *attrib_list`
parameter, leaving only the `EGLAttrib *attrib_list` parameter, for all
internal EGLSync functions.
v2:
- Consistently use condition (sizeof(int_list[0]) ==
sizeof(attrib_list[0])). [for emil]
v3:
- Don't double-unlock the display in eglCreateSyncKHR.
Reviewed-by: Emil Velikov <emil.velikov@collabora.com> (v2)
This commit is contained in:
parent
0f99c0686e
commit
8044885182
5 changed files with 34 additions and 52 deletions
|
|
@ -2509,8 +2509,7 @@ dri2_egl_unref_sync(struct dri2_egl_display *dri2_dpy,
|
|||
|
||||
static _EGLSync *
|
||||
dri2_create_sync(_EGLDriver *drv, _EGLDisplay *dpy,
|
||||
EGLenum type, const EGLint *attrib_list,
|
||||
const EGLAttrib *attrib_list64)
|
||||
EGLenum type, const EGLAttrib *attrib_list)
|
||||
{
|
||||
_EGLContext *ctx = _eglGetCurrentContext();
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
|
||||
|
|
@ -2525,8 +2524,7 @@ dri2_create_sync(_EGLDriver *drv, _EGLDisplay *dpy,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!_eglInitSync(&dri2_sync->base, dpy, type, attrib_list,
|
||||
attrib_list64)) {
|
||||
if (!_eglInitSync(&dri2_sync->base, dpy, type, attrib_list)) {
|
||||
free(dri2_sync);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1520,8 +1520,8 @@ eglDestroyImage(EGLDisplay dpy, EGLImage image)
|
|||
|
||||
|
||||
static EGLSync
|
||||
_eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLint *attrib_list,
|
||||
const EGLAttrib *attrib_list64, EGLBoolean is64,
|
||||
_eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list,
|
||||
EGLBoolean orig_is_EGLAttrib,
|
||||
EGLenum invalid_type_error)
|
||||
{
|
||||
_EGLContext *ctx = _eglGetCurrentContext();
|
||||
|
|
@ -1531,7 +1531,7 @@ _eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLint *attrib_list,
|
|||
|
||||
_EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
|
||||
|
||||
if (!disp->Extensions.KHR_cl_event2 && is64) {
|
||||
if (!disp->Extensions.KHR_cl_event2 && orig_is_EGLAttrib) {
|
||||
/* There exist two EGLAttrib variants of eglCreateSync*:
|
||||
* eglCreateSync64KHR which requires EGL_KHR_cl_event2, and eglCreateSync
|
||||
* which requires EGL 1.5. Here we use the presence of EGL_KHR_cl_event2
|
||||
|
|
@ -1566,7 +1566,7 @@ _eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLint *attrib_list,
|
|||
RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
|
||||
}
|
||||
|
||||
sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list, attrib_list64);
|
||||
sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
|
||||
ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
|
||||
|
||||
RETURN_EGL_EVAL(disp, ret);
|
||||
|
|
@ -1574,12 +1574,31 @@ _eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLint *attrib_list,
|
|||
|
||||
|
||||
static EGLSync EGLAPIENTRY
|
||||
eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
|
||||
eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list)
|
||||
{
|
||||
_EGLDisplay *disp = _eglLockDisplay(dpy);
|
||||
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
|
||||
return _eglCreateSync(disp, type, attrib_list, NULL, EGL_FALSE,
|
||||
|
||||
EGLSync sync;
|
||||
EGLAttrib *attrib_list;
|
||||
EGLint err;
|
||||
|
||||
if (sizeof(int_list[0]) == sizeof(attrib_list[0])) {
|
||||
attrib_list = (EGLAttrib *) int_list;
|
||||
} else {
|
||||
err = _eglConvertIntsToAttribs(int_list, &attrib_list);
|
||||
if (err != EGL_SUCCESS)
|
||||
RETURN_EGL_ERROR(disp, err, EGL_NO_SYNC);
|
||||
}
|
||||
|
||||
sync = _eglCreateSync(disp, type, attrib_list, EGL_FALSE,
|
||||
EGL_BAD_ATTRIBUTE);
|
||||
|
||||
if (sizeof(int_list[0]) != sizeof(attrib_list[0]))
|
||||
free(attrib_list);
|
||||
|
||||
/* Don't double-unlock the display. _eglCreateSync already unlocked it. */
|
||||
return sync;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1588,7 +1607,7 @@ eglCreateSync64KHR(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
|
|||
{
|
||||
_EGLDisplay *disp = _eglLockDisplay(dpy);
|
||||
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
|
||||
return _eglCreateSync(disp, type, NULL, attrib_list, EGL_TRUE,
|
||||
return _eglCreateSync(disp, type, attrib_list, EGL_TRUE,
|
||||
EGL_BAD_ATTRIBUTE);
|
||||
}
|
||||
|
||||
|
|
@ -1598,7 +1617,7 @@ eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
|
|||
{
|
||||
_EGLDisplay *disp = _eglLockDisplay(dpy);
|
||||
_EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
|
||||
return _eglCreateSync(disp, type, NULL, attrib_list, EGL_TRUE,
|
||||
return _eglCreateSync(disp, type, attrib_list, EGL_TRUE,
|
||||
EGL_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -135,8 +135,7 @@ struct _egl_api
|
|||
_EGLImage *image);
|
||||
|
||||
_EGLSync *(*CreateSyncKHR)(_EGLDriver *drv, _EGLDisplay *dpy, EGLenum type,
|
||||
const EGLint *attrib_list,
|
||||
const EGLAttrib *attrib_list64);
|
||||
const EGLAttrib *attrib_list);
|
||||
EGLBoolean (*DestroySyncKHR)(_EGLDriver *drv, _EGLDisplay *dpy,
|
||||
_EGLSync *sync);
|
||||
EGLint (*ClientWaitSyncKHR)(_EGLDriver *drv, _EGLDisplay *dpy,
|
||||
|
|
|
|||
|
|
@ -39,37 +39,7 @@
|
|||
* Parse the list of sync attributes and return the proper error code.
|
||||
*/
|
||||
static EGLint
|
||||
_eglParseSyncAttribList(_EGLSync *sync, const EGLint *attrib_list)
|
||||
{
|
||||
EGLint i;
|
||||
|
||||
if (!attrib_list)
|
||||
return EGL_SUCCESS;
|
||||
|
||||
for (i = 0; attrib_list[i] != EGL_NONE; i++) {
|
||||
EGLint attr = attrib_list[i++];
|
||||
EGLint val = attrib_list[i];
|
||||
EGLint err = EGL_SUCCESS;
|
||||
|
||||
switch (attr) {
|
||||
default:
|
||||
(void) val;
|
||||
err = EGL_BAD_ATTRIBUTE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (err != EGL_SUCCESS) {
|
||||
_eglLog(_EGL_DEBUG, "bad sync attribute 0x%04x", attr);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return EGL_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static EGLint
|
||||
_eglParseSyncAttribList64(_EGLSync *sync, const EGLAttrib *attrib_list)
|
||||
_eglParseSyncAttribList(_EGLSync *sync, const EGLAttrib *attrib_list)
|
||||
{
|
||||
EGLint i;
|
||||
|
||||
|
|
@ -106,7 +76,7 @@ _eglParseSyncAttribList64(_EGLSync *sync, const EGLAttrib *attrib_list)
|
|||
|
||||
EGLBoolean
|
||||
_eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
|
||||
const EGLint *attrib_list, const EGLAttrib *attrib_list64)
|
||||
const EGLAttrib *attrib_list)
|
||||
{
|
||||
EGLint err;
|
||||
|
||||
|
|
@ -122,11 +92,7 @@ _eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
|
|||
sync->SyncCondition = EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR;
|
||||
}
|
||||
|
||||
if (attrib_list64)
|
||||
err = _eglParseSyncAttribList64(sync, attrib_list64);
|
||||
else
|
||||
err = _eglParseSyncAttribList(sync, attrib_list);
|
||||
|
||||
err = _eglParseSyncAttribList(sync, attrib_list);
|
||||
if (err != EGL_SUCCESS)
|
||||
return _eglError(err, "eglCreateSyncKHR");
|
||||
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ struct _egl_sync
|
|||
|
||||
extern EGLBoolean
|
||||
_eglInitSync(_EGLSync *sync, _EGLDisplay *dpy, EGLenum type,
|
||||
const EGLint *attrib_list, const EGLAttrib *attrib_list64);
|
||||
const EGLAttrib *attrib_list);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue