[Mesa-dev] [PATCH 3/6] st/clover: Unreference fences as early as possible
Niels Ole Salscheider
niels_ole at salscheider-online.de
Fri Aug 9 02:59:27 PDT 2013
This makes sure that there are not too many concurrent fences.
Also, simplify status handling by keeping track of the current state.
Signed-off-by: Niels Ole Salscheider <niels_ole at salscheider-online.de>
---
src/gallium/state_trackers/clover/core/event.cpp | 29 +++++++++++++++---------
src/gallium/state_trackers/clover/core/event.hpp | 12 +++++-----
2 Dateien geändert, 24 Zeilen hinzugefügt(+), 17 Zeilen entfernt(-)
diff --git a/src/gallium/state_trackers/clover/core/event.cpp b/src/gallium/state_trackers/clover/core/event.cpp
index cbb97bf..13e8130 100644
--- a/src/gallium/state_trackers/clover/core/event.cpp
+++ b/src/gallium/state_trackers/clover/core/event.cpp
@@ -28,7 +28,7 @@ using namespace clover;
_cl_event::_cl_event(clover::context &ctx,
std::vector<clover::event *> deps,
action action_ok, action action_fail) :
- ctx(ctx), __status(0), wait_count(1),
+ ctx(ctx), __status(CL_QUEUED), wait_count(1),
action_ok(action_ok), action_fail(action_fail) {
for (auto ev : deps)
ev->chain(this);
@@ -114,6 +114,7 @@ hard_event::trigger() {
pipe->end_query(pipe, __query_end);
__ts_submit = screen->get_timestamp(screen);
}
+ __status = CL_SUBMITTED;
while (!__chain.empty()) {
__chain.back()->trigger();
@@ -123,20 +124,21 @@ hard_event::trigger() {
}
cl_int
-hard_event::status() const {
+hard_event::status() {
pipe_screen *screen = queue()->dev.pipe;
- if (__status < 0)
+ if (__status != CL_SUBMITTED)
return __status;
- else if (!__fence)
- return CL_QUEUED;
-
- else if (!screen->fence_signalled(screen, __fence))
+ else if (__fence && !screen->fence_signalled(screen, __fence))
return CL_SUBMITTED;
- else
+ else {
+ if (__fence)
+ screen->fence_reference(screen, &__fence, NULL);
+ __status = CL_COMPLETE;
return CL_COMPLETE;
+ }
}
cl_command_queue
@@ -150,15 +152,20 @@ hard_event::command() const {
}
void
-hard_event::wait() const {
+hard_event::wait() {
pipe_screen *screen = queue()->dev.pipe;
if (status() == CL_QUEUED)
queue()->flush();
+ if (status() == CL_COMPLETE)
+ return;
+
if (!__fence ||
!screen->fence_finish(screen, __fence, PIPE_TIMEOUT_INFINITE))
throw error(CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
+ screen->fence_reference(screen, &__fence, NULL);
+ __status = CL_COMPLETE;
}
cl_ulong
@@ -231,7 +238,7 @@ soft_event::trigger() {
}
cl_int
-soft_event::status() const {
+soft_event::status() {
if (__status < 0)
return __status;
@@ -256,7 +263,7 @@ soft_event::command() const {
}
void
-soft_event::wait() const {
+soft_event::wait() {
for (auto ev : deps)
ev->wait();
diff --git a/src/gallium/state_trackers/clover/core/event.hpp b/src/gallium/state_trackers/clover/core/event.hpp
index de92de0..611b233 100644
--- a/src/gallium/state_trackers/clover/core/event.hpp
+++ b/src/gallium/state_trackers/clover/core/event.hpp
@@ -61,10 +61,10 @@ public:
void abort(cl_int status);
bool signalled() const;
- virtual cl_int status() const = 0;
+ virtual cl_int status() = 0;
virtual cl_command_queue queue() const = 0;
virtual cl_command_type command() const = 0;
- virtual void wait() const = 0;
+ virtual void wait() = 0;
clover::context &ctx;
@@ -101,10 +101,10 @@ namespace clover {
virtual void trigger();
- virtual cl_int status() const;
+ virtual cl_int status();
virtual cl_command_queue queue() const;
virtual cl_command_type command() const;
- virtual void wait() const;
+ virtual void wait();
cl_ulong ts_queued() const;
cl_ulong ts_submit() const;
@@ -138,10 +138,10 @@ namespace clover {
virtual void trigger();
- virtual cl_int status() const;
+ virtual cl_int status();
virtual cl_command_queue queue() const;
virtual cl_command_type command() const;
- virtual void wait() const;
+ virtual void wait();
};
}
--
1.7.11.7
More information about the mesa-dev
mailing list