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