tu: Implement fallback linear staging blit for CopyImage
[mesa.git] / src / gallium / state_trackers / clover / core / memory.cpp
index 742e3d3106a1f8aa9a0ba64fa216e2a3f5bd4b40..ed13d92c281e34610c58e6edfa7ebec877c40760 100644 (file)
 
 #include "core/memory.hpp"
 #include "core/resource.hpp"
+#include "util/format/u_format.h"
 
 using namespace clover;
 
-_cl_mem::_cl_mem(clover::context &ctx, cl_mem_flags flags,
-                 size_t size, void *host_ptr) :
-   ctx(ctx), _flags(flags),
-   _size(size), _host_ptr(host_ptr),
-   _destroy_notify([]{}) {
+memory_obj::memory_obj(clover::context &ctx, cl_mem_flags flags,
+                       size_t size, void *host_ptr) :
+   context(ctx), _flags(flags),
+   _size(size), _host_ptr(host_ptr) {
    if (flags & CL_MEM_COPY_HOST_PTR)
       data.append((char *)host_ptr, size);
 }
 
-_cl_mem::~_cl_mem() {
-   _destroy_notify();
+memory_obj::~memory_obj() {
+   while (_destroy_notify.size()) {
+      _destroy_notify.top()();
+      _destroy_notify.pop();
+   }
+}
+
+bool
+memory_obj::operator==(const memory_obj &obj) const {
+   return this == &obj;
 }
 
 void
-_cl_mem::destroy_notify(std::function<void ()> f) {
-   _destroy_notify = f;
+memory_obj::destroy_notify(std::function<void ()> f) {
+   _destroy_notify.push(f);
 }
 
 cl_mem_flags
-_cl_mem::flags() const {
+memory_obj::flags() const {
    return _flags;
 }
 
 size_t
-_cl_mem::size() const {
+memory_obj::size() const {
    return _size;
 }
 
 void *
-_cl_mem::host_ptr() const {
+memory_obj::host_ptr() const {
    return _host_ptr;
 }
 
@@ -73,40 +81,41 @@ root_buffer::root_buffer(clover::context &ctx, cl_mem_flags flags,
    buffer(ctx, flags, size, host_ptr) {
 }
 
-clover::resource &
-root_buffer::resource(cl_command_queue q) {
+resource &
+root_buffer::resource(command_queue &q) {
    // Create a new resource if there's none for this device yet.
-   if (!resources.count(&q->dev)) {
+   if (!resources.count(&q.device())) {
       auto r = (!resources.empty() ?
-                new root_resource(q->dev, *this, *resources.begin()->second) :
-                new root_resource(q->dev, *this, *q, data));
+                new root_resource(q.device(), *this,
+                                  *resources.begin()->second) :
+                new root_resource(q.device(), *this, q, data));
 
-      resources.insert(std::make_pair(&q->dev,
+      resources.insert(std::make_pair(&q.device(),
                                       std::unique_ptr<root_resource>(r)));
       data.clear();
    }
 
-   return *resources.find(&q->dev)->second;
+   return *resources.find(&q.device())->second;
 }
 
-sub_buffer::sub_buffer(clover::root_buffer &parent, cl_mem_flags flags,
+sub_buffer::sub_buffer(root_buffer &parent, cl_mem_flags flags,
                        size_t offset, size_t size) :
-   buffer(parent.ctx, flags, size,
+   buffer(parent.context(), flags, size,
           (char *)parent.host_ptr() + offset),
    parent(parent), _offset(offset) {
 }
 
-clover::resource &
-sub_buffer::resource(cl_command_queue q) {
+resource &
+sub_buffer::resource(command_queue &q) {
    // Create a new resource if there's none for this device yet.
-   if (!resources.count(&q->dev)) {
-      auto r = new sub_resource(parent.resource(q), {{ offset() }});
+   if (!resources.count(&q.device())) {
+      auto r = new sub_resource(parent().resource(q), {{ offset() }});
 
-      resources.insert(std::make_pair(&q->dev,
+      resources.insert(std::make_pair(&q.device(),
                                       std::unique_ptr<sub_resource>(r)));
    }
 
-   return *resources.find(&q->dev)->second;
+   return *resources.find(&q.device())->second;
 }
 
 size_t
@@ -124,20 +133,21 @@ image::image(clover::context &ctx, cl_mem_flags flags,
    _row_pitch(row_pitch), _slice_pitch(slice_pitch) {
 }
 
-clover::resource &
-image::resource(cl_command_queue q) {
+resource &
+image::resource(command_queue &q) {
    // Create a new resource if there's none for this device yet.
-   if (!resources.count(&q->dev)) {
+   if (!resources.count(&q.device())) {
       auto r = (!resources.empty() ?
-                new root_resource(q->dev, *this, *resources.begin()->second) :
-                new root_resource(q->dev, *this, *q, data));
+                new root_resource(q.device(), *this,
+                                  *resources.begin()->second) :
+                new root_resource(q.device(), *this, q, data));
 
-      resources.insert(std::make_pair(&q->dev,
+      resources.insert(std::make_pair(&q.device(),
                                       std::unique_ptr<root_resource>(r)));
       data.clear();
    }
 
-   return *resources.find(&q->dev)->second;
+   return *resources.find(&q.device())->second;
 }
 
 cl_image_format
@@ -160,6 +170,11 @@ image::depth() const {
    return _depth;
 }
 
+size_t
+image::pixel_size() const {
+   return util_format_get_blocksize(translate_format(_format));
+}
+
 size_t
 image::row_pitch() const {
    return _row_pitch;
@@ -174,7 +189,7 @@ image2d::image2d(clover::context &ctx, cl_mem_flags flags,
                  const cl_image_format *format, size_t width,
                  size_t height, size_t row_pitch,
                  void *host_ptr) :
-   image(ctx, flags, format, width, height, 0,
+   image(ctx, flags, format, width, height, 1,
          row_pitch, 0, height * row_pitch, host_ptr) {
 }