#include "lp_setup.h"
+/**
+ * \param flags bitmask of PIPE_FLUSH_x flags
+ * \param fence if non-null, returns pointer to a fench which can be waited on
+ */
void
llvmpipe_flush( struct pipe_context *pipe,
unsigned flags,
}
}
- /* XXX the lp_setup_flush(flags) param is not a bool, and it's ignored
- * at this time!
- */
- if (flags & PIPE_FLUSH_SWAPBUFFERS) {
- lp_setup_flush( llvmpipe->setup, FALSE );
- }
- else if (flags & PIPE_FLUSH_RENDER_CACHE) {
- lp_setup_flush( llvmpipe->setup, TRUE );
+ /* ask the setup module to flush */
+ if (flags & (PIPE_FLUSH_SWAPBUFFERS | PIPE_FLUSH_RENDER_CACHE |
+ PIPE_FLUSH_TEXTURE_CACHE)) {
+ lp_setup_flush(llvmpipe->setup, flags);
}
/* Enable to dump BMPs of the color/depth buffers each frame */
/**
* Flush context if necessary.
*
- * TODO: move this logic to an auxiliary library?
+ * Returns FALSE if it would have block, but do_not_block was set, TRUE
+ * otherwise.
*
- * FIXME: We must implement DISCARD/DONTBLOCK/UNSYNCHRONIZED/etc for
- * textures to avoid blocking.
+ * TODO: move this logic to an auxiliary library?
*/
boolean
-llvmpipe_flush_texture(struct pipe_context *pipe,
- struct pipe_texture *texture,
- unsigned face,
- unsigned level,
- unsigned flush_flags,
- boolean read_only,
- boolean cpu_access,
- boolean do_not_flush)
+llvmpipe_flush_resource(struct pipe_context *pipe,
+ struct pipe_resource *resource,
+ unsigned face,
+ unsigned level,
+ unsigned flush_flags,
+ boolean read_only,
+ boolean cpu_access,
+ boolean do_not_block)
{
- struct pipe_fence_handle *last_fence = NULL;
unsigned referenced;
- referenced = pipe->is_texture_referenced(pipe, texture, face, level);
+ referenced = pipe->is_resource_referenced(pipe, resource, face, level);
if ((referenced & PIPE_REFERENCED_FOR_WRITE) ||
((referenced & PIPE_REFERENCED_FOR_READ) && !read_only)) {
- if (do_not_flush)
- return FALSE;
-
- /*
- * TODO: The semantics of these flush flags are too obtuse. They should
- * disappear and the pipe driver should just ensure that all visible
- * side-effects happen when they need to happen.
- */
- if (referenced & PIPE_REFERENCED_FOR_WRITE)
- flush_flags |= PIPE_FLUSH_RENDER_CACHE;
+ if (resource->target != PIPE_BUFFER) {
+ /*
+ * TODO: The semantics of these flush flags are too obtuse. They should
+ * disappear and the pipe driver should just ensure that all visible
+ * side-effects happen when they need to happen.
+ */
+ if (referenced & PIPE_REFERENCED_FOR_WRITE)
+ flush_flags |= PIPE_FLUSH_RENDER_CACHE;
- if (referenced & PIPE_REFERENCED_FOR_READ)
- flush_flags |= PIPE_FLUSH_TEXTURE_CACHE;
+ if (referenced & PIPE_REFERENCED_FOR_READ)
+ flush_flags |= PIPE_FLUSH_TEXTURE_CACHE;
+ }
if (cpu_access) {
/*
struct pipe_fence_handle *fence = NULL;
+ if (do_not_block)
+ return FALSE;
+
pipe->flush(pipe, flush_flags, &fence);
- if (last_fence) {
+ if (fence) {
pipe->screen->fence_finish(pipe->screen, fence, 0);
pipe->screen->fence_reference(pipe->screen, &fence, NULL);
}