Hash :
cfb430c8
Author :
Date :
2025-02-10T13:19:05
Remove angle::ErrorStream helper Most uses of the helper either use just the code or a fixed string, which compiles to a few instructions. Using this helper adds 200+ bytes of assembly to each use, due to the unneeded instantiation of ostringstream which allocates a buffer etc. The combined effect of this CL on an Android perf build is ~12KB (0.2%) reduction in size. The cases where the message is actually formatted are converted to an explicit use of ostringstream. Removing the helper so that the new code is explicit about the intent to use ostringstream, or an alternative way to format the message. Discovered accidentally while looking into size reduction due to __builtin_unreachable() Semi-automated code change, risk of copy-paste mistakes should be minimal. Bug: angleproject:394129077 Change-Id: I47c2642d750d31416b08a1cfa435d5463c294e35 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6250078 Commit-Queue: Roman Lavrov <romanl@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
//
// Copyright 2020 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// EGLReusableSync.cpp: Implements the egl::ReusableSync class.
#include "libANGLE/renderer/EGLReusableSync.h"
#include "libANGLE/Context.h"
#include "libANGLE/renderer/ContextImpl.h"
namespace rx
{
ReusableSync::ReusableSync() : EGLSyncImpl(), mStatus(0) {}
void ReusableSync::onDestroy(const egl::Display *display) {}
ReusableSync::~ReusableSync()
{
// Release any waiting thread.
mCondVar.notify_all();
}
egl::Error ReusableSync::initialize(const egl::Display *display,
const gl::Context *context,
EGLenum type,
const egl::AttributeMap &attribs)
{
ASSERT(type == EGL_SYNC_REUSABLE_KHR);
mStatus = EGL_UNSIGNALED;
return egl::NoError();
}
egl::Error ReusableSync::clientWait(const egl::Display *display,
const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult)
{
if (mStatus == EGL_SIGNALED)
{
*outResult = EGL_CONDITION_SATISFIED_KHR;
return egl::NoError();
}
if (((flags & EGL_SYNC_FLUSH_COMMANDS_BIT) != 0) && (context != nullptr))
{
angle::Result result = context->getImplementation()->flush(context);
if (result != angle::Result::Continue)
{
return ResultToEGL(result);
}
}
if (timeout == 0)
{
*outResult = EGL_TIMEOUT_EXPIRED_KHR;
return egl::NoError();
}
using NanoSeconds = std::chrono::duration<int64_t, std::nano>;
NanoSeconds duration = (timeout == EGL_FOREVER) ? NanoSeconds::max() : NanoSeconds(timeout);
std::cv_status waitStatus = std::cv_status::no_timeout;
mMutex.lock();
waitStatus = mCondVar.wait_for(mMutex, duration);
mMutex.unlock();
switch (waitStatus)
{
case std::cv_status::no_timeout: // Signaled.
*outResult = EGL_CONDITION_SATISFIED_KHR;
break;
case std::cv_status::timeout: // Timed-out.
*outResult = EGL_TIMEOUT_EXPIRED_KHR;
break;
default:
break;
}
return egl::NoError();
}
egl::Error ReusableSync::serverWait(const egl::Display *display,
const gl::Context *context,
EGLint flags)
{
// Does not support server wait.
return egl::Error(EGL_BAD_MATCH);
}
egl::Error ReusableSync::signal(const egl::Display *display,
const gl::Context *context,
EGLint mode)
{
if (mode == EGL_SIGNALED)
{
if (mStatus == EGL_UNSIGNALED)
{
// Release all threads.
mCondVar.notify_all();
}
mStatus = EGL_SIGNALED;
}
else
{
mStatus = EGL_UNSIGNALED;
}
return egl::NoError();
}
egl::Error ReusableSync::getStatus(const egl::Display *display, EGLint *outStatus)
{
*outStatus = mStatus;
return egl::NoError();
}
} // namespace rx