[Mesa-dev] [PATCH v3 2/2] clover: add GetKernelArgInfo (CL 1.2)
Francisco Jerez
currojerez at riseup.net
Mon Dec 12 01:48:59 UTC 2016
Serge Martin <edb+mesa at sigluy.net> writes:
> ---
> src/gallium/state_trackers/clover/api/kernel.cpp | 92 +++++++++++++++++++++-
> src/gallium/state_trackers/clover/core/module.cpp | 14 ++++
> src/gallium/state_trackers/clover/core/module.hpp | 11 +++
> .../state_trackers/clover/llvm/codegen/common.cpp | 11 +++
> 4 files changed, 125 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp b/src/gallium/state_trackers/clover/api/kernel.cpp
> index 73ba34a..81a4a38 100644
> --- a/src/gallium/state_trackers/clover/api/kernel.cpp
> +++ b/src/gallium/state_trackers/clover/api/kernel.cpp
> @@ -192,9 +192,95 @@ clGetKernelWorkGroupInfo(cl_kernel d_kern, cl_device_id d_dev,
> CLOVER_API cl_int
> clGetKernelArgInfo(cl_kernel d_kern,
> cl_uint idx, cl_kernel_arg_info param,
> - size_t size, void *r_buf, size_t *r_size) {
> - CLOVER_NOT_SUPPORTED_UNTIL("1.2");
> - return CL_KERNEL_ARG_INFO_NOT_AVAILABLE;
> + size_t size, void *r_buf, size_t *r_size) try {
> + property_buffer buf { r_buf, size, r_size };
> + const auto &kern = obj(d_kern);
> +
> + const auto args =
> + find(name_equals(kern.name()), kern.program().symbols()).args;
> +
> + if (args.at(0).arg_info.arg_name.empty())
> + throw error(CL_KERNEL_ARG_INFO_NOT_AVAILABLE);
> +
> + const auto &arg = find([&](const clover::module::argument &arg) {
> + return arg.arg_info.index == idx;
> + }, args);
> +
> + switch (param) {
> + case CL_KERNEL_ARG_ADDRESS_QUALIFIER: {
> + cl_kernel_arg_address_qualifier v;
> + switch (arg.type) {
> + case module::argument::local:
> + v = CL_KERNEL_ARG_ADDRESS_LOCAL;
> + break;
> + case module::argument::constant:
> + v = CL_KERNEL_ARG_ADDRESS_CONSTANT;
> + break;
> + case module::argument::global:
> + case module::argument::image2d_rd:
> + case module::argument::image2d_wr:
> + case module::argument::image3d_rd:
> + case module::argument::image3d_wr:
> + v = CL_KERNEL_ARG_ADDRESS_GLOBAL;
> + break;
> + default:
> + v = CL_KERNEL_ARG_ADDRESS_PRIVATE;
> + }
> + buf.as_scalar<cl_kernel_arg_address_qualifier>() = v;
> + break;
> + }
> +
> + case CL_KERNEL_ARG_ACCESS_QUALIFIER: {
> + cl_kernel_arg_access_qualifier v;
> + switch (arg.type) {
> + case module::argument::image2d_rd:
> + case module::argument::image3d_rd:
> + v = CL_KERNEL_ARG_ACCESS_READ_ONLY;
> + break;
> + case module::argument::image2d_wr:
> + case module::argument::image3d_wr:
> + v = CL_KERNEL_ARG_ACCESS_WRITE_ONLY;
> + break;
> + default:
> + v = CL_KERNEL_ARG_ACCESS_NONE;
> + }
> + buf.as_scalar<cl_kernel_arg_access_qualifier>() = v;
> + break;
> + }
> +
> + case CL_KERNEL_ARG_TYPE_NAME:
> + buf.as_string() = arg.arg_info.type_name;
> + break;
> +
> + case CL_KERNEL_ARG_TYPE_QUALIFIER: {
> + cl_kernel_arg_type_qualifier v = CL_KERNEL_ARG_TYPE_NONE;
> +
> + if (arg.arg_info.type_qualifier.find("const") != std::string::npos)
> + v |= CL_KERNEL_ARG_TYPE_CONST;
> + if (arg.arg_info.type_qualifier.find("restrict") != std::string::npos)
> + v |= CL_KERNEL_ARG_TYPE_RESTRICT;
> + if (arg.arg_info.type_qualifier.find("volatile") != std::string::npos)
> + v |= CL_KERNEL_ARG_TYPE_VOLATILE;
> +
> + buf.as_scalar<cl_kernel_arg_type_qualifier>() = v;
> + break;
> + }
> +
> + case CL_KERNEL_ARG_NAME:
> + buf.as_string() = arg.arg_info.arg_name;
> + break;
> +
> + default:
> + throw error(CL_INVALID_VALUE);
> + }
> +
> + return CL_SUCCESS;
> +
> +} catch (std::out_of_range &e) {
> + return CL_INVALID_ARG_INDEX;
> +
> +} catch (error &e) {
> + return e.get();
> }
>
> namespace {
> diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp
> index a6c5b98..1b6b642 100644
> --- a/src/gallium/state_trackers/clover/core/module.cpp
> +++ b/src/gallium/state_trackers/clover/core/module.cpp
> @@ -168,6 +168,19 @@ namespace {
> }
> };
>
> + /// (De)serialize a module::argument::info
> + template<>
> + struct _serializer<module::argument::info> {
> + template<typename S, typename QT>
> + static void
> + proc(S &s, QT &x) {
> + _proc(s, x.index);
> + _proc(s, x.type_name);
> + _proc(s, x.type_qualifier);
> + _proc(s, x.arg_name);
> + }
> + };
> +
> /// (De)serialize a module::argument.
> template<>
> struct _serializer<module::argument> {
> @@ -180,6 +193,7 @@ namespace {
> _proc(s, x.target_align);
> _proc(s, x.ext_type);
> _proc(s, x.semantic);
> + _proc(s, x.arg_info);
> }
> };
>
> diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp
> index 2ddd264..4425df9 100644
> --- a/src/gallium/state_trackers/clover/core/module.hpp
> +++ b/src/gallium/state_trackers/clover/core/module.hpp
> @@ -54,6 +54,16 @@ namespace clover {
> };
>
> struct argument {
> + struct info {
> + info() :
> + index(-1), type_name(""), type_qualifier(""), arg_name("") { }
> +
> + size_t index;
> + std::string type_name;
> + std::string type_qualifier;
> + std::string arg_name;
> + };
> +
> enum type {
> scalar,
> constant,
> @@ -102,6 +112,7 @@ namespace clover {
> size_t target_align;
> ext_type ext_type;
> semantic semantic;
> + info arg_info;
> };
>
> struct symbol {
> diff --git a/src/gallium/state_trackers/clover/llvm/codegen/common.cpp b/src/gallium/state_trackers/clover/llvm/codegen/common.cpp
> index aa6ca50..03b9a88 100644
> --- a/src/gallium/state_trackers/clover/llvm/codegen/common.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/codegen/common.cpp
> @@ -69,6 +69,7 @@ namespace {
> std::vector<module::argument>
> make_kernel_args(const Module &mod, const std::string &kernel_name,
> const clang::CompilerInstance &c) {
> + const bool get_args_infos = c.getCodeGenOpts().EmitOpenCLArgMetadata;
> std::vector<module::argument> args;
> const auto address_spaces = c.getTarget().getAddressSpaceMap();
> const Function &f = *mod.getFunction(kernel_name);
> @@ -161,6 +162,16 @@ namespace {
> module::argument::zero_ext));
> }
> }
> +
> + if (get_args_infos) {
> + struct module::argument::info i;
> + i.index = arg.getArgNo();
> + i.type_name = get_argument_metadata(f, arg, "kernel_arg_type");
> + i.type_qualifier = get_argument_metadata(f, arg, "kernel_arg_type_qual");
> + i.arg_name = get_argument_metadata(f, arg, "kernel_arg_name");
> + args.back().arg_info = i;
> + }
> +
> }
>
> // Append implicit arguments. XXX - The types, ordering and
With the attached clean-up patch squashed in this gets my:
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
> --
> 2.5.5
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-SQUASH-clover-Add-GetKernelArgInfo-CL-1.2.patch
Type: text/x-diff
Size: 9996 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161211/4a0557a8/attachment-0001.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161211/4a0557a8/attachment-0001.sig>
More information about the mesa-dev
mailing list