[Mesa-dev] [PATCH 1/5] clover: Handle multiple kernels in the same program v2
Francisco Jerez
currojerez at riseup.net
Mon Sep 24 09:42:39 PDT 2012
Tom Stellard <tom at stellard.net> writes:
> From: Blaž Tomažič <blaz.tomazic at gmail.com>
>
> v2: Tom Stellard
> - Use pc parameter of launch_grid()
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
> ---
> src/gallium/include/pipe/p_context.h | 4 ++
> .../state_trackers/clover/llvm/invocation.cpp | 66 +++++++++++-----------
> 2 files changed, 37 insertions(+), 33 deletions(-)
>
> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
> index f59e388..5d46812 100644
> --- a/src/gallium/include/pipe/p_context.h
> +++ b/src/gallium/include/pipe/p_context.h
> @@ -507,6 +507,10 @@ struct pipe_context {
> * grid (in block units) and working block (in thread units) to be
> * used, respectively.
> *
> + * \a pc For drivers that use PIPE_SHADER_IR_LLVM as their prefered IR,
> + * this value will be the index of the kernel in the opencl.kernels
> + * metadata list.
> + *
> * \a input will be used to initialize the INPUT resource, and it
> * should point to a buffer of at least
> * pipe_compute_state::req_input_mem bytes.
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index be15e96..6ab9025 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -199,41 +199,42 @@ namespace {
> llvm::WriteBitcodeToFile(mod, bitcode_ostream);
> bitcode_ostream.flush();
>
> - llvm::Function *kernel_func;
> - std::string kernel_name;
> - compat::vector<module::argument> args;
> -
> - // XXX: Support more than one kernel
> - assert(kernels.size() == 1);
> -
> - kernel_func = kernels[0];
> - kernel_name = kernel_func->getName();
> -
> - for (llvm::Function::arg_iterator I = kernel_func->arg_begin(),
> - E = kernel_func->arg_end(); I != E; ++I) {
> - llvm::Argument &arg = *I;
> - llvm::Type *arg_type = arg.getType();
> - llvm::TargetData TD(kernel_func->getParent());
> - unsigned arg_size = TD.getTypeStoreSize(arg_type);
> -
> - if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) {
> - arg_type =
> - llvm::dyn_cast<llvm::PointerType>(arg_type)->getElementType();
> - }
> + for (unsigned i = 0; i < kernels.size(); ++i) {
> + llvm::Function *kernel_func;
> + std::string kernel_name;
> + compat::vector<module::argument> args;
> +
> + kernel_func = kernels[i];
> + kernel_name = kernel_func->getName();
> +
> + for (llvm::Function::arg_iterator I = kernel_func->arg_begin(),
> + E = kernel_func->arg_end(); I != E; ++I) {
> + llvm::Argument &arg = *I;
> + llvm::Type *arg_type = arg.getType();
> + llvm::TargetData TD(kernel_func->getParent());
> + unsigned arg_size = TD.getTypeStoreSize(arg_type);
> +
> + if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) {
> + arg_type =
> + llvm::dyn_cast<llvm::PointerType>(arg_type)->getElementType();
> + }
>
> - if (arg_type->isPointerTy()) {
> - // XXX: Figure out LLVM->OpenCL address space mappings for each
> - // target. I think we need to ask clang what these are. For now,
> - // pretend everything is in the global address space.
> - unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace();
> - switch (address_space) {
> - default:
> - args.push_back(module::argument(module::argument::global, arg_size));
> - break;
> + if (arg_type->isPointerTy()) {
> + // XXX: Figure out LLVM->OpenCL address space mappings for each
> + // target. I think we need to ask clang what these are. For now,
> + // pretend everything is in the global address space.
> + unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace();
> + switch (address_space) {
> + default:
> + args.push_back(module::argument(module::argument::global, arg_size));
> + break;
> + }
> + } else {
> + args.push_back(module::argument(module::argument::scalar, arg_size));
> }
> - } else {
> - args.push_back(module::argument(module::argument::scalar, arg_size));
> }
> +
> + m.syms.push_back(module::symbol(kernel_name, 0, i, args ));
> }
>
> header.num_bytes = llvm_bitcode.size();
> @@ -241,7 +242,6 @@ namespace {
> data.insert(0, (char*)(&header), sizeof(header));
> data.insert(data.end(), llvm_bitcode.begin(),
> llvm_bitcode.end());
> - m.syms.push_back(module::symbol(kernel_name, 0, 0, args ));
> m.secs.push_back(module::section(0, module::section::text,
> header.num_bytes, data));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120924/3fd2a271/attachment-0001.pgp>
More information about the mesa-dev
mailing list