--- src/gallium/state_trackers/clover/core/kernel.cpp | 1 + src/gallium/state_trackers/clover/core/module.hpp | 9 +++++---- src/gallium/state_trackers/clover/llvm/invocation.cpp | 6 +++++- 3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp index 606e4e9..32274dd 100644 --- a/src/gallium/state_trackers/clover/core/kernel.cpp +++ b/src/gallium/state_trackers/clover/core/kernel.cpp @@ -421,6 +421,7 @@ kernel::local_argument::set(size_t size, const void *value) { void kernel::local_argument::bind(exec_context &ctx, const module::argument &marg) { + ctx.mem_local = util_align_npot(ctx.mem_local, marg.value_align); auto v = bytes(ctx.mem_local); extend(v, module::argument::zero_ext, marg.target_size); diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp index c0bc320..5840891 100644 --- a/src/gallium/state_trackers/clover/core/module.hpp +++ b/src/gallium/state_trackers/clover/core/module.hpp @@ -77,24 +77,25 @@ namespace clover { argument(enum type type, size_t size, size_t target_size, size_t target_align, enum ext_type ext_type, - enum semantic semantic = general) : + enum semantic semantic = general, size_t value_align = 1) : type(type), size(size), target_size(target_size), target_align(target_align), - ext_type(ext_type), semantic(semantic) { } + value_align(value_align), ext_type(ext_type), semantic(semantic) { } argument(enum type type, size_t size) : type(type), size(size), - target_size(size), target_align(1), + target_size(size), target_align(1), value_align(1), ext_type(zero_ext), semantic(general) { } argument() : type(scalar), size(0), - target_size(0), target_align(1), + target_size(0), target_align(1), value_align(1), ext_type(zero_ext), semantic(general) { } type type; size_t size; size_t target_size; size_t target_align; + size_t value_align; ext_type ext_type; semantic semantic; }; diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 70ef526..1158440 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -433,10 +433,14 @@ namespace { unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace(); if (address_space == address_spaces[clang::LangAS::opencl_local - clang::LangAS::Offset]) { + llvm::Type *pointee_type = arg_type->getPointerElementType(); + size_t value_align = TD.getABITypeAlignment(pointee_type); args.push_back(module::argument(module::argument::local, arg_api_size, target_size, target_align, - module::argument::zero_ext)); + module::argument::zero_ext, + module::argument::general, + value_align)); } else { // XXX: Correctly handle constant address space. There is no // way for r600g to pass a handle for constant buffers back -- 2.0.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev