Path: blob/21.2-virgl/src/gallium/drivers/llvmpipe/lp_flush.c
4570 views
/**************************************************************************1*2* Copyright 2007 VMware, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627/* Author:28* Keith Whitwell <[email protected]>29*/303132#include "pipe/p_defines.h"33#include "pipe/p_screen.h"34#include "util/u_debug_image.h"35#include "util/u_string.h"36#include "draw/draw_context.h"37#include "lp_flush.h"38#include "lp_context.h"39#include "lp_setup.h"404142/**43* \param fence if non-null, returns pointer to a fence which can be waited on44*/45void46llvmpipe_flush( struct pipe_context *pipe,47struct pipe_fence_handle **fence,48const char *reason)49{50struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);5152draw_flush(llvmpipe->draw);5354/* ask the setup module to flush */55lp_setup_flush(llvmpipe->setup, fence, reason);5657/* Enable to dump BMPs of the color/depth buffers each frame */58if (0) {59static unsigned frame_no = 1;60char filename[256];61unsigned i;6263for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; i++) {64snprintf(filename, sizeof(filename), "cbuf%u_%u", i, frame_no);65debug_dump_surface_bmp(&llvmpipe->pipe, filename, llvmpipe->framebuffer.cbufs[i]);66}6768if (0) {69snprintf(filename, sizeof(filename), "zsbuf_%u", frame_no);70debug_dump_surface_bmp(&llvmpipe->pipe, filename, llvmpipe->framebuffer.zsbuf);71}7273++frame_no;74}75}7677void78llvmpipe_finish( struct pipe_context *pipe,79const char *reason )80{81struct pipe_fence_handle *fence = NULL;82llvmpipe_flush(pipe, &fence, reason);83if (fence) {84pipe->screen->fence_finish(pipe->screen, NULL, fence,85PIPE_TIMEOUT_INFINITE);86pipe->screen->fence_reference(pipe->screen, &fence, NULL);87}88}8990/**91* Flush context if necessary.92*93* Returns FALSE if it would have block, but do_not_block was set, TRUE94* otherwise.95*96* TODO: move this logic to an auxiliary library?97*/98boolean99llvmpipe_flush_resource(struct pipe_context *pipe,100struct pipe_resource *resource,101unsigned level,102boolean read_only,103boolean cpu_access,104boolean do_not_block,105const char *reason)106{107unsigned referenced;108109referenced = llvmpipe_is_resource_referenced(pipe, resource, level);110111if ((referenced & LP_REFERENCED_FOR_WRITE) ||112((referenced & LP_REFERENCED_FOR_READ) && !read_only)) {113114if (cpu_access) {115/*116* Flush and wait.117*/118if (do_not_block)119return FALSE;120121llvmpipe_finish(pipe, reason);122} else {123/*124* Just flush.125*/126127llvmpipe_flush(pipe, NULL, reason);128}129}130131return TRUE;132}133134135