Hash :
5610ab64
Author :
Date :
2022-04-20T03:22:59
Fix ANGLEGetDisplayPlatform after method deprecation This function verifies that the methods that are named match methods of PlatformMethods. Since 8074061d2, some methods have been deprecated, which caused this function to fail to return the platform methods for the Android platform. The Android platform doesn't actually use the deprecated functions. In this change, ANGLEGetDisplayPlatform is made to ignore deprecated methods (whose names start with `placeholder`) to maintain backwards compatibility. This can be reverted once Android and any other potential user is fixed. Bug: b/229651121 Change-Id: I1d51a6e064f1dec128f67c0991cd8fb2646ad2b1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3594804 Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
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
//
// Copyright 2015 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.
//
// Platform.cpp: Implementation methods for angle::Platform.
#include <platform/Platform.h>
#include <cstring>
#include "common/debug.h"
namespace
{
// TODO(jmadill): Make methods owned by egl::Display.
angle::PlatformMethods &PlatformMethods()
{
static angle::PlatformMethods platformMethods;
return platformMethods;
}
} // anonymous namespace
angle::PlatformMethods *ANGLEPlatformCurrent()
{
return &PlatformMethods();
}
bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display,
const char *const methodNames[],
unsigned int methodNameCount,
void *context,
void *platformMethods)
{
angle::PlatformMethods **platformMethodsOut =
reinterpret_cast<angle::PlatformMethods **>(platformMethods);
// We allow for a lower input count of impl platform methods if the subset is correct.
if (methodNameCount > angle::g_NumPlatformMethods)
{
ERR() << "Invalid platform method count: " << methodNameCount << ", expected "
<< angle::g_NumPlatformMethods << ".";
return false;
}
for (unsigned int nameIndex = 0; nameIndex < methodNameCount; ++nameIndex)
{
const char *expectedName = angle::g_PlatformMethodNames[nameIndex];
const char *actualName = methodNames[nameIndex];
// Skip deprecated methods. The names of these methods start with |placeholder|.
constexpr char kPlaceholder[] = "placeholder";
if (strncmp(expectedName, kPlaceholder, sizeof(kPlaceholder) - 1) == 0)
{
continue;
}
if (strcmp(expectedName, actualName) != 0)
{
ERR() << "Invalid platform method name: " << actualName << ", expected " << expectedName
<< ".";
return false;
}
}
// TODO(jmadill): Store platform methods in display.
PlatformMethods().context = context;
*platformMethodsOut = &PlatformMethods();
return true;
}
void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display)
{
// TODO(jmadill): Store platform methods in display.
PlatformMethods() = angle::PlatformMethods();
}