blob: d7286211ad6e9d8b823156b3969b6d273175a6f4 [file] [log] [blame]
Lingfeng Yang3c944902020-10-28 11:56:43 -07001// Copyright (C) 2017 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Joshua Duong13890052022-08-26 13:30:50 -070015#include "OpenGLESDispatch/OpenGLDispatchLoader.h"
Lingfeng Yang3c944902020-10-28 11:56:43 -070016
17#include "OpenGLESDispatch/DispatchTables.h"
18
Jason Macnaked0c9e62023-03-30 15:58:24 -070019namespace gfxstream {
20namespace gl {
21
Lingfeng Yang3c944902020-10-28 11:56:43 -070022GLESv1Dispatch s_gles1;
23GLESv2Dispatch s_gles2;
24
Lingfeng Yang3c944902020-10-28 11:56:43 -070025// Must be declared outside of LazyLoaded*Dispatch scope due to the use of
26// sizeof(T) within the template definition.
Lingfeng Yang87321ae2020-10-28 17:04:22 -070027static LazyLoadedGLESv1Dispatch* sGLESv1Dispatch() {
28 static LazyLoadedGLESv1Dispatch* l = new LazyLoadedGLESv1Dispatch;
29 return l;
30}
31static LazyLoadedGLESv2Dispatch* sGLESv2Dispatch() {
32 static LazyLoadedGLESv2Dispatch* l = new LazyLoadedGLESv2Dispatch;
33 return l;
34}
35static LazyLoadedEGLDispatch* sEGLDispatch() {
36 static LazyLoadedEGLDispatch* l = new LazyLoadedEGLDispatch;
37 return l;
38}
Lingfeng Yang3c944902020-10-28 11:56:43 -070039
40// static
41const GLESv1Dispatch* LazyLoadedGLESv1Dispatch::get() {
Lingfeng Yang87321ae2020-10-28 17:04:22 -070042 LazyLoadedGLESv1Dispatch* instance = sGLESv1Dispatch();
Lingfeng Yang3c944902020-10-28 11:56:43 -070043 if (instance->mValid) {
44 return &s_gles1;
45 } else {
46 return nullptr;
47 }
48}
49
50LazyLoadedGLESv1Dispatch::LazyLoadedGLESv1Dispatch() {
51 LazyLoadedEGLDispatch::get();
52 mValid = gles1_dispatch_init(&s_gles1);
53}
54
55// static
56const GLESv2Dispatch* LazyLoadedGLESv2Dispatch::get() {
Lingfeng Yang87321ae2020-10-28 17:04:22 -070057 LazyLoadedGLESv2Dispatch* instance = sGLESv2Dispatch();
Lingfeng Yang3c944902020-10-28 11:56:43 -070058 if (instance->mValid) {
59 return &s_gles2;
60 } else {
61 return nullptr;
62 }
63}
64
65LazyLoadedGLESv2Dispatch::LazyLoadedGLESv2Dispatch() {
66 LazyLoadedEGLDispatch::get();
67 mValid = gles2_dispatch_init(&s_gles2);
68}
69
70// static
71const EGLDispatch* LazyLoadedEGLDispatch::get() {
Lingfeng Yang87321ae2020-10-28 17:04:22 -070072 LazyLoadedEGLDispatch* instance = sEGLDispatch();
Lingfeng Yang3c944902020-10-28 11:56:43 -070073 if (instance->mValid) {
74 return &s_egl;
75 } else {
76 return nullptr;
77 }
78}
79
80LazyLoadedEGLDispatch::LazyLoadedEGLDispatch() { mValid = init_egl_dispatch(); }
Jason Macnaked0c9e62023-03-30 15:58:24 -070081
82} // namespace gl
83} // namespace gfxstream