clover: Simplify command_queue::flush().
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 16 Sep 2013 06:04:28 +0000 (23:04 -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/core/queue.cpp
src/gallium/state_trackers/clover/core/queue.hpp

index 084e3c3f734967ca6ea02410c8660987f3cbd072..3a8ccabb26974282a524f218ea2bdfdd977dac3a 100644 (file)
@@ -20,8 +20,6 @@
 // OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#include <algorithm>
-
 #include "core/queue.hpp"
 #include "core/event.hpp"
 #include "pipe/p_screen.h"
@@ -47,16 +45,15 @@ command_queue::flush() {
    pipe_fence_handle *fence = NULL;
 
    if (!queued_events.empty()) {
-      // Find out which events have already been signalled.
-      auto first = queued_events.begin();
-      auto last = std::find_if(queued_events.begin(), queued_events.end(),
-                               [](event_ptr &ev) { return !ev->signalled(); });
-
-      // Flush and fence them.
       pipe->flush(pipe, &fence, 0);
-      std::for_each(first, last, [&](event_ptr &ev) { ev->fence(fence); });
+
+      while (!queued_events.empty() &&
+             queued_events.front()->signalled()) {
+         queued_events.front()->fence(fence);
+         queued_events.pop_front();
+      }
+
       screen->fence_reference(screen, &fence, NULL);
-      queued_events.erase(first, last);
    }
 }
 
index 671eaf7bddfde2bd0577b3d6fa17575af85e3afd..e3c4ceb774463debfec1f23bf2fa19120932eb0a 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef CLOVER_CORE_QUEUE_HPP
 #define CLOVER_CORE_QUEUE_HPP
 
+#include <deque>
+
 #include "core/object.hpp"
 #include "core/context.hpp"
 #include "core/timestamp.hpp"
@@ -69,7 +71,7 @@ namespace clover {
       pipe_context *pipe;
 
       typedef ref_ptr<hard_event> event_ptr;
-      std::vector<event_ptr> queued_events;
+      std::deque<event_ptr> queued_events;
    };
 }