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