123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- // ======================================================================== //
- // Copyright 2009-2019 Intel Corporation //
- // //
- // Licensed under the Apache License, Version 2.0 (the "License"); //
- // you may not use this file except in compliance with the License. //
- // You may obtain a copy of the License at //
- // //
- // http://www.apache.org/licenses/LICENSE-2.0 //
- // //
- // Unless required by applicable law or agreed to in writing, software //
- // distributed under the License is distributed on an "AS IS" BASIS, //
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
- // See the License for the specific language governing permissions and //
- // limitations under the License. //
- // ======================================================================== //
- #ifdef _WIN32
- # define OIDN_API extern "C" __declspec(dllexport)
- #else
- # define OIDN_API extern "C" __attribute__ ((visibility ("default")))
- #endif
- // Locks the device that owns the specified object
- // Use *only* inside OIDN_TRY/CATCH!
- #define OIDN_LOCK(obj) \
- std::lock_guard<std::mutex> lock(obj->getDevice()->getMutex());
- // Try/catch for converting exceptions to errors
- #define OIDN_TRY \
- try {
- #define OIDN_CATCH(obj) \
- } catch (Exception& e) { \
- Device::setError(obj ? obj->getDevice() : nullptr, e.code(), e.what()); \
- } catch (std::bad_alloc&) { \
- Device::setError(obj ? obj->getDevice() : nullptr, Error::OutOfMemory, "out of memory"); \
- } catch (mkldnn::error& e) { \
- if (e.status == mkldnn_out_of_memory) \
- Device::setError(obj ? obj->getDevice() : nullptr, Error::OutOfMemory, "out of memory"); \
- else \
- Device::setError(obj ? obj->getDevice() : nullptr, Error::Unknown, e.message); \
- } catch (std::exception& e) { \
- Device::setError(obj ? obj->getDevice() : nullptr, Error::Unknown, e.what()); \
- } catch (...) { \
- Device::setError(obj ? obj->getDevice() : nullptr, Error::Unknown, "unknown exception caught"); \
- }
- #include "device.h"
- #include "filter.h"
- #include <mutex>
- namespace oidn {
- namespace
- {
- __forceinline void checkHandle(void* handle)
- {
- if (handle == nullptr)
- throw Exception(Error::InvalidArgument, "invalid handle");
- }
- template<typename T>
- __forceinline void retainObject(T* obj)
- {
- if (obj)
- {
- obj->incRef();
- }
- else
- {
- OIDN_TRY
- checkHandle(obj);
- OIDN_CATCH(obj)
- }
- }
- template<typename T>
- __forceinline void releaseObject(T* obj)
- {
- if (obj == nullptr || obj->decRefKeep() == 0)
- {
- OIDN_TRY
- checkHandle(obj);
- OIDN_LOCK(obj);
- obj->destroy();
- OIDN_CATCH(obj)
- }
- }
- template<>
- __forceinline void releaseObject(Device* obj)
- {
- if (obj == nullptr || obj->decRefKeep() == 0)
- {
- OIDN_TRY
- checkHandle(obj);
- // Do NOT lock the device because it owns the mutex
- obj->destroy();
- OIDN_CATCH(obj)
- }
- }
- }
- OIDN_API OIDNDevice oidnNewDevice(OIDNDeviceType type)
- {
- Ref<Device> device = nullptr;
- OIDN_TRY
- if (type == OIDN_DEVICE_TYPE_CPU || type == OIDN_DEVICE_TYPE_DEFAULT)
- device = makeRef<Device>();
- else
- throw Exception(Error::InvalidArgument, "invalid device type");
- OIDN_CATCH(device)
- return (OIDNDevice)device.detach();
- }
- OIDN_API void oidnRetainDevice(OIDNDevice hDevice)
- {
- Device* device = (Device*)hDevice;
- retainObject(device);
- }
- OIDN_API void oidnReleaseDevice(OIDNDevice hDevice)
- {
- Device* device = (Device*)hDevice;
- releaseObject(device);
- }
- OIDN_API void oidnSetDevice1b(OIDNDevice hDevice, const char* name, bool value)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- device->set1i(name, value);
- OIDN_CATCH(device)
- }
- OIDN_API void oidnSetDevice1i(OIDNDevice hDevice, const char* name, int value)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- device->set1i(name, value);
- OIDN_CATCH(device)
- }
- OIDN_API bool oidnGetDevice1b(OIDNDevice hDevice, const char* name)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- return device->get1i(name);
- OIDN_CATCH(device)
- return false;
- }
- OIDN_API int oidnGetDevice1i(OIDNDevice hDevice, const char* name)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- return device->get1i(name);
- OIDN_CATCH(device)
- return 0;
- }
- OIDN_API void oidnSetDeviceErrorFunction(OIDNDevice hDevice, OIDNErrorFunction func, void* userPtr)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- device->setErrorFunction((ErrorFunction)func, userPtr);
- OIDN_CATCH(device)
- }
- OIDN_API OIDNError oidnGetDeviceError(OIDNDevice hDevice, const char** outMessage)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- return (OIDNError)Device::getError(device, outMessage);
- OIDN_CATCH(device)
- if (outMessage) *outMessage = "";
- return OIDN_ERROR_UNKNOWN;
- }
- OIDN_API void oidnCommitDevice(OIDNDevice hDevice)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- device->commit();
- OIDN_CATCH(device)
- }
- OIDN_API OIDNBuffer oidnNewBuffer(OIDNDevice hDevice, size_t byteSize)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- Ref<Buffer> buffer = device->newBuffer(byteSize);
- return (OIDNBuffer)buffer.detach();
- OIDN_CATCH(device)
- return nullptr;
- }
- OIDN_API OIDNBuffer oidnNewSharedBuffer(OIDNDevice hDevice, void* ptr, size_t byteSize)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- Ref<Buffer> buffer = device->newBuffer(ptr, byteSize);
- return (OIDNBuffer)buffer.detach();
- OIDN_CATCH(device)
- return nullptr;
- }
- OIDN_API void oidnRetainBuffer(OIDNBuffer hBuffer)
- {
- Buffer* buffer = (Buffer*)hBuffer;
- retainObject(buffer);
- }
- OIDN_API void oidnReleaseBuffer(OIDNBuffer hBuffer)
- {
- Buffer* buffer = (Buffer*)hBuffer;
- releaseObject(buffer);
- }
- OIDN_API void* oidnMapBuffer(OIDNBuffer hBuffer, OIDNAccess access, size_t byteOffset, size_t byteSize)
- {
- Buffer* buffer = (Buffer*)hBuffer;
- OIDN_TRY
- checkHandle(hBuffer);
- OIDN_LOCK(buffer);
- return buffer->map(byteOffset, byteSize);
- OIDN_CATCH(buffer)
- return nullptr;
- }
- OIDN_API void oidnUnmapBuffer(OIDNBuffer hBuffer, void* mappedPtr)
- {
- Buffer* buffer = (Buffer*)hBuffer;
- OIDN_TRY
- checkHandle(hBuffer);
- OIDN_LOCK(buffer);
- return buffer->unmap(mappedPtr);
- OIDN_CATCH(buffer)
- }
- OIDN_API OIDNFilter oidnNewFilter(OIDNDevice hDevice, const char* type)
- {
- Device* device = (Device*)hDevice;
- OIDN_TRY
- checkHandle(hDevice);
- OIDN_LOCK(device);
- Ref<Filter> filter = device->newFilter(type);
- return (OIDNFilter)filter.detach();
- OIDN_CATCH(device)
- return nullptr;
- }
- OIDN_API void oidnRetainFilter(OIDNFilter hFilter)
- {
- Filter* filter = (Filter*)hFilter;
- retainObject(filter);
- }
- OIDN_API void oidnReleaseFilter(OIDNFilter hFilter)
- {
- Filter* filter = (Filter*)hFilter;
- releaseObject(filter);
- }
- OIDN_API void oidnSetFilterImage(OIDNFilter hFilter, const char* name,
- OIDNBuffer hBuffer, OIDNFormat format,
- size_t width, size_t height,
- size_t byteOffset,
- size_t bytePixelStride, size_t byteRowStride)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- checkHandle(hBuffer);
- OIDN_LOCK(filter);
- Ref<Buffer> buffer = (Buffer*)hBuffer;
- if (buffer->getDevice() != filter->getDevice())
- throw Exception(Error::InvalidArgument, "the specified objects are bound to different devices");
- Image data(buffer, (Format)format, (int)width, (int)height, byteOffset, bytePixelStride, byteRowStride);
- filter->setImage(name, data);
- OIDN_CATCH(filter)
- }
- OIDN_API void oidnSetSharedFilterImage(OIDNFilter hFilter, const char* name,
- void* ptr, OIDNFormat format,
- size_t width, size_t height,
- size_t byteOffset,
- size_t bytePixelStride, size_t byteRowStride)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- Image data(ptr, (Format)format, (int)width, (int)height, byteOffset, bytePixelStride, byteRowStride);
- filter->setImage(name, data);
- OIDN_CATCH(filter)
- }
- OIDN_API void oidnSetFilter1b(OIDNFilter hFilter, const char* name, bool value)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- filter->set1i(name, int(value));
- OIDN_CATCH(filter)
- }
- OIDN_API bool oidnGetFilter1b(OIDNFilter hFilter, const char* name)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- return filter->get1i(name);
- OIDN_CATCH(filter)
- return false;
- }
- OIDN_API void oidnSetFilter1i(OIDNFilter hFilter, const char* name, int value)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- filter->set1i(name, value);
- OIDN_CATCH(filter)
- }
- OIDN_API int oidnGetFilter1i(OIDNFilter hFilter, const char* name)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- return filter->get1i(name);
- OIDN_CATCH(filter)
- return 0;
- }
- OIDN_API void oidnSetFilter1f(OIDNFilter hFilter, const char* name, float value)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- filter->set1f(name, value);
- OIDN_CATCH(filter)
- }
- OIDN_API float oidnGetFilter1f(OIDNFilter hFilter, const char* name)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- return filter->get1f(name);
- OIDN_CATCH(filter)
- return 0;
- }
- OIDN_API void oidnSetFilterProgressMonitorFunction(OIDNFilter hFilter, OIDNProgressMonitorFunction func, void* userPtr)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- filter->setProgressMonitorFunction(func, userPtr);
- OIDN_CATCH(filter)
- }
- OIDN_API void oidnCommitFilter(OIDNFilter hFilter)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- filter->commit();
- OIDN_CATCH(filter)
- }
- OIDN_API void oidnExecuteFilter(OIDNFilter hFilter)
- {
- Filter* filter = (Filter*)hFilter;
- OIDN_TRY
- checkHandle(hFilter);
- OIDN_LOCK(filter);
- filter->execute();
- OIDN_CATCH(filter)
- }
- } // namespace oidn
|