X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fi915%2Fi915_flush.c;h=6311c00305605041fa4a8abf8b0122ccfafec6fc;hb=ac4437b20b87c7285b89466f05b51518ae616873;hp=1582168eba576f0d832d612dd963fe430fc3c66e;hpb=49d402e275cdaf46de8db5a475dfe00509141195;p=mesa.git diff --git a/src/gallium/drivers/i915/i915_flush.c b/src/gallium/drivers/i915/i915_flush.c index 1582168eba5..6311c003056 100644 --- a/src/gallium/drivers/i915/i915_flush.c +++ b/src/gallium/drivers/i915/i915_flush.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -18,7 +18,7 @@ * 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 NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS 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. @@ -26,61 +26,66 @@ **************************************************************************/ /* Author: - * Keith Whitwell + * Keith Whitwell */ #include "pipe/p_defines.h" #include "draw/draw_context.h" #include "i915_context.h" -#include "i915_reg.h" #include "i915_batch.h" +#include "i915_debug.h" +#include "i915_reg.h" -static void i915_flush( struct pipe_context *pipe, - unsigned flags, - struct pipe_fence_handle **fence ) +static void i915_flush_pipe( struct pipe_context *pipe, + struct pipe_fence_handle **fence, + unsigned flags ) { struct i915_context *i915 = i915_context(pipe); + enum i915_winsys_flush_flags winsys_flags = I915_FLUSH_ASYNC; - draw_flush(i915->draw); + if (!i915->batch) + return; -#if 0 - /* Do we need to emit an MI_FLUSH command to flush the hardware - * caches? + /* Only shortcut this if we have no fence, otherwise we must flush the + * empty batchbuffer to get our fence back. */ - if (flags & (PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_TEXTURE_CACHE)) { - unsigned flush = MI_FLUSH; - - if (!(flags & PIPE_FLUSH_RENDER_CACHE)) - flush |= INHIBIT_FLUSH_RENDER_CACHE; - - if (flags & PIPE_FLUSH_TEXTURE_CACHE) - flush |= FLUSH_MAP_CACHE; - - if (!BEGIN_BATCH(1, 0)) { - FLUSH_BATCH(NULL); - assert(BEGIN_BATCH(1, 0)); - } - OUT_BATCH( flush ); - } -#endif - -#if 0 - if (i915->batch->map == i915->batch->ptr) { + if (!fence && (i915->batch->map == i915->batch->ptr)) { return; } -#endif - /* If there are no flags, just flush pending commands to hardware: - */ - FLUSH_BATCH(fence); - i915->vbo_flushed = 1; -} + if (flags == PIPE_FLUSH_END_OF_FRAME) + winsys_flags = I915_FLUSH_END_OF_FRAME; + FLUSH_BATCH(fence, winsys_flags); + I915_DBG(DBG_FLUSH, "%s: #####\n", __FUNCTION__); +} void i915_init_flush_functions( struct i915_context *i915 ) { - i915->base.flush = i915_flush; + i915->base.flush = i915_flush_pipe; +} + +/** + * Here we handle all the notifications that needs to go out on a flush. + * XXX might move above function to i915_pipe_flush.c and leave this here. + */ +void i915_flush(struct i915_context *i915, + struct pipe_fence_handle **fence, + unsigned flags) +{ + struct i915_winsys_batchbuffer *batch = i915->batch; + + batch->iws->batchbuffer_flush(batch, fence, flags); + i915->vbo_flushed = 1; + i915->hardware_dirty = ~0; + i915->immediate_dirty = ~0; + i915->dynamic_dirty = ~0; + i915->static_dirty = ~0; + /* kernel emits flushes in between batchbuffers */ + i915->flush_dirty = 0; + i915->fired_vertices += i915->queued_vertices; + i915->queued_vertices = 0; }