clover: use pipe_resource references
authorJan Vesely <jan.vesely@rutgers.edu>
Thu, 2 Mar 2017 00:45:03 +0000 (19:45 -0500)
committerJan Vesely <jan.vesely@rutgers.edu>
Fri, 24 Mar 2017 19:57:47 +0000 (15:57 -0400)
v2: buffers are created with one reference.
v3: add pipe_resource reference to mapping object
v4: rename to pres and drop inline initializers

CC: "17.0 13.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/gallium/state_trackers/clover/core/resource.cpp
src/gallium/state_trackers/clover/core/resource.hpp

index 06fd3f608fa7dd28eb93e8f80c398dd8f3d79241..28fba1ac1ad6c72d522a2f17151276d841d367ca 100644 (file)
@@ -25,6 +25,7 @@
 #include "pipe/p_screen.h"
 #include "util/u_sampler.h"
 #include "util/u_format.h"
+#include "util/u_inlines.h"
 
 using namespace clover;
 
@@ -176,7 +177,7 @@ root_resource::root_resource(clover::device &dev, memory_obj &obj,
 }
 
 root_resource::~root_resource() {
-   device().pipe->resource_destroy(device().pipe, pipe);
+   pipe_resource_reference(&this->pipe, NULL);
 }
 
 sub_resource::sub_resource(resource &r, const vector &offset) :
@@ -189,7 +190,7 @@ mapping::mapping(command_queue &q, resource &r,
                  cl_map_flags flags, bool blocking,
                  const resource::vector &origin,
                  const resource::vector &region) :
-   pctx(q.pipe) {
+   pctx(q.pipe), pres(NULL) {
    unsigned usage = ((flags & CL_MAP_WRITE ? PIPE_TRANSFER_WRITE : 0 ) |
                      (flags & CL_MAP_READ ? PIPE_TRANSFER_READ : 0 ) |
                      (flags & CL_MAP_WRITE_INVALIDATE_REGION ?
@@ -202,12 +203,14 @@ mapping::mapping(command_queue &q, resource &r,
       pxfer = NULL;
       throw error(CL_OUT_OF_RESOURCES);
    }
+   pipe_resource_reference(&pres, r.pipe);
 }
 
 mapping::mapping(mapping &&m) :
-   pctx(m.pctx), pxfer(m.pxfer), p(m.p) {
+   pctx(m.pctx), pxfer(m.pxfer), pres(m.pres), p(m.p) {
    m.pctx = NULL;
    m.pxfer = NULL;
+   m.pres = NULL;
    m.p = NULL;
 }
 
@@ -215,12 +218,14 @@ mapping::~mapping() {
    if (pxfer) {
       pctx->transfer_unmap(pctx, pxfer);
    }
+   pipe_resource_reference(&pres, NULL);
 }
 
 mapping &
 mapping::operator=(mapping m) {
    std::swap(pctx, m.pctx);
    std::swap(pxfer, m.pxfer);
+   std::swap(pres, m.pres);
    std::swap(p, m.p);
    return *this;
 }
index 9993dcb5857171386f101137fdd0fbfd8c061a4d..3b994b4008badd43559fb9d447947f3fd82a87f7 100644 (file)
@@ -125,6 +125,7 @@ namespace clover {
    private:
       pipe_context *pctx;
       pipe_transfer *pxfer;
+      pipe_resource *pres;
       void *p;
    };
 }