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