diff options
-rw-r--r-- | src/gallium/drivers/ilo/Makefile.sources | 1 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/core/ilo_fence.h | 73 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_context.c | 3 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_screen.c | 84 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_screen.h | 10 |
5 files changed, 113 insertions, 58 deletions
diff --git a/src/gallium/drivers/ilo/Makefile.sources b/src/gallium/drivers/ilo/Makefile.sources index ef79fbc64ce..6083e24f46d 100644 --- a/src/gallium/drivers/ilo/Makefile.sources +++ b/src/gallium/drivers/ilo/Makefile.sources @@ -4,6 +4,7 @@ C_SOURCES := \ core/ilo_debug.h \ core/ilo_dev.c \ core/ilo_dev.h \ + core/ilo_fence.h \ core/intel_winsys.h \ ilo_blit.c \ ilo_blit.h \ diff --git a/src/gallium/drivers/ilo/core/ilo_fence.h b/src/gallium/drivers/ilo/core/ilo_fence.h new file mode 100644 index 00000000000..00d555aa95b --- /dev/null +++ b/src/gallium/drivers/ilo/core/ilo_fence.h @@ -0,0 +1,73 @@ +/* + * Mesa 3-D graphics library + * + * Copyright (C) 2012-2013 LunarG, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Chia-I Wu <[email protected]> + */ + +#ifndef ILO_FENCE_H +#define ILO_FENCE_H + +#include "intel_winsys.h" + +#include "ilo_core.h" +#include "ilo_dev.h" + +struct ilo_fence { + struct intel_bo *seq_bo; +}; + +static inline void +ilo_fence_init(struct ilo_fence *fence, const struct ilo_dev *dev) +{ + /* no-op */ +} + +static inline void +ilo_fence_cleanup(struct ilo_fence *fence) +{ + intel_bo_unref(fence->seq_bo); +} + +/** + * Set the sequence bo for waiting. The fence is considered signaled when + * there is no sequence bo. + */ +static inline void +ilo_fence_set_seq_bo(struct ilo_fence *fence, struct intel_bo *seq_bo) +{ + intel_bo_unref(fence->seq_bo); + fence->seq_bo = intel_bo_ref(seq_bo); +} + +/** + * Wait for the fence to be signaled or until \p timeout nanoseconds has + * passed. It will wait indefinitely when \p timeout is negative. + */ +static inline bool +ilo_fence_wait(struct ilo_fence *fence, int64_t timeout) +{ + return (!fence->seq_bo || intel_bo_wait(fence->seq_bo, timeout) == 0); +} + +#endif /* ILO_FENCE_H */ diff --git a/src/gallium/drivers/ilo/ilo_context.c b/src/gallium/drivers/ilo/ilo_context.c index 5993591aca2..3d5c7b636a8 100644 --- a/src/gallium/drivers/ilo/ilo_context.c +++ b/src/gallium/drivers/ilo/ilo_context.c @@ -62,8 +62,7 @@ ilo_flush(struct pipe_context *pipe, (flags & PIPE_FLUSH_END_OF_FRAME) ? "frame end" : "user request"); if (f) { - *f = (struct pipe_fence_handle *) - ilo_fence_create(pipe->screen, ilo->cp->last_submitted_bo); + *f = ilo_screen_fence_create(pipe->screen, ilo->cp->last_submitted_bo); } } diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c index ebfb3ed24a5..039e91611b8 100644 --- a/src/gallium/drivers/ilo/ilo_screen.c +++ b/src/gallium/drivers/ilo/ilo_screen.c @@ -31,6 +31,7 @@ #include "vl/vl_decoder.h" #include "vl/vl_video_buffer.h" #include "genhw/genhw.h" /* for GEN6_REG_TIMESTAMP */ +#include "core/ilo_fence.h" #include "core/intel_winsys.h" #include "ilo_context.h" @@ -40,9 +41,10 @@ #include "ilo_public.h" #include "ilo_screen.h" -struct ilo_fence { +struct pipe_fence_handle { struct pipe_reference reference; - struct intel_bo *bo; + + struct ilo_fence fence; }; static float @@ -579,81 +581,67 @@ ilo_get_timestamp(struct pipe_screen *screen) } static void -ilo_fence_reference(struct pipe_screen *screen, - struct pipe_fence_handle **p, - struct pipe_fence_handle *f) +ilo_screen_fence_reference(struct pipe_screen *screen, + struct pipe_fence_handle **ptr, + struct pipe_fence_handle *fence) { - struct ilo_fence *fence = ilo_fence(f); - struct ilo_fence *old; + struct pipe_fence_handle *old; - if (likely(p)) { - old = ilo_fence(*p); - *p = f; + if (likely(ptr)) { + old = *ptr; + *ptr = fence; } else { old = NULL; } - STATIC_ASSERT(&((struct ilo_fence *) NULL)->reference == NULL); + STATIC_ASSERT(&((struct pipe_fence_handle *) NULL)->reference == NULL); if (pipe_reference(&old->reference, &fence->reference)) { - intel_bo_unref(old->bo); + ilo_fence_cleanup(&old->fence); FREE(old); } } static boolean -ilo_fence_signalled(struct pipe_screen *screen, - struct pipe_fence_handle *f) +ilo_screen_fence_finish(struct pipe_screen *screen, + struct pipe_fence_handle *fence, + uint64_t timeout) { - struct ilo_fence *fence = ilo_fence(f); + const int64_t wait_timeout = (timeout > INT64_MAX) ? -1 : timeout; + bool signaled; - /* mark signalled if the bo is idle */ - if (fence->bo && !intel_bo_is_busy(fence->bo)) { - intel_bo_unref(fence->bo); - fence->bo = NULL; - } + signaled = ilo_fence_wait(&fence->fence, wait_timeout); + /* XXX not thread safe */ + if (signaled) + ilo_fence_set_seq_bo(&fence->fence, NULL); - return (fence->bo == NULL); + return signaled; } static boolean -ilo_fence_finish(struct pipe_screen *screen, - struct pipe_fence_handle *f, - uint64_t timeout) +ilo_screen_fence_signalled(struct pipe_screen *screen, + struct pipe_fence_handle *fence) { - struct ilo_fence *fence = ilo_fence(f); - const int64_t wait_timeout = (timeout > INT64_MAX) ? -1 : timeout; - - /* already signalled */ - if (!fence->bo) - return true; - - /* wait and see if it returns error */ - if (intel_bo_wait(fence->bo, wait_timeout)) - return false; - - /* mark signalled */ - intel_bo_unref(fence->bo); - fence->bo = NULL; - - return true; + return ilo_screen_fence_finish(screen, fence, 0); } /** * Create a fence for \p bo. When \p bo is not NULL, it must be submitted * before waited on or checked. */ -struct ilo_fence * -ilo_fence_create(struct pipe_screen *screen, struct intel_bo *bo) +struct pipe_fence_handle * +ilo_screen_fence_create(struct pipe_screen *screen, struct intel_bo *bo) { - struct ilo_fence *fence; + struct ilo_screen *is = ilo_screen(screen); + struct pipe_fence_handle *fence; - fence = CALLOC_STRUCT(ilo_fence); + fence = CALLOC_STRUCT(pipe_fence_handle); if (!fence) return NULL; pipe_reference_init(&fence->reference, 1); - fence->bo = intel_bo_ref(bo); + ilo_fence_init(&fence->fence, &is->dev); + ilo_fence_set_seq_bo(&fence->fence, bo); return fence; } @@ -700,9 +688,9 @@ ilo_screen_create(struct intel_winsys *ws) is->base.flush_frontbuffer = NULL; - is->base.fence_reference = ilo_fence_reference; - is->base.fence_signalled = ilo_fence_signalled; - is->base.fence_finish = ilo_fence_finish; + is->base.fence_reference = ilo_screen_fence_reference; + is->base.fence_signalled = ilo_screen_fence_signalled; + is->base.fence_finish = ilo_screen_fence_finish; is->base.get_driver_query_info = NULL; diff --git a/src/gallium/drivers/ilo/ilo_screen.h b/src/gallium/drivers/ilo/ilo_screen.h index 9d53af991aa..612f4c97022 100644 --- a/src/gallium/drivers/ilo/ilo_screen.h +++ b/src/gallium/drivers/ilo/ilo_screen.h @@ -48,13 +48,7 @@ ilo_screen(struct pipe_screen *screen) return (struct ilo_screen *) screen; } -static inline struct ilo_fence * -ilo_fence(struct pipe_fence_handle *fence) -{ - return (struct ilo_fence *) fence; -} - -struct ilo_fence * -ilo_fence_create(struct pipe_screen *screen, struct intel_bo *bo); +struct pipe_fence_handle * +ilo_screen_fence_create(struct pipe_screen *screen, struct intel_bo *bo); #endif /* ILO_SCREEN_H */ |