summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2013-07-21 01:14:54 +0200
committerFrancisco Jerez <currojerez@riseup.net>2013-07-21 19:13:40 +0200
commit789204bcd5e8a8f3ad01ab4559edb6254816fb99 (patch)
tree9498e88fe9fe0c6adc57c2a801f1f0c9598b8b5f
parentf760ea7f551e8a2e5f5057be2a8972fb67bf5491 (diff)
clover: Respect kernel argument alignment restrictions.HEADmaster
-rw-r--r--src/gallium/state_trackers/clover/core/kernel.cpp13
-rw-r--r--src/gallium/state_trackers/clover/llvm/invocation.cpp5
2 files changed, 16 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp
index e11efd5b1fc..9332702724a 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -22,6 +22,7 @@
#include "core/kernel.hpp"
#include "core/resource.hpp"
+#include "util/u_math.h"
#include "pipe/p_context.h"
using namespace clover;
@@ -199,6 +200,12 @@ namespace {
std::reverse(v.begin(), v.end());
}
+ template<typename T>
+ void
+ align(T &v, size_t n) {
+ v.resize(util_align_npot(v.size(), n));
+ }
+
bool
msb(const std::vector<uint8_t> &s) {
if (native_endianness == PIPE_ENDIAN_LITTLE)
@@ -270,6 +277,7 @@ _cl_kernel::scalar_argument::bind(exec_context &ctx,
extend(w, marg.ext_type, marg.target_size);
byteswap(w, ctx.q->dev.endianness());
+ align(ctx.input, marg.target_align);
insert(ctx.input, w);
}
@@ -292,6 +300,7 @@ _cl_kernel::global_argument::set(size_t size, const void *value) {
void
_cl_kernel::global_argument::bind(exec_context &ctx,
const clover::module::argument &marg) {
+ align(ctx.input, marg.target_align);
ctx.g_handles.push_back(allocate(ctx.input, marg.target_size));
ctx.g_buffers.push_back(obj->resource(ctx.q).pipe);
}
@@ -321,6 +330,7 @@ _cl_kernel::local_argument::bind(exec_context &ctx,
extend(v, module::argument::zero_ext, marg.target_size);
byteswap(v, ctx.q->dev.endianness());
+ align(ctx.input, marg.target_align);
insert(ctx.input, v);
ctx.mem_local += __storage;
@@ -349,6 +359,7 @@ _cl_kernel::constant_argument::bind(exec_context &ctx,
extend(v, module::argument::zero_ext, marg.target_size);
byteswap(v, ctx.q->dev.endianness());
+ align(ctx.input, marg.target_align);
insert(ctx.input, v);
st = obj->resource(ctx.q).bind_surface(*ctx.q, false);
@@ -379,6 +390,7 @@ _cl_kernel::image_rd_argument::bind(exec_context &ctx,
extend(v, module::argument::zero_ext, marg.target_size);
byteswap(v, ctx.q->dev.endianness());
+ align(ctx.input, marg.target_align);
insert(ctx.input, v);
st = obj->resource(ctx.q).bind_sampler_view(*ctx.q);
@@ -409,6 +421,7 @@ _cl_kernel::image_wr_argument::bind(exec_context &ctx,
extend(v, module::argument::zero_ext, marg.target_size);
byteswap(v, ctx.q->dev.endianness());
+ align(ctx.input, marg.target_align);
insert(ctx.input, v);
st = obj->resource(ctx.q).bind_surface(*ctx.q, true);
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index a50cf37dfcb..2c6c1d46882 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -317,6 +317,7 @@ namespace {
TD.getSmallestLegalIntType(mod->getContext(), arg_size * 8) :
arg_type;
unsigned target_size = TD.getTypeStoreSize(target_type);
+ unsigned target_align = TD.getABITypeAlignment(target_type);
if (llvm::isa<llvm::PointerType>(arg_type) && arg.hasByValAttr()) {
arg_type =
@@ -332,7 +333,7 @@ namespace {
default:
args.push_back(
module::argument(module::argument::global, arg_size,
- target_size, 0,
+ target_size, target_align,
module::argument::zero_ext));
break;
}
@@ -347,7 +348,7 @@ namespace {
args.push_back(
module::argument(module::argument::scalar, arg_size,
- target_size, 0, ext_type));
+ target_size, target_align, ext_type));
}
}