clover: Clean up the interface of the context object slightly.
authorFrancisco Jerez <currojerez@riseup.net>
Tue, 17 Sep 2013 04:38:32 +0000 (21:38 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 21 Oct 2013 17:47:03 +0000 (10:47 -0700)
Tested-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/state_trackers/clover/api/context.cpp
src/gallium/state_trackers/clover/api/program.cpp
src/gallium/state_trackers/clover/api/queue.cpp
src/gallium/state_trackers/clover/core/context.cpp
src/gallium/state_trackers/clover/core/context.hpp
src/gallium/state_trackers/clover/core/format.cpp

index 98bc2141e1165259a27280eab73917f9c1526947..c6c71ceb92fa5c288edaf5e63d3ea866acf1756d 100644 (file)
@@ -111,11 +111,11 @@ clGetContextInfo(cl_context d_ctx, cl_context_info param,
       break;
 
    case CL_CONTEXT_NUM_DEVICES:
-      buf.as_scalar<cl_uint>() = ctx.devs.size();
+      buf.as_scalar<cl_uint>() = ctx.devs().size();
       break;
 
    case CL_CONTEXT_DEVICES:
-      buf.as_vector<cl_device_id>() = descs(map(derefs(), ctx.devs));
+      buf.as_vector<cl_device_id>() = descs(ctx.devs());
       break;
 
    case CL_CONTEXT_PROPERTIES:
index 84260472953030f24fcc45e420efd571d12e64da..45640424a0d4884ad169c7d0732f0ffbd3cd1f58 100644 (file)
@@ -63,8 +63,8 @@ clCreateProgramWithBinary(cl_context d_ctx, cl_uint n,
    if (!lengths || !binaries)
       throw error(CL_INVALID_VALUE);
 
-   if (any_of([&](device &dev) {
-            return !ctx.has_device(dev);
+   if (any_of([&](const device &dev) {
+            return !count(dev, ctx.devs());
          }, devs))
       throw error(CL_INVALID_DEVICE);
 
@@ -133,15 +133,15 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
                void *user_data) try {
    auto &prog = obj(d_prog);
    auto devs = (d_devs ? objs(d_devs, num_devs) :
-                ref_vector<device>(map(derefs(), prog.ctx.devs)));
+                ref_vector<device>(prog.ctx.devs()));
    auto opts = (p_opts ? p_opts : "");
 
    if (bool(num_devs) != bool(d_devs) ||
        (!pfn_notify && user_data))
       throw error(CL_INVALID_VALUE);
 
-   if (any_of([&](device &dev) {
-            return !prog.ctx.has_device(dev);
+   if (any_of([&](const device &dev) {
+            return !count(dev, prog.ctx.devs());
          }, devs))
       throw error(CL_INVALID_DEVICE);
 
@@ -224,7 +224,7 @@ clGetProgramBuildInfo(cl_program d_prog, cl_device_id d_dev,
    auto &prog = obj(d_prog);
    auto &dev = obj(d_dev);
 
-   if (!prog.ctx.has_device(dev))
+   if (!count(dev, prog.ctx.devs()))
       return CL_INVALID_DEVICE;
 
    switch (param) {
index b68dfa1f62a6d13bf0a79742abd6d410ec8dcaa9..0fdb7356b3513b14ea31ecc2fcb8e1afcedf4f33 100644 (file)
@@ -32,7 +32,7 @@ clCreateCommandQueue(cl_context d_ctx, cl_device_id d_dev,
    auto &ctx = obj(d_ctx);
    auto &dev = obj(d_dev);
 
-   if (!ctx.has_device(dev))
+   if (!count(dev, ctx.devs()))
       throw error(CL_INVALID_DEVICE);
 
    if (props & ~(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE |
index f4f98004790f05c6c38b9bb7681a5c35f98581c9..e2658f28cb4bbfd61f003e13a0dd892c1d2064fd 100644 (file)
 // OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#include <algorithm>
-
 #include "core/context.hpp"
 
 using namespace clover;
 
 context::context(const property_list &props,
                  const ref_vector<device> &devs) :
-   devs(map(addresses(), devs)), _props(props) {
-}
-
-bool
-context::has_device(device &dev) const {
-   return std::count(devs.begin(), devs.end(), &dev);
+   _props(props), _devs(map(addresses(), devs)) {
 }
 
 bool
@@ -50,3 +43,8 @@ const context::property_list &
 context::props() const {
    return _props;
 }
+
+context::device_range
+context::devs() const {
+   return map(derefs(), _devs);
+}
index e739f5e2ec23910cdad1861f5cee9e6ca70f8cdf..0b5cf8aede6775b060a02822ebd079cf9823eee4 100644 (file)
@@ -30,6 +30,7 @@
 namespace clover {
    class context : public ref_counter, public _cl_context {
    private:
+      typedef adaptor_range<derefs, const std::vector<device *> &> device_range;
       typedef clover::property_list<cl_context_properties> property_list;
 
    public:
@@ -39,8 +40,6 @@ namespace clover {
       context &
       operator=(const context &ctx) = delete;
 
-      bool has_device(device &dev) const;
-
       bool
       operator==(const context &ctx) const;
       bool
@@ -49,10 +48,12 @@ namespace clover {
       const property_list &
       props() const;
 
-      const std::vector<device *> devs;
+      device_range
+      devs() const;
 
    private:
       property_list _props;
+      const std::vector<clover::device *> _devs;
    };
 }
 
index 40d5ded1d768bfb59062cb97957d5f2efe1dd2d9..79582306a6093878452436200569825ba3b0f892 100644 (file)
@@ -20,8 +20,6 @@
 // OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#include <algorithm>
-
 #include "core/format.hpp"
 #include "core/memory.hpp"
 #include "pipe/p_screen.h"
@@ -154,11 +152,10 @@ namespace clover {
                            PIPE_BIND_TRANSFER_WRITE);
 
       for (auto f : formats) {
-         if (std::all_of(ctx.devs.begin(), ctx.devs.end(),
-                         [=](const device *dev) {
-                            return dev->pipe->is_format_supported(
-                               dev->pipe, f.second, target, 1, bindings);
-                         }))
+         if (all_of([=](const device &dev) {
+                  return dev.pipe->is_format_supported(
+                     dev.pipe, f.second, target, 1, bindings);
+               }, ctx.devs()))
             s.insert(f.first);
       }