| // |
| // 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 |
| { |
| |
| 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; |
| } |
| |
| bool Image::IsValid(const _cl_mem *image) |
| { |
| if (!Memory::IsValid(image)) |
| { |
| return false; |
| } |
| switch (image->cast<Memory>().getType()) |
| { |
| case CL_MEM_OBJECT_IMAGE1D: |
| case CL_MEM_OBJECT_IMAGE2D: |
| case CL_MEM_OBJECT_IMAGE3D: |
| case CL_MEM_OBJECT_IMAGE1D_ARRAY: |
| case CL_MEM_OBJECT_IMAGE2D_ARRAY: |
| case CL_MEM_OBJECT_IMAGE1D_BUFFER: |
| break; |
| default: |
| return false; |
| } |
| return true; |
| } |
| |
| Image::~Image() = default; |
| |
| 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 |