• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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