Branch
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
//
// Copyright 2016 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.
//
// FunctionsEGLDL.cpp: Implements the FunctionsEGLDL class.
#include "libANGLE/renderer/gl/egl/FunctionsEGLDL.h"
#include <dlfcn.h>
namespace rx
{
namespace
{
// In ideal world, we would want this to be a member of FunctionsEGLDL,
// and call dlclose() on it in ~FunctionsEGLDL().
// However, some GL implementations are broken and don't allow multiple
// load/unload cycles, but only static linking with them.
// That's why we dlopen() this handle once and never dlclose() it.
// This is consistent with Chromium's CleanupNativeLibraries() code,
// referencing crbug.com/250813 and http://www.xfree86.org/4.3.0/DRI11.html
void *nativeEGLHandle;
} // anonymous namespace
FunctionsEGLDL::FunctionsEGLDL() : mGetProcAddressPtr(nullptr) {}
FunctionsEGLDL::~FunctionsEGLDL() {}
egl::Error FunctionsEGLDL::initialize(EGLAttrib platformType,
EGLNativeDisplayType nativeDisplay,
const char *libName,
void *eglHandle)
{
if (eglHandle)
{
// If the handle is provided, use it.
// Caller has already dlopened the vendor library.
nativeEGLHandle = eglHandle;
}
if (!nativeEGLHandle)
{
nativeEGLHandle = dlopen(libName, RTLD_NOW);
if (!nativeEGLHandle)
{
std::ostringstream err;
err << "Could not dlopen native EGL: " << dlerror();
return egl::Error(EGL_NOT_INITIALIZED, err.str());
}
}
mGetProcAddressPtr =
reinterpret_cast<PFNEGLGETPROCADDRESSPROC>(dlsym(nativeEGLHandle, "eglGetProcAddress"));
if (!mGetProcAddressPtr)
{
return egl::Error(EGL_NOT_INITIALIZED, "Could not find eglGetProcAddress");
}
return FunctionsEGL::initialize(platformType, nativeDisplay);
}
void *FunctionsEGLDL::getProcAddress(const char *name) const
{
void *f = reinterpret_cast<void *>(mGetProcAddressPtr(name));
if (f)
{
return f;
}
return dlsym(nativeEGLHandle, name);
}
} // namespace rx