1 //
2 // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // Platform.cpp: Implementation methods for angle::Platform.
8
9 #include <platform/PlatformMethods.h>
10
11 #include <cstring>
12
13 #include "common/debug.h"
14
15 namespace
16 {
17 // TODO(jmadill): Make methods owned by egl::Display.
PlatformMethods()18 angle::PlatformMethods &PlatformMethods()
19 {
20 static angle::PlatformMethods platformMethods;
21 return platformMethods;
22 }
23 } // anonymous namespace
24
ANGLEPlatformCurrent()25 angle::PlatformMethods *ANGLEPlatformCurrent()
26 {
27 return &PlatformMethods();
28 }
29
ANGLEGetDisplayPlatform(angle::EGLDisplayType display,const char * const methodNames[],unsigned int methodNameCount,void * context,void * platformMethods)30 bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display,
31 const char *const methodNames[],
32 unsigned int methodNameCount,
33 void *context,
34 void *platformMethods)
35 {
36 angle::PlatformMethods **platformMethodsOut =
37 reinterpret_cast<angle::PlatformMethods **>(platformMethods);
38
39 // We allow for a lower input count of impl platform methods if the subset is correct.
40 if (methodNameCount > angle::g_NumPlatformMethods)
41 {
42 ERR() << "Invalid platform method count: " << methodNameCount << ", expected "
43 << angle::g_NumPlatformMethods << ".";
44 return false;
45 }
46
47 for (unsigned int nameIndex = 0; nameIndex < methodNameCount; ++nameIndex)
48 {
49 const char *expectedName = angle::g_PlatformMethodNames[nameIndex];
50 const char *actualName = methodNames[nameIndex];
51
52 // Skip deprecated methods. The names of these methods start with |placeholder|.
53 constexpr char kPlaceholder[] = "placeholder";
54 if (strncmp(expectedName, kPlaceholder, sizeof(kPlaceholder) - 1) == 0)
55 {
56 continue;
57 }
58 if (strcmp(expectedName, actualName) != 0)
59 {
60 ERR() << "Invalid platform method name: " << actualName << ", expected " << expectedName
61 << ".";
62 return false;
63 }
64 }
65
66 // TODO(jmadill): Store platform methods in display.
67 PlatformMethods().context = context;
68 *platformMethodsOut = &PlatformMethods();
69 return true;
70 }
71
ANGLEResetDisplayPlatform(angle::EGLDisplayType display)72 void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display)
73 {
74 // TODO(jmadill): Store platform methods in display.
75 PlatformMethods() = angle::PlatformMethods();
76 }
77