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 class MockBackend final : public Backend {
 28 public:
 29     class MockProgram final : public Backend::CompilationUnit {
 30         class MockKernel final : public Backend::CompilationUnit::Kernel {
 31         public:
 32             MockKernel(Backend::CompilationUnit *compilationUnit, char *name)
 33                 : Backend::CompilationUnit::Kernel(compilationUnit, name) {
 34             }
 35 
 36             ~MockKernel() override = default;
 37 
 38             bool setArg(KernelArg *arg, Buffer *buffer) override {
 39                 return false;
 40             }
 41 
 42             bool setArg(KernelArg *arg) override {
 43                 return false;
 44             }
 45         };
 46 
 47     public:
 48         MockProgram(Backend *backend, char *src, char *log, bool ok)
 49             : Backend::CompilationUnit(backend, src, log, ok) {
 50         }
 51 
 52         ~MockProgram() override = default;
 53 
 54         Kernel *getKernel(int nameLen, char *name) override {
 55             return new MockKernel(this, name);
 56         }
 57     };
 58 
 59     class MockQueue final : public Backend::Queue {
 60     public:
 61         void wait() override {
 62         };
 63 
 64         void release() override {
 65         };
 66 
 67         void computeStart() override {
 68         };
 69 
 70         void computeEnd() override {
 71         };
 72 
 73         void dispatch(KernelContext *kernelContext, Backend::CompilationUnit::Kernel *kernel) override {
 74             std::cout << "mock dispatch() " << std::endl;
 75             size_t dims = 1;
 76             if (backend->config->trace | backend->config->traceEnqueues) {
 77                 std::cout << "enqueued kernel dispatch \"" << kernel->name << "\" globalSize=" << kernelContext->gsx <<
 78                         std::endl;
 79             }
 80         }
 81 
 82         void copyToDevice(Buffer *buffer) override {
 83         }
 84 
 85         void copyFromDevice(Buffer *buffer) override {
 86         };
 87 
 88         explicit MockQueue(Backend *backend) : Queue(backend) {
 89         }
 90 
 91         ~MockQueue() override = default;
 92     };
 93 
 94 public:
 95     explicit MockBackend(int configBits) : Backend(new Config(configBits), new MockQueue(this)) {
 96     }
 97 
 98     ~MockBackend() override = default;
 99 
100     Buffer *getOrCreateBuffer(BufferState *bufferState) override {
101         Buffer *buffer = nullptr;
102 
103         /* if (bufferState->vendorPtr == 0L || bufferState->state == BufferState::NEW_STATE){
104               openclBuffer = new OpenCLBuffer(this,  bufferState);
105               if (openclConfig.trace){
106                   std::cout << "We allocated arg buffer "<<std::endl;
107               }
108           }else{
109               if (openclConfig.trace){
110                   std::cout << "Were reusing  buffer  buffer "<<std::endl;
111               }
112               openclBuffer=  static_cast<OpenCLBuffer*>(bufferState->vendorPtr);
113           }*/
114         return buffer;
115     }
116 
117     bool getBufferFromDeviceIfDirty(void *memorySegment, long memorySegmentLength) override {
118         std::cout << "attempting  to get buffer from Mockbackend " << std::endl;
119         return false;
120     }
121 
122 
123     void showDeviceInfo() override {
124         std::cout << "mock showDeviceInfo()" << std::endl;
125     }
126 
127     void computeStart() override {
128         std::cout << "mock compute start()" << std::endl;
129     }
130 
131     void computeEnd() override {
132         std::cout << "mock compute start()" << std::endl;
133     }
134 
135     CompilationUnit *compile(int len, char *source) override {
136         std::cout << "mock compileProgram()" << std::endl;
137         size_t srcLen = ::strlen(source);
138         char *src = new char[srcLen + 1];
139         strncpy(src, source, srcLen);
140         src[srcLen] = '\0';
141         std::cout << "native compiling " << src << std::endl;
142         auto *mockProgram = new MockProgram(this, src, nullptr, false);
143         return mockProgram;
144     }
145 };
146 
147 extern "C" long getBackend(int mode) {
148     long backendHandle = reinterpret_cast<long>(new MockBackend(mode));
149     return backendHandle;
150 }