1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/* 24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License. 6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at 7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * 10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software 11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and 14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License. 15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */ 16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsDevice.h" 18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsContext.h" 19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsThreadIO.h" 203142f4f40ba745ecd3cd9f1839adaebc1f20fedeMathias Agopian#include <ui/FramebufferNativeWindow.h> 21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 227d787b4722eaeb79cab42c36060336e092b77b5fJason Sams#include <sys/types.h> 237d787b4722eaeb79cab42c36060336e092b77b5fJason Sams#include <sys/resource.h> 248e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams#include <sched.h> 257d787b4722eaeb79cab42c36060336e092b77b5fJason Sams 269ac2c66f0171593113238635c6a7921c41215e77Joe Onorato#include <cutils/properties.h> 279ac2c66f0171593113238635c6a7921c41215e77Joe Onorato 287d787b4722eaeb79cab42c36060336e092b77b5fJason Sams#include <cutils/sched_policy.h> 29f3470edc8a929d73797789656ce840aff918dcd0Jason Sams#include <sys/syscall.h> 30f3470edc8a929d73797789656ce840aff918dcd0Jason Sams#include <string.h> 317d787b4722eaeb79cab42c36060336e092b77b5fJason Sams 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android; 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android::renderscript; 34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 3541c19db90e250e2b7cb438904f0e96a0ef455d6dJason Samspthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER; 361ac9da6717f27ecfd3c650bd1bfd84d336674dfcStephen Hinespthread_mutex_t Context::gLibMutex = PTHREAD_MUTEX_INITIALIZER; 37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 38ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukbool Context::initGLThread() { 3911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams pthread_mutex_lock(&gInitMutex); 4011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams 41803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Sams if (!mHal.funcs.initGraphics(this)) { 42d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams pthread_mutex_unlock(&gInitMutex); 438410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGE("%p initGraphics failed", this); 44d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return false; 4511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams } 4611c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams 4711c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams pthread_mutex_unlock(&gInitMutex); 48d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return true; 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 50d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 51ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::deinitEGL() { 52803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Sams mHal.funcs.shutdownGraphics(this); 537136220b54e68e0c7faac30577ed20b7482481fdJason Sams} 547136220b54e68e0c7faac30577ed20b7482481fdJason Sams 55a17af04e62a3f40f729e7ebb8bd868d192e18405Jason SamsContext::PushState::PushState(Context *con) { 56a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams mRsc = con; 5707078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams if (con->mIsGraphicsContext) { 5807078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mFragment.set(con->getProgramFragment()); 5907078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mVertex.set(con->getProgramVertex()); 6007078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mStore.set(con->getProgramStore()); 6107078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mRaster.set(con->getProgramRaster()); 6207078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mFont.set(con->getFont()); 6307078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams } 64a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams} 65a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams 66a17af04e62a3f40f729e7ebb8bd868d192e18405Jason SamsContext::PushState::~PushState() { 6707078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams if (mRsc->mIsGraphicsContext) { 6807078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mRsc->setProgramFragment(mFragment.get()); 6907078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mRsc->setProgramVertex(mVertex.get()); 7007078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mRsc->setProgramStore(mStore.get()); 7107078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mRsc->setProgramRaster(mRaster.get()); 7207078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams mRsc->setFont(mFont.get()); 7307078e385872ee9eed475aaf43e1b89bcc3329f1Jason Sams } 74a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams} 75a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams 767136220b54e68e0c7faac30577ed20b7482481fdJason Sams 77ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukuint32_t Context::runScript(Script *s) { 78a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams PushState(this); 79da423d8479a2cefb456a03d7dc550e74e473acf4Jason Sams 80f17bccc9050498f51a32a2ee78f5d5a306008e3dJason Sams uint32_t ret = s->run(this); 81b0ec1b46d6f5b5612e33fe43a828abea79b87a00Jason Sams return ret; 82da423d8479a2cefb456a03d7dc550e74e473acf4Jason Sams} 83da423d8479a2cefb456a03d7dc550e74e473acf4Jason Sams 84ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukuint32_t Context::runRootScript() { 85b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams timerSet(RS_TIMER_SCRIPT); 86516c31911578db8ce53529483c3ded918ac7dc6bJason Sams mStateFragmentStore.mLast.clear(); 875316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams watchdog.inRoot = true; 88f17bccc9050498f51a32a2ee78f5d5a306008e3dJason Sams uint32_t ret = runScript(mRootScript.get()); 895316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams watchdog.inRoot = false; 90c7412b3b08d62c298dc7c3e5f369f406a3c0eac2Jason Sams 91f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams return ret; 92f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams} 939bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams 94ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukuint64_t Context::getTime() const { 9517a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 96f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams struct timespec t; 97f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams clock_gettime(CLOCK_MONOTONIC, &t); 98f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000); 9917a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk#else 10017a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk return 0; 10117a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE 102f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams} 1039bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams 104ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::timerReset() { 105f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams for (int ct=0; ct < _RS_TIMER_TOTAL; ct++) { 106f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams mTimers[ct] = 0; 107f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams } 108f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams} 1099bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams 110ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::timerInit() { 111f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams mTimeLast = getTime(); 1122525a815220652b37e2e390fe8c62394a6d0e574Jason Sams mTimeFrame = mTimeLast; 1132525a815220652b37e2e390fe8c62394a6d0e574Jason Sams mTimeLastFrame = mTimeLast; 114f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams mTimerActive = RS_TIMER_INTERNAL; 11576322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPSFrameCount = 0; 11676322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPSStartTime = mTimeLast; 11776322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPS = 0; 118f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams timerReset(); 119f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams} 120f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams 121ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::timerFrame() { 1222525a815220652b37e2e390fe8c62394a6d0e574Jason Sams mTimeLastFrame = mTimeFrame; 1232525a815220652b37e2e390fe8c62394a6d0e574Jason Sams mTimeFrame = getTime(); 12476322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk // Update average fps 12576322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk const uint64_t averageFramerateInterval = 1000 * 1000000; 12676322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPSFrameCount ++; 12776322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk uint64_t inverval = mTimeFrame - mAverageFPSStartTime; 128ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (inverval >= averageFramerateInterval) { 12976322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk inverval = inverval / 1000000; 13076322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPS = (mAverageFPSFrameCount * 1000) / inverval; 13176322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPSFrameCount = 0; 13276322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPSStartTime = mTimeFrame; 13376322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk } 1342525a815220652b37e2e390fe8c62394a6d0e574Jason Sams} 1352525a815220652b37e2e390fe8c62394a6d0e574Jason Sams 136ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::timerSet(Timers tm) { 137f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams uint64_t last = mTimeLast; 138f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams mTimeLast = getTime(); 139f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams mTimers[mTimerActive] += mTimeLast - last; 140f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams mTimerActive = tm; 141f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams} 142f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams 143ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::timerPrint() { 144f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams double total = 0; 145f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams for (int ct = 0; ct < _RS_TIMER_TOTAL; ct++) { 146f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams total += mTimers[ct]; 147f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams } 1482525a815220652b37e2e390fe8c62394a6d0e574Jason Sams uint64_t frame = mTimeFrame - mTimeLastFrame; 149b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams mTimeMSLastFrame = frame / 1000000; 150b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams mTimeMSLastScript = mTimers[RS_TIMER_SCRIPT] / 1000000; 151b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams mTimeMSLastSwap = mTimers[RS_TIMER_CLEAR_SWAP] / 1000000; 152f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams 153b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams 154b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams if (props.mLogTimes) { 15598bfe5d02a81c15fff52570178a2edd830701665Alex Sakhartchouk LOGV("RS: Frame (%i), Script %2.1f%% (%i), Swap %2.1f%% (%i), Idle %2.1f%% (%lli), Internal %2.1f%% (%lli), Avg fps: %u", 156b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams mTimeMSLastFrame, 157b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams 100.0 * mTimers[RS_TIMER_SCRIPT] / total, mTimeMSLastScript, 158b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams 100.0 * mTimers[RS_TIMER_CLEAR_SWAP] / total, mTimeMSLastSwap, 159b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams 100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000, 16076322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk 100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000, 16176322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mAverageFPS); 162b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams } 163d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 164d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 165ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukbool Context::setupCheck() { 166d081fffab58b4cb8a36b7a083ab7793585bc1510Jason Sams 167331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams mFragmentStore->setup(this, &mStateFragmentStore); 168407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk mFragment->setup(this, &mStateFragment); 169331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams mRaster->setup(this, &mStateRaster); 170407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk mVertex->setup(this, &mStateVertex); 171407cae950325682a56fe5373dd218a666da901efAlex Sakhartchouk mFBOCache.setup(this); 172156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams return true; 173d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 174d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 175feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchoukvoid Context::setupProgramStore() { 176331bf9b14b1c5c1e88f5c4092b6e24fae887fb3bJason Sams mFragmentStore->setup(this, &mStateFragmentStore); 177feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchouk} 178feede2aee6fe3e721ee71ffc35b277f1d9260e03Alex Sakhartchouk 179ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukstatic bool getProp(const char *str) { 1809ac2c66f0171593113238635c6a7921c41215e77Joe Onorato char buf[PROPERTY_VALUE_MAX]; 18166b2771d745aa66df5cf80b300b5ba0f936ff22eJason Sams property_get(str, buf, "0"); 1829ac2c66f0171593113238635c6a7921c41215e77Joe Onorato return 0 != strcmp(buf, "0"); 1839ac2c66f0171593113238635c6a7921c41215e77Joe Onorato} 184d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 185ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::displayDebugStats() { 1866de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk char buffer[128]; 18776322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk sprintf(buffer, "Avg fps %u, Frame %i ms, Script %i ms", mAverageFPS, mTimeMSLastFrame, mTimeMSLastScript); 18855e81983562ca507883f32f817e9d24e1c49b909Alex Sakhartchouk float oldR, oldG, oldB, oldA; 18955e81983562ca507883f32f817e9d24e1c49b909Alex Sakhartchouk mStateFont.getFontColor(&oldR, &oldG, &oldB, &oldA); 19010825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk uint32_t bufferLen = strlen(buffer); 1916de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk 19220a9354e52cb5cd22c38c7146efe37e1f9f690f3Alex Sakhartchouk ObjectBaseRef<Font> lastFont(getFont()); 19320a9354e52cb5cd22c38c7146efe37e1f9f690f3Alex Sakhartchouk setFont(NULL); 19410825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk float shadowCol = 0.1f; 19555e81983562ca507883f32f817e9d24e1c49b909Alex Sakhartchouk mStateFont.setFontColor(shadowCol, shadowCol, shadowCol, 1.0f); 19676322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mStateFont.renderText(buffer, bufferLen, 5, getHeight() - 6); 1976de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk 19810825a07ae3a7520110a5fb642a6c8745d7b3956Alex Sakhartchouk mStateFont.setFontColor(1.0f, 0.7f, 0.0f, 1.0f); 19976322af2a6c109a79431f019dcef6e038c030686Alex Sakhartchouk mStateFont.renderText(buffer, bufferLen, 4, getHeight() - 7); 2006de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk 20120a9354e52cb5cd22c38c7146efe37e1f9f690f3Alex Sakhartchouk setFont(lastFont.get()); 20255e81983562ca507883f32f817e9d24e1c49b909Alex Sakhartchouk mStateFont.setFontColor(oldR, oldG, oldB, oldA); 2036de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk} 2046de555001bc9b3ea6baf8ce1293e6c366a9bd6ceAlex Sakhartchouk 205ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid * Context::threadProc(void *vrsc) { 206be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams Context *rsc = static_cast<Context *>(vrsc); 20717a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 208be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mNativeThreadId = gettid(); 209be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY); 210be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mThreadPriority = ANDROID_PRIORITY_DISPLAY; 21117a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk#endif //ANDROID_RS_SERIALIZE 212be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogTimes = getProp("debug.rs.profile"); 213be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogScripts = getProp("debug.rs.script"); 214be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogObjects = getProp("debug.rs.object"); 215be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogShaders = getProp("debug.rs.shader"); 216be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogShadersAttr = getProp("debug.rs.shader.attributes"); 217be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogShadersUniforms = getProp("debug.rs.shader.uniforms"); 218be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->props.mLogVisual = getProp("debug.rs.visual"); 219be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 220be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams if (!rsdHalInit(rsc, 0, 0)) { 2212698536b3ff60bfee85e47e4a8d4b25fdfdf4db5Jason Sams rsc->setError(RS_ERROR_FATAL_DRIVER, "Failed initializing GL"); 222be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams LOGE("Hal init failed"); 223be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams return NULL; 224be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams } 225be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mHal.funcs.setPriority(rsc, rsc->mThreadPriority); 226be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 227be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams if (rsc->mIsGraphicsContext) { 2282698536b3ff60bfee85e47e4a8d4b25fdfdf4db5Jason Sams if (!rsc->initGLThread()) { 2292698536b3ff60bfee85e47e4a8d4b25fdfdf4db5Jason Sams rsc->setError(RS_ERROR_OUT_OF_MEMORY, "Failed initializing GL"); 2302698536b3ff60bfee85e47e4a8d4b25fdfdf4db5Jason Sams return NULL; 2312698536b3ff60bfee85e47e4a8d4b25fdfdf4db5Jason Sams } 2322698536b3ff60bfee85e47e4a8d4b25fdfdf4db5Jason Sams 233be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mStateRaster.init(rsc); 234be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->setProgramRaster(NULL); 235be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mStateVertex.init(rsc); 236be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->setProgramVertex(NULL); 237be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mStateFragment.init(rsc); 238be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->setProgramFragment(NULL); 239be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mStateFragmentStore.init(rsc); 240be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->setProgramStore(NULL); 241be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mStateFont.init(rsc); 242be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->setFont(NULL); 243117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk rsc->mStateSampler.init(rsc); 2442f6964fc89bf69c8e37f096d37c8e224d598b8f8Alex Sakhartchouk rsc->mFBOCache.init(rsc); 245be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams } 246be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 247be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mRunning = true; 248be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams bool mDraw = true; 249bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams bool doWait = true; 250bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams 251bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams uint64_t targetTime = rsc->getTime(); 252be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams while (!rsc->mExit) { 253bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams uint64_t waitTime = 0; 254bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams uint64_t now = rsc->getTime(); 25585deb781658e870556c305c523fa7f2bf679efe3Jason Sams if (!doWait) { 25685deb781658e870556c305c523fa7f2bf679efe3Jason Sams if (now < targetTime) { 25785deb781658e870556c305c523fa7f2bf679efe3Jason Sams waitTime = targetTime - now; 25885deb781658e870556c305c523fa7f2bf679efe3Jason Sams doWait = true; 25985deb781658e870556c305c523fa7f2bf679efe3Jason Sams } 260bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams } 261bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams 262bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams mDraw |= rsc->mIO.playCoreCommands(rsc, doWait, waitTime); 263be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams mDraw &= (rsc->mRootScript.get() != NULL); 2646c72eec06e69559b4d990777c7b280aa81586797Alex Sakhartchouk mDraw &= rsc->mHasSurface; 265be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 266be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams if (mDraw && rsc->mIsGraphicsContext) { 267bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams uint64_t delay = rsc->runRootScript() * 1000000; 268bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams targetTime = rsc->getTime() + delay; 26985deb781658e870556c305c523fa7f2bf679efe3Jason Sams doWait = (delay == 0); 270be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 271be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams if (rsc->props.mLogVisual) { 272be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->displayDebugStats(); 273be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams } 274be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 275bfc7891bdd08f2c16e9ffa592fd9f4ea21ff220dJason Sams mDraw = !rsc->mPaused; 276be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->timerSet(RS_TIMER_CLEAR_SWAP); 277be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->mHal.funcs.swap(rsc); 278be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->timerFrame(); 279be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->timerSet(RS_TIMER_INTERNAL); 280be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->timerPrint(); 281be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->timerReset(); 28228e4f87f38cae799b494e160467d732e988bad89Jason Sams } else { 28328e4f87f38cae799b494e160467d732e988bad89Jason Sams doWait = true; 284be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams } 285be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams } 286be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 2878410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p RS Thread exiting", rsc); 288be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 289be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams if (rsc->mIsGraphicsContext) { 290be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams pthread_mutex_lock(&gInitMutex); 291be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams rsc->deinitEGL(); 292be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams pthread_mutex_unlock(&gInitMutex); 293be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams } 294be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams 2958410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p RS Thread exited", rsc); 296be8ac6ace9036262942bc8c96baa36abeb2291f3Jason Sams return NULL; 297d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 298d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 2995c68a712dacf8cf0a419f1b743474a3b4290d024Jason Samsvoid Context::destroyWorkerThreadResources() { 300c55de66ad20c7834b04d605e8704dd2a0e3d23faJason Sams //LOGV("destroyWorkerThreadResources 1"); 30138f8d9d7a17037a34f4df229b1089536a6cdc8dcJason Sams ObjectBase::zeroAllUserRef(this); 3025c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams if (mIsGraphicsContext) { 3035c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mRaster.clear(); 3045c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mFragment.clear(); 3055c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mVertex.clear(); 3065c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mFragmentStore.clear(); 3075c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mFont.clear(); 3085c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mRootScript.clear(); 3095c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mStateRaster.deinit(this); 3105c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mStateVertex.deinit(this); 3115c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mStateFragment.deinit(this); 3125c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mStateFragmentStore.deinit(this); 3135c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams mStateFont.deinit(this); 314117abdbc67123654d0754b686c5bbdee6b44bcddAlex Sakhartchouk mStateSampler.deinit(this); 3152f6964fc89bf69c8e37f096d37c8e224d598b8f8Alex Sakhartchouk mFBOCache.deinit(this); 3165c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams } 317777ec2662ef5ee8b0a501e0b8a9b2d7a2b84ffe7Jason Sams ObjectBase::freeAllChildren(this); 318c55de66ad20c7834b04d605e8704dd2a0e3d23faJason Sams //LOGV("destroyWorkerThreadResources 2"); 31984035ff6f50dfb999d26ba476d5cb7619fa9cc57Jason Sams mExit = true; 3205c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams} 3215c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams 3225316b9eead0c29df36f46d29c17914bc3c61ed9fJason Samsvoid Context::printWatchdogInfo(void *ctx) { 3235316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams Context *rsc = (Context *)ctx; 32443b57ec48ec7652addc11bbc9fef652c2394b7f5Jason Sams if (rsc->watchdog.command && rsc->watchdog.file) { 32543b57ec48ec7652addc11bbc9fef652c2394b7f5Jason Sams LOGE("RS watchdog timeout: %i %s line %i %s", rsc->watchdog.inRoot, 32643b57ec48ec7652addc11bbc9fef652c2394b7f5Jason Sams rsc->watchdog.command, rsc->watchdog.line, rsc->watchdog.file); 32743b57ec48ec7652addc11bbc9fef652c2394b7f5Jason Sams } else { 32843b57ec48ec7652addc11bbc9fef652c2394b7f5Jason Sams LOGE("RS watchdog timeout: %i", rsc->watchdog.inRoot); 32943b57ec48ec7652addc11bbc9fef652c2394b7f5Jason Sams } 3305316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams} 3315316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams 3325316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams 333ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::setPriority(int32_t p) { 3347d787b4722eaeb79cab42c36060336e092b77b5fJason Sams // Note: If we put this in the proper "background" policy 3357d787b4722eaeb79cab42c36060336e092b77b5fJason Sams // the wallpapers can become completly unresponsive at times. 3367d787b4722eaeb79cab42c36060336e092b77b5fJason Sams // This is probably not what we want for something the user is actively 3377d787b4722eaeb79cab42c36060336e092b77b5fJason Sams // looking at. 338b9d5c574ff11a9470b92c5b9a62da6a655d9ef7aJason Sams mThreadPriority = p; 3397d787b4722eaeb79cab42c36060336e092b77b5fJason Sams#if 0 3407d787b4722eaeb79cab42c36060336e092b77b5fJason Sams SchedPolicy pol = SP_FOREGROUND; 3417d787b4722eaeb79cab42c36060336e092b77b5fJason Sams if (p > 0) { 3427d787b4722eaeb79cab42c36060336e092b77b5fJason Sams pol = SP_BACKGROUND; 3437d787b4722eaeb79cab42c36060336e092b77b5fJason Sams } 3447d787b4722eaeb79cab42c36060336e092b77b5fJason Sams if (!set_sched_policy(mNativeThreadId, pol)) { 3457d787b4722eaeb79cab42c36060336e092b77b5fJason Sams // success; reset the priority as well 3467d787b4722eaeb79cab42c36060336e092b77b5fJason Sams } 3477d787b4722eaeb79cab42c36060336e092b77b5fJason Sams#else 3488e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams setpriority(PRIO_PROCESS, mNativeThreadId, p); 3497d787b4722eaeb79cab42c36060336e092b77b5fJason Sams#endif 3507d787b4722eaeb79cab42c36060336e092b77b5fJason Sams} 3517d787b4722eaeb79cab42c36060336e092b77b5fJason Sams 352ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukContext::Context() { 353d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams mDev = NULL; 354d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mRunning = false; 355d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mExit = false; 35665e7aa56f56097418d617663683544c25b3988eaJason Sams mPaused = false; 357a9e7a05b84470257637c97d65f6562aa832c66efJason Sams mObjHead = NULL; 358156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams mError = RS_ERROR_NONE; 3594382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines mTargetSdkVersion = 14; 3602c74ad9aae29cc64fece926f353825a7925792c2Alex Sakhartchouk mDPI = 96; 36117a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mIsContextLite = false; 362a049184274b88dd86a1f2e4e7d16a7553153dbb1Stephen Hines memset(&watchdog, 0, sizeof(watchdog)); 363d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams} 364d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams 365ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukContext * Context::createContext(Device *dev, const RsSurfaceConfig *sc) { 366d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams Context * rsc = new Context(); 36717a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk 368d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams if (!rsc->initContext(dev, sc)) { 369d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams delete rsc; 370d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return NULL; 371d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams } 372d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return rsc; 373d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams} 374d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams 37517a8a1939d4cbc74de54954c67f3dd61882420aaAlex SakhartchoukContext * Context::createContextLite() { 37617a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk Context * rsc = new Context(); 37717a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk rsc->mIsContextLite = true; 37817a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk return rsc; 37917a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk} 38017a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk 381ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukbool Context::initContext(Device *dev, const RsSurfaceConfig *sc) { 382d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams pthread_mutex_lock(&gInitMutex); 383d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams 384edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams mIO.init(); 3855316b9eead0c29df36f46d29c17914bc3c61ed9fJason Sams mIO.setTimoutCallback(printWatchdogInfo, this, 2e9); 386edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams 387d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams dev->addContext(this); 388d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams mDev = dev; 38911c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams if (sc) { 39011c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams mUserSurfaceConfig = *sc; 39111c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams } else { 39211c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams memset(&mUserSurfaceConfig, 0, sizeof(mUserSurfaceConfig)); 39311c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams } 394156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams 39511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams mIsGraphicsContext = sc != NULL; 396d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 3978ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams int status; 3988ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams pthread_attr_t threadAttr; 3998ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams 40041c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams pthread_mutex_unlock(&gInitMutex); 40141c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams 40241c19db90e250e2b7cb438904f0e96a0ef455d6dJason Sams // Global init done at this point. 403462d11b880cba72584c135397c0a82618ab63217Jason Sams 4048ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams status = pthread_attr_init(&threadAttr); 4058ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams if (status) { 4068ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams LOGE("Failed to init thread attribute."); 407d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return false; 4088ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams } 4098ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams 4106c72eec06e69559b4d990777c7b280aa81586797Alex Sakhartchouk mHasSurface = false; 411f29ca50d80e3dc379de1642e85b7963175b2ca38Jason Sams 412f4d160653fe405eba9d6f55448ac4599c6cadd77Jason Sams timerInit(); 413d3f2eaf60a349316a219ebd12b4ee88f6d1b1261Jason Sams timerSet(RS_TIMER_INTERNAL); 414730ee65d4ddb307898053b623120bad1655fadadJason Sams 4158ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams status = pthread_create(&mThreadId, &threadAttr, threadProc, this); 416d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (status) { 417d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams LOGE("Failed to start rs context thread."); 418d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return false; 4198e6c17fcc40bfb2391dcadecb397431239ab8a18Jason Sams } 420ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk while (!mRunning && (mError == RS_ERROR_NONE)) { 421c7f4e41ecd8211227b4f0037ac3312a83db389ccJason Sams usleep(100); 422c7f4e41ecd8211227b4f0037ac3312a83db389ccJason Sams } 423c7f4e41ecd8211227b4f0037ac3312a83db389ccJason Sams 424d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams if (mError != RS_ERROR_NONE) { 42580e29cf5c45e378bd28a1b061bb70d8ce02846aeJason Sams LOGE("Errors during thread init"); 426d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return false; 427d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams } 428d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams 4298ad0010d6e3ce416cd8148a458d7457c1e59e770Jason Sams pthread_attr_destroy(&threadAttr); 430d5f06300341df0990be3e0b7a26fa49b13c6fc19Jason Sams return true; 431d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 432d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 433ed9f210568082dd6d1d8a0c92c693d574d87d545Alex SakhartchoukContext::~Context() { 4348410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p Context::~Context", this); 43584035ff6f50dfb999d26ba476d5cb7619fa9cc57Jason Sams 43617a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk if (!mIsContextLite) { 43717a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mIO.coreFlush(); 43817a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk rsAssert(mExit); 43917a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mExit = true; 44017a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mPaused = false; 44117a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk void *res; 442d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 44317a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mIO.shutdown(); 44417a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk int status = pthread_join(mThreadId, &res); 445d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 44617a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk if (mHal.funcs.shutdownDriver) { 44717a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mHal.funcs.shutdownDriver(this); 44817a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk } 449c55de66ad20c7834b04d605e8704dd2a0e3d23faJason Sams 45017a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk // Global structure cleanup. 45117a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk pthread_mutex_lock(&gInitMutex); 45217a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk if (mDev) { 45317a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mDev->removeContext(this); 45417a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk mDev = NULL; 45517a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk } 45617a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk pthread_mutex_unlock(&gInitMutex); 457d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 4588410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p Context::~Context done", this); 459d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 460d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 4616c72eec06e69559b4d990777c7b280aa81586797Alex Sakhartchoukvoid Context::setSurface(uint32_t w, uint32_t h, RsNativeWindow sur) { 462704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 463803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Sams mHal.funcs.setSurface(this, w, h, sur); 464efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams 4656c72eec06e69559b4d990777c7b280aa81586797Alex Sakhartchouk mHasSurface = sur != NULL; 466803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Sams mWidth = w; 467803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Sams mHeight = h; 4683bc47d438171dce294e816366d53bc9eca772c5bJason Sams 469803626f61526c9271a1ffb27f3e3e0bfce767f41Jason Sams if (mWidth && mHeight) { 470f603d212552485c634e25f3556f847dc2b022bd5Jason Sams mStateVertex.updateSize(this); 47110ed04935d19ff87169499a7c1c7d8256cf13fe0Alex Sakhartchouk mFBOCache.updateSize(); 472efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams } 473efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams} 474efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams 475ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::pause() { 476704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 47765e7aa56f56097418d617663683544c25b3988eaJason Sams mPaused = true; 47865e7aa56f56097418d617663683544c25b3988eaJason Sams} 47965e7aa56f56097418d617663683544c25b3988eaJason Sams 480ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::resume() { 481704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 48265e7aa56f56097418d617663683544c25b3988eaJason Sams mPaused = false; 48365e7aa56f56097418d617663683544c25b3988eaJason Sams} 48465e7aa56f56097418d617663683544c25b3988eaJason Sams 485ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::setRootScript(Script *s) { 486704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 487d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams mRootScript.set(s); 488d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 489d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 490a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Samsvoid Context::setProgramStore(ProgramStore *pfs) { 491704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 4929c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams if (pfs == NULL) { 4939c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams mFragmentStore.set(mStateFragmentStore.mDefault); 4949c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } else { 4959c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams mFragmentStore.set(pfs); 4969c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } 497d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 498d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 499a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Samsvoid Context::setProgramFragment(ProgramFragment *pf) { 500704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 5019c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams if (pf == NULL) { 5029c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams mFragment.set(mStateFragment.mDefault); 5039c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } else { 5049c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams mFragment.set(pf); 5059c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } 5069bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams} 5079bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams 508a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Samsvoid Context::setProgramRaster(ProgramRaster *pr) { 509704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 510ebfb436a49673693b98469683451bd9ede797557Jason Sams if (pr == NULL) { 511ebfb436a49673693b98469683451bd9ede797557Jason Sams mRaster.set(mStateRaster.mDefault); 512ebfb436a49673693b98469683451bd9ede797557Jason Sams } else { 513ebfb436a49673693b98469683451bd9ede797557Jason Sams mRaster.set(pr); 514ebfb436a49673693b98469683451bd9ede797557Jason Sams } 515ebfb436a49673693b98469683451bd9ede797557Jason Sams} 516ebfb436a49673693b98469683451bd9ede797557Jason Sams 517a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Samsvoid Context::setProgramVertex(ProgramVertex *pv) { 518704ff64b099406bb328898a7443921f22dbffd6dJason Sams rsAssert(mIsGraphicsContext); 5199c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams if (pv == NULL) { 5209c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams mVertex.set(mStateVertex.mDefault); 5219c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } else { 5229c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams mVertex.set(pv); 5239c54bdbf458e3c9433d237ae71cf47c4ec47d852Jason Sams } 524d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 525d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 526ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::setFont(Font *f) { 5279b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk rsAssert(mIsGraphicsContext); 5289b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk if (f == NULL) { 5299b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk mFont.set(mStateFont.mDefault); 5309b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } else { 5319b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk mFont.set(f); 5329b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 5339b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk} 5349b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk 535ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::assignName(ObjectBase *obj, const char *name, uint32_t len) { 5363eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams rsAssert(!obj->getName()); 537d5680f9ba95ec7ce212e8025774914e79982a1eeJason Sams obj->setName(name, len); 5383eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams mNames.add(obj); 5393eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams} 5403eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams 541ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::removeName(ObjectBase *obj) { 542ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (size_t ct=0; ct < mNames.size(); ct++) { 5433eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams if (obj == mNames[ct]) { 5443eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams mNames.removeAt(ct); 5453eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams return; 5463eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams } 5473eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams } 5483eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams} 5493eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams 550edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason SamsRsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID) { 551edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams return (RsMessageToClientType)mIO.getClientHeader(receiveLen, subID); 5521c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams} 5531c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams 554edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason SamsRsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen) { 555edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams return (RsMessageToClientType)mIO.getClientPayload(data, receiveLen, subID, bufferLen); 556516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 557516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 558add9d9633205f76cc34f04368b8482c2c369ba63Jason Samsbool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID, 559add9d9633205f76cc34f04368b8482c2c369ba63Jason Sams uint32_t subID, size_t len, bool waitForSpace) const { 560edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams 561edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams return mIO.sendToClient(cmdID, subID, data, len, waitForSpace); 562516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 563516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 564ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::initToClient() { 565ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk while (!mRunning) { 566516c31911578db8ce53529483c3ded918ac7dc6bJason Sams usleep(100); 567516c31911578db8ce53529483c3ded918ac7dc6bJason Sams } 568516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 569516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 570ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::deinitToClient() { 571edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams mIO.clientShutdown(); 572516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 573730ee65d4ddb307898053b623120bad1655fadadJason Sams 574add9d9633205f76cc34f04368b8482c2c369ba63Jason Samsvoid Context::setError(RsError e, const char *msg) const { 575156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams mError = e; 5761c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams sendMessageToClient(msg, RS_MESSAGE_TO_CLIENT_ERROR, e, strlen(msg) + 1, true); 577156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams} 578156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams 579156cce698093023d9e79a4ff4fb96f4e4d3019dbJason Sams 580ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid Context::dumpDebug() const { 5819dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams LOGE("RS Context debug %p", this); 5829dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams LOGE("RS Context debug"); 5839dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams 5849dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams LOGE(" RS width %i, height %i", mWidth, mHeight); 58511c8af9ded3a319635b4e91a639a616ec97fc7e3Jason Sams LOGE(" RS running %i, exit %i, paused %i", mRunning, mExit, mPaused); 58617a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk LOGE(" RS pThreadID %li, nativeThreadID %i", (long int)mThreadId, mNativeThreadId); 5879dab667e03632181e487a04a8a170b3fa0bd5037Jason Sams} 588d5680f9ba95ec7ce212e8025774914e79982a1eeJason Sams 589d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/////////////////////////////////////////////////////////////////////////////////////////// 590a09f11d6c641726b61f80c15230a18d31c146fecJason Sams// 591d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 592d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android { 593d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript { 594d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 595ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextFinish(Context *rsc) { 59696ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams} 597d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 598ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindRootScript(Context *rsc, RsScript vs) { 599d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Script *s = static_cast<Script *>(vs); 600d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams rsc->setRootScript(s); 601d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 602d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 603ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) { 604d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams Sampler *s = static_cast<Sampler *>(vs); 605d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 606d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (slot > RS_MAX_SAMPLER_SLOT) { 607d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams LOGE("Invalid sampler slot"); 608d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return; 609d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 610d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 611d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams s->bindToContext(&rsc->mStateSampler, slot); 612d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 613d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 614ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) { 61554db59c3594e887a412a24713fc3daa1c2404593Jason Sams ProgramStore *pfs = static_cast<ProgramStore *>(vpfs); 616a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->setProgramStore(pfs); 617d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 618d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 619ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) { 620d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ProgramFragment *pf = static_cast<ProgramFragment *>(vpf); 621a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->setProgramFragment(pf); 622d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 623d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 624ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) { 625ebfb436a49673693b98469683451bd9ede797557Jason Sams ProgramRaster *pr = static_cast<ProgramRaster *>(vpr); 626a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->setProgramRaster(pr); 627ebfb436a49673693b98469683451bd9ede797557Jason Sams} 628ebfb436a49673693b98469683451bd9ede797557Jason Sams 629ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) { 630d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams ProgramVertex *pv = static_cast<ProgramVertex *>(vpv); 631a17af04e62a3f40f729e7ebb8bd868d192e18405Jason Sams rsc->setProgramVertex(pv); 632d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 633d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 634ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextBindFont(Context *rsc, RsFont vfont) { 6359b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk Font *font = static_cast<Font *>(vfont); 6369b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk rsc->setFont(font); 6379b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk} 6389b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk 63917a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchoukvoid rsi_AssignName(Context *rsc, RsObjectBase obj, const char *name, size_t name_length) { 6403eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams ObjectBase *ob = static_cast<ObjectBase *>(obj); 641e7c4a7565c7f8c8fc1ec92dc0692577fcc474750Alex Sakhartchouk rsc->assignName(ob, name, name_length); 6423eaa338e11a3b0d6b87d705e5bb95625e82347bdJason Sams} 643d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 644ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ObjDestroy(Context *rsc, void *optr) { 6453b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams ObjectBase *ob = static_cast<ObjectBase *>(optr); 6467ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams rsc->removeName(ob); 64707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams ob->decUserRef(); 6487ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams} 6497ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams 650ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextPause(Context *rsc) { 65165e7aa56f56097418d617663683544c25b3988eaJason Sams rsc->pause(); 65265e7aa56f56097418d617663683544c25b3988eaJason Sams} 65365e7aa56f56097418d617663683544c25b3988eaJason Sams 654ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextResume(Context *rsc) { 65565e7aa56f56097418d617663683544c25b3988eaJason Sams rsc->resume(); 65665e7aa56f56097418d617663683544c25b3988eaJason Sams} 65765e7aa56f56097418d617663683544c25b3988eaJason Sams 6586c72eec06e69559b4d990777c7b280aa81586797Alex Sakhartchoukvoid rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) { 659128ce4b24ad0ee2c2ed56af9a0d800d7dc6111c0Mathias Agopian rsc->setSurface(w, h, sur); 6603bc47d438171dce294e816366d53bc9eca772c5bJason Sams} 6613bc47d438171dce294e816366d53bc9eca772c5bJason Sams 662ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextSetPriority(Context *rsc, int32_t p) { 6637d787b4722eaeb79cab42c36060336e092b77b5fJason Sams rsc->setPriority(p); 664efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams} 665efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams 666ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsi_ContextDump(Context *rsc, int32_t bits) { 667715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams ObjectBase::dumpAll(rsc); 668715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams} 669715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams 6705c68a712dacf8cf0a419f1b743474a3b4290d024Jason Samsvoid rsi_ContextDestroyWorker(Context *rsc) { 67117a8a1939d4cbc74de54954c67f3dd61882420aaAlex Sakhartchouk rsc->destroyWorkerThreadResources(); 672546f01b6d52d8da18c7a39239a36adf5b05ccf48Jason Sams} 673546f01b6d52d8da18c7a39239a36adf5b05ccf48Jason Sams 674c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid rsi_ContextDestroy(Context *rsc) { 6758410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p rsContextDestroy", rsc); 6765c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams rsContextDestroyWorker(rsc); 6775c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams delete rsc; 6788410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p rsContextDestroy done", rsc); 6795c68a712dacf8cf0a419f1b743474a3b4290d024Jason Sams} 680d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 681d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 682c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason SamsRsMessageToClientType rsi_ContextPeekMessage(Context *rsc, 68365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams size_t * receiveLen, size_t receiveLen_length, 684edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams uint32_t * subID, size_t subID_length) { 685edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams return rsc->peekMessageToClient(receiveLen, subID); 6861c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams} 6871c41517124a90fcfdb95dc069fc492c6fcf1ff25Jason Sams 688c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason SamsRsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length, 68965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams size_t * receiveLen, size_t receiveLen_length, 690edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams uint32_t * subID, size_t subID_length) { 69165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams rsAssert(subID_length == sizeof(uint32_t)); 69265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams rsAssert(receiveLen_length == sizeof(size_t)); 693edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams return rsc->getMessageToClient(data, receiveLen, subID, data_length); 694516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 695516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 696c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid rsi_ContextInitToClient(Context *rsc) { 697516c31911578db8ce53529483c3ded918ac7dc6bJason Sams rsc->initToClient(); 698516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 699516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 700c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid rsi_ContextDeinitToClient(Context *rsc) { 701516c31911578db8ce53529483c3ded918ac7dc6bJason Sams rsc->deinitToClient(); 702516c31911578db8ce53529483c3ded918ac7dc6bJason Sams} 703516c31911578db8ce53529483c3ded918ac7dc6bJason Sams 704c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams} 705c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams} 706c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 7074382467a80dd12c6362d57edca7f2367f7ae877cStephen HinesRsContext rsContextCreate(RsDevice vdev, uint32_t version, 7084382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines uint32_t sdkVersion) { 7098410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("rsContextCreate dev=%p", vdev); 710d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams Device * dev = static_cast<Device *>(vdev); 711d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams Context *rsc = Context::createContext(dev, NULL); 7124382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines if (rsc) { 7134382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines rsc->setTargetSdkVersion(sdkVersion); 7144382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines } 715d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams return rsc; 716d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams} 717d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams 718d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason SamsRsContext rsContextCreateGL(RsDevice vdev, uint32_t version, 7194382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines uint32_t sdkVersion, RsSurfaceConfig sc, 7204382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines uint32_t dpi) { 7218410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("rsContextCreateGL dev=%p", vdev); 722d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams Device * dev = static_cast<Device *>(vdev); 723d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams Context *rsc = Context::createContext(dev, &sc); 724fb06b7a5510e4c6f6c4b3cd51cca22493cd258caJason Sams if (rsc) { 7254382467a80dd12c6362d57edca7f2367f7ae877cStephen Hines rsc->setTargetSdkVersion(sdkVersion); 726fb06b7a5510e4c6f6c4b3cd51cca22493cd258caJason Sams rsc->setDPI(dpi); 727fb06b7a5510e4c6f6c4b3cd51cca22493cd258caJason Sams } 7288410b14c85b5a0c7fcaa095b61feca96fb36d528Jason Sams LOGV("%p rsContextCreateGL ret", rsc); 729d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams return rsc; 730d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams} 731d9d37cc1b6700923be5ae8c04fbb1b0effc7ab63Jason Sams 732581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk// Only to be called at a3d load time, before object is visible to user 733581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk// not thread safe 734ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid rsaGetName(RsContext con, void * obj, const char **name) { 735581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk ObjectBase *ob = static_cast<ObjectBase *>(obj); 736581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk (*name) = ob->getName(); 737581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk} 738