10838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang/* 20838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * Copyright (C) 2017 The Android Open Source Project 30838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * 40838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * Licensed under the Apache License, Version 2.0 (the "License"); 50838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * you may not use this file except in compliance with the License. 60838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * You may obtain a copy of the License at 70838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * 80838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * http://www.apache.org/licenses/LICENSE-2.0 90838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * 100838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * Unless required by applicable law or agreed to in writing, software 110838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * distributed under the License is distributed on an "AS IS" BASIS, 120838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * See the License for the specific language governing permissions and 140838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang * limitations under the License. 150838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang */ 160838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 170838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang#include "cpp/rsDispatch.h" 180838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang#include "rsFallbackAdaptation.h" 190838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 200838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang#include <log/log.h> 210838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang#include <dlfcn.h> 220838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 230838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang#undef LOG_TAG 240838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang#define LOG_TAG "RenderScript Graphics Fallback" 250838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 260838b98ea2d72bd2262bf9bff5aca093699d64ffMiao WangdispatchTable RsFallbackAdaptation::mEntryFuncs; 270838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 280838b98ea2d72bd2262bf9bff5aca093699d64ffMiao WangRsFallbackAdaptation::RsFallbackAdaptation() 290838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang{ 300838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang void* handle = dlopen("libRS_internal.so", RTLD_LAZY | RTLD_LOCAL); 310838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang if (handle == NULL) { 320838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang ALOGE("couldn't dlopen %s.", dlerror()); 330838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang return; 340838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang } 350838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang if (loadSymbols(handle, mEntryFuncs) == false) { 360838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang // If dispatch table initialization failed, the dispatch table 370838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang // will be reset, and calling function pointers of uninitialized 380838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang // dispatch table will crash the application. 390838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang ALOGE("Fallback dispatch table init failed!"); 400838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang mEntryFuncs = {}; 410838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang dlclose(handle); 420838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang } 430838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang} 440838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 450838b98ea2d72bd2262bf9bff5aca093699d64ffMiao WangRsFallbackAdaptation& RsFallbackAdaptation::GetInstance() 460838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang{ 470838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang // This function-local-static guarantees the instance is a singleton. The 480838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang // constructor of RsHidlAdaptation will only be called when GetInstance is 490838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang // called for the first time. 500838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang static RsFallbackAdaptation instance; 510838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang return instance; 520838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang} 530838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 540838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wangconst dispatchTable* RsFallbackAdaptation::GetEntryFuncs() 550838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang{ 560838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang return &mEntryFuncs; 570838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang} 580838b98ea2d72bd2262bf9bff5aca093699d64ffMiao Wang 59