EdB <edb+m...@sigluy.net> writes:

> program build should failed if there is created kernel attached to program
>
> piglit error:
> "Trigger CL_INVALID_OPERATION if there are kernel objects attached to program"
>[...]

How about doing it as follows?

From 4c18eaad1a2c741152a91379cccc5814092bf026 Mon Sep 17 00:00:00 2001
From: Francisco Jerez <curroje...@riseup.net>
Date: Sat, 16 Aug 2014 16:25:34 +0300
Subject: [PATCH] clover: Refuse to build a program if there are kernel objects
 attached to it.

Fixes piglit cl-api-build-program.
---
 src/gallium/state_trackers/clover/api/program.cpp  | 3 +++
 src/gallium/state_trackers/clover/core/kernel.cpp  | 3 ++-
 src/gallium/state_trackers/clover/core/kernel.hpp  | 1 +
 src/gallium/state_trackers/clover/core/program.cpp | 9 +++++++--
 src/gallium/state_trackers/clover/core/program.hpp | 5 +++++
 src/gallium/state_trackers/clover/util/pointer.hpp | 4 ++--
 6 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp
index b81ce69..ab6cf7c 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -167,6 +167,9 @@ clBuildProgram(cl_program d_prog, cl_uint num_devs,
          }, devs))
       throw error(CL_INVALID_DEVICE);
 
+   if (prog.kernel_ref_count())
+      throw error(CL_INVALID_OPERATION);
+
    prog.build(devs, opts);
    return CL_SUCCESS;
 
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp
index 5e5fe51..e4b2152 100644
--- a/src/gallium/state_trackers/clover/core/kernel.cpp
+++ b/src/gallium/state_trackers/clover/core/kernel.cpp
@@ -30,7 +30,8 @@ using namespace clover;
 
 kernel::kernel(clover::program &prog, const std::string &name,
                const std::vector<module::argument> &margs) :
-   program(prog), _name(name), exec(*this) {
+   program(prog), _name(name), exec(*this),
+   program_ref(prog._kernel_ref_counter) {
    for (auto &marg : margs) {
       if (marg.type == module::argument::scalar)
          _args.emplace_back(new scalar_argument(marg.size));
diff --git a/src/gallium/state_trackers/clover/core/kernel.hpp b/src/gallium/state_trackers/clover/core/kernel.hpp
index ed44485..0f699cc 100644
--- a/src/gallium/state_trackers/clover/core/kernel.hpp
+++ b/src/gallium/state_trackers/clover/core/kernel.hpp
@@ -225,6 +225,7 @@ namespace clover {
       std::vector<std::unique_ptr<argument>> _args;
       std::string _name;
       exec_context exec;
+      const intrusive_ref<ref_counter> program_ref;
    };
 }
 
diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp
index e09c3aa..30a1f0e 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -26,14 +26,14 @@
 using namespace clover;
 
 program::program(clover::context &ctx, const std::string &source) :
-   has_source(true), context(ctx), _source(source) {
+   has_source(true), context(ctx), _source(source), _kernel_ref_counter(0) {
 }
 
 program::program(clover::context &ctx,
                  const ref_vector<device> &devs,
                  const std::vector<module> &binaries) :
    has_source(false), context(ctx),
-   _devices(devs) {
+   _devices(devs), _kernel_ref_counter(0) {
    for_each([&](device &dev, const module &bin) {
          _binaries.insert({ &dev, bin });
       },
@@ -110,3 +110,8 @@ program::symbols() const {
 
    return _binaries.begin()->second.syms;
 }
+
+unsigned
+program::kernel_ref_count() const {
+   return _kernel_ref_counter.ref_count();
+}
diff --git a/src/gallium/state_trackers/clover/core/program.hpp b/src/gallium/state_trackers/clover/core/program.hpp
index 66bb99a..7cf025b 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -60,14 +60,19 @@ namespace clover {
 
       const compat::vector<module::symbol> &symbols() const;
 
+      unsigned kernel_ref_count() const;
+
       const intrusive_ref<clover::context> context;
 
+      friend class kernel;
+
    private:
       std::vector<intrusive_ref<device>> _devices;
       std::map<const device *, module> _binaries;
       std::map<const device *, std::string> _logs;
       std::map<const device *, std::string> _opts;
       std::string _source;
+      ref_counter _kernel_ref_counter;
    };
 }
 
diff --git a/src/gallium/state_trackers/clover/util/pointer.hpp b/src/gallium/state_trackers/clover/util/pointer.hpp
index 59c6e6e..b68fb58 100644
--- a/src/gallium/state_trackers/clover/util/pointer.hpp
+++ b/src/gallium/state_trackers/clover/util/pointer.hpp
@@ -31,10 +31,10 @@ namespace clover {
    ///
    class ref_counter {
    public:
-      ref_counter() : _ref_count(1) {}
+      ref_counter(unsigned x = 1) : _ref_count(x) {}
 
       unsigned
-      ref_count() {
+      ref_count() const {
          return _ref_count;
       }
 
-- 
2.0.1

Attachment: pgpTuStxIrc_x.pgp
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to