[Mesa-dev] [PATCH 2/3] clover: Add work dimension implicit param to input

Jan Vesely jan.vesely at rutgers.edu
Wed Aug 6 14:36:18 PDT 2014


Signed-off-by: Jan Vesely <jan.vesely at rutgers.edu>
---
 src/gallium/state_trackers/clover/core/kernel.cpp | 162 ++++++++++++----------
 1 file changed, 85 insertions(+), 77 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp
index 68e91d5..7a88de1 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -28,6 +28,82 @@
 
 using namespace clover;
 
+namespace {
+   template<typename T>
+   std::vector<uint8_t>
+   bytes(const T& x) {
+      return { (uint8_t *)&x, (uint8_t *)&x + sizeof(x) };
+   }
+
+   ///
+   /// Transform buffer \a v from the native byte order into the byte
+   /// order specified by \a e.
+   ///
+   template<typename T>
+   void
+   byteswap(T &v, pipe_endian e) {
+      if (PIPE_ENDIAN_NATIVE != e)
+         std::reverse(v.begin(), v.end());
+   }
+
+   ///
+   /// Pad buffer \a v to the next multiple of \a n.
+   ///
+   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 (PIPE_ENDIAN_NATIVE == PIPE_ENDIAN_LITTLE)
+         return s.back() & 0x80;
+      else
+         return s.front() & 0x80;
+   }
+
+   ///
+   /// Resize buffer \a v to size \a n using sign or zero extension
+   /// according to \a ext.
+   ///
+   template<typename T>
+   void
+   extend(T &v, enum module::argument::ext_type ext, size_t n) {
+      const size_t m = std::min(v.size(), n);
+      const bool sign_ext = (ext == module::argument::sign_ext);
+      const uint8_t fill = (sign_ext && msb(v) ? ~0 : 0);
+      T w(n, fill);
+
+      if (PIPE_ENDIAN_NATIVE == PIPE_ENDIAN_LITTLE)
+         std::copy_n(v.begin(), m, w.begin());
+      else
+         std::copy_n(v.end() - m, m, w.end() - m);
+
+      std::swap(v, w);
+   }
+
+   ///
+   /// Append buffer \a w to \a v.
+   ///
+   template<typename T>
+   void
+   insert(T &v, const T &w) {
+      v.insert(v.end(), w.begin(), w.end());
+   }
+
+   ///
+   /// Append \a n elements to the end of buffer \a v.
+   ///
+   template<typename T>
+   size_t
+   allocate(T &v, size_t n) {
+      size_t pos = v.size();
+      v.resize(pos + n);
+      return pos;
+   }
+}
+
 kernel::kernel(clover::program &prog, const std::string &name,
                const std::vector<module::argument> &margs) :
    program(prog), _name(name), exec(*this) {
@@ -77,6 +153,10 @@ kernel::launch(command_queue &q,
          return (uint32_t *)&exec.input[h];
       }, exec.g_handles);
 
+   // Implicit arguments
+   auto dims = bytes(cl_uint(block_size.size()));
+   byteswap(dims, q.device().endianness());
+
    q.pipe->bind_compute_state(q.pipe, st);
    q.pipe->bind_sampler_states(q.pipe, PIPE_SHADER_COMPUTE,
                                0, exec.samplers.size(),
@@ -89,11 +169,15 @@ kernel::launch(command_queue &q,
    q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(),
                               exec.g_buffers.data(), g_handles.data());
 
+   // Create local copy for implicit arguments
+   auto local_input = exec.input;
+   insert(local_input, dims);
+
    q.pipe->launch_grid(q.pipe,
                        pad_vector(q, block_size, 1).data(),
                        pad_vector(q, reduced_grid_size, 1).data(),
                        find(name_equals(_name), m.syms).offset,
-                       exec.input.data(), exec.input.size());
+                       local_input.data(), local_input.size());
 
    q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(), NULL, NULL);
    q.pipe->set_compute_resources(q.pipe, 0, exec.resources.size(), NULL);
@@ -206,82 +290,6 @@ kernel::exec_context::unbind() {
    mem_local = 0;
 }
 
-namespace {
-   template<typename T>
-   std::vector<uint8_t>
-   bytes(const T& x) {
-      return { (uint8_t *)&x, (uint8_t *)&x + sizeof(x) };
-   }
-
-   ///
-   /// Transform buffer \a v from the native byte order into the byte
-   /// order specified by \a e.
-   ///
-   template<typename T>
-   void
-   byteswap(T &v, pipe_endian e) {
-      if (PIPE_ENDIAN_NATIVE != e)
-         std::reverse(v.begin(), v.end());
-   }
-
-   ///
-   /// Pad buffer \a v to the next multiple of \a n.
-   ///
-   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 (PIPE_ENDIAN_NATIVE == PIPE_ENDIAN_LITTLE)
-         return s.back() & 0x80;
-      else
-         return s.front() & 0x80;
-   }
-
-   ///
-   /// Resize buffer \a v to size \a n using sign or zero extension
-   /// according to \a ext.
-   ///
-   template<typename T>
-   void
-   extend(T &v, enum module::argument::ext_type ext, size_t n) {
-      const size_t m = std::min(v.size(), n);
-      const bool sign_ext = (ext == module::argument::sign_ext);
-      const uint8_t fill = (sign_ext && msb(v) ? ~0 : 0);
-      T w(n, fill);
-
-      if (PIPE_ENDIAN_NATIVE == PIPE_ENDIAN_LITTLE)
-         std::copy_n(v.begin(), m, w.begin());
-      else
-         std::copy_n(v.end() - m, m, w.end() - m);
-
-      std::swap(v, w);
-   }
-
-   ///
-   /// Append buffer \a w to \a v.
-   ///
-   template<typename T>
-   void
-   insert(T &v, const T &w) {
-      v.insert(v.end(), w.begin(), w.end());
-   }
-
-   ///
-   /// Append \a n elements to the end of buffer \a v.
-   ///
-   template<typename T>
-   size_t
-   allocate(T &v, size_t n) {
-      size_t pos = v.size();
-      v.resize(pos + n);
-      return pos;
-   }
-}
-
 kernel::argument::argument() : _set(false) {
 }
 
-- 
1.9.3



More information about the mesa-dev mailing list