rsContext.cpp revision 6dfe6841d357a1664433f0dcec3c8f4ae8ffbeb0
114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon/* 214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * Copyright (C) 2011 The Android Open Source Project 314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * 414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * Licensed under the Apache License, Version 2.0 (the "License"); 514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * you may not use this file except in compliance with the License. 614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * You may obtain a copy of the License at 714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * 814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * http://www.apache.org/licenses/LICENSE-2.0 914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * 1014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * Unless required by applicable law or agreed to in writing, software 1114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * distributed under the License is distributed on an "AS IS" BASIS, 1214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * See the License for the specific language governing permissions and 1414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon * limitations under the License. 1514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon */ 1614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 1714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include "rs.h" 1814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include "rsDevice.h" 1914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include "rsContext.h" 2014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include "rsThreadIO.h" 2114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 2214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 2314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include "rsMesh.h" 2414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <ui/FramebufferNativeWindow.h> 2514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <gui/DisplayEventReceiver.h> 2614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 2714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 2814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <sys/types.h> 2914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <sys/resource.h> 3014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <sched.h> 3114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 3214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <sys/syscall.h> 3314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <string.h> 3414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <dlfcn.h> 3514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <unistd.h> 3614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 3714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB) 3814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include <cutils/properties.h> 3914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 4014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 4114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifdef RS_COMPATIBILITY_LIB 4214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#include "rsCompatibilityLib.h" 4314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 4414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 4514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifdef RS_SERVER 4614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon// Android exposes gettid(), standard Linux does not 4714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonstatic pid_t gettid() { 4814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return syscall(SYS_gettid); 4914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 5014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 5114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 5214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonusing namespace android; 5314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonusing namespace android::renderscript; 5414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 5514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonpthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER; 5614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonpthread_mutex_t Context::gMessageMutex = PTHREAD_MUTEX_INITIALIZER; 5714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonpthread_mutex_t Context::gLibMutex = PTHREAD_MUTEX_INITIALIZER; 5814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 5914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonbool Context::initGLThread() { 6014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_lock(&gInitMutex); 6114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 6214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!mHal.funcs.initGraphics(this)) { 6314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_unlock(&gInitMutex); 6414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("%p initGraphics failed", this); 6514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 6614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 6714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 6814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_unlock(&gInitMutex); 6914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return true; 7014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 7114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 7214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::deinitEGL() { 7314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 7414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHal.funcs.shutdownGraphics(this); 7514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 7614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 7714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 7814ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonContext::PushState::PushState(Context *con) { 7914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRsc = con; 8014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 8114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (con->mIsGraphicsContext) { 8214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragment.set(con->getProgramFragment()); 8314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mVertex.set(con->getProgramVertex()); 8414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStore.set(con->getProgramStore()); 8514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRaster.set(con->getProgramRaster()); 8614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFont.set(con->getFont()); 8714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 8814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 8914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 9014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 9114ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonContext::PushState::~PushState() { 9214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 9314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mRsc->mIsGraphicsContext) { 9414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRsc->setProgramFragment(mFragment.get()); 9514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRsc->setProgramVertex(mVertex.get()); 9614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRsc->setProgramStore(mStore.get()); 9714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRsc->setProgramRaster(mRaster.get()); 9814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRsc->setFont(mFont.get()); 9914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 10014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 10114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 10214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 10314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 10414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonuint32_t Context::runScript(Script *s) { 10514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon PushState ps(this); 10614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 10714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t ret = s->run(this); 10814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return ret; 10914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 11014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 11114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonuint32_t Context::runRootScript() { 11214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon timerSet(RS_TIMER_SCRIPT); 11314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 11414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFragmentStore.mLast.clear(); 11514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 11614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon watchdog.inRoot = true; 11714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t ret = runScript(mRootScript.get()); 11814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon watchdog.inRoot = false; 11914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 12014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return ret; 12114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 12214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 12314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonuint64_t Context::getTime() const { 12414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef ANDROID_RS_SERIALIZE 12514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon struct timespec t; 12614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon clock_gettime(CLOCK_MONOTONIC, &t); 12714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000); 12814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#else 12914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return 0; 13014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif //ANDROID_RS_SERIALIZE 13114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 13214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 13314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::timerReset() { 13414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon for (int ct=0; ct < _RS_TIMER_TOTAL; ct++) { 13514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimers[ct] = 0; 13614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 13714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 13814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 13914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::timerInit() { 14014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeLast = getTime(); 14114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeFrame = mTimeLast; 14214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeLastFrame = mTimeLast; 14314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimerActive = RS_TIMER_INTERNAL; 14414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPSFrameCount = 0; 14514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPSStartTime = mTimeLast; 14614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPS = 0; 14714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon timerReset(); 14814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 14914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 15014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::timerFrame() { 15114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeLastFrame = mTimeFrame; 15214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeFrame = getTime(); 15314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // Update average fps 15414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon const uint64_t averageFramerateInterval = 1000 * 1000000; 15514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPSFrameCount ++; 15614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint64_t inverval = mTimeFrame - mAverageFPSStartTime; 15714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (inverval >= averageFramerateInterval) { 15814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon inverval = inverval / 1000000; 15914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPS = (mAverageFPSFrameCount * 1000) / inverval; 16014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPSFrameCount = 0; 16114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPSStartTime = mTimeFrame; 16214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 16314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 16414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 16514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::timerSet(Timers tm) { 16614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint64_t last = mTimeLast; 16714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeLast = getTime(); 16814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimers[mTimerActive] += mTimeLast - last; 16914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimerActive = tm; 17014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 17114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 17214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::timerPrint() { 17314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon double total = 0; 17414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon for (int ct = 0; ct < _RS_TIMER_TOTAL; ct++) { 17514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon total += mTimers[ct]; 17614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 17714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint64_t frame = mTimeFrame - mTimeLastFrame; 17814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeMSLastFrame = frame / 1000000; 17914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeMSLastScript = mTimers[RS_TIMER_SCRIPT] / 1000000; 18014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeMSLastSwap = mTimers[RS_TIMER_CLEAR_SWAP] / 1000000; 18114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 18214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 18314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (props.mLogTimes) { 18414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGV("RS: Frame (%i), Script %2.1f%% (%i), Swap %2.1f%% (%i), Idle %2.1f%% (%lli), Internal %2.1f%% (%lli), Avg fps: %u", 18514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTimeMSLastFrame, 18614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 100.0 * mTimers[RS_TIMER_SCRIPT] / total, mTimeMSLastScript, 18714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 100.0 * mTimers[RS_TIMER_CLEAR_SWAP] / total, mTimeMSLastSwap, 18814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000, 18914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000, 19014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mAverageFPS); 19114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 19214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 19314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 19414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonbool Context::setupCheck() { 19514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 19614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragmentStore->setup(this, &mStateFragmentStore); 19714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragment->setup(this, &mStateFragment); 19814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRaster->setup(this, &mStateRaster); 19914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mVertex->setup(this, &mStateVertex); 20014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFBOCache.setup(this); 20114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 20214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return true; 20314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 20414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 20514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 20614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setupProgramStore() { 20714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragmentStore->setup(this, &mStateFragmentStore); 20814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 20914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 21014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 21114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonstatic uint32_t getProp(const char *str) { 21214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_SERVER 21314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon char buf[PROPERTY_VALUE_MAX]; 21414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon property_get(str, buf, "0"); 21514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return atoi(buf); 21614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#else 21714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return 0; 21814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 21914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 22014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 22114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::displayDebugStats() { 22214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 22314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon char buffer[128]; 22414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon sprintf(buffer, "Avg fps %u, Frame %i ms, Script %i ms", mAverageFPS, mTimeMSLastFrame, mTimeMSLastScript); 22514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon float oldR, oldG, oldB, oldA; 22614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.getFontColor(&oldR, &oldG, &oldB, &oldA); 22714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t bufferLen = strlen(buffer); 22814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 22914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBaseRef<Font> lastFont(getFont()); 23014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon setFont(NULL); 23114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon float shadowCol = 0.1f; 23214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.setFontColor(shadowCol, shadowCol, shadowCol, 1.0f); 23314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.renderText(buffer, bufferLen, 5, getHeight() - 6); 23414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 23514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.setFontColor(1.0f, 0.7f, 0.0f, 1.0f); 23614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.renderText(buffer, bufferLen, 4, getHeight() - 7); 23714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 23814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon setFont(lastFont.get()); 23914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.setFontColor(oldR, oldG, oldB, oldA); 24014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 24114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 24214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 24314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonbool Context::loadRuntime(const char* filename, Context* rsc) { 24414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 24514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // TODO: store the driverSO somewhere so we can dlclose later 24614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon void *driverSO = NULL; 24714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 24814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon driverSO = dlopen(filename, RTLD_LAZY); 24914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (driverSO == NULL) { 25014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Failed loading RS driver: %s", dlerror()); 25114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 25214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 25314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 25414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // Need to call dlerror() to clear buffer before using it for dlsym(). 25514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon (void) dlerror(); 25614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon typedef bool (*HalSig)(Context*, uint32_t, uint32_t); 25714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon HalSig halInit = (HalSig) dlsym(driverSO, "rsdHalInit"); 25814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 25914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // If we can't find the C variant, we go looking for the C++ version. 26014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (halInit == NULL) { 26114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGW("Falling back to find C++ rsdHalInit: %s", dlerror()); 26214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon halInit = (HalSig) dlsym(driverSO, 26314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon "_Z10rsdHalInitPN7android12renderscript7ContextEjj"); 26414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 26514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 26614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (halInit == NULL) { 26714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon dlclose(driverSO); 26814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Failed to find rsdHalInit: %s", dlerror()); 26914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 27014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 27114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 27214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!(*halInit)(rsc, 0, 0)) { 27314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon dlclose(driverSO); 27414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Hal init failed"); 27514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 27614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 27714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 27814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //validate HAL struct 27914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 28014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 28114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return true; 28214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 28314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 28414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonextern "C" bool rsdHalInit(RsContext c, uint32_t version_major, uint32_t version_minor); 28514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 28614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid * Context::threadProc(void *vrsc) { 28714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Context *rsc = static_cast<Context *>(vrsc); 28814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef ANDROID_RS_SERIALIZE 28914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mNativeThreadId = gettid(); 29014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 29114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!rsc->isSynchronous()) { 29214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY); 29314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 29414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mThreadPriority = ANDROID_PRIORITY_DISPLAY; 29514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#else 29614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!rsc->isSynchronous()) { 29714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon setpriority(PRIO_PROCESS, rsc->mNativeThreadId, -4); 29814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 29914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mThreadPriority = -4; 30014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 30114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif //ANDROID_RS_SERIALIZE 30214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogTimes = getProp("debug.rs.profile") != 0; 30314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogScripts = getProp("debug.rs.script") != 0; 30414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogObjects = getProp("debug.rs.object") != 0; 30514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogShaders = getProp("debug.rs.shader") != 0; 30614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogShadersAttr = getProp("debug.rs.shader.attributes") != 0; 30714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogShadersUniforms = getProp("debug.rs.shader.uniforms") != 0; 30814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mLogVisual = getProp("debug.rs.visual") != 0; 30914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->props.mDebugMaxThreads = getProp("debug.rs.max-threads"); 31014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 31114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon bool loadDefault = true; 31214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 31314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // Provide a mechanism for dropping in a different RS driver. 31414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 31514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifdef OVERRIDE_RS_DRIVER 31614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#define XSTR(S) #S 31714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#define STR(S) XSTR(S) 31814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#define OVERRIDE_RS_DRIVER_STRING STR(OVERRIDE_RS_DRIVER) 31914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 32014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (getProp("debug.rs.default-CPU-driver") != 0) { 32114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Skipping override driver and loading default CPU driver"); 32214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else if (rsc->mForceCpu) { 32314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGV("Application requested CPU execution"); 32414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else if (rsc->getContextType() == RS_CONTEXT_TYPE_DEBUG) { 32514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGV("Application requested debug context"); 32614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 32714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (loadRuntime(OVERRIDE_RS_DRIVER_STRING, rsc)) { 32814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Successfully loaded runtime: %s", OVERRIDE_RS_DRIVER_STRING); 32914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon loadDefault = false; 33014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 33114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Failed to load runtime %s, loading default", OVERRIDE_RS_DRIVER_STRING); 33214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 33314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 33414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 33514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#undef XSTR 33614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#undef STR 33714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif // OVERRIDE_RS_DRIVER 33814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 33914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (loadDefault) { 34014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!loadRuntime("libRSDriver.so", rsc)) { 34114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Failed to load default runtime!"); 34214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setError(RS_ERROR_FATAL_DRIVER, "Failed loading RS driver"); 34314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return NULL; 34414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 34514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 34614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#else // RS_COMPATIBILITY_LIB 34714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsdHalInit(rsc, 0, 0) != true) { 34814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return NULL; 34914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 35014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 35114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 35214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 35314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mHal.funcs.setPriority(rsc, rsc->mThreadPriority); 35414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 35514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 35614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc->mIsGraphicsContext) { 35714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!rsc->initGLThread()) { 35814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setError(RS_ERROR_OUT_OF_MEMORY, "Failed initializing GL"); 35914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return NULL; 36014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 36114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 36214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mStateRaster.init(rsc); 36314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramRaster(NULL); 36414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mStateVertex.init(rsc); 36514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramVertex(NULL); 36614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mStateFragment.init(rsc); 36714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramFragment(NULL); 36814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mStateFragmentStore.init(rsc); 36914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramStore(NULL); 37014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mStateFont.init(rsc); 37114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setFont(NULL); 37214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mStateSampler.init(rsc); 37314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mFBOCache.init(rsc); 37414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 37514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 37614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 37714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mRunning = true; 37814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 37914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc->isSynchronous()) { 38014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return NULL; 38114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 38214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 38314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!rsc->mIsGraphicsContext) { 38414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon while (!rsc->mExit) { 38514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mIO.playCoreCommands(rsc, -1); 38614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 38714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 38814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 38914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef ANDROID_RS_SERIALIZE 39014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon DisplayEventReceiver displayEvent; 39114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon DisplayEventReceiver::Event eventBuffer[1]; 39214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 39314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon int vsyncRate = 0; 39414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon int targetRate = 0; 39514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 39614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon bool drawOnce = false; 39714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon while (!rsc->mExit) { 39814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->timerSet(RS_TIMER_IDLE); 39914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 40014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef ANDROID_RS_SERIALIZE 40114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!rsc->mRootScript.get() || !rsc->mHasSurface || rsc->mPaused) { 40214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon targetRate = 0; 40314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 40414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 40514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (vsyncRate != targetRate) { 40614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon displayEvent.setVsyncRate(targetRate); 40714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon vsyncRate = targetRate; 40814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 40914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (targetRate) { 41014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon drawOnce |= rsc->mIO.playCoreCommands(rsc, displayEvent.getFd()); 41114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon while (displayEvent.getEvents(eventBuffer, 1) != 0) { 41214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGE("vs2 time past %lld", (rsc->getTime() - eventBuffer[0].header.timestamp) / 1000000); 41314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 41414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else 41514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 41614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon { 41714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon drawOnce |= rsc->mIO.playCoreCommands(rsc, -1); 41814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 41914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 42014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if ((rsc->mRootScript.get() != NULL) && rsc->mHasSurface && 42114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon (targetRate || drawOnce) && !rsc->mPaused) { 42214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 42314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon drawOnce = false; 42414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon targetRate = ((rsc->runRootScript() + 15) / 16); 42514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 42614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc->props.mLogVisual) { 42714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->displayDebugStats(); 42814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 42914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 43014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->timerSet(RS_TIMER_CLEAR_SWAP); 43114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mHal.funcs.swap(rsc); 43214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->timerFrame(); 43314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->timerSet(RS_TIMER_INTERNAL); 43414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->timerPrint(); 43514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->timerReset(); 43614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 43714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 43814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 43914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 44014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 44114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p RS Thread exiting", rsc); 44214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 44314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 44414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc->mIsGraphicsContext) { 44514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_lock(&gInitMutex); 44614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->deinitEGL(); 44714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_unlock(&gInitMutex); 44814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 44914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 45014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 45114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p RS Thread exited", rsc); 45214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return NULL; 45314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 45414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 45514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::destroyWorkerThreadResources() { 45614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("destroyWorkerThreadResources 1"); 45714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBase::zeroAllUserRef(this); 45814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 45914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mIsGraphicsContext) { 46014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRaster.clear(); 46114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragment.clear(); 46214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mVertex.clear(); 46314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragmentStore.clear(); 46414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFont.clear(); 46514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRootScript.clear(); 46614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateRaster.deinit(this); 46714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateVertex.deinit(this); 46814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFragment.deinit(this); 46914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFragmentStore.deinit(this); 47014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateFont.deinit(this); 47114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateSampler.deinit(this); 47214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFBOCache.deinit(this); 47314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 47414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 47514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBase::freeAllChildren(this); 47614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mExit = true; 47714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("destroyWorkerThreadResources 2"); 47814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 47914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 48014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::printWatchdogInfo(void *ctx) { 48114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Context *rsc = (Context *)ctx; 48214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc->watchdog.command && rsc->watchdog.file) { 48314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("RS watchdog timeout: %i %s line %i %s", rsc->watchdog.inRoot, 48414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->watchdog.command, rsc->watchdog.line, rsc->watchdog.file); 48514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 48614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("RS watchdog timeout: %i", rsc->watchdog.inRoot); 48714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 48814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 48914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 49014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 49114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setPriority(int32_t p) { 49214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // Note: If we put this in the proper "background" policy 49314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // the wallpapers can become completly unresponsive at times. 49414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // This is probably not what we want for something the user is actively 49514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // looking at. 49614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mThreadPriority = p; 49714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon setpriority(PRIO_PROCESS, mNativeThreadId, p); 49814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHal.funcs.setPriority(this, mThreadPriority); 49914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 50014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 50114ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonContext::Context() { 50214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mDev = NULL; 50314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRunning = false; 50414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mExit = false; 50514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mPaused = false; 50614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mObjHead = NULL; 50714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mError = RS_ERROR_NONE; 50814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mTargetSdkVersion = 14; 50914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mDPI = 96; 51014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mIsContextLite = false; 51114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon memset(&watchdog, 0, sizeof(watchdog)); 51214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mForceCpu = false; 51314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mContextType = RS_CONTEXT_TYPE_NORMAL; 51414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mSynchronous = false; 51514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 51614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 51714ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonContext * Context::createContext(Device *dev, const RsSurfaceConfig *sc, 51814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon RsContextType ct, bool forceCpu, 51914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon bool synchronous) { 52014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Context * rsc = new Context(); 52114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 52214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mForceCpu = forceCpu; 52314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mSynchronous = synchronous; 52414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mContextType = ct; 52514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 52614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!rsc->initContext(dev, sc)) { 52714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon delete rsc; 52814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return NULL; 52914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 53014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return rsc; 53114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 53214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 53314ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonContext * Context::createContextLite() { 53414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Context * rsc = new Context(); 53514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->mIsContextLite = true; 53614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return rsc; 53714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 53814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 53914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonbool Context::initContext(Device *dev, const RsSurfaceConfig *sc) { 54014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_lock(&gInitMutex); 54114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 54214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mIO.init(); 54314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mIO.setTimeoutCallback(printWatchdogInfo, this, 2e9); 54414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 54514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon dev->addContext(this); 54614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mDev = dev; 54714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (sc) { 54814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mUserSurfaceConfig = *sc; 54914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 55014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon memset(&mUserSurfaceConfig, 0, sizeof(mUserSurfaceConfig)); 55114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 55214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 55314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mIsGraphicsContext = sc != NULL; 55414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 55514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon int status; 55614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_attr_t threadAttr; 55714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 55814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_unlock(&gInitMutex); 55914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 56014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // Global init done at this point. 56114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 56214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon status = pthread_attr_init(&threadAttr); 56314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (status) { 56414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Failed to init thread attribute."); 56514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 56614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 56714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 56814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHasSurface = false; 56914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 57014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon timerInit(); 57114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon timerSet(RS_TIMER_INTERNAL); 57214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mSynchronous) { 57314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon threadProc(this); 57414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 57514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon status = pthread_create(&mThreadId, &threadAttr, threadProc, this); 57614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (status) { 57714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Failed to start rs context thread."); 57814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 57914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 58014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon while (!mRunning && (mError == RS_ERROR_NONE)) { 58114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon usleep(100); 58214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 58314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 58414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mError != RS_ERROR_NONE) { 58514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Errors during thread init"); 58614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return false; 58714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 58814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 58914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_attr_destroy(&threadAttr); 59014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 59114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return true; 59214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 59314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 59414ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonContext::~Context() { 59514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p Context::~Context", this); 59614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 59714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (!mIsContextLite) { 59814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mPaused = false; 59914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon void *res; 60014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 60114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mIO.shutdown(); 60214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon int status = pthread_join(mThreadId, &res); 60314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mExit); 60414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 60514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mHal.funcs.shutdownDriver) { 60614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHal.funcs.shutdownDriver(this); 60714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 60814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 60914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon // Global structure cleanup. 61014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_lock(&gInitMutex); 61114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mDev) { 61214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mDev->removeContext(this); 61314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mDev = NULL; 61414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 61514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_unlock(&gInitMutex); 61614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 61714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p Context::~Context done", this); 61814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 61914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 62014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 62114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setSurface(uint32_t w, uint32_t h, RsNativeWindow sur) { 62214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 62314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHal.funcs.setSurface(this, w, h, sur); 62414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 62514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHasSurface = sur != NULL; 62614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mWidth = w; 62714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mHeight = h; 62814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 62914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mWidth && mHeight) { 63014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mStateVertex.updateSize(this); 63114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFBOCache.updateSize(); 63214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 63314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 63414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 63514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonuint32_t Context::getCurrentSurfaceWidth() const { 63614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon for (uint32_t i = 0; i < mFBOCache.mHal.state.colorTargetsCount; i ++) { 63714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mFBOCache.mHal.state.colorTargets[i] != NULL) { 63814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return mFBOCache.mHal.state.colorTargets[i]->getType()->getDimX(); 63914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 64014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 64114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mFBOCache.mHal.state.depthTarget != NULL) { 64214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return mFBOCache.mHal.state.depthTarget->getType()->getDimX(); 64314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 64414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return mWidth; 64514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 64614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 64714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonuint32_t Context::getCurrentSurfaceHeight() const { 64814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon for (uint32_t i = 0; i < mFBOCache.mHal.state.colorTargetsCount; i ++) { 64914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mFBOCache.mHal.state.colorTargets[i] != NULL) { 65014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return mFBOCache.mHal.state.colorTargets[i]->getType()->getDimY(); 65114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 65214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 65314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (mFBOCache.mHal.state.depthTarget != NULL) { 65414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return mFBOCache.mHal.state.depthTarget->getType()->getDimY(); 65514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 65614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return mHeight; 65714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 65814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 65914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::pause() { 66014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 661f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes mPaused = true; 66214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 663f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes 66414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::resume() { 66514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 66614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mPaused = false; 66714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 66814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 66914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setRootScript(Script *s) { 67014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 67114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRootScript.set(s); 67214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 67314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 67414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setProgramStore(ProgramStore *pfs) { 67514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 67614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (pfs == NULL) { 67714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragmentStore.set(mStateFragmentStore.mDefault); 67814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 67914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragmentStore.set(pfs); 68014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 68114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 68214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 68314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setProgramFragment(ProgramFragment *pf) { 68414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 68514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (pf == NULL) { 68614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragment.set(mStateFragment.mDefault); 68714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 68814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFragment.set(pf); 68914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 69014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 69114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 69214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setProgramRaster(ProgramRaster *pr) { 69314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 69414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (pr == NULL) { 69514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRaster.set(mStateRaster.mDefault); 69614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 69714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mRaster.set(pr); 69814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 69914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 70014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 70114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setProgramVertex(ProgramVertex *pv) { 70214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 70314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (pv == NULL) { 70414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mVertex.set(mStateVertex.mDefault); 70514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 70614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mVertex.set(pv); 70714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 70814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 70914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 71014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setFont(Font *f) { 71114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(mIsGraphicsContext); 71214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (f == NULL) { 71314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFont.set(mStateFont.mDefault); 71414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } else { 71514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mFont.set(f); 71614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 71714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 71814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 71914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 72014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::assignName(ObjectBase *obj, const char *name, uint32_t len) { 72114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(!obj->getName()); 72214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon obj->setName(name, len); 72314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mNames.add(obj); 72414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 72514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 72614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::removeName(ObjectBase *obj) { 72714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon for (size_t ct=0; ct < mNames.size(); ct++) { 72814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (obj == mNames[ct]) { 72914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mNames.removeAt(ct); 73014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return; 73114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 73214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 73314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 73414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 73514ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonRsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID) { 73614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return (RsMessageToClientType)mIO.getClientHeader(receiveLen, subID); 73714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 73814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 73914ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonRsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen) { 74014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return (RsMessageToClientType)mIO.getClientPayload(data, receiveLen, subID, bufferLen); 74114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 74214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 74314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonbool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID, 74414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t subID, size_t len, bool waitForSpace) const { 74514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 74614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_lock(&gMessageMutex); 74714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon bool ret = mIO.sendToClient(cmdID, subID, data, len, waitForSpace); 74814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon pthread_mutex_unlock(&gMessageMutex); 74914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return ret; 75014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 75114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 75214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::initToClient() { 75314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon while (!mRunning) { 75414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon usleep(100); 75514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 75614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 75714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 75814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::deinitToClient() { 75914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mIO.clientShutdown(); 76014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 76114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 76214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::setError(RsError e, const char *msg) const { 76314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon mError = e; 76414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon sendMessageToClient(msg, RS_MESSAGE_TO_CLIENT_ERROR, e, strlen(msg) + 1, true); 76514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 76614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 76714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 76814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid Context::dumpDebug() const { 76914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("RS Context debug %p", this); 77014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("RS Context debug"); 771f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes 772f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes ALOGE(" RS width %i, height %i", mWidth, mHeight); 773f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes ALOGE(" RS running %i, exit %i, paused %i", mRunning, mExit, mPaused); 774f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes ALOGE(" RS pThreadID %li, nativeThreadID %i", (long int)mThreadId, mNativeThreadId); 775f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes} 776f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes 777f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes/////////////////////////////////////////////////////////////////////////////////////////// 778f83358389f0c4ea37a7e7d9e493857f99baf0440Chris Banes// 77914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 78014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonnamespace android { 78114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonnamespace renderscript { 78214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 78314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextFinish(Context *rsc) { 78414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 78514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 78614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindRootScript(Context *rsc, RsScript vs) { 78714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 78814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Script *s = static_cast<Script *>(vs); 78914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setRootScript(s); 79014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 79114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 79214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 79314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) { 79414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Sampler *s = static_cast<Sampler *>(vs); 79514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 79614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (slot > RS_MAX_SAMPLER_SLOT) { 79714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ALOGE("Invalid sampler slot"); 79814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return; 79914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 80014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 80114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon s->bindToContext(&rsc->mStateSampler, slot); 80214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 80314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 80414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 80514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) { 80614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ProgramStore *pfs = static_cast<ProgramStore *>(vpfs); 80714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramStore(pfs); 80814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 80914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 81014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) { 81114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 81214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramFragment(pf); 81314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 81414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 81514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) { 81614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); 81714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramRaster(pr); 81814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 81914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 82014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) { 82114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ProgramVertex *pv = static_cast<ProgramVertex *>(vpv); 82214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setProgramVertex(pv); 82314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 82414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 82514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextBindFont(Context *rsc, RsFont vfont) { 82614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Font *font = static_cast<Font *>(vfont); 82714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setFont(font); 82814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 82914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 83014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 83114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_AssignName(Context *rsc, RsObjectBase obj, const char *name, size_t name_length) { 83214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBase *ob = static_cast<ObjectBase *>(obj); 83314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->assignName(ob, name, name_length); 83414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 83514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 83614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ObjDestroy(Context *rsc, void *optr) { 83714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBase *ob = static_cast<ObjectBase *>(optr); 83814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->removeName(ob); 83914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ob->decUserRef(); 84014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 84114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 84214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 84314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextPause(Context *rsc) { 84414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->pause(); 84514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 84614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 84714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextResume(Context *rsc) { 84814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->resume(); 84914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 85014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 85114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) { 85214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setSurface(w, h, sur); 85314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 85414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 85514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 85614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextSetPriority(Context *rsc, int32_t p) { 85714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setPriority(p); 85814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 85914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 86014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextDump(Context *rsc, int32_t bits) { 86114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBase::dumpAll(rsc); 86214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 86314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 86414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextDestroyWorker(Context *rsc) { 86514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->destroyWorkerThreadResources(); 86614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 86714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 86814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextDestroy(Context *rsc) { 86914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p rsContextDestroy", rsc); 87014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsContextDestroyWorker(rsc); 87114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon delete rsc; 87214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p rsContextDestroy done", rsc); 87314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 87414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 87514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 87614ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonRsMessageToClientType rsi_ContextPeekMessage(Context *rsc, 87714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon size_t * receiveLen, size_t receiveLen_length, 87814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t * subID, size_t subID_length) { 87914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return rsc->peekMessageToClient(receiveLen, subID); 88014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 88114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 88214ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonRsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length, 88314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon size_t * receiveLen, size_t receiveLen_length, 88414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t * subID, size_t subID_length) { 88514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(subID_length == sizeof(uint32_t)); 88614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsAssert(receiveLen_length == sizeof(size_t)); 88714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return rsc->getMessageToClient(data, receiveLen, subID, data_length); 88814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 88914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 89014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextInitToClient(Context *rsc) { 89114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->initToClient(); 89214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 89314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 89414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextDeinitToClient(Context *rsc) { 89514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->deinitToClient(); 89614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 89714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 89814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsi_ContextSendMessage(Context *rsc, uint32_t id, const uint8_t *data, size_t len) { 89914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, id, len, true); 90014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 90114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 90214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 90314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 90414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 90514ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonRsContext rsContextCreate(RsDevice vdev, uint32_t version, uint32_t sdkVersion, 90614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon RsContextType ct, bool forceCpu, bool synchronous) { 90714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("rsContextCreate dev=%p", vdev); 90814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Device * dev = static_cast<Device *>(vdev); 90914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Context *rsc = Context::createContext(dev, NULL, ct, forceCpu, synchronous); 91014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc) { 91114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setTargetSdkVersion(sdkVersion); 91214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 91314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return rsc; 91414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 91514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 91614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#ifndef RS_COMPATIBILITY_LIB 91714ea3100458369949fffba9978db2a51dde21bf2Hyundo MoonRsContext rsContextCreateGL(RsDevice vdev, uint32_t version, 91814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t sdkVersion, RsSurfaceConfig sc, 91914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon uint32_t dpi) { 92014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("rsContextCreateGL dev=%p", vdev); 92114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Device * dev = static_cast<Device *>(vdev); 92214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon Context *rsc = Context::createContext(dev, &sc); 92314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon if (rsc) { 92414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setTargetSdkVersion(sdkVersion); 92514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon rsc->setDPI(dpi); 92614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon } 92714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon //ALOGV("%p rsContextCreateGL ret", rsc); 92814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon return rsc; 92914ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 93014ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon#endif 93114ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon 93214ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon// Only to be called at a3d load time, before object is visible to user 93314ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon// not thread safe 93414ea3100458369949fffba9978db2a51dde21bf2Hyundo Moonvoid rsaGetName(RsContext con, void * obj, const char **name) { 93514ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon ObjectBase *ob = static_cast<ObjectBase *>(obj); 93614ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon (*name) = ob->getName(); 93714ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon} 93814ea3100458369949fffba9978db2a51dde21bf2Hyundo Moon