Edit

kc3-lang/angle/src/libANGLE/Platform.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2017-02-16 10:24:06
    Hash : abe89c7d
    Message : Tweak platform method signatures. This works around a limitation in UBSAN which can't handle decltype. Instead use void * and typedef where appropriate. BUG=chromium:692274 Change-Id: I4eab796db3aa2e51c0fc558170eb2af61f07223d Reviewed-on: https://chromium-review.googlesource.com/443885 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/Platform.cpp
  • //
    // 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 g_platformMethods;
    }  // anonymous namespace
    
    angle::PlatformMethods *ANGLEPlatformCurrent()
    {
        return &g_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];
            if (strcmp(expectedName, actualName) != 0)
            {
                ERR() << "Invalid platform method name: " << actualName << ", expected " << expectedName
                      << ".";
                return false;
            }
        }
    
        // TODO(jmadill): Store platform methods in display.
        g_platformMethods.context = context;
        *platformMethodsOut       = &g_platformMethods;
        return true;
    }
    
    void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display)
    {
        // TODO(jmadill): Store platform methods in display.
        g_platformMethods = angle::PlatformMethods();
    }