Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 1 | /* |
Stephen Hines | ee7aa2e | 2012-01-12 18:56:23 -0800 | [diff] [blame] | 2 | * Copyright (C) 2011-2012 The Android Open Source Project |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 3 | * |
| 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 | |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 17 | #include "../cpu_ref/rsd_cpu.h" |
| 18 | |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 19 | #include "rsdCore.h" |
Jason Sams | eb4fe18 | 2011-05-26 16:33:01 -0700 | [diff] [blame] | 20 | #include "rsdAllocation.h" |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 21 | #include "rsdBcc.h" |
Jason Sams | a36c50a | 2014-06-17 12:06:06 -0700 | [diff] [blame] | 22 | #include "rsdElement.h" |
| 23 | #include "rsdType.h" |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 24 | #ifndef RS_COMPATIBILITY_LIB |
Stephen Hines | a221f56 | 2013-07-10 17:59:47 -0700 | [diff] [blame] | 25 | #include "MemChunk.h" |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 26 | #include "rsdGL.h" |
| 27 | #include "rsdPath.h" |
| 28 | #include "rsdProgramStore.h" |
| 29 | #include "rsdProgramRaster.h" |
| 30 | #include "rsdProgramVertex.h" |
| 31 | #include "rsdProgramFragment.h" |
| 32 | #include "rsdMesh.h" |
| 33 | #include "rsdFrameBuffer.h" |
| 34 | #endif |
Alex Sakhartchouk | 7f126c7 | 2011-05-05 16:56:27 -0700 | [diff] [blame] | 35 | #include "rsdSampler.h" |
Jason Sams | dbe66d6 | 2012-09-17 13:54:41 -0700 | [diff] [blame] | 36 | #include "rsdScriptGroup.h" |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 37 | |
| 38 | #include <malloc.h> |
| 39 | #include "rsContext.h" |
| 40 | |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 41 | #include <sys/types.h> |
| 42 | #include <sys/resource.h> |
| 43 | #include <sched.h> |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 44 | #include <sys/syscall.h> |
| 45 | #include <string.h> |
| 46 | |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 47 | using namespace android; |
| 48 | using namespace android::renderscript; |
| 49 | |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 50 | static void Shutdown(Context *rsc); |
| 51 | static void SetPriority(const Context *rsc, int32_t priority); |
| 52 | |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 53 | #ifndef RS_COMPATIBILITY_LIB |
| 54 | #define NATIVE_FUNC(a) a |
| 55 | #else |
| 56 | #define NATIVE_FUNC(a) NULL |
| 57 | #endif |
| 58 | |
| 59 | |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 60 | static RsdHalFunctions FunctionTable = { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 61 | NATIVE_FUNC(rsdGLInit), |
| 62 | NATIVE_FUNC(rsdGLShutdown), |
| 63 | NATIVE_FUNC(rsdGLSetSurface), |
| 64 | NATIVE_FUNC(rsdGLSwap), |
Jason Sams | 4b3de47 | 2011-04-06 17:52:23 -0700 | [diff] [blame] | 65 | |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 66 | Shutdown, |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 67 | NULL, |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 68 | SetPriority, |
Tim Murray | 3468938 | 2013-03-11 12:12:03 -0700 | [diff] [blame] | 69 | rsdAllocRuntimeMem, |
| 70 | rsdFreeRuntimeMem, |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 71 | { |
| 72 | rsdScriptInit, |
Jason Sams | 8eaba4f | 2012-08-14 14:38:05 -0700 | [diff] [blame] | 73 | rsdInitIntrinsic, |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 74 | rsdScriptInvokeFunction, |
| 75 | rsdScriptInvokeRoot, |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 76 | rsdScriptInvokeForEach, |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 77 | rsdScriptInvokeInit, |
Stephen Hines | 4ee16ff | 2011-08-31 17:41:39 -0700 | [diff] [blame] | 78 | rsdScriptInvokeFreeChildren, |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 79 | rsdScriptSetGlobalVar, |
Tim Murray | 9c64239 | 2013-04-11 13:29:59 -0700 | [diff] [blame] | 80 | rsdScriptGetGlobalVar, |
Stephen Hines | 2980f07 | 2012-04-09 18:26:29 -0700 | [diff] [blame] | 81 | rsdScriptSetGlobalVarWithElemDims, |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 82 | rsdScriptSetGlobalBind, |
| 83 | rsdScriptSetGlobalObj, |
Chris Wailes | 4b3c34e | 2014-06-11 12:00:29 -0700 | [diff] [blame] | 84 | rsdScriptDestroy, |
Jason Sams | a36c50a | 2014-06-17 12:06:06 -0700 | [diff] [blame] | 85 | rsdScriptInvokeForEachMulti, |
| 86 | rsdScriptUpdateCachedObject |
Jason Sams | 8feea4e | 2011-03-18 15:03:25 -0700 | [diff] [blame] | 87 | }, |
| 88 | |
Jason Sams | eb4fe18 | 2011-05-26 16:33:01 -0700 | [diff] [blame] | 89 | { |
| 90 | rsdAllocationInit, |
| 91 | rsdAllocationDestroy, |
Jason Sams | ddceab9 | 2013-08-07 13:02:32 -0700 | [diff] [blame] | 92 | rsdAllocationGrallocBits, |
Jason Sams | eb4fe18 | 2011-05-26 16:33:01 -0700 | [diff] [blame] | 93 | rsdAllocationResize, |
| 94 | rsdAllocationSyncAll, |
| 95 | rsdAllocationMarkDirty, |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 96 | NATIVE_FUNC(rsdAllocationSetSurface), |
| 97 | NATIVE_FUNC(rsdAllocationIoSend), |
| 98 | NATIVE_FUNC(rsdAllocationIoReceive), |
Jason Sams | eb4fe18 | 2011-05-26 16:33:01 -0700 | [diff] [blame] | 99 | rsdAllocationData1D, |
| 100 | rsdAllocationData2D, |
| 101 | rsdAllocationData3D, |
Jason Sams | 807fdc4 | 2012-07-25 17:55:39 -0700 | [diff] [blame] | 102 | rsdAllocationRead1D, |
| 103 | rsdAllocationRead2D, |
| 104 | rsdAllocationRead3D, |
| 105 | rsdAllocationLock1D, |
| 106 | rsdAllocationUnlock1D, |
Alex Sakhartchouk | 74a8279 | 2011-06-14 11:13:19 -0700 | [diff] [blame] | 107 | rsdAllocationData1D_alloc, |
| 108 | rsdAllocationData2D_alloc, |
| 109 | rsdAllocationData3D_alloc, |
Jason Sams | eb4fe18 | 2011-05-26 16:33:01 -0700 | [diff] [blame] | 110 | rsdAllocationElementData1D, |
Jason Sams | 61a4bb7 | 2012-07-25 19:33:43 -0700 | [diff] [blame] | 111 | rsdAllocationElementData2D, |
Jason Sams | a36c50a | 2014-06-17 12:06:06 -0700 | [diff] [blame] | 112 | rsdAllocationGenerateMipmaps, |
| 113 | rsdAllocationUpdateCachedObject |
Jason Sams | eb4fe18 | 2011-05-26 16:33:01 -0700 | [diff] [blame] | 114 | }, |
| 115 | |
Jason Sams | 8feea4e | 2011-03-18 15:03:25 -0700 | [diff] [blame] | 116 | |
| 117 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 118 | NATIVE_FUNC(rsdProgramStoreInit), |
| 119 | NATIVE_FUNC(rsdProgramStoreSetActive), |
| 120 | NATIVE_FUNC(rsdProgramStoreDestroy) |
Jason Sams | 721acc4 | 2011-04-06 11:23:54 -0700 | [diff] [blame] | 121 | }, |
| 122 | |
| 123 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 124 | NATIVE_FUNC(rsdProgramRasterInit), |
| 125 | NATIVE_FUNC(rsdProgramRasterSetActive), |
| 126 | NATIVE_FUNC(rsdProgramRasterDestroy) |
Alex Sakhartchouk | a04e30d | 2011-04-29 16:49:08 -0700 | [diff] [blame] | 127 | }, |
| 128 | |
| 129 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 130 | NATIVE_FUNC(rsdProgramVertexInit), |
| 131 | NATIVE_FUNC(rsdProgramVertexSetActive), |
| 132 | NATIVE_FUNC(rsdProgramVertexDestroy) |
Alex Sakhartchouk | a04e30d | 2011-04-29 16:49:08 -0700 | [diff] [blame] | 133 | }, |
| 134 | |
| 135 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 136 | NATIVE_FUNC(rsdProgramFragmentInit), |
| 137 | NATIVE_FUNC(rsdProgramFragmentSetActive), |
| 138 | NATIVE_FUNC(rsdProgramFragmentDestroy) |
Alex Sakhartchouk | a04e30d | 2011-04-29 16:49:08 -0700 | [diff] [blame] | 139 | }, |
| 140 | |
| 141 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 142 | NATIVE_FUNC(rsdMeshInit), |
| 143 | NATIVE_FUNC(rsdMeshDraw), |
| 144 | NATIVE_FUNC(rsdMeshDestroy) |
Alex Sakhartchouk | 7f126c7 | 2011-05-05 16:56:27 -0700 | [diff] [blame] | 145 | }, |
| 146 | |
| 147 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 148 | NATIVE_FUNC(rsdPathInitStatic), |
| 149 | NATIVE_FUNC(rsdPathInitDynamic), |
| 150 | NATIVE_FUNC(rsdPathDraw), |
| 151 | NATIVE_FUNC(rsdPathDestroy) |
Jason Sams | 9e0afb5 | 2011-10-31 13:23:43 -0700 | [diff] [blame] | 152 | }, |
| 153 | |
| 154 | { |
Alex Sakhartchouk | 7f126c7 | 2011-05-05 16:56:27 -0700 | [diff] [blame] | 155 | rsdSamplerInit, |
Jason Sams | a36c50a | 2014-06-17 12:06:06 -0700 | [diff] [blame] | 156 | rsdSamplerDestroy, |
| 157 | rsdSamplerUpdateCachedObject |
Alex Sakhartchouk | 7f126c7 | 2011-05-05 16:56:27 -0700 | [diff] [blame] | 158 | }, |
Jason Sams | 8feea4e | 2011-03-18 15:03:25 -0700 | [diff] [blame] | 159 | |
Alex Sakhartchouk | da6d34a | 2011-05-13 14:53:34 -0700 | [diff] [blame] | 160 | { |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 161 | NATIVE_FUNC(rsdFrameBufferInit), |
| 162 | NATIVE_FUNC(rsdFrameBufferSetActive), |
| 163 | NATIVE_FUNC(rsdFrameBufferDestroy) |
Alex Sakhartchouk | da6d34a | 2011-05-13 14:53:34 -0700 | [diff] [blame] | 164 | }, |
| 165 | |
Jason Sams | dbe66d6 | 2012-09-17 13:54:41 -0700 | [diff] [blame] | 166 | { |
| 167 | rsdScriptGroupInit, |
| 168 | rsdScriptGroupSetInput, |
| 169 | rsdScriptGroupSetOutput, |
| 170 | rsdScriptGroupExecute, |
Jason Sams | a36c50a | 2014-06-17 12:06:06 -0700 | [diff] [blame] | 171 | rsdScriptGroupDestroy, |
| 172 | NULL |
| 173 | }, |
| 174 | |
| 175 | { |
| 176 | rsdTypeInit, |
| 177 | rsdTypeDestroy, |
| 178 | rsdTypeUpdateCachedObject |
| 179 | }, |
| 180 | |
| 181 | { |
| 182 | rsdElementInit, |
| 183 | rsdElementDestroy, |
| 184 | rsdElementUpdateCachedObject |
Jason Sams | 9761c3f | 2013-11-26 18:10:59 -0800 | [diff] [blame] | 185 | }, |
Jason Sams | dbe66d6 | 2012-09-17 13:54:41 -0700 | [diff] [blame] | 186 | |
Jason Sams | 9761c3f | 2013-11-26 18:10:59 -0800 | [diff] [blame] | 187 | NULL // finish |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 188 | }; |
| 189 | |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 190 | extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name); |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 191 | |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 192 | static RsdCpuReference::CpuScript * LookupScript(Context *, const Script *s) { |
| 193 | return (RsdCpuReference::CpuScript *)s->mHal.drv; |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 194 | } |
| 195 | |
Stephen Hines | 414a461 | 2012-09-05 18:05:08 -0700 | [diff] [blame] | 196 | extern "C" bool rsdHalInit(RsContext c, uint32_t version_major, |
| 197 | uint32_t version_minor) { |
| 198 | Context *rsc = (Context*) c; |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 199 | rsc->mHal.funcs = FunctionTable; |
| 200 | |
Jason Sams | 87fe59a | 2011-04-20 15:09:01 -0700 | [diff] [blame] | 201 | RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal)); |
Jason Sams | 2cfe51e | 2011-03-18 17:08:54 -0700 | [diff] [blame] | 202 | if (!dc) { |
Steve Block | af12ac6 | 2012-01-06 19:20:56 +0000 | [diff] [blame] | 203 | ALOGE("Calloc for driver hal failed."); |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 204 | return false; |
| 205 | } |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 206 | rsc->mHal.drv = dc; |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 207 | |
Stephen Hines | a221f56 | 2013-07-10 17:59:47 -0700 | [diff] [blame] | 208 | dc->mCpuRef = RsdCpuReference::create(rsc, version_major, version_minor, |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 209 | &rsdLookupRuntimeStub, &LookupScript); |
| 210 | if (!dc->mCpuRef) { |
| 211 | ALOGE("RsdCpuReference::create for driver hal failed."); |
Jens Gulin | 07ef704 | 2014-02-19 18:16:01 +0100 | [diff] [blame] | 212 | rsc->mHal.drv = NULL; |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 213 | free(dc); |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 214 | return false; |
| 215 | } |
| 216 | |
Stephen Hines | b7d9c80 | 2013-04-29 19:13:09 -0700 | [diff] [blame] | 217 | #ifndef RS_COMPATIBILITY_LIB |
| 218 | // Set a callback for compiler setup here. |
| 219 | if (false) { |
| 220 | dc->mCpuRef->setSetupCompilerCallback(NULL); |
| 221 | } |
Stephen Hines | a221f56 | 2013-07-10 17:59:47 -0700 | [diff] [blame] | 222 | |
| 223 | // Set a callback for switching MemChunk's allocator here. |
| 224 | // Note that the allocation function must return page-aligned memory, so |
| 225 | // that it can be mprotected properly (i.e. code should be written and |
| 226 | // later switched to read+execute only). |
| 227 | if (false) { |
| 228 | MemChunk::registerAllocFreeCallbacks( |
| 229 | rsc->mHal.funcs.allocRuntimeMem, |
| 230 | rsc->mHal.funcs.freeRuntimeMem); |
| 231 | } |
Stephen Hines | b7d9c80 | 2013-04-29 19:13:09 -0700 | [diff] [blame] | 232 | #endif |
| 233 | |
Jason Sams | bad8074 | 2011-03-16 16:29:28 -0700 | [diff] [blame] | 234 | return true; |
| 235 | } |
| 236 | |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 237 | |
| 238 | void SetPriority(const Context *rsc, int32_t priority) { |
Jason Sams | 87fe59a | 2011-04-20 15:09:01 -0700 | [diff] [blame] | 239 | RsdHal *dc = (RsdHal *)rsc->mHal.drv; |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 240 | |
| 241 | dc->mCpuRef->setPriority(priority); |
| 242 | |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 243 | #ifndef RS_COMPATIBILITY_LIB |
Jason Sams | 9719bd4 | 2012-01-12 14:22:21 -0800 | [diff] [blame] | 244 | if (dc->mHasGraphics) { |
| 245 | rsdGLSetPriority(rsc, priority); |
| 246 | } |
Jason Sams | 110f181 | 2013-03-14 16:02:18 -0700 | [diff] [blame] | 247 | #endif |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 248 | } |
| 249 | |
| 250 | void Shutdown(Context *rsc) { |
Jason Sams | 87fe59a | 2011-04-20 15:09:01 -0700 | [diff] [blame] | 251 | RsdHal *dc = (RsdHal *)rsc->mHal.drv; |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 252 | delete dc->mCpuRef; |
Jens Gulin | 07ef704 | 2014-02-19 18:16:01 +0100 | [diff] [blame] | 253 | free(dc); |
Jason Sams | 709a097 | 2012-11-15 18:18:04 -0800 | [diff] [blame] | 254 | rsc->mHal.drv = NULL; |
Jason Sams | cdfdb8f | 2011-03-17 16:12:47 -0700 | [diff] [blame] | 255 | } |
| 256 | |
Tim Murray | 3468938 | 2013-03-11 12:12:03 -0700 | [diff] [blame] | 257 | void* rsdAllocRuntimeMem(size_t size, uint32_t flags) { |
| 258 | void* buffer = calloc(size, sizeof(char)); |
| 259 | return buffer; |
| 260 | } |
| 261 | |
| 262 | void rsdFreeRuntimeMem(void* ptr) { |
| 263 | free(ptr); |
| 264 | } |