lp_flush.c revision 287c94ea4987033f9c99a2f91c5750c9083504ca
1/************************************************************************** 2 * 3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28/* Author: 29 * Keith Whitwell <keith@tungstengraphics.com> 30 */ 31 32 33#include "pipe/p_defines.h" 34#include "draw/draw_context.h" 35#include "lp_flush.h" 36#include "lp_context.h" 37#include "lp_setup.h" 38 39 40void 41llvmpipe_flush( struct pipe_context *pipe, 42 unsigned flags, 43 struct pipe_fence_handle **fence ) 44{ 45 struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe); 46 47 draw_flush(llvmpipe->draw); 48 49 if (fence) { 50 if ((flags & (PIPE_FLUSH_SWAPBUFFERS | 51 PIPE_FLUSH_RENDER_CACHE))) { 52 /* if we're going to flush the setup/rasterization modules, emit 53 * a fence. 54 * XXX this (and the code below) may need fine tuning... 55 */ 56 *fence = lp_setup_fence( llvmpipe->setup ); 57 } 58 else { 59 *fence = NULL; 60 } 61 } 62 63 /* XXX the lp_setup_flush(flags) param is not a bool, and it's ignored 64 * at this time! 65 */ 66 if (flags & PIPE_FLUSH_SWAPBUFFERS) { 67 lp_setup_flush( llvmpipe->setup, FALSE ); 68 } 69 else if (flags & PIPE_FLUSH_RENDER_CACHE) { 70 lp_setup_flush( llvmpipe->setup, TRUE ); 71 } 72 73 /* Enable to dump BMPs of the color/depth buffers each frame */ 74#if 0 75 if (flags & PIPE_FLUSH_FRAME) { 76 static unsigned frame_no = 1; 77 char filename[256]; 78 unsigned i; 79 80 for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; i++) { 81 util_snprintf(filename, sizeof(filename), "cbuf%u_%u", i, frame_no); 82 debug_dump_surface_bmp(&llvmpipe->pipe, filename, llvmpipe->framebuffer.cbufs[0]); 83 } 84 85 if (0) { 86 util_snprintf(filename, sizeof(filename), "zsbuf_%u", frame_no); 87 debug_dump_surface_bmp(&llvmpipe->pipe, filename, llvmpipe->framebuffer.zsbuf); 88 } 89 90 ++frame_no; 91 } 92#endif 93} 94 95 96/** 97 * Flush context if necessary. 98 * 99 * TODO: move this logic to an auxiliary library? 100 * 101 * FIXME: We must implement DISCARD/DONTBLOCK/UNSYNCHRONIZED/etc for 102 * textures to avoid blocking. 103 */ 104boolean 105llvmpipe_flush_texture(struct pipe_context *pipe, 106 struct pipe_resource *texture, 107 unsigned face, 108 unsigned level, 109 unsigned flush_flags, 110 boolean read_only, 111 boolean cpu_access, 112 boolean do_not_flush) 113{ 114 unsigned referenced; 115 116 referenced = pipe->is_resource_referenced(pipe, texture, face, level); 117 118 if ((referenced & PIPE_REFERENCED_FOR_WRITE) || 119 ((referenced & PIPE_REFERENCED_FOR_READ) && !read_only)) { 120 121 if (do_not_flush) 122 return FALSE; 123 124 /* 125 * TODO: The semantics of these flush flags are too obtuse. They should 126 * disappear and the pipe driver should just ensure that all visible 127 * side-effects happen when they need to happen. 128 */ 129 if (referenced & PIPE_REFERENCED_FOR_WRITE) 130 flush_flags |= PIPE_FLUSH_RENDER_CACHE; 131 132 if (referenced & PIPE_REFERENCED_FOR_READ) 133 flush_flags |= PIPE_FLUSH_TEXTURE_CACHE; 134 135 if (cpu_access) { 136 /* 137 * Flush and wait. 138 */ 139 140 struct pipe_fence_handle *fence = NULL; 141 142 pipe->flush(pipe, flush_flags, &fence); 143 144 if (fence) { 145 pipe->screen->fence_finish(pipe->screen, fence, 0); 146 pipe->screen->fence_reference(pipe->screen, &fence, NULL); 147 } 148 } else { 149 /* 150 * Just flush. 151 */ 152 153 pipe->flush(pipe, flush_flags, NULL); 154 } 155 } 156 157 return TRUE; 158} 159