Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/svga/svga_pipe_flush.c
4570 views
1
/**********************************************************
2
* Copyright 2008-2009 VMware, Inc. All rights reserved.
3
*
4
* Permission is hereby granted, free of charge, to any person
5
* obtaining a copy of this software and associated documentation
6
* files (the "Software"), to deal in the Software without
7
* restriction, including without limitation the rights to use, copy,
8
* modify, merge, publish, distribute, sublicense, and/or sell copies
9
* of the Software, and to permit persons to whom the Software is
10
* furnished to do so, subject to the following conditions:
11
*
12
* The above copyright notice and this permission notice shall be
13
* included in all copies or substantial portions of the Software.
14
*
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
* SOFTWARE.
23
*
24
**********************************************************/
25
26
#include "pipe/p_defines.h"
27
#include "util/u_debug_image.h"
28
#include "util/u_string.h"
29
#include "svga_screen.h"
30
#include "svga_surface.h"
31
#include "svga_context.h"
32
#include "svga_debug.h"
33
34
35
static void svga_flush( struct pipe_context *pipe,
36
struct pipe_fence_handle **fence,
37
unsigned flags)
38
{
39
struct svga_context *svga = svga_context(pipe);
40
41
/* Emit buffered drawing commands, and any back copies.
42
*/
43
svga_surfaces_flush( svga );
44
45
if (flags & PIPE_FLUSH_FENCE_FD)
46
svga->swc->hints |= SVGA_HINT_FLAG_EXPORT_FENCE_FD;
47
48
/* Flush command queue.
49
*/
50
svga_context_flush(svga, fence);
51
52
SVGA_DBG(DEBUG_DMA|DEBUG_PERF, "%s fence_ptr %p\n",
53
__FUNCTION__, fence ? *fence : 0x0);
54
55
/* Enable to dump BMPs of the color/depth buffers each frame */
56
if (0) {
57
struct pipe_framebuffer_state *fb = &svga->curr.framebuffer;
58
static unsigned frame_no = 1;
59
char filename[256];
60
unsigned i;
61
62
for (i = 0; i < fb->nr_cbufs; i++) {
63
snprintf(filename, sizeof(filename), "cbuf%u_%04u.bmp", i, frame_no);
64
debug_dump_surface_bmp(&svga->pipe, filename, fb->cbufs[i]);
65
}
66
67
if (0 && fb->zsbuf) {
68
snprintf(filename, sizeof(filename), "zsbuf_%04u.bmp", frame_no);
69
debug_dump_surface_bmp(&svga->pipe, filename, fb->zsbuf);
70
}
71
72
++frame_no;
73
}
74
}
75
76
77
/**
78
* svga_create_fence_fd
79
*
80
* Wraps a SVGA fence around an imported file descriptor. This
81
* fd represents a fence from another process/device. The fence created
82
* here can then be fed into fence_server_sync() so SVGA can synchronize
83
* with an external process
84
*/
85
static void
86
svga_create_fence_fd(struct pipe_context *pipe,
87
struct pipe_fence_handle **fence,
88
int fd,
89
enum pipe_fd_type type)
90
{
91
struct svga_winsys_screen *sws = svga_winsys_screen(pipe->screen);
92
93
assert(type == PIPE_FD_TYPE_NATIVE_SYNC);
94
sws->fence_create_fd(sws, fence, fd);
95
}
96
97
98
/**
99
* svga_fence_server_sync
100
*
101
* This function imports a fence from another process/device into the current
102
* software context so that SVGA can synchronize with it.
103
*/
104
static void
105
svga_fence_server_sync(struct pipe_context *pipe,
106
struct pipe_fence_handle *fence)
107
{
108
struct svga_winsys_screen *sws = svga_winsys_screen(pipe->screen);
109
struct svga_context *svga = svga_context(pipe);
110
111
sws->fence_server_sync(sws, &svga->swc->imported_fence_fd, fence);
112
}
113
114
115
void svga_init_flush_functions( struct svga_context *svga )
116
{
117
svga->pipe.flush = svga_flush;
118
svga->pipe.create_fence_fd = svga_create_fence_fd;
119
svga->pipe.fence_server_sync = svga_fence_server_sync;
120
}
121
122