rsdCore.cpp revision 807fdc4b6f3fb893015ee136565d6151bb2332d3
1bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/* 2ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines * Copyright (C) 2011-2012 The Android Open Source Project 3bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * 4bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * you may not use this file except in compliance with the License. 6bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * You may obtain a copy of the License at 7bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * 8bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * 10bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Unless required by applicable law or agreed to in writing, software 11bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * See the License for the specific language governing permissions and 14bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * limitations under the License. 15bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */ 16bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 17bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsdCore.h" 18eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams#include "rsdAllocation.h" 19bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsdBcc.h" 204b3de47071d875faaa7d419d050a464b09538797Jason Sams#include "rsdGL.h" 219e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams#include "rsdPath.h" 228feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams#include "rsdProgramStore.h" 23721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams#include "rsdProgramRaster.h" 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdProgramVertex.h" 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdProgramFragment.h" 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "rsdMesh.h" 277f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsdSampler.h" 28da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk#include "rsdFrameBuffer.h" 29bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 30bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include <malloc.h> 31bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsContext.h" 32bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 33cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#include <sys/types.h> 34cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#include <sys/resource.h> 35cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#include <sched.h> 36cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#include <cutils/properties.h> 37cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#include <sys/syscall.h> 38cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#include <string.h> 39cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 40bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsusing namespace android; 41bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsusing namespace android::renderscript; 42bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 43cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsstatic void Shutdown(Context *rsc); 44cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsstatic void SetPriority(const Context *rsc, int32_t priority); 45cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 46bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsstatic RsdHalFunctions FunctionTable = { 474b3de47071d875faaa7d419d050a464b09538797Jason Sams rsdGLInit, 484b3de47071d875faaa7d419d050a464b09538797Jason Sams rsdGLShutdown, 494b3de47071d875faaa7d419d050a464b09538797Jason Sams rsdGLSetSurface, 504b3de47071d875faaa7d419d050a464b09538797Jason Sams rsdGLSwap, 514b3de47071d875faaa7d419d050a464b09538797Jason Sams 52cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams Shutdown, 53bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams NULL, 54cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams SetPriority, 55bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams { 56bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptInit, 57bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptInvokeFunction, 58bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptInvokeRoot, 59cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams rsdScriptInvokeForEach, 60bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptInvokeInit, 614ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines rsdScriptInvokeFreeChildren, 62bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptSetGlobalVar, 632980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines rsdScriptSetGlobalVarWithElemDims, 64bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptSetGlobalBind, 65bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptSetGlobalObj, 66bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsdScriptDestroy 678feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams }, 688feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 69eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams { 70eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationInit, 71eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationDestroy, 72eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationResize, 73eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationSyncAll, 74eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationMarkDirty, 7541e373d91a60043afa0f9abd026218b49cbc1201Jason Sams rsdAllocationInitSurfaceTexture, 767ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsdAllocationSetSurfaceTexture, 777ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsdAllocationIoSend, 787ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsdAllocationIoReceive, 79eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationData1D, 80eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationData2D, 81eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationData3D, 82807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsdAllocationRead1D, 83807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsdAllocationRead2D, 84807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsdAllocationRead3D, 85807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsdAllocationLock1D, 86807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsdAllocationUnlock1D, 8774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsdAllocationData1D_alloc, 8874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsdAllocationData2D_alloc, 8974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsdAllocationData3D_alloc, 90eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationElementData1D, 91eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsdAllocationElementData2D 92eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams }, 93eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams 948feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 958feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams { 968feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams rsdProgramStoreInit, 978feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams rsdProgramStoreSetActive, 988feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams rsdProgramStoreDestroy 99721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams }, 100721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams 101721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams { 102721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams rsdProgramRasterInit, 103721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams rsdProgramRasterSetActive, 104721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams rsdProgramRasterDestroy 105a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk }, 106a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 107a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk { 108a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdProgramVertexInit, 109a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdProgramVertexSetActive, 110a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdProgramVertexDestroy 111a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk }, 112a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 113a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk { 114a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdProgramFragmentInit, 115a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdProgramFragmentSetActive, 116a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdProgramFragmentDestroy 117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk }, 118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk { 120a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdMeshInit, 121a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdMeshDraw, 122a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsdMeshDestroy 1237f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk }, 1247f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 1257f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk { 1269e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams rsdPathInitStatic, 1279e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams rsdPathInitDynamic, 1289e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams rsdPathDraw, 1299e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams rsdPathDestroy 1309e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams }, 1319e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 1329e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams { 1337f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk rsdSamplerInit, 1347f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk rsdSamplerDestroy 1357f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk }, 1368feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams 137da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk { 138da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk rsdFrameBufferInit, 139da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk rsdFrameBufferSetActive, 140da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk rsdFrameBufferDestroy 141da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk }, 142da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk 143bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}; 144bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 14583c451a4ef4388e002482e383d488ca9b7b7600dJason Samspthread_key_t rsdgThreadTLSKey = 0; 14683c451a4ef4388e002482e383d488ca9b7b7600dJason Samsuint32_t rsdgThreadTLSKeyCount = 0; 14783c451a4ef4388e002482e383d488ca9b7b7600dJason Samspthread_mutex_t rsdgInitMutex = PTHREAD_MUTEX_INITIALIZER; 148bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 149cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 150cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsstatic void * HelperThreadProc(void *vrsc) { 151cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams Context *rsc = static_cast<Context *>(vrsc); 15287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams RsdHal *dc = (RsdHal *)rsc->mHal.drv; 153cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 154cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 155cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams uint32_t idx = (uint32_t)android_atomic_inc(&dc->mWorkers.mLaunchCount); 156cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 1576598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("RS helperThread starting %p idx=%i", rsc, idx); 158cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 159cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchSignals[idx].init(); 160cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mNativeThreadId[idx] = gettid(); 161cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 16283c451a4ef4388e002482e383d488ca9b7b7600dJason Sams int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct); 16383c451a4ef4388e002482e383d488ca9b7b7600dJason Sams if (status) { 164af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("pthread_setspecific %i", status); 16583c451a4ef4388e002482e383d488ca9b7b7600dJason Sams } 16683c451a4ef4388e002482e383d488ca9b7b7600dJason Sams 167cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#if 0 168cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams typedef struct {uint64_t bits[1024 / 64]; } cpu_set_t; 169cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams cpu_set_t cpuset; 170cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams memset(&cpuset, 0, sizeof(cpuset)); 171cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams cpuset.bits[idx / 64] |= 1ULL << (idx % 64); 172cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx], 173cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams sizeof(cpuset), &cpuset); 174af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret)); 175cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams#endif 176cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 177cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams while (!dc->mExit) { 178cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchSignals[idx].wait(); 179cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams if (dc->mWorkers.mLaunchCallback) { 180cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchCallback(dc->mWorkers.mLaunchData, idx); 181cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 182cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams android_atomic_dec(&dc->mWorkers.mRunningCount); 183cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mCompleteSignal.set(); 184cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 185cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 1866598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("RS helperThread exited %p idx=%i", rsc, idx); 187cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams return NULL; 188cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams} 189cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 190cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsvoid rsdLaunchThreads(Context *rsc, WorkerCallback_t cbk, void *data) { 19187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams RsdHal *dc = (RsdHal *)rsc->mHal.drv; 192cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 193cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchData = data; 194cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchCallback = cbk; 195cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount); 196cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) { 197cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchSignals[ct].set(); 198cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 199cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) { 200cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mCompleteSignal.wait(); 201cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 202cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams} 203cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 204bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsbool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) { 205bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams rsc->mHal.funcs = FunctionTable; 206bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 20787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal)); 2082cfe51e7a9eef3dec091ce7c15d2a5a2216e9d3eJason Sams if (!dc) { 209af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Calloc for driver hal failed."); 210bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams return false; 211bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams } 212cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams rsc->mHal.drv = dc; 213bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 21483c451a4ef4388e002482e383d488ca9b7b7600dJason Sams pthread_mutex_lock(&rsdgInitMutex); 21583c451a4ef4388e002482e383d488ca9b7b7600dJason Sams if (!rsdgThreadTLSKeyCount) { 21683c451a4ef4388e002482e383d488ca9b7b7600dJason Sams int status = pthread_key_create(&rsdgThreadTLSKey, NULL); 21783c451a4ef4388e002482e383d488ca9b7b7600dJason Sams if (status) { 218af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Failed to init thread tls key."); 21983c451a4ef4388e002482e383d488ca9b7b7600dJason Sams pthread_mutex_unlock(&rsdgInitMutex); 22083c451a4ef4388e002482e383d488ca9b7b7600dJason Sams return false; 22183c451a4ef4388e002482e383d488ca9b7b7600dJason Sams } 22283c451a4ef4388e002482e383d488ca9b7b7600dJason Sams } 22383c451a4ef4388e002482e383d488ca9b7b7600dJason Sams rsdgThreadTLSKeyCount++; 22483c451a4ef4388e002482e383d488ca9b7b7600dJason Sams pthread_mutex_unlock(&rsdgInitMutex); 22583c451a4ef4388e002482e383d488ca9b7b7600dJason Sams 22683c451a4ef4388e002482e383d488ca9b7b7600dJason Sams dc->mTlsStruct.mContext = rsc; 22783c451a4ef4388e002482e383d488ca9b7b7600dJason Sams dc->mTlsStruct.mScript = NULL; 22883c451a4ef4388e002482e383d488ca9b7b7600dJason Sams int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct); 22983c451a4ef4388e002482e383d488ca9b7b7600dJason Sams if (status) { 230af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("pthread_setspecific %i", status); 23183c451a4ef4388e002482e383d488ca9b7b7600dJason Sams } 23283c451a4ef4388e002482e383d488ca9b7b7600dJason Sams 233cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 234cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams int cpu = sysconf(_SC_NPROCESSORS_ONLN); 235d1f7da6803a1bfc0bf8129a66316cfb8994e7110Jason Sams if(rsc->props.mDebugMaxThreads && (cpu > (int)rsc->props.mDebugMaxThreads)) { 236d1f7da6803a1bfc0bf8129a66316cfb8994e7110Jason Sams cpu = rsc->props.mDebugMaxThreads; 237d1f7da6803a1bfc0bf8129a66316cfb8994e7110Jason Sams } 238d1f7da6803a1bfc0bf8129a66316cfb8994e7110Jason Sams if (cpu < 2) { 239d1f7da6803a1bfc0bf8129a66316cfb8994e7110Jason Sams cpu = 0; 240d1f7da6803a1bfc0bf8129a66316cfb8994e7110Jason Sams } 2413522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams ALOGV("%p Launching thread(s), CPUs %i", rsc, cpu); 242cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 243cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mCount = (uint32_t)cpu; 244cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mThreadId = (pthread_t *) calloc(dc->mWorkers.mCount, sizeof(pthread_t)); 245cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mNativeThreadId = (pid_t *) calloc(dc->mWorkers.mCount, sizeof(pid_t)); 246cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchSignals = new Signal[dc->mWorkers.mCount]; 247cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchCallback = NULL; 248cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 249cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mCompleteSignal.init(); 250cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 251cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount); 252cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams android_atomic_release_store(0, &dc->mWorkers.mLaunchCount); 253cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 254cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams pthread_attr_t threadAttr; 255cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams status = pthread_attr_init(&threadAttr); 256cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams if (status) { 257af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Failed to init thread attribute."); 258cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams return false; 259cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 260cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 261cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) { 262cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams status = pthread_create(&dc->mWorkers.mThreadId[ct], &threadAttr, HelperThreadProc, rsc); 263cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams if (status) { 264cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mCount = ct; 265af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Created fewer than expected number of RS threads."); 266cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams break; 267cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 268cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 269cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) { 270cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams usleep(100); 271cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 272cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 273cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams pthread_attr_destroy(&threadAttr); 274bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams return true; 275bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams} 276bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 277cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 278cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsvoid SetPriority(const Context *rsc, int32_t priority) { 27987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams RsdHal *dc = (RsdHal *)rsc->mHal.drv; 280cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) { 281cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams setpriority(PRIO_PROCESS, dc->mWorkers.mNativeThreadId[ct], priority); 282cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 2839719bd4a0187c400ba868712612fe66da4635aacJason Sams if (dc->mHasGraphics) { 2849719bd4a0187c400ba868712612fe66da4635aacJason Sams rsdGLSetPriority(rsc, priority); 2859719bd4a0187c400ba868712612fe66da4635aacJason Sams } 286cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams} 287cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 288cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsvoid Shutdown(Context *rsc) { 28987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams RsdHal *dc = (RsdHal *)rsc->mHal.drv; 290cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 291cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mExit = true; 292cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchData = NULL; 293cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchCallback = NULL; 294cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount); 295cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) { 296cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams dc->mWorkers.mLaunchSignals[ct].set(); 297cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 298cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams void *res; 299cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) { 300d2d868f98f235a0b6cecda7cbdef36c7d5c3d4afJean-Baptiste Queru pthread_join(dc->mWorkers.mThreadId[ct], &res); 301cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams } 302cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams rsAssert(android_atomic_acquire_load(&dc->mWorkers.mRunningCount) == 0); 30383c451a4ef4388e002482e383d488ca9b7b7600dJason Sams 30483c451a4ef4388e002482e383d488ca9b7b7600dJason Sams // Global structure cleanup. 30583c451a4ef4388e002482e383d488ca9b7b7600dJason Sams pthread_mutex_lock(&rsdgInitMutex); 30683c451a4ef4388e002482e383d488ca9b7b7600dJason Sams --rsdgThreadTLSKeyCount; 30783c451a4ef4388e002482e383d488ca9b7b7600dJason Sams if (!rsdgThreadTLSKeyCount) { 30883c451a4ef4388e002482e383d488ca9b7b7600dJason Sams pthread_key_delete(rsdgThreadTLSKey); 30983c451a4ef4388e002482e383d488ca9b7b7600dJason Sams } 31083c451a4ef4388e002482e383d488ca9b7b7600dJason Sams pthread_mutex_unlock(&rsdgInitMutex); 31183c451a4ef4388e002482e383d488ca9b7b7600dJason Sams 312cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams} 313cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams 314