/* * cl_argument.h - CL kernel Argument * * Copyright (c) 2017 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. * * Author: Wind Yuan <feng.yuan@intel.com> */ #ifndef XCAM_CL_KERNEL_ARGUMENT_H #define XCAM_CL_KERNEL_ARGUMENT_H #include <xcam_std.h> #include <ocl/cl_memory.h> namespace XCam { #define XCAM_DEFAULT_IMAGE_DIM 2 #define XCAM_CL_KERNEL_MAX_WORK_DIM 3 struct CLWorkSize { uint32_t dim; size_t global[XCAM_CL_KERNEL_MAX_WORK_DIM]; size_t local[XCAM_CL_KERNEL_MAX_WORK_DIM]; CLWorkSize(); }; class CLArgument { public: virtual ~CLArgument (); void get_value (void *&adress, uint32_t &size); protected: CLArgument (uint32_t size); private: XCAM_DEAD_COPY (CLArgument); protected: void *_arg_adress; uint32_t _arg_size; }; typedef std::list<SmartPtr<CLArgument> > CLArgList; template<typename DataType> class CLArgumentT : public CLArgument { public: CLArgumentT (const DataType &value) : CLArgument (sizeof (DataType)) , _value (value) { _arg_adress = (void *) &_value; } ~CLArgumentT () {} private: DataType _value; }; template<typename DataType, int count> class CLArgumentTArray : public CLArgument { public: CLArgumentTArray (const DataType *value) : CLArgument (sizeof (DataType) * count) { memcpy (&_value[0], value, sizeof (DataType) * count); _arg_adress = (void *) &_value; } ~CLArgumentTArray () {} private: DataType _value[count]; }; class CLMemArgument : public CLArgument { public: CLMemArgument (const SmartPtr<CLMemory> &mem) : CLArgument (sizeof (cl_mem)) , _mem (mem) { XCAM_ASSERT (mem.ptr ()); _arg_adress = &mem->get_mem_id (); } ~CLMemArgument () {} private: SmartPtr<CLMemory> _mem; }; } #endif //XCAM_CL_KERNEL_ARGUMENT_H