gallium: add flags parameter to pipe_screen::context_create
[mesa.git] / src / gallium / state_trackers / clover / core / queue.cpp
index 95b02d7c05f29c261b2fbd79c77a8536d6ab8f60..4aaf67de2411b6572c32e114882be3b85f53e684 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"
 
 using namespace clover;
 
-_cl_command_queue::_cl_command_queue(context &ctx, device &dev,
-                                     cl_command_queue_properties props) :
-   ctx(ctx), dev(dev), __props(props) {
-   pipe = dev.pipe->context_create(dev.pipe, NULL);
+command_queue::command_queue(clover::context &ctx, clover::device &dev,
+                             cl_command_queue_properties props) :
+   context(ctx), device(dev), props(props) {
+   pipe = dev.pipe->context_create(dev.pipe, NULL, PIPE_CONTEXT_COMPUTE_ONLY);
    if (!pipe)
       throw error(CL_INVALID_DEVICE);
 }
 
-_cl_command_queue::~_cl_command_queue() {
+command_queue::~command_queue() {
    pipe->destroy(pipe);
 }
 
 void
-_cl_command_queue::flush() {
-   pipe_screen *screen = dev.pipe;
+command_queue::flush() {
+   pipe_screen *screen = device().pipe;
    pipe_fence_handle *fence = NULL;
 
+   std::lock_guard<std::mutex> lock(queued_events_mutex);
    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(); });
+      pipe->flush(pipe, &fence, 0);
+
+      while (!queued_events.empty() &&
+             queued_events.front()().signalled()) {
+         queued_events.front()().fence(fence);
+         queued_events.pop_front();
+      }
 
-      // Flush and fence them.
-      pipe->flush(pipe, &fence, (enum pipe_flush_flags)0);
-      std::for_each(first, last, [&](event_ptr &ev) { ev->fence(fence); });
       screen->fence_reference(screen, &fence, NULL);
-      queued_events.erase(first, last);
    }
 }
 
+cl_command_queue_properties
+command_queue::properties() const {
+   return props;
+}
+
+bool
+command_queue::profiling_enabled() const {
+   return props & CL_QUEUE_PROFILING_ENABLE;
+}
+
 void
-_cl_command_queue::sequence(clover::hard_event *ev) {
+command_queue::sequence(hard_event &ev) {
+   std::lock_guard<std::mutex> lock(queued_events_mutex);
    if (!queued_events.empty())
-      queued_events.back()->chain(ev);
+      queued_events.back()().chain(ev);
 
    queued_events.push_back(ev);
 }