X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_pipe_flush.c;h=1f4eebc124a950fbc305a3bf04875ca2e7de01da;hb=4e110eca42ac2c56c5763a1f502e7c80db67e064;hp=ab243aa6ec59160a4d399d83610efecd99d64090;hpb=bcc13b74443137043e8a34f8cb64a5add0d8af93;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_pipe_flush.c b/src/gallium/drivers/svga/svga_pipe_flush.c index ab243aa6ec5..1f4eebc124a 100644 --- a/src/gallium/drivers/svga/svga_pipe_flush.c +++ b/src/gallium/drivers/svga/svga_pipe_flush.c @@ -24,6 +24,8 @@ **********************************************************/ #include "pipe/p_defines.h" +#include "util/u_debug_image.h" +#include "util/u_string.h" #include "svga_screen.h" #include "svga_surface.h" #include "svga_context.h" @@ -31,35 +33,88 @@ 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++) { + util_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) { + util_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; }