Mesa (master): clover: Pull the stride from pipe_transfer for image maps

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Sep 20 14:42:33 UTC 2020


Module: Mesa
Branch: master
Commit: afa5c2e993494fbd2b11f9726c0cfcf311784f99
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=afa5c2e993494fbd2b11f9726c0cfcf311784f99

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Mon Aug 31 16:43:40 2020 -0500

clover: Pull the stride from pipe_transfer for image maps

Reviewed-by: Francisco Jerez <currojerez at riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6578>

---

 src/gallium/frontends/clover/api/transfer.cpp  | 77 +++++++++++++++++---------
 src/gallium/frontends/clover/core/resource.cpp | 10 ++++
 src/gallium/frontends/clover/core/resource.hpp |  2 +
 3 files changed, 63 insertions(+), 26 deletions(-)

diff --git a/src/gallium/frontends/clover/api/transfer.cpp b/src/gallium/frontends/clover/api/transfer.cpp
index 0e39d976a89..aa21b001ce4 100644
--- a/src/gallium/frontends/clover/api/transfer.cpp
+++ b/src/gallium/frontends/clover/api/transfer.cpp
@@ -204,31 +204,57 @@ namespace {
    /// convertible to \a void *.
    ///
    template<typename T>
-   struct _map {
-      static mapping
-      get(command_queue &q, T obj, cl_map_flags flags,
-          size_t offset, size_t size) {
-         return { q, obj->resource(q), flags, true,
-                  {{ offset }}, {{ size, 1, 1 }} };
+   struct _map;
+
+   template<>
+   struct _map<image*> {
+      _map(command_queue &q, image *img, cl_map_flags flags,
+           vector_t offset, vector_t pitch, vector_t region) :
+         map(q, img->resource(q), flags, true, offset, region),
+         pitch(map.pitch())
+      { }
+
+      template<typename T>
+      operator T *() const {
+         return static_cast<T *>(map);
       }
+
+      mapping map;
+      vector_t pitch;
    };
 
    template<>
-   struct _map<void *> {
-      static void *
-      get(command_queue &q, void *obj, cl_map_flags flags,
-          size_t offset, size_t size) {
-         return (char *)obj + offset;
+   struct _map<buffer*> {
+      _map(command_queue &q, buffer *mem, cl_map_flags flags,
+           vector_t offset, vector_t pitch, vector_t region) :
+         map(q, mem->resource(q), flags, true,
+             {{ dot(pitch, offset) }}, {{ size(pitch, region) }}),
+         pitch(pitch)
+      { }
+
+      template<typename T>
+      operator T *() const {
+         return static_cast<T *>(map);
       }
+
+      mapping map;
+      vector_t pitch;
    };
 
-   template<>
-   struct _map<const void *> {
-      static const void *
-      get(command_queue &q, const void *obj, cl_map_flags flags,
-          size_t offset, size_t size) {
-         return (const char *)obj + offset;
+   template<typename P>
+   struct _map<P *> {
+      _map(command_queue &q, P *ptr, cl_map_flags flags,
+           vector_t offset, vector_t pitch, vector_t region) :
+         ptr((P *)((char *)ptr + dot(pitch, offset))), pitch(pitch)
+      { }
+
+      template<typename T>
+      operator T *() const {
+         return static_cast<T *>(ptr);
       }
+
+      P *ptr;
+      vector_t pitch;
    };
 
    ///
@@ -242,20 +268,19 @@ namespace {
                 S src_obj, const vector_t &src_orig, const vector_t &src_pitch,
                 const vector_t &region) {
       return [=, &q](event &) {
-         auto dst = _map<T>::get(q, dst_obj, CL_MAP_WRITE,
-                                 dot(dst_pitch, dst_orig),
-                                 size(dst_pitch, region));
-         auto src = _map<S>::get(q, src_obj, CL_MAP_READ,
-                                 dot(src_pitch, src_orig),
-                                 size(src_pitch, region));
+         _map<T> dst = { q, dst_obj, CL_MAP_WRITE,
+                         dst_orig, dst_pitch, region };
+         _map<S> src = { q, src_obj, CL_MAP_READ,
+                         src_orig, src_pitch, region };
+         assert(src.pitch[0] == dst.pitch[0]);
          vector_t v = {};
 
          for (v[2] = 0; v[2] < region[2]; ++v[2]) {
             for (v[1] = 0; v[1] < region[1]; ++v[1]) {
                std::memcpy(
-                  static_cast<char *>(dst) + dot(dst_pitch, v),
-                  static_cast<const char *>(src) + dot(src_pitch, v),
-                  src_pitch[0] * region[0]);
+                  static_cast<char *>(dst) + dot(dst.pitch, v),
+                  static_cast<const char *>(src) + dot(src.pitch, v),
+                  src.pitch[0] * region[0]);
             }
          }
       };
diff --git a/src/gallium/frontends/clover/core/resource.cpp b/src/gallium/frontends/clover/core/resource.cpp
index c3c6cce5f3b..89125c7656d 100644
--- a/src/gallium/frontends/clover/core/resource.cpp
+++ b/src/gallium/frontends/clover/core/resource.cpp
@@ -235,3 +235,13 @@ mapping::operator=(mapping m) {
    std::swap(p, m.p);
    return *this;
 }
+
+resource::vector
+mapping::pitch() const
+{
+   return {
+      util_format_get_blocksize(pres->format),
+      pxfer->stride,
+      pxfer->layer_stride,
+   };
+}
diff --git a/src/gallium/frontends/clover/core/resource.hpp b/src/gallium/frontends/clover/core/resource.hpp
index 208016dd132..009e42f0769 100644
--- a/src/gallium/frontends/clover/core/resource.hpp
+++ b/src/gallium/frontends/clover/core/resource.hpp
@@ -125,6 +125,8 @@ namespace clover {
          return (T *)p;
       }
 
+      resource::vector pitch() const;
+
    private:
       pipe_context *pctx;
       pipe_transfer *pxfer;



More information about the mesa-commit mailing list