Skip to content

Commit

Permalink
eglGetError is now a lockless entrypoint
Browse files Browse the repository at this point in the history
eglGetError returns last recorded error in a thread,
there is no need to lock the global mutex.

Bug: b/318921454
Change-Id: I9e5192becc67dc81b54abfb63d2b32283ebc69d8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5181881
Commit-Queue: Shahbaz Youssefi <[email protected]>
Reviewed-by: Charlie Lao <[email protected]>
Reviewed-by: Shahbaz Youssefi <[email protected]>
  • Loading branch information
Mohan Maiya authored and Angle LUCI CQ committed Jan 10, 2024
1 parent 2937ee2 commit c2ad86b
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 13 deletions.
4 changes: 2 additions & 2 deletions scripts/code_generation_hashes/GL_EGL_entry_points.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"scripts/entry_point_packed_gl_enums.json":
"1c6b036918aabb9822a638fbf33f87f4",
"scripts/generate_entry_points.py":
"894d8669247c8054dcbd117da80c7355",
"a1b7573e6c82bf56f5264aa98a9e6141",
"scripts/gl_angle_ext.xml":
"3d6d9529c6d0da797652c366ddaa9087",
"scripts/registry_xml.py":
Expand Down Expand Up @@ -130,7 +130,7 @@
"src/libGLESv2/entry_points_cl_autogen.h":
"dde2f94c3004874a7da995dae69da811",
"src/libGLESv2/entry_points_egl_autogen.cpp":
"f144617163496d688541db9824645bf5",
"753e22c68aa2f60c02c9bda707b554e7",
"src/libGLESv2/entry_points_egl_autogen.h":
"3bc7a8df9deadd7cfd615d0cfad0c6a8",
"src/libGLESv2/entry_points_egl_ext_autogen.cpp":
Expand Down
32 changes: 31 additions & 1 deletion scripts/generate_entry_points.py
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,28 @@
}}
"""

TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN_NO_LOCKS = """\
{return_type} EGLAPIENTRY EGL_{name}({params})
{{
{preamble}
Thread *thread = egl::GetCurrentThread();
{return_type} returnValue;
EGL_EVENT({name}, "{format_params}"{comma_if_needed}{pass_params});
{packed_gl_enum_conversions}
ANGLE_EGL_VALIDATE(thread, {name}, {labeled_object}, {return_type}{comma_if_needed}{internal_params});
returnValue = {name}(thread{comma_if_needed}{internal_params});
ANGLE_CAPTURE_EGL({name}, true, {egl_capture_params}, returnValue);
{epilog}
return returnValue;
}}
"""

TEMPLATE_CL_ENTRY_POINT_NO_RETURN = """\
void CL_API_CALL cl{name}({params})
{{
Expand Down Expand Up @@ -1584,6 +1606,11 @@ def is_context_private_state_command(api, name):
[fnmatch.fnmatchcase(name, entry) for entry in CONTEXT_PRIVATE_WILDCARDS])


def is_lockless_egl_entry_point(cmd_name):
if cmd_name in ["eglGetError"]:
return True
return False

def get_validation_expression(api, cmd_name, entry_point_name, internal_params):
name = strip_api_prefix(cmd_name)
private_params = ["context->getPrivateState()", "context->getMutableErrorSetForValidation()"]
Expand Down Expand Up @@ -1844,7 +1871,10 @@ def get_def_template(api, cmd_name, return_type, has_errcode_ret):
return TEMPLATE_CL_ENTRY_POINT_WITH_RETURN_ERROR
else:
if api == apis.EGL:
return TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN
if is_lockless_egl_entry_point(cmd_name):
return TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN_NO_LOCKS
else:
return TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN
elif api == apis.CL:
if has_errcode_ret:
return TEMPLATE_CL_ENTRY_POINT_WITH_ERRCODE_RET
Expand Down
16 changes: 6 additions & 10 deletions src/libGLESv2/entry_points_egl_autogen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -421,19 +421,15 @@ EGLint EGLAPIENTRY EGL_GetError()

Thread *thread = egl::GetCurrentThread();
EGLint returnValue;
{
ANGLE_SCOPED_GLOBAL_LOCK();
EGL_EVENT(GetError, "");

{
ANGLE_EGL_SCOPED_CONTEXT_LOCK(GetError, thread);
ANGLE_EGL_VALIDATE(thread, GetError, nullptr, EGLint);
EGL_EVENT(GetError, "");

returnValue = GetError(thread);
}
ANGLE_EGL_VALIDATE(thread, GetError, nullptr, EGLint);

returnValue = GetError(thread);

ANGLE_CAPTURE_EGL(GetError, true, thread, returnValue);

ANGLE_CAPTURE_EGL(GetError, true, thread, returnValue);
}
ASSERT(!egl::Display::GetCurrentThreadUnlockedTailCall()->any());
return returnValue;
}
Expand Down

0 comments on commit c2ad86b

Please sign in to comment.