Хорошо, я наконец-то узнал, как реализовать заявленные параметры.Первое, что нужно сделать, это передать boost::compute::detail::device_ptr<float4_>
экземпляр функции.Далее мы должны объявить генератор typename для `OpenCL backend` и operator<<
для записи информации указателя в экземпляр meta_kernel
, который скрытно используется в определении замыкания.Итак, код:
1) Передача device_ptr
экземпляр
...
#include <boost/compute/detail/device_ptr.hpp>
...
float4_ *normalsData = new float4_[NORMALS_NO];
device_ptr<float4_> normalsDataDP = normalsData;
...
BOOST_COMPUTE_CLOSURE(void, evalNormals, (int4_ indices), (normalsDataDP), {
...
});
...
2) Реализация генератора названий типов:
...
namespace boost {
namespace compute {
template<>
inline const char *type_name<detail::device_ptr<float4_>>()
{
return "__global float4 *";
}
}
}
...
3) Реализация operator<<
...
namespace boost {
namespace compute {
namespace detail {
meta_kernel &operator<<(meta_kernel &kern,
const device_ptr<float4_> &ptr)
{
std::string nodes_info = kern.get_buffer_identifier<float4_>(ptr.get_buffer());
kern << kern.var<float4_ *>(nodes_info);
return kern;
}
}
}
}
...