| // |
| // 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. |
| // |
| // CLKernel.cpp: Implements the cl::Kernel class. |
| |
| #include "libANGLE/CLKernel.h" |
| |
| #include "libANGLE/CLContext.h" |
| #include "libANGLE/CLProgram.h" |
| |
| #include <cstring> |
| |
| namespace cl |
| { |
| |
| cl_int Kernel::setArg(cl_uint argIndex, size_t argSize, const void *argValue) |
| { |
| return mImpl->setArg(argIndex, argSize, argValue); |
| } |
| |
| cl_int Kernel::getInfo(KernelInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const |
| { |
| cl_uint valUInt = 0u; |
| void *valPointer = nullptr; |
| const void *copyValue = nullptr; |
| size_t copySize = 0u; |
| |
| switch (name) |
| { |
| case KernelInfo::FunctionName: |
| copyValue = mInfo.functionName.c_str(); |
| copySize = mInfo.functionName.length() + 1u; |
| break; |
| case KernelInfo::NumArgs: |
| copyValue = &mInfo.numArgs; |
| copySize = sizeof(mInfo.numArgs); |
| break; |
| case KernelInfo::ReferenceCount: |
| valUInt = getRefCount(); |
| copyValue = &valUInt; |
| copySize = sizeof(valUInt); |
| break; |
| case KernelInfo::Context: |
| valPointer = mProgram->getContext().getNative(); |
| copyValue = &valPointer; |
| copySize = sizeof(valPointer); |
| break; |
| case KernelInfo::Program: |
| valPointer = mProgram->getNative(); |
| copyValue = &valPointer; |
| copySize = sizeof(valPointer); |
| break; |
| case KernelInfo::Attributes: |
| copyValue = mInfo.attributes.c_str(); |
| copySize = mInfo.attributes.length() + 1u; |
| 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 Kernel 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; |
| } |
| |
| cl_int Kernel::getWorkGroupInfo(cl_device_id device, |
| KernelWorkGroupInfo name, |
| size_t valueSize, |
| void *value, |
| size_t *valueSizeRet) const |
| { |
| size_t index = 0u; |
| if (device != nullptr) |
| { |
| const DevicePtrs &devices = mProgram->getContext().getDevices(); |
| while (index < devices.size() && devices[index] != device) |
| { |
| ++index; |
| } |
| if (index == devices.size()) |
| { |
| return CL_INVALID_DEVICE; |
| } |
| } |
| const rx::CLKernelImpl::WorkGroupInfo &info = mInfo.workGroups[index]; |
| |
| const void *copyValue = nullptr; |
| size_t copySize = 0u; |
| |
| switch (name) |
| { |
| case KernelWorkGroupInfo::GlobalWorkSize: |
| copyValue = &info.globalWorkSize; |
| copySize = sizeof(info.globalWorkSize); |
| break; |
| case KernelWorkGroupInfo::WorkGroupSize: |
| copyValue = &info.workGroupSize; |
| copySize = sizeof(info.workGroupSize); |
| break; |
| case KernelWorkGroupInfo::CompileWorkGroupSize: |
| copyValue = &info.compileWorkGroupSize; |
| copySize = sizeof(info.compileWorkGroupSize); |
| break; |
| case KernelWorkGroupInfo::LocalMemSize: |
| copyValue = &info.localMemSize; |
| copySize = sizeof(info.localMemSize); |
| break; |
| case KernelWorkGroupInfo::PreferredWorkGroupSizeMultiple: |
| copyValue = &info.prefWorkGroupSizeMultiple; |
| copySize = sizeof(info.prefWorkGroupSizeMultiple); |
| break; |
| case KernelWorkGroupInfo::PrivateMemSize: |
| copyValue = &info.privateMemSize; |
| copySize = sizeof(info.privateMemSize); |
| 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 Kernel Object Device 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; |
| } |
| |
| cl_int Kernel::getArgInfo(cl_uint argIndex, |
| KernelArgInfo name, |
| size_t valueSize, |
| void *value, |
| size_t *valueSizeRet) const |
| { |
| const rx::CLKernelImpl::ArgInfo &info = mInfo.args[argIndex]; |
| const void *copyValue = nullptr; |
| size_t copySize = 0u; |
| |
| switch (name) |
| { |
| case KernelArgInfo::AddressQualifier: |
| copyValue = &info.addressQualifier; |
| copySize = sizeof(info.addressQualifier); |
| break; |
| case KernelArgInfo::AccessQualifier: |
| copyValue = &info.accessQualifier; |
| copySize = sizeof(info.accessQualifier); |
| break; |
| case KernelArgInfo::TypeName: |
| copyValue = info.typeName.c_str(); |
| copySize = info.typeName.length() + 1u; |
| break; |
| case KernelArgInfo::TypeQualifier: |
| copyValue = &info.typeQualifier; |
| copySize = sizeof(info.typeQualifier); |
| break; |
| case KernelArgInfo::Name: |
| copyValue = info.name.c_str(); |
| copySize = info.name.length() + 1u; |
| 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 Kernel Argument 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; |
| } |
| |
| Kernel::~Kernel() |
| { |
| --mProgram->mNumAttachedKernels; |
| } |
| |
| Kernel::Kernel(Program &program, const char *name, cl_int &errorCode) |
| : mProgram(&program), |
| mImpl(program.getImpl().createKernel(*this, name, errorCode)), |
| mInfo(mImpl ? mImpl->createInfo(errorCode) : rx::CLKernelImpl::Info{}) |
| { |
| ++mProgram->mNumAttachedKernels; |
| } |
| |
| Kernel::Kernel(Program &program, const rx::CLKernelImpl::CreateFunc &createFunc, cl_int &errorCode) |
| : mProgram(&program), mImpl(createFunc(*this)), mInfo(mImpl->createInfo(errorCode)) |
| { |
| ++mProgram->mNumAttachedKernels; |
| } |
| |
| } // namespace cl |