Mesa (master): clover: Don' t try to build programs created from a binary again.

Francisco Jerez currojerez at kemper.freedesktop.org
Wed Jan 15 15:52:51 UTC 2014


Module: Mesa
Branch: master
Commit: 5662602ba050a43a01c1e06bdfeea83ec792852e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5662602ba050a43a01c1e06bdfeea83ec792852e

Author: Francisco Jerez <currojerez at riseup.net>
Date:   Tue Jan 14 21:55:29 2014 +0100

clover: Don't try to build programs created from a binary again.

According to the spec it's allowed to call clBuildProgram() on a
program created from a user-specified binary.  We don't need to do
anything to build the program in that case.

Reported-and-tested-by: "Dorrington, Albert" <albert.dorrington at lmco.com>

---

 src/gallium/state_trackers/clover/core/program.cpp |   40 ++++++++++----------
 src/gallium/state_trackers/clover/core/program.hpp |    1 +
 2 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp
index 6d4a9ba..fb7e8d1 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -26,13 +26,13 @@
 using namespace clover;
 
 program::program(context &ctx, const std::string &source) :
-   ctx(ctx), _source(source) {
+   has_source(true), ctx(ctx), _source(source) {
 }
 
 program::program(context &ctx,
                  const ref_vector<device> &devs,
                  const std::vector<module> &binaries) :
-   ctx(ctx) {
+   has_source(false), ctx(ctx) {
    for_each([&](device &dev, const module &bin) {
          _binaries.insert({ &dev, bin });
       },
@@ -41,23 +41,25 @@ program::program(context &ctx,
 
 void
 program::build(const ref_vector<device> &devs, const char *opts) {
-   for (auto &dev : devs) {
-      _binaries.erase(&dev);
-      _logs.erase(&dev);
-      _opts.erase(&dev);
-
-      _opts.insert({ &dev, opts });
-
-      try {
-         auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
-                        compile_program_tgsi(_source) :
-                        compile_program_llvm(_source, dev.ir_format(),
-                                             dev.ir_target(), build_opts(dev)));
-         _binaries.insert({ &dev, module });
-
-      } catch (build_error &e) {
-         _logs.insert({ &dev, e.what() });
-         throw;
+   if (has_source) {
+      for (auto &dev : devs) {
+         _binaries.erase(&dev);
+         _logs.erase(&dev);
+         _opts.erase(&dev);
+
+         _opts.insert({ &dev, opts });
+
+         try {
+            auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
+                           compile_program_tgsi(_source) :
+                           compile_program_llvm(_source, dev.ir_format(),
+                                                dev.ir_target(), build_opts(dev)));
+            _binaries.insert({ &dev, module });
+
+         } catch (build_error &e) {
+            _logs.insert({ &dev, e.what() });
+            throw;
+         }
       }
    }
 }
diff --git a/src/gallium/state_trackers/clover/core/program.hpp b/src/gallium/state_trackers/clover/core/program.hpp
index 25ec239..d36982c 100644
--- a/src/gallium/state_trackers/clover/core/program.hpp
+++ b/src/gallium/state_trackers/clover/core/program.hpp
@@ -49,6 +49,7 @@ namespace clover {
 
       void build(const ref_vector<device> &devs, const char *opts);
 
+      const bool has_source;
       const std::string &source() const;
 
       device_range devices() const;




More information about the mesa-commit mailing list