| 17 | format(Format::Undefined) {} |
| 18 | |
| 19 | ImageBuffer::ImageBuffer(const DeviceRef& device, size_t width, size_t height, size_t numChannels, |
| 20 | DataType dataType, Storage storage, bool forceHostCopy) |
| 21 | : device(device), |
| 22 | numValues(size_t(width) * height * numChannels), |
| 23 | width(width), |
| 24 | height(height), |
| 25 | numChannels(numChannels), |
| 26 | dataType(dataType), |
| 27 | format(makeFormat(dataType, numChannels)) |
| 28 | { |
| 29 | |
| 30 | if (width > maxDim || height > maxDim || width * height * getC() > std::numeric_limits<int>::max()) |
| 31 | throw std::runtime_error("image size is too large"); |
| 32 | |
| 33 | const size_t valueByteSize = getDataTypeSize(dataType); |
| 34 | byteSize = std::max(numValues * valueByteSize, size_t(1)); // avoid zero-sized buffer |
| 35 | buffer = device.newBuffer(byteSize, storage); |
| 36 | storage = buffer.getStorage(); // get actual storage mode |
| 37 | devPtr = (storage != Storage::Device) ? static_cast<char*>(buffer.getData()) : nullptr; |
| 38 | hostPtr = (storage != Storage::Device && !forceHostCopy) ? devPtr : static_cast<char*>(malloc(byteSize)); |
| 39 | } |
| 40 | |
| 41 | ImageBuffer::~ImageBuffer() |
| 42 | { |
nothing calls this directly
no test coverage detected