summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2014-06-14 21:03:02 +0200
committerFrancisco Jerez <[email protected]>2014-06-19 20:17:19 +0200
commit4a39e5073a7d0cd8243c6f963567a9945265490c (patch)
tree22383d8abbb68291160e8607d0829fb2ef512b83
parentab023c27a374bb69bd7300b5b6f0789844fc8ba9 (diff)
clover: Calculate the serialized size of a module efficiently.
Tested-by: Tom Stellard <[email protected]>
-rw-r--r--src/gallium/state_trackers/clover/api/program.cpp5
-rw-r--r--src/gallium/state_trackers/clover/core/module.cpp32
-rw-r--r--src/gallium/state_trackers/clover/core/module.hpp1
3 files changed, 34 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp
index fedc91d531a..a14baa30e06 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -190,10 +190,7 @@ clGetProgramInfo(cl_program d_prog, cl_program_info param,
case CL_PROGRAM_BINARY_SIZES:
buf.as_vector<size_t>() = map([&](const device &dev) {
- compat::ostream::buffer_t bin;
- compat::ostream s(bin);
- prog.binary(dev).serialize(s);
- return bin.size();
+ return prog.binary(dev).size();
},
prog.devices());
break;
diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp
index 41de7344203..55ed91af799 100644
--- a/src/gallium/state_trackers/clover/core/module.cpp
+++ b/src/gallium/state_trackers/clover/core/module.cpp
@@ -52,6 +52,13 @@ namespace {
return x;
}
+ /// Calculate the size of the specified object.
+ template<typename T>
+ void
+ _proc(module::size_t &sz, const T &x) {
+ _serializer<T>::proc(sz, x);
+ }
+
/// (De)serialize a scalar value.
template<typename T>
struct _serializer<T, typename std::enable_if<
@@ -65,6 +72,11 @@ namespace {
proc(compat::istream &is, T &x) {
is.read(reinterpret_cast<char *>(&x), sizeof(x));
}
+
+ static void
+ proc(module::size_t &sz, const T &x) {
+ sz += sizeof(x);
+ }
};
/// (De)serialize a vector.
@@ -87,6 +99,14 @@ namespace {
for (size_t i = 0; i < v.size(); i++)
new(&v[i]) T(_proc<T>(is));
}
+
+ static void
+ proc(module::size_t &sz, const compat::vector<T> &v) {
+ sz += sizeof(uint32_t);
+
+ for (size_t i = 0; i < v.size(); i++)
+ _proc<T>(sz, v[i]);
+ }
};
template<typename T>
@@ -106,6 +126,11 @@ namespace {
is.read(reinterpret_cast<char *>(v.begin()),
v.size() * sizeof(T));
}
+
+ static void
+ proc(module::size_t &sz, const compat::vector<T> &v) {
+ sz += sizeof(uint32_t) + sizeof(T) * v.size();
+ }
};
/// (De)serialize a module::section.
@@ -170,4 +195,11 @@ namespace clover {
module::deserialize(compat::istream &is) {
return _proc<module>(is);
}
+
+ module::size_t
+ module::size() const {
+ size_t sz = 0;
+ _proc(sz, *this);
+ return sz;
+ }
}
diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp
index 4a8dbcb4949..18a5bfb24c3 100644
--- a/src/gallium/state_trackers/clover/core/module.hpp
+++ b/src/gallium/state_trackers/clover/core/module.hpp
@@ -105,6 +105,7 @@ namespace clover {
void serialize(compat::ostream &os) const;
static module deserialize(compat::istream &is);
+ size_t size() const;
compat::vector<symbol> syms;
compat::vector<section> secs;