1 /* 2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 #include "shared.h" 26 27 #define INFO 0 28 29 30 void hexdump(void *ptr, int buflen) { 31 unsigned char *buf = (unsigned char *) ptr; 32 int i, j; 33 for (i = 0; i < buflen; i += 16) { 34 printf("%06x: ", i); 35 for (j = 0; j < 16; j++) 36 if (i + j < buflen) 37 printf("%02x ", buf[i + j]); 38 else 39 printf(" "); 40 printf(" "); 41 for (j = 0; j < 16; j++) 42 if (i + j < buflen) 43 printf("%c", isprint(buf[i + j]) ? buf[i + j] : '.'); 44 printf("\n"); 45 } 46 } 47 48 void Sled::show(std::ostream &out, void *argArray) { 49 ArgSled argSled(static_cast<ArgArray_s *>(argArray)); 50 for (int i = 0; i < argSled.argc(); i++) { 51 Arg_s *arg = argSled.arg(i); 52 switch (arg->variant) { 53 case '&': { 54 out << "Buf: of " << arg->value.buffer.sizeInBytes << " bytes " << std::endl; 55 break; 56 } 57 case 'B': { 58 out << "S8:" << arg->value.s8 << std::endl; 59 break; 60 } 61 case 'Z': { 62 out << "Z:" << arg->value.z1 << std::endl; 63 break; 64 } 65 case 'C': { 66 out << "U16:" << arg->value.u16 << std::endl; 67 break; 68 } 69 case 'S': { 70 out << "S16:" << arg->value.s16 << std::endl; 71 break; 72 } 73 case 'I': { 74 out << "S32:" << arg->value.s32 << std::endl; 75 break; 76 } 77 case 'F': { 78 out << "F32:" << arg->value.f32 << std::endl; 79 break; 80 } 81 case 'J': { 82 out << "S64:" << arg->value.s64 << std::endl; 83 break; 84 } 85 case 'D': { 86 out << "F64:" << arg->value.f64 << std::endl; 87 break; 88 } 89 default: { 90 std::cerr << "unexpected variant (shared.cpp) '" << (char) arg->variant << "'" << std::endl; 91 exit(1); 92 } 93 } 94 } 95 out << "schema len = " << argSled.schemaLen() << std::endl; 96 97 out << "schema = " << argSled.schema() << std::endl; 98 } 99 100 101 extern "C" int getMaxComputeUnits(long backendHandle) { 102 if (INFO){ 103 std::cout << "trampolining through backendHandle to backend.getMaxComputeUnits()" << std::endl; 104 } 105 auto *backend = reinterpret_cast<Backend*>(backendHandle); 106 return backend->getMaxComputeUnits(); 107 } 108 109 extern "C" void info(long backendHandle) { 110 if (INFO){ 111 std::cout << "trampolining through backendHandle to backend.info()" << std::endl; 112 } 113 auto *backend = reinterpret_cast<Backend*>(backendHandle); 114 backend->info(); 115 } 116 extern "C" void computeStart(long backendHandle) { 117 if (INFO){ 118 std::cout << "trampolining through backendHandle to backend.computeStart()" << std::endl; 119 } 120 auto *backend = reinterpret_cast<Backend*>(backendHandle); 121 backend->computeStart(); 122 } 123 extern "C" void computeEnd(long backendHandle) { 124 if (INFO){ 125 std::cout << "trampolining through backendHandle to backend.computeEnd()" << std::endl; 126 } 127 auto *backend = reinterpret_cast<Backend*>(backendHandle); 128 backend->computeEnd(); 129 } 130 extern "C" void releaseBackend(long backendHandle) { 131 auto *backend = reinterpret_cast<Backend*>(backendHandle); 132 delete backend; 133 } 134 extern "C" long compileProgram(long backendHandle, int len, char *source) { 135 if (INFO){ 136 std::cout << "trampolining through backendHandle to backend.compileProgram() " 137 <<std::hex<<backendHandle<< std::dec <<std::endl; 138 } 139 auto *backend = reinterpret_cast<Backend*>(backendHandle); 140 auto programHandle = backend->compileProgram(len, source); 141 if (INFO){ 142 std::cout << "programHandle = "<<std::hex<<backendHandle<< std::dec <<std::endl; 143 } 144 return programHandle; 145 } 146 extern "C" long getKernel(long programHandle, int nameLen, char *name) { 147 if (INFO){ 148 std::cout << "trampolining through programHandle to program.getKernel()" 149 <<std::hex<<programHandle<< std::dec <<std::endl; 150 } 151 auto program = reinterpret_cast<Backend::Program *>(programHandle); 152 return program->getKernel(nameLen, name); 153 } 154 155 extern "C" long ndrange(long kernelHandle, void *argArray) { 156 if (INFO){ 157 std::cout << "trampolining through kernelHandle to kernel.ndrange(...) " << std::endl; 158 } 159 auto kernel = reinterpret_cast<Backend::Program::Kernel *>(kernelHandle); 160 kernel->ndrange( argArray); 161 return (long) 0; 162 } 163 extern "C" void releaseKernel(long kernelHandle) { 164 if (INFO){ 165 std::cout << "trampolining through to releaseKernel " << std::endl; 166 } 167 auto kernel = reinterpret_cast<Backend::Program::Kernel *>(kernelHandle); 168 delete kernel; 169 } 170 171 extern "C" void releaseProgram(long programHandle) { 172 if (INFO){ 173 std::cout << "trampolining through to releaseProgram " << std::endl; 174 } 175 auto program = reinterpret_cast<Backend::Program *>(programHandle); 176 delete program; 177 } 178 extern "C" bool programOK(long programHandle) { 179 if (INFO){ 180 std::cout << "trampolining through to programOK " << std::endl; 181 } 182 auto program = reinterpret_cast<Backend::Program *>(programHandle); 183 return program->programOK(); 184 } 185 186 extern "C" bool getBufferFromDeviceIfDirty(long backendHandle, long memorySegmentHandle, long memorySegmentLength) { 187 if (INFO){ 188 std::cout << "trampolining through to getBuffer " << std::endl; 189 } 190 auto backend = reinterpret_cast<Backend *>(backendHandle); 191 auto memorySegment = reinterpret_cast<void *>(memorySegmentHandle); 192 return backend->getBufferFromDeviceIfDirty(memorySegment, memorySegmentLength); 193 } 194 195