clover: support custom driver strides
authorKarol Herbst <kherbst@redhat.com>
Wed, 14 Oct 2020 23:19:57 +0000 (01:19 +0200)
committerKarol Herbst <kherbst@redhat.com>
Tue, 20 Oct 2020 21:46:42 +0000 (23:46 +0200)
This is required by llvmpipe as it sets explicit strides on buffers and
textures.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7069>

src/gallium/frontends/clover/api/transfer.cpp
src/gallium/frontends/clover/core/resource.cpp
src/gallium/frontends/clover/core/resource.hpp

index 1d9663a..bb9133c 100644 (file)
@@ -806,7 +806,7 @@ clEnqueueMapBuffer(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
    validate_object(q, mem, obj_origin, obj_pitch, region);
    validate_map_flags(mem, flags);
 
-   void *map = mem.resource_in(q).add_map(q, flags, blocking, obj_origin, region);
+   auto *map = mem.resource_in(q).add_map(q, flags, blocking, obj_origin, region);
 
    auto hev = create<hard_event>(q, CL_COMMAND_MAP_BUFFER, deps);
    if (blocking)
@@ -814,7 +814,7 @@ clEnqueueMapBuffer(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
 
    ret_object(rd_ev, hev);
    ret_error(r_errcode, CL_SUCCESS);
-   return map;
+   return *map;
 
 } catch (error &e) {
    ret_error(r_errcode, e);
@@ -844,7 +844,10 @@ clEnqueueMapImage(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
    if (img.slice_pitch() && !slice_pitch)
       throw error(CL_INVALID_VALUE);
 
-   void *map = img.resource_in(q).add_map(q, flags, blocking, origin, region);
+   auto *map = img.resource_in(q).add_map(q, flags, blocking, origin, region);
+   *row_pitch = map->pitch()[1];
+   if (slice_pitch)
+      *slice_pitch = map->pitch()[2];
 
    auto hev = create<hard_event>(q, CL_COMMAND_MAP_IMAGE, deps);
    if (blocking)
@@ -852,7 +855,7 @@ clEnqueueMapImage(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
 
    ret_object(rd_ev, hev);
    ret_error(r_errcode, CL_SUCCESS);
-   return map;
+   return *map;
 
 } catch (error &e) {
    ret_error(r_errcode, e);
index 4315204..e0f151c 100644 (file)
@@ -79,11 +79,11 @@ resource::clear(command_queue &q, const vector &origin, const vector &region,
    }
 }
 
-void *
+mapping *
 resource::add_map(command_queue &q, cl_map_flags flags, bool blocking,
                   const vector &origin, const vector &region) {
    maps.emplace_back(q, *this, flags, blocking, origin, region);
-   return maps.back();
+   return &maps.back();
 }
 
 void
index 562f410..facf31e 100644 (file)
@@ -53,8 +53,8 @@ namespace clover {
       void clear(command_queue &q, const vector &origin, const vector &region,
                  const std::string &data);
 
-      void *add_map(command_queue &q, cl_map_flags flags, bool blocking,
-                    const vector &origin, const vector &region);
+      mapping *add_map(command_queue &q, cl_map_flags flags, bool blocking,
+                       const vector &origin, const vector &region);
       void del_map(void *p);
       unsigned map_count() const;