| // | |
| // Copyright 2021 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // CLImage.cpp: Implements the cl::Image class. | |
| #include "libANGLE/CLImage.h" | |
| #include "libANGLE/cl_utils.h" | |
| #include <cstring> | |
| namespace cl | |
| { | |
| bool Image::IsTypeValid(MemObjectType imageType) | |
| { | |
| switch (imageType) | |
| { | |
| case MemObjectType::Image1D: | |
| case MemObjectType::Image2D: | |
| case MemObjectType::Image3D: | |
| case MemObjectType::Image1D_Array: | |
| case MemObjectType::Image2D_Array: | |
| case MemObjectType::Image1D_Buffer: | |
| break; | |
| default: | |
| return false; | |
| } | |
| return true; | |
| } | |
| cl_int Image::getInfo(ImageInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const | |
| { | |
| size_t valSizeT = 0u; | |
| void *valPointer = nullptr; | |
| const void *copyValue = nullptr; | |
| size_t copySize = 0u; | |
| switch (name) | |
| { | |
| case ImageInfo::Format: | |
| copyValue = &mFormat; | |
| copySize = sizeof(mFormat); | |
| break; | |
| case ImageInfo::ElementSize: | |
| valSizeT = GetElementSize(mFormat); | |
| copyValue = &valSizeT; | |
| copySize = sizeof(valSizeT); | |
| break; | |
| case ImageInfo::RowPitch: | |
| copyValue = &mDesc.rowPitch; | |
| copySize = sizeof(mDesc.rowPitch); | |
| break; | |
| case ImageInfo::SlicePitch: | |
| copyValue = &mDesc.slicePitch; | |
| copySize = sizeof(mDesc.slicePitch); | |
| break; | |
| case ImageInfo::Width: | |
| copyValue = &mDesc.width; | |
| copySize = sizeof(mDesc.width); | |
| break; | |
| case ImageInfo::Height: | |
| copyValue = &mDesc.height; | |
| copySize = sizeof(mDesc.height); | |
| break; | |
| case ImageInfo::Depth: | |
| copyValue = &mDesc.depth; | |
| copySize = sizeof(mDesc.depth); | |
| break; | |
| case ImageInfo::ArraySize: | |
| copyValue = &mDesc.arraySize; | |
| copySize = sizeof(mDesc.arraySize); | |
| break; | |
| case ImageInfo::Buffer: | |
| valPointer = Memory::CastNative(mParent.get()); | |
| copyValue = &valPointer; | |
| copySize = sizeof(valPointer); | |
| break; | |
| case ImageInfo::NumMipLevels: | |
| copyValue = &mDesc.numMipLevels; | |
| copySize = sizeof(mDesc.numMipLevels); | |
| break; | |
| case ImageInfo::NumSamples: | |
| copyValue = &mDesc.numSamples; | |
| copySize = sizeof(mDesc.numSamples); | |
| break; | |
| default: | |
| return CL_INVALID_VALUE; | |
| } | |
| if (value != nullptr) | |
| { | |
| // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type | |
| // as described in the Image Object Queries table and param_value is not NULL. | |
| if (valueSize < copySize) | |
| { | |
| return CL_INVALID_VALUE; | |
| } | |
| if (copyValue != nullptr) | |
| { | |
| std::memcpy(value, copyValue, copySize); | |
| } | |
| } | |
| if (valueSizeRet != nullptr) | |
| { | |
| *valueSizeRet = copySize; | |
| } | |
| return CL_SUCCESS; | |
| } | |
| Image::~Image() = default; | |
| bool Image::isRegionValid(const size_t origin[3], const size_t region[3]) const | |
| { | |
| switch (getType()) | |
| { | |
| case MemObjectType::Image1D: | |
| case MemObjectType::Image1D_Buffer: | |
| return origin[0] + region[0] <= mDesc.width; | |
| case MemObjectType::Image2D: | |
| return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height; | |
| case MemObjectType::Image3D: | |
| return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height && | |
| origin[2] + region[2] <= mDesc.depth; | |
| case MemObjectType::Image1D_Array: | |
| return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.arraySize; | |
| case MemObjectType::Image2D_Array: | |
| return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height && | |
| origin[2] + region[2] <= mDesc.arraySize; | |
| default: | |
| ASSERT(false); | |
| break; | |
| } | |
| return false; | |
| } | |
| Image::Image(Context &context, | |
| PropArray &&properties, | |
| MemFlags flags, | |
| const cl_image_format &format, | |
| const ImageDescriptor &desc, | |
| Memory *parent, | |
| void *hostPtr, | |
| cl_int &errorCode) | |
| : Memory(*this, | |
| context, | |
| std::move(properties), | |
| flags, | |
| format, | |
| desc, | |
| parent, | |
| hostPtr, | |
| errorCode), | |
| mFormat(format), | |
| mDesc(desc) | |
| {} | |
| } // namespace cl |