X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_pipe_flush.c;h=7e809d0cda8bde661bb96c67deea8c0c38f5fb53;hb=a03d17ede778610f2c66099d0d5342cf09ef12a2;hp=0becb0765acc20387f3f70eb2b6d7fb999967d0d;hpb=447dddb93d8dc2551ef7a9c43004237c7a8dd2dd;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_pipe_flush.c b/src/gallium/drivers/svga/svga_pipe_flush.c index 0becb0765ac..7e809d0cda8 100644 --- a/src/gallium/drivers/svga/svga_pipe_flush.c +++ b/src/gallium/drivers/svga/svga_pipe_flush.c @@ -24,48 +24,97 @@ **********************************************************/ #include "pipe/p_defines.h" +#include "util/u_debug_image.h" +#include "util/u_string.h" #include "svga_screen.h" -#include "svga_screen_texture.h" +#include "svga_surface.h" #include "svga_context.h" -#include "svga_winsys.h" -#include "svga_draw.h" #include "svga_debug.h" -#include "svga_hw_reg.h" - - - static void svga_flush( struct pipe_context *pipe, - unsigned flags, - struct pipe_fence_handle **fence ) + struct pipe_fence_handle **fence, + unsigned flags) { struct svga_context *svga = svga_context(pipe); - int i; - /* Emit buffered drawing commands. + /* Emit buffered drawing commands, and any back copies. */ - svga_hwtnl_flush_retry( svga ); + svga_surfaces_flush( svga ); - /* Emit back-copy from render target view to texture. - */ - for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { - if (svga->curr.framebuffer.cbufs[i]) - svga_propagate_surface(pipe, svga->curr.framebuffer.cbufs[i]); - } - if (svga->curr.framebuffer.zsbuf) - svga_propagate_surface(pipe, svga->curr.framebuffer.zsbuf); + if (flags & PIPE_FLUSH_FENCE_FD) + svga->swc->hints |= SVGA_HINT_FLAG_EXPORT_FENCE_FD; /* Flush command queue. */ svga_context_flush(svga, fence); - SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s flags %x fence_ptr %p\n", - __FUNCTION__, flags, fence ? *fence : 0x0); + SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s fence_ptr %p\n", + __FUNCTION__, fence ? *fence : 0x0); + + /* Enable to dump BMPs of the color/depth buffers each frame */ + if (0) { + struct pipe_framebuffer_state *fb = &svga->curr.framebuffer; + static unsigned frame_no = 1; + char filename[256]; + unsigned i; + + for (i = 0; i < fb->nr_cbufs; i++) { + snprintf(filename, sizeof(filename), "cbuf%u_%04u.bmp", i, frame_no); + debug_dump_surface_bmp(&svga->pipe, filename, fb->cbufs[i]); + } + + if (0 && fb->zsbuf) { + snprintf(filename, sizeof(filename), "zsbuf_%04u.bmp", frame_no); + debug_dump_surface_bmp(&svga->pipe, filename, fb->zsbuf); + } + + ++frame_no; + } +} + + +/** + * svga_create_fence_fd + * + * Wraps a SVGA fence around an imported file descriptor. This + * fd represents a fence from another process/device. The fence created + * here can then be fed into fence_server_sync() so SVGA can synchronize + * with an external process + */ +static void +svga_create_fence_fd(struct pipe_context *pipe, + struct pipe_fence_handle **fence, + int fd, + enum pipe_fd_type type) +{ + struct svga_winsys_screen *sws = svga_winsys_screen(pipe->screen); + + assert(type == PIPE_FD_TYPE_NATIVE_SYNC); + sws->fence_create_fd(sws, fence, fd); +} + + +/** + * svga_fence_server_sync + * + * This function imports a fence from another process/device into the current + * software context so that SVGA can synchronize with it. + */ +static void +svga_fence_server_sync(struct pipe_context *pipe, + struct pipe_fence_handle *fence) +{ + struct svga_winsys_screen *sws = svga_winsys_screen(pipe->screen); + struct svga_context *svga = svga_context(pipe); + + sws->fence_server_sync(sws, &svga->swc->imported_fence_fd, fence); } void svga_init_flush_functions( struct svga_context *svga ) { svga->pipe.flush = svga_flush; + svga->pipe.create_fence_fd = svga_create_fence_fd; + svga->pipe.fence_server_sync = svga_fence_server_sync; }