blob: 1a71d544f773a1704f3d148cb622da502101f156 [file] [log] [blame]
Jason Samsbad80742011-03-16 16:29:28 -07001/*
Stephen Hinesee7aa2e2012-01-12 18:56:23 -08002 * Copyright (C) 2011-2012 The Android Open Source Project
Jason Samsbad80742011-03-16 16:29:28 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsdCore.h"
Jason Samseb4fe182011-05-26 16:33:01 -070018#include "rsdAllocation.h"
Jason Samsbad80742011-03-16 16:29:28 -070019#include "rsdBcc.h"
Jason Sams4b3de472011-04-06 17:52:23 -070020#include "rsdGL.h"
Jason Sams9e0afb52011-10-31 13:23:43 -070021#include "rsdPath.h"
Jason Sams8feea4e2011-03-18 15:03:25 -070022#include "rsdProgramStore.h"
Jason Sams721acc42011-04-06 11:23:54 -070023#include "rsdProgramRaster.h"
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -070024#include "rsdProgramVertex.h"
25#include "rsdProgramFragment.h"
26#include "rsdMesh.h"
Alex Sakhartchouk7f126c72011-05-05 16:56:27 -070027#include "rsdSampler.h"
Alex Sakhartchoukda6d34a2011-05-13 14:53:34 -070028#include "rsdFrameBuffer.h"
Jason Samsbad80742011-03-16 16:29:28 -070029
30#include <malloc.h>
31#include "rsContext.h"
32
Jason Samscdfdb8f2011-03-17 16:12:47 -070033#include <sys/types.h>
34#include <sys/resource.h>
35#include <sched.h>
36#include <cutils/properties.h>
Jason Samscdfdb8f2011-03-17 16:12:47 -070037#include <sys/syscall.h>
38#include <string.h>
39
Jason Samsbad80742011-03-16 16:29:28 -070040using namespace android;
41using namespace android::renderscript;
42
Jason Samscdfdb8f2011-03-17 16:12:47 -070043static void Shutdown(Context *rsc);
44static void SetPriority(const Context *rsc, int32_t priority);
45
Jason Samsbad80742011-03-16 16:29:28 -070046static RsdHalFunctions FunctionTable = {
Jason Sams4b3de472011-04-06 17:52:23 -070047 rsdGLInit,
48 rsdGLShutdown,
49 rsdGLSetSurface,
50 rsdGLSwap,
51
Jason Samscdfdb8f2011-03-17 16:12:47 -070052 Shutdown,
Jason Samsbad80742011-03-16 16:29:28 -070053 NULL,
Jason Samscdfdb8f2011-03-17 16:12:47 -070054 SetPriority,
Jason Samsbad80742011-03-16 16:29:28 -070055 {
56 rsdScriptInit,
57 rsdScriptInvokeFunction,
58 rsdScriptInvokeRoot,
Jason Samscdfdb8f2011-03-17 16:12:47 -070059 rsdScriptInvokeForEach,
Jason Samsbad80742011-03-16 16:29:28 -070060 rsdScriptInvokeInit,
Stephen Hines4ee16ff2011-08-31 17:41:39 -070061 rsdScriptInvokeFreeChildren,
Jason Samsbad80742011-03-16 16:29:28 -070062 rsdScriptSetGlobalVar,
Stephen Hines2980f072012-04-09 18:26:29 -070063 rsdScriptSetGlobalVarWithElemDims,
Jason Samsbad80742011-03-16 16:29:28 -070064 rsdScriptSetGlobalBind,
65 rsdScriptSetGlobalObj,
66 rsdScriptDestroy
Jason Sams8feea4e2011-03-18 15:03:25 -070067 },
68
Jason Samseb4fe182011-05-26 16:33:01 -070069 {
70 rsdAllocationInit,
71 rsdAllocationDestroy,
72 rsdAllocationResize,
73 rsdAllocationSyncAll,
74 rsdAllocationMarkDirty,
Jason Sams41e373d2012-01-13 14:01:20 -080075 rsdAllocationInitSurfaceTexture,
Jason Sams7ac2a4d2012-02-15 12:04:24 -080076 rsdAllocationSetSurfaceTexture,
77 rsdAllocationIoSend,
78 rsdAllocationIoReceive,
Jason Samseb4fe182011-05-26 16:33:01 -070079 rsdAllocationData1D,
80 rsdAllocationData2D,
81 rsdAllocationData3D,
Jason Sams807fdc42012-07-25 17:55:39 -070082 rsdAllocationRead1D,
83 rsdAllocationRead2D,
84 rsdAllocationRead3D,
85 rsdAllocationLock1D,
86 rsdAllocationUnlock1D,
Alex Sakhartchouk74a82792011-06-14 11:13:19 -070087 rsdAllocationData1D_alloc,
88 rsdAllocationData2D_alloc,
89 rsdAllocationData3D_alloc,
Jason Samseb4fe182011-05-26 16:33:01 -070090 rsdAllocationElementData1D,
91 rsdAllocationElementData2D
92 },
93
Jason Sams8feea4e2011-03-18 15:03:25 -070094
95 {
96 rsdProgramStoreInit,
97 rsdProgramStoreSetActive,
98 rsdProgramStoreDestroy
Jason Sams721acc42011-04-06 11:23:54 -070099 },
100
101 {
102 rsdProgramRasterInit,
103 rsdProgramRasterSetActive,
104 rsdProgramRasterDestroy
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700105 },
106
107 {
108 rsdProgramVertexInit,
109 rsdProgramVertexSetActive,
110 rsdProgramVertexDestroy
111 },
112
113 {
114 rsdProgramFragmentInit,
115 rsdProgramFragmentSetActive,
116 rsdProgramFragmentDestroy
117 },
118
119 {
120 rsdMeshInit,
121 rsdMeshDraw,
122 rsdMeshDestroy
Alex Sakhartchouk7f126c72011-05-05 16:56:27 -0700123 },
124
125 {
Jason Sams9e0afb52011-10-31 13:23:43 -0700126 rsdPathInitStatic,
127 rsdPathInitDynamic,
128 rsdPathDraw,
129 rsdPathDestroy
130 },
131
132 {
Alex Sakhartchouk7f126c72011-05-05 16:56:27 -0700133 rsdSamplerInit,
134 rsdSamplerDestroy
135 },
Jason Sams8feea4e2011-03-18 15:03:25 -0700136
Alex Sakhartchoukda6d34a2011-05-13 14:53:34 -0700137 {
138 rsdFrameBufferInit,
139 rsdFrameBufferSetActive,
140 rsdFrameBufferDestroy
141 },
142
Jason Samsbad80742011-03-16 16:29:28 -0700143};
144
Jason Sams83c451a2011-04-21 11:46:50 -0700145pthread_key_t rsdgThreadTLSKey = 0;
146uint32_t rsdgThreadTLSKeyCount = 0;
147pthread_mutex_t rsdgInitMutex = PTHREAD_MUTEX_INITIALIZER;
Jason Samsbad80742011-03-16 16:29:28 -0700148
Jason Samscdfdb8f2011-03-17 16:12:47 -0700149
150static void * HelperThreadProc(void *vrsc) {
151 Context *rsc = static_cast<Context *>(vrsc);
Jason Sams87fe59a2011-04-20 15:09:01 -0700152 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
Jason Samscdfdb8f2011-03-17 16:12:47 -0700153
154
155 uint32_t idx = (uint32_t)android_atomic_inc(&dc->mWorkers.mLaunchCount);
156
Steve Block65982012011-10-20 11:56:00 +0100157 //ALOGV("RS helperThread starting %p idx=%i", rsc, idx);
Jason Samscdfdb8f2011-03-17 16:12:47 -0700158
159 dc->mWorkers.mLaunchSignals[idx].init();
160 dc->mWorkers.mNativeThreadId[idx] = gettid();
161
Jason Sams83c451a2011-04-21 11:46:50 -0700162 int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
163 if (status) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000164 ALOGE("pthread_setspecific %i", status);
Jason Sams83c451a2011-04-21 11:46:50 -0700165 }
166
Jason Samscdfdb8f2011-03-17 16:12:47 -0700167#if 0
168 typedef struct {uint64_t bits[1024 / 64]; } cpu_set_t;
169 cpu_set_t cpuset;
170 memset(&cpuset, 0, sizeof(cpuset));
171 cpuset.bits[idx / 64] |= 1ULL << (idx % 64);
172 int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx],
173 sizeof(cpuset), &cpuset);
Steve Blockaf12ac62012-01-06 19:20:56 +0000174 ALOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret));
Jason Samscdfdb8f2011-03-17 16:12:47 -0700175#endif
176
Jason Samscdfdb8f2011-03-17 16:12:47 -0700177 while (!dc->mExit) {
178 dc->mWorkers.mLaunchSignals[idx].wait();
179 if (dc->mWorkers.mLaunchCallback) {
180 dc->mWorkers.mLaunchCallback(dc->mWorkers.mLaunchData, idx);
181 }
182 android_atomic_dec(&dc->mWorkers.mRunningCount);
183 dc->mWorkers.mCompleteSignal.set();
184 }
185
Steve Block65982012011-10-20 11:56:00 +0100186 //ALOGV("RS helperThread exited %p idx=%i", rsc, idx);
Jason Samscdfdb8f2011-03-17 16:12:47 -0700187 return NULL;
188}
189
190void rsdLaunchThreads(Context *rsc, WorkerCallback_t cbk, void *data) {
Jason Sams87fe59a2011-04-20 15:09:01 -0700191 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
Jason Samscdfdb8f2011-03-17 16:12:47 -0700192
193 dc->mWorkers.mLaunchData = data;
194 dc->mWorkers.mLaunchCallback = cbk;
195 android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
196 for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
197 dc->mWorkers.mLaunchSignals[ct].set();
198 }
199 while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) {
200 dc->mWorkers.mCompleteSignal.wait();
201 }
202}
203
Jason Samsbad80742011-03-16 16:29:28 -0700204bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
205 rsc->mHal.funcs = FunctionTable;
206
Jason Sams87fe59a2011-04-20 15:09:01 -0700207 RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal));
Jason Sams2cfe51e2011-03-18 17:08:54 -0700208 if (!dc) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000209 ALOGE("Calloc for driver hal failed.");
Jason Samsbad80742011-03-16 16:29:28 -0700210 return false;
211 }
Jason Samscdfdb8f2011-03-17 16:12:47 -0700212 rsc->mHal.drv = dc;
Jason Samsbad80742011-03-16 16:29:28 -0700213
Jason Sams83c451a2011-04-21 11:46:50 -0700214 pthread_mutex_lock(&rsdgInitMutex);
215 if (!rsdgThreadTLSKeyCount) {
216 int status = pthread_key_create(&rsdgThreadTLSKey, NULL);
217 if (status) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000218 ALOGE("Failed to init thread tls key.");
Jason Sams83c451a2011-04-21 11:46:50 -0700219 pthread_mutex_unlock(&rsdgInitMutex);
220 return false;
221 }
222 }
223 rsdgThreadTLSKeyCount++;
224 pthread_mutex_unlock(&rsdgInitMutex);
225
226 dc->mTlsStruct.mContext = rsc;
227 dc->mTlsStruct.mScript = NULL;
228 int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
229 if (status) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000230 ALOGE("pthread_setspecific %i", status);
Jason Sams83c451a2011-04-21 11:46:50 -0700231 }
232
Jason Samscdfdb8f2011-03-17 16:12:47 -0700233
234 int cpu = sysconf(_SC_NPROCESSORS_ONLN);
Jason Samsd1f7da62012-03-15 19:18:03 -0700235 if(rsc->props.mDebugMaxThreads && (cpu > (int)rsc->props.mDebugMaxThreads)) {
236 cpu = rsc->props.mDebugMaxThreads;
237 }
238 if (cpu < 2) {
239 cpu = 0;
240 }
Jason Sams3522f402012-03-23 11:47:26 -0700241 ALOGV("%p Launching thread(s), CPUs %i", rsc, cpu);
Jason Samscdfdb8f2011-03-17 16:12:47 -0700242
243 dc->mWorkers.mCount = (uint32_t)cpu;
244 dc->mWorkers.mThreadId = (pthread_t *) calloc(dc->mWorkers.mCount, sizeof(pthread_t));
245 dc->mWorkers.mNativeThreadId = (pid_t *) calloc(dc->mWorkers.mCount, sizeof(pid_t));
246 dc->mWorkers.mLaunchSignals = new Signal[dc->mWorkers.mCount];
247 dc->mWorkers.mLaunchCallback = NULL;
248
249 dc->mWorkers.mCompleteSignal.init();
250
251 android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
252 android_atomic_release_store(0, &dc->mWorkers.mLaunchCount);
253
Jason Samscdfdb8f2011-03-17 16:12:47 -0700254 pthread_attr_t threadAttr;
255 status = pthread_attr_init(&threadAttr);
256 if (status) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000257 ALOGE("Failed to init thread attribute.");
Jason Samscdfdb8f2011-03-17 16:12:47 -0700258 return false;
259 }
260
261 for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) {
262 status = pthread_create(&dc->mWorkers.mThreadId[ct], &threadAttr, HelperThreadProc, rsc);
263 if (status) {
264 dc->mWorkers.mCount = ct;
Steve Blockaf12ac62012-01-06 19:20:56 +0000265 ALOGE("Created fewer than expected number of RS threads.");
Jason Samscdfdb8f2011-03-17 16:12:47 -0700266 break;
267 }
268 }
269 while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) {
270 usleep(100);
271 }
272
273 pthread_attr_destroy(&threadAttr);
Jason Samsbad80742011-03-16 16:29:28 -0700274 return true;
275}
276
Jason Samscdfdb8f2011-03-17 16:12:47 -0700277
278void SetPriority(const Context *rsc, int32_t priority) {
Jason Sams87fe59a2011-04-20 15:09:01 -0700279 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
Jason Samscdfdb8f2011-03-17 16:12:47 -0700280 for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) {
281 setpriority(PRIO_PROCESS, dc->mWorkers.mNativeThreadId[ct], priority);
282 }
Jason Sams9719bd42012-01-12 14:22:21 -0800283 if (dc->mHasGraphics) {
284 rsdGLSetPriority(rsc, priority);
285 }
Jason Samscdfdb8f2011-03-17 16:12:47 -0700286}
287
288void Shutdown(Context *rsc) {
Jason Sams87fe59a2011-04-20 15:09:01 -0700289 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
Jason Samscdfdb8f2011-03-17 16:12:47 -0700290
291 dc->mExit = true;
292 dc->mWorkers.mLaunchData = NULL;
293 dc->mWorkers.mLaunchCallback = NULL;
294 android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
295 for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
296 dc->mWorkers.mLaunchSignals[ct].set();
297 }
Jason Samscdfdb8f2011-03-17 16:12:47 -0700298 void *res;
299 for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
Jean-Baptiste Querud2d868f2012-05-16 13:19:24 -0700300 pthread_join(dc->mWorkers.mThreadId[ct], &res);
Jason Samscdfdb8f2011-03-17 16:12:47 -0700301 }
302 rsAssert(android_atomic_acquire_load(&dc->mWorkers.mRunningCount) == 0);
Jason Sams83c451a2011-04-21 11:46:50 -0700303
304 // Global structure cleanup.
305 pthread_mutex_lock(&rsdgInitMutex);
306 --rsdgThreadTLSKeyCount;
307 if (!rsdgThreadTLSKeyCount) {
308 pthread_key_delete(rsdgThreadTLSKey);
309 }
310 pthread_mutex_unlock(&rsdgInitMutex);
311
Jason Samscdfdb8f2011-03-17 16:12:47 -0700312}
313