1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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 // Thread.cpp : Defines the Thread class which represents a global EGL thread.
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Thread.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Debug.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h"
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker namespace angle
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_USE_ANDROID_TLS_SLOT)
19*8975f5c5SAndroid Build Coastguard Worker bool gUseAndroidOpenGLTlsSlot = false;
20*8975f5c5SAndroid Build Coastguard Worker #endif
21*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Worker namespace egl
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker namespace
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker Debug *sDebug = nullptr;
28*8975f5c5SAndroid Build Coastguard Worker } // namespace
29*8975f5c5SAndroid Build Coastguard Worker
Thread()30*8975f5c5SAndroid Build Coastguard Worker Thread::Thread()
31*8975f5c5SAndroid Build Coastguard Worker : mLabel(nullptr),
32*8975f5c5SAndroid Build Coastguard Worker mError(EGL_SUCCESS),
33*8975f5c5SAndroid Build Coastguard Worker mAPI(EGL_OPENGL_ES_API),
34*8975f5c5SAndroid Build Coastguard Worker mContext(static_cast<gl::Context *>(EGL_NO_CONTEXT))
35*8975f5c5SAndroid Build Coastguard Worker {}
36*8975f5c5SAndroid Build Coastguard Worker
setLabel(EGLLabelKHR label)37*8975f5c5SAndroid Build Coastguard Worker void Thread::setLabel(EGLLabelKHR label)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker mLabel = label;
40*8975f5c5SAndroid Build Coastguard Worker }
41*8975f5c5SAndroid Build Coastguard Worker
getLabel() const42*8975f5c5SAndroid Build Coastguard Worker EGLLabelKHR Thread::getLabel() const
43*8975f5c5SAndroid Build Coastguard Worker {
44*8975f5c5SAndroid Build Coastguard Worker return mLabel;
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker
setSuccess()47*8975f5c5SAndroid Build Coastguard Worker void Thread::setSuccess()
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker mError = EGL_SUCCESS;
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker
setError(EGLint error,const char * command,const LabeledObject * object,const char * message)52*8975f5c5SAndroid Build Coastguard Worker void Thread::setError(EGLint error,
53*8975f5c5SAndroid Build Coastguard Worker const char *command,
54*8975f5c5SAndroid Build Coastguard Worker const LabeledObject *object,
55*8975f5c5SAndroid Build Coastguard Worker const char *message)
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker mError = error;
58*8975f5c5SAndroid Build Coastguard Worker if (error != EGL_SUCCESS && message)
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker EnsureDebugAllocated();
61*8975f5c5SAndroid Build Coastguard Worker sDebug->insertMessage(error, command, ErrorCodeToMessageType(error), getLabel(),
62*8975f5c5SAndroid Build Coastguard Worker object ? object->getLabel() : nullptr, message);
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker }
65*8975f5c5SAndroid Build Coastguard Worker
setError(const Error & error,const char * command,const LabeledObject * object)66*8975f5c5SAndroid Build Coastguard Worker void Thread::setError(const Error &error, const char *command, const LabeledObject *object)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker mError = error.getCode();
69*8975f5c5SAndroid Build Coastguard Worker if (error.isError() && !error.getMessage().empty())
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker EnsureDebugAllocated();
72*8975f5c5SAndroid Build Coastguard Worker sDebug->insertMessage(error.getCode(), command, ErrorCodeToMessageType(error.getCode()),
73*8975f5c5SAndroid Build Coastguard Worker getLabel(), object ? object->getLabel() : nullptr,
74*8975f5c5SAndroid Build Coastguard Worker error.getMessage());
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker }
77*8975f5c5SAndroid Build Coastguard Worker
getError() const78*8975f5c5SAndroid Build Coastguard Worker EGLint Thread::getError() const
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker return mError;
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker
setAPI(EGLenum api)83*8975f5c5SAndroid Build Coastguard Worker void Thread::setAPI(EGLenum api)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker mAPI = api;
86*8975f5c5SAndroid Build Coastguard Worker }
87*8975f5c5SAndroid Build Coastguard Worker
getAPI() const88*8975f5c5SAndroid Build Coastguard Worker EGLenum Thread::getAPI() const
89*8975f5c5SAndroid Build Coastguard Worker {
90*8975f5c5SAndroid Build Coastguard Worker return mAPI;
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker
setCurrent(gl::Context * context)93*8975f5c5SAndroid Build Coastguard Worker void Thread::setCurrent(gl::Context *context)
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker mContext = context;
96*8975f5c5SAndroid Build Coastguard Worker if (mContext)
97*8975f5c5SAndroid Build Coastguard Worker {
98*8975f5c5SAndroid Build Coastguard Worker ASSERT(mContext->getDisplay());
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker
getCurrentDrawSurface() const102*8975f5c5SAndroid Build Coastguard Worker Surface *Thread::getCurrentDrawSurface() const
103*8975f5c5SAndroid Build Coastguard Worker {
104*8975f5c5SAndroid Build Coastguard Worker if (mContext)
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker return mContext->getCurrentDrawSurface();
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker return nullptr;
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker
getCurrentReadSurface() const111*8975f5c5SAndroid Build Coastguard Worker Surface *Thread::getCurrentReadSurface() const
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker if (mContext)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker return mContext->getCurrentReadSurface();
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker return nullptr;
118*8975f5c5SAndroid Build Coastguard Worker }
119*8975f5c5SAndroid Build Coastguard Worker
getContext() const120*8975f5c5SAndroid Build Coastguard Worker gl::Context *Thread::getContext() const
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker return mContext;
123*8975f5c5SAndroid Build Coastguard Worker }
124*8975f5c5SAndroid Build Coastguard Worker
getDisplay() const125*8975f5c5SAndroid Build Coastguard Worker Display *Thread::getDisplay() const
126*8975f5c5SAndroid Build Coastguard Worker {
127*8975f5c5SAndroid Build Coastguard Worker if (mContext)
128*8975f5c5SAndroid Build Coastguard Worker {
129*8975f5c5SAndroid Build Coastguard Worker return mContext->getDisplay();
130*8975f5c5SAndroid Build Coastguard Worker }
131*8975f5c5SAndroid Build Coastguard Worker return nullptr;
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker
EnsureDebugAllocated()134*8975f5c5SAndroid Build Coastguard Worker void EnsureDebugAllocated()
135*8975f5c5SAndroid Build Coastguard Worker {
136*8975f5c5SAndroid Build Coastguard Worker // All EGL calls use a global lock, this is thread safe
137*8975f5c5SAndroid Build Coastguard Worker if (sDebug == nullptr)
138*8975f5c5SAndroid Build Coastguard Worker {
139*8975f5c5SAndroid Build Coastguard Worker sDebug = new Debug();
140*8975f5c5SAndroid Build Coastguard Worker }
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker
DeallocateDebug()143*8975f5c5SAndroid Build Coastguard Worker void DeallocateDebug()
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker SafeDelete(sDebug);
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker
GetDebug()148*8975f5c5SAndroid Build Coastguard Worker Debug *GetDebug()
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker EnsureDebugAllocated();
151*8975f5c5SAndroid Build Coastguard Worker return sDebug;
152*8975f5c5SAndroid Build Coastguard Worker }
153*8975f5c5SAndroid Build Coastguard Worker } // namespace egl
154