// Copyright (C) 2017 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "OpenGLESDispatch/OpenGLDispatchLoader.h" #include "OpenGLESDispatch/DispatchTables.h" namespace gfxstream { namespace gl { GLESv1Dispatch s_gles1; GLESv2Dispatch s_gles2; // Must be declared outside of LazyLoaded*Dispatch scope due to the use of // sizeof(T) within the template definition. static LazyLoadedGLESv1Dispatch* sGLESv1Dispatch() { static LazyLoadedGLESv1Dispatch* l = new LazyLoadedGLESv1Dispatch; return l; } static LazyLoadedGLESv2Dispatch* sGLESv2Dispatch() { static LazyLoadedGLESv2Dispatch* l = new LazyLoadedGLESv2Dispatch; return l; } static LazyLoadedEGLDispatch* sEGLDispatch() { static LazyLoadedEGLDispatch* l = new LazyLoadedEGLDispatch; return l; } // static const GLESv1Dispatch* LazyLoadedGLESv1Dispatch::get() { LazyLoadedGLESv1Dispatch* instance = sGLESv1Dispatch(); if (instance->mValid) { return &s_gles1; } else { return nullptr; } } LazyLoadedGLESv1Dispatch::LazyLoadedGLESv1Dispatch() { LazyLoadedEGLDispatch::get(); mValid = gles1_dispatch_init(&s_gles1); } // static const GLESv2Dispatch* LazyLoadedGLESv2Dispatch::get() { LazyLoadedGLESv2Dispatch* instance = sGLESv2Dispatch(); if (instance->mValid) { return &s_gles2; } else { return nullptr; } } LazyLoadedGLESv2Dispatch::LazyLoadedGLESv2Dispatch() { LazyLoadedEGLDispatch::get(); mValid = gles2_dispatch_init(&s_gles2); } // static const EGLDispatch* LazyLoadedEGLDispatch::get() { LazyLoadedEGLDispatch* instance = sEGLDispatch(); if (instance->mValid) { return &s_egl; } else { return nullptr; } } LazyLoadedEGLDispatch::LazyLoadedEGLDispatch() { mValid = init_egl_dispatch(); } } // namespace gl } // namespace gfxstream