1b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie/*
2b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * Copyright 2014, 2015 Red Hat.
3b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie *
4b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a
5b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * copy of this software and associated documentation files (the "Software"),
6b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * to deal in the Software without restriction, including without limitation
7b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * on the rights to use, copy, modify, merge, publish, distribute, sub
8b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * license, and/or sell copies of the Software, and to permit persons to whom
9b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * the Software is furnished to do so, subject to the following conditions:
10b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie *
11b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * The above copyright notice and this permission notice (including the next
12b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * paragraph) shall be included in all copies or substantial portions of the
13b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * Software.
14b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie *
15b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE.
22b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie */
23b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie#include <stdio.h>
24b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie#include "util/u_memory.h"
25b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie#include "util/u_format.h"
26b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie#include "util/u_inlines.h"
27b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie#include "os/os_time.h"
28493e410d552e97572ca9a492d23648f6a236e4a4Emil Velikov#include "state_tracker/sw_winsys.h"
29493e410d552e97572ca9a492d23648f6a236e4a4Emil Velikov
30493e410d552e97572ca9a492d23648f6a236e4a4Emil Velikov#include "virgl_vtest_winsys.h"
31493e410d552e97572ca9a492d23648f6a236e4a4Emil Velikov#include "virgl_vtest_public.h"
32b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
337bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic void *virgl_vtest_resource_map(struct virgl_winsys *vws,
347bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      struct virgl_hw_res *res);
357bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic void virgl_vtest_resource_unmap(struct virgl_winsys *vws,
367bac333508835776573e6f3192c819dbe4303480Emil Velikov                                       struct virgl_hw_res *res);
377bac333508835776573e6f3192c819dbe4303480Emil Velikov
38b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic inline boolean can_cache_resource(struct virgl_hw_res *res)
39b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
40b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return res->cacheable == TRUE;
41b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
42b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
43b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic uint32_t vtest_get_transfer_size(struct virgl_hw_res *res,
44b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                        const struct pipe_box *box,
45b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                        uint32_t stride, uint32_t layer_stride,
46b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                        uint32_t level, uint32_t *valid_stride_p)
47b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
48b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t valid_stride, valid_layer_stride;
49b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
50b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   valid_stride = util_format_get_stride(res->format, box->width);
51b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (stride) {
52b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (box->height > 1)
53b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         valid_stride = stride;
54b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
55b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
56b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   valid_layer_stride = util_format_get_2d_size(res->format, valid_stride,
57b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                                box->height);
58b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (layer_stride) {
59b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (box->depth > 1)
60b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         valid_layer_stride = layer_stride;
61b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
62b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
63b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   *valid_stride_p = valid_stride;
64b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return valid_layer_stride * box->depth;
65b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
66b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
67b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic int
68b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_vtest_transfer_put(struct virgl_winsys *vws,
69b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         struct virgl_hw_res *res,
70b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         const struct pipe_box *box,
71b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         uint32_t stride, uint32_t layer_stride,
72b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         uint32_t buf_offset, uint32_t level)
73b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
74b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
75b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t size;
76b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   void *ptr;
77b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t valid_stride;
78b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
797bac333508835776573e6f3192c819dbe4303480Emil Velikov   size = vtest_get_transfer_size(res, box, stride, layer_stride, level,
807bac333508835776573e6f3192c819dbe4303480Emil Velikov                                  &valid_stride);
81b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
82b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_send_transfer_cmd(vtws, VCMD_TRANSFER_PUT, res->res_handle,
83b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                 level, stride, layer_stride,
84b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                 box, size);
85b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   ptr = virgl_vtest_resource_map(vws, res);
86b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_send_transfer_put_data(vtws, ptr + buf_offset, size);
87b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_resource_unmap(vws, res);
88b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return 0;
89b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
90b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
91b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic int
92b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_vtest_transfer_get(struct virgl_winsys *vws,
93b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         struct virgl_hw_res *res,
94b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         const struct pipe_box *box,
95b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         uint32_t stride, uint32_t layer_stride,
96b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                         uint32_t buf_offset, uint32_t level)
97b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
98b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
99b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t size;
100b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   void *ptr;
101b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t valid_stride;
102b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
1037bac333508835776573e6f3192c819dbe4303480Emil Velikov   size = vtest_get_transfer_size(res, box, stride, layer_stride, level,
1047bac333508835776573e6f3192c819dbe4303480Emil Velikov                                  &valid_stride);
105b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
106b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_send_transfer_cmd(vtws, VCMD_TRANSFER_GET, res->res_handle,
107b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                 level, stride, layer_stride,
108b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                 box, size);
109b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
110b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
111b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   ptr = virgl_vtest_resource_map(vws, res);
1127bac333508835776573e6f3192c819dbe4303480Emil Velikov   virgl_vtest_recv_transfer_get_data(vtws, ptr + buf_offset, size,
1137bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      valid_stride, box, res->format);
114b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_resource_unmap(vws, res);
115b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return 0;
116b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
117b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
118b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_hw_res_destroy(struct virgl_vtest_winsys *vtws,
119b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                 struct virgl_hw_res *res)
120b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
121b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_send_resource_unref(vtws, res->res_handle);
122b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->dt)
123b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      vtws->sws->displaytarget_destroy(vtws->sws, res->dt);
124b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   free(res->ptr);
125b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   FREE(res);
126b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
127b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
128b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic boolean virgl_vtest_resource_is_busy(struct virgl_vtest_winsys *vtws,
129b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                            struct virgl_hw_res *res)
130b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
131b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   /* implement busy check */
132b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int ret;
133b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   ret = virgl_vtest_busy_wait(vtws, res->res_handle, 0);
134b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
135b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (ret < 0)
136b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return FALSE;
137b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
138b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return ret == 1 ? TRUE : FALSE;
139b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
140b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
141b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void
142b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_cache_flush(struct virgl_vtest_winsys *vtws)
143b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
144b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct list_head *curr, *next;
145b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_hw_res *res;
146b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
147b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_mutex_lock(vtws->mutex);
148b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   curr = vtws->delayed.next;
149b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   next = curr->next;
150b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
151b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   while (curr != &vtws->delayed) {
152b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      res = LIST_ENTRY(struct virgl_hw_res, curr, head);
153b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      LIST_DEL(&res->head);
154b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      virgl_hw_res_destroy(vtws, res);
155b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      curr = next;
156b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      next = curr->next;
157b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
158b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_mutex_unlock(vtws->mutex);
159b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
160b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
161b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void
162b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_cache_list_check_free(struct virgl_vtest_winsys *vtws)
163b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
164b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct list_head *curr, *next;
165b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_hw_res *res;
166b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int64_t now;
167b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
168b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   now = os_time_get();
169b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   curr = vtws->delayed.next;
170b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   next = curr->next;
171b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   while (curr != &vtws->delayed) {
172b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      res = LIST_ENTRY(struct virgl_hw_res, curr, head);
173b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (!os_time_timeout(res->start, res->end, now))
174b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         break;
175b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
176b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      LIST_DEL(&res->head);
177b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      virgl_hw_res_destroy(vtws, res);
178b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      curr = next;
179b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      next = curr->next;
180b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
181b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
182b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
183b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_vtest_resource_reference(struct virgl_vtest_winsys *vtws,
184b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                           struct virgl_hw_res **dres,
185b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                           struct virgl_hw_res *sres)
186b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
187b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_hw_res *old = *dres;
188b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (pipe_reference(&(*dres)->reference, &sres->reference)) {
189b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (!can_cache_resource(old)) {
190b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         virgl_hw_res_destroy(vtws, old);
191b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      } else {
192b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         pipe_mutex_lock(vtws->mutex);
193b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         virgl_cache_list_check_free(vtws);
194b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
195b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         old->start = os_time_get();
196b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         old->end = old->start + vtws->usecs;
197b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         LIST_ADDTAIL(&old->head, &vtws->delayed);
198b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         vtws->num_delayed++;
199b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         pipe_mutex_unlock(vtws->mutex);
200b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      }
201b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
202b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   *dres = sres;
203b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
204b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
2057bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic struct virgl_hw_res *
2067bac333508835776573e6f3192c819dbe4303480Emil Velikovvirgl_vtest_winsys_resource_create(struct virgl_winsys *vws,
2077bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   enum pipe_texture_target target,
2087bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t format,
2097bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t bind,
2107bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t width,
2117bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t height,
2127bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t depth,
2137bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t array_size,
2147bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t last_level,
2157bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t nr_samples,
2167bac333508835776573e6f3192c819dbe4303480Emil Velikov                                   uint32_t size)
217b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
218b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
219b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_hw_res *res;
220b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   static int handle = 1;
221b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
222b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res = CALLOC_STRUCT(virgl_hw_res);
223b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!res)
224b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return NULL;
225b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
226b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (bind & (VIRGL_BIND_DISPLAY_TARGET | VIRGL_BIND_SCANOUT)) {
2277bac333508835776573e6f3192c819dbe4303480Emil Velikov      res->dt = vtws->sws->displaytarget_create(vtws->sws, bind, format,
2287153b12651f4d6e3b160a8d577a084a32be08c40Dave Airlie                                                width, height, 64, NULL,
229b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                                &res->stride);
230b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
231b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   } else {
232b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      res->ptr = align_malloc(size, 64);
233b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (!res->ptr) {
234b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         FREE(res);
235b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         return NULL;
236b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      }
237b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
238b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
239b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res->bind = bind;
240b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res->format = format;
241b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res->height = height;
242b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res->width = width;
2437bac333508835776573e6f3192c819dbe4303480Emil Velikov   virgl_vtest_send_resource_create(vtws, handle, target, format, bind,
2447bac333508835776573e6f3192c819dbe4303480Emil Velikov                                    width, height, depth, array_size,
2457bac333508835776573e6f3192c819dbe4303480Emil Velikov                                    last_level, nr_samples);
246b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
247b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res->res_handle = handle++;
248b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_reference_init(&res->reference, 1);
249b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return res;
250b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
251b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
252b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_vtest_winsys_resource_unref(struct virgl_winsys *vws,
253b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                              struct virgl_hw_res *hres)
254b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
255b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
256b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_resource_reference(vtws, &hres, NULL);
257b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
258b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
2597bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic void *virgl_vtest_resource_map(struct virgl_winsys *vws,
2607bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      struct virgl_hw_res *res)
261b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
262b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
263b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
264b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->dt) {
265b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return vtws->sws->displaytarget_map(vtws->sws, res->dt, 0);
266b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   } else {
267b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      res->mapped = res->ptr;
268b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return res->mapped;
269b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
270b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
271b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
2727bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic void virgl_vtest_resource_unmap(struct virgl_winsys *vws,
2737bac333508835776573e6f3192c819dbe4303480Emil Velikov                                       struct virgl_hw_res *res)
274b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
275b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
276b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->mapped)
277b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      res->mapped = NULL;
278b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
279b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->dt)
280b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      vtws->sws->displaytarget_unmap(vtws->sws, res->dt);
281b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
282b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
2837bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic void virgl_vtest_resource_wait(struct virgl_winsys *vws,
2847bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      struct virgl_hw_res *res)
285b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
286b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
287b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
288b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_busy_wait(vtws, res->res_handle, VCMD_BUSY_WAIT_FLAG_WAIT);
289b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
290b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
291b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic inline int virgl_is_res_compat(struct virgl_vtest_winsys *vtws,
292b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                      struct virgl_hw_res *res,
2937bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      uint32_t size, uint32_t bind,
2947bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      uint32_t format)
295b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
296b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->bind != bind)
297b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return 0;
298b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->format != format)
299b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return 0;
300b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->size < size)
301b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return 0;
302b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res->size > size * 2)
303b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return 0;
304b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
305b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (virgl_vtest_resource_is_busy(vtws, res)) {
306b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return -1;
307b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
308b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
309b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return 1;
310b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
311b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
3127bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic struct virgl_hw_res *
3137bac333508835776573e6f3192c819dbe4303480Emil Velikovvirgl_vtest_winsys_resource_cache_create(struct virgl_winsys *vws,
3147bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         enum pipe_texture_target target,
3157bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t format,
3167bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t bind,
3177bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t width,
3187bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t height,
3197bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t depth,
3207bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t array_size,
3217bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t last_level,
3227bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t nr_samples,
3237bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         uint32_t size)
324b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
325b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
326b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_hw_res *res, *curr_res;
327b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct list_head *curr, *next;
328b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int64_t now;
329b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int ret;
330b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
331b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   /* only store binds for vertex/index/const buffers */
332b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (bind != VIRGL_BIND_CONSTANT_BUFFER && bind != VIRGL_BIND_INDEX_BUFFER &&
333b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie       bind != VIRGL_BIND_VERTEX_BUFFER && bind != VIRGL_BIND_CUSTOM)
334b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      goto alloc;
335b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
336b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_mutex_lock(vtws->mutex);
337b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
338b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res = NULL;
339b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   curr = vtws->delayed.next;
340b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   next = curr->next;
341b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
342b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   now = os_time_get();
343b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   while (curr != &vtws->delayed) {
344b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      curr_res = LIST_ENTRY(struct virgl_hw_res, curr, head);
345b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
34687711183ac35d85ca7d2c2ee67536fe689d6bef3Dave Airlie      if (!res && ((ret = virgl_is_res_compat(vtws, curr_res, size, bind, format)) > 0))
347b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         res = curr_res;
348b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      else if (os_time_timeout(curr_res->start, curr_res->end, now)) {
349b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         LIST_DEL(&curr_res->head);
350b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         virgl_hw_res_destroy(vtws, curr_res);
351b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      } else
352b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         break;
353b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
354b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (ret == -1)
355b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         break;
356b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
357b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      curr = next;
358b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      next = curr->next;
359b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
360b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
361b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!res && ret != -1) {
362b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      while (curr != &vtws->delayed) {
363b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         curr_res = LIST_ENTRY(struct virgl_hw_res, curr, head);
364b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         ret = virgl_is_res_compat(vtws, curr_res, size, bind, format);
365b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         if (ret > 0) {
366b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie            res = curr_res;
367b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie            break;
368b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         }
369b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         if (ret == -1)
370b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie            break;
371b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         curr = next;
372b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         next = curr->next;
373b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      }
374b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
375b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
376b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (res) {
377b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      LIST_DEL(&res->head);
378b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      --vtws->num_delayed;
379b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      pipe_mutex_unlock(vtws->mutex);
380b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      pipe_reference_init(&res->reference, 1);
381b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return res;
382b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
383b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
384b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_mutex_unlock(vtws->mutex);
385b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
386b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliealloc:
387b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res = virgl_vtest_winsys_resource_create(vws, target, format, bind,
3887bac333508835776573e6f3192c819dbe4303480Emil Velikov                                            width, height, depth, array_size,
3897bac333508835776573e6f3192c819dbe4303480Emil Velikov                                            last_level, nr_samples, size);
390b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (bind == VIRGL_BIND_CONSTANT_BUFFER || bind == VIRGL_BIND_INDEX_BUFFER ||
391b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie       bind == VIRGL_BIND_VERTEX_BUFFER)
392b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      res->cacheable = TRUE;
393b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return res;
394b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
395b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
396b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic struct virgl_cmd_buf *virgl_vtest_cmd_buf_create(struct virgl_winsys *vws)
397b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
398b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_cmd_buf *cbuf;
399b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
400b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf = CALLOC_STRUCT(virgl_vtest_cmd_buf);
401b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!cbuf)
402b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return NULL;
403b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
404b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->nres = 512;
40572d7d1e224049f3f22e1275df99e6e8e31de0506Emil Velikov   cbuf->res_bo = CALLOC(cbuf->nres, sizeof(struct virgl_hw_buf*));
406b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!cbuf->res_bo) {
407b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      FREE(cbuf);
408b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return NULL;
409b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
410b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->ws = vws;
411b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->base.buf = cbuf->buf;
412b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return &cbuf->base;
413b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
414b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
415b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_vtest_cmd_buf_destroy(struct virgl_cmd_buf *_cbuf)
416b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
4171ce685f05e798d1b3c0526b5431f8109dd8803faEmil Velikov   struct virgl_vtest_cmd_buf *cbuf = virgl_vtest_cmd_buf(_cbuf);
418b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
419b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   FREE(cbuf->res_bo);
420b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   FREE(cbuf);
421b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
422b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
423b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic boolean virgl_vtest_lookup_res(struct virgl_vtest_cmd_buf *cbuf,
4247bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      struct virgl_hw_res *res)
425b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
426b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   unsigned hash = res->res_handle & (sizeof(cbuf->is_handle_added)-1);
427b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int i;
428b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
429b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (cbuf->is_handle_added[hash]) {
430b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      i = cbuf->reloc_indices_hashlist[hash];
431b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      if (cbuf->res_bo[i] == res)
432b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         return true;
433b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
434b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      for (i = 0; i < cbuf->cres; i++) {
435b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         if (cbuf->res_bo[i] == res) {
436b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie            cbuf->reloc_indices_hashlist[hash] = i;
437b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie            return true;
438b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         }
439b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      }
440b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
441b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return false;
442b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
443b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
444b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_vtest_release_all_res(struct virgl_vtest_winsys *vtws,
445b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                        struct virgl_vtest_cmd_buf *cbuf)
446b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
447b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int i;
448b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
449b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   for (i = 0; i < cbuf->cres; i++) {
450b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      p_atomic_dec(&cbuf->res_bo[i]->num_cs_references);
451b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      virgl_vtest_resource_reference(vtws, &cbuf->res_bo[i], NULL);
452b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
453b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->cres = 0;
454b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
455b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
456b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_vtest_add_res(struct virgl_vtest_winsys *vtws,
4577bac333508835776573e6f3192c819dbe4303480Emil Velikov                                struct virgl_vtest_cmd_buf *cbuf,
4587bac333508835776573e6f3192c819dbe4303480Emil Velikov                                struct virgl_hw_res *res)
459b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
460b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   unsigned hash = res->res_handle & (sizeof(cbuf->is_handle_added)-1);
461b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
462b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (cbuf->cres > cbuf->nres) {
463b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      fprintf(stderr,"failure to add relocation\n");
464b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return;
465b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
466b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
467b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->res_bo[cbuf->cres] = NULL;
468b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_resource_reference(vtws, &cbuf->res_bo[cbuf->cres], res);
469b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->is_handle_added[hash] = TRUE;
470b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
471b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->reloc_indices_hashlist[hash] = cbuf->cres;
472b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   p_atomic_inc(&res->num_cs_references);
473b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->cres++;
474b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
475b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
4767bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic int virgl_vtest_winsys_submit_cmd(struct virgl_winsys *vws,
4777bac333508835776573e6f3192c819dbe4303480Emil Velikov                                         struct virgl_cmd_buf *_cbuf)
478b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
479b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
4801ce685f05e798d1b3c0526b5431f8109dd8803faEmil Velikov   struct virgl_vtest_cmd_buf *cbuf = virgl_vtest_cmd_buf(_cbuf);
481b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   int ret;
482b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
483b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (cbuf->base.cdw == 0)
484b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return 0;
485b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
486b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   ret = virgl_vtest_submit_cmd(vtws, cbuf);
487b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
488b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_release_all_res(vtws, cbuf);
489b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   memset(cbuf->is_handle_added, 0, sizeof(cbuf->is_handle_added));
490b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   cbuf->base.cdw = 0;
491b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return ret;
492b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
493b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
4947bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic void virgl_vtest_emit_res(struct virgl_winsys *vws,
4957bac333508835776573e6f3192c819dbe4303480Emil Velikov                                 struct virgl_cmd_buf *_cbuf,
4967bac333508835776573e6f3192c819dbe4303480Emil Velikov                                 struct virgl_hw_res *res, boolean write_buf)
497b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
498b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
4991ce685f05e798d1b3c0526b5431f8109dd8803faEmil Velikov   struct virgl_vtest_cmd_buf *cbuf = virgl_vtest_cmd_buf(_cbuf);
500b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   boolean already_in_list = virgl_vtest_lookup_res(cbuf, res);
501b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
502b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (write_buf)
503b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      cbuf->base.buf[cbuf->base.cdw++] = res->res_handle;
504b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!already_in_list)
505b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      virgl_vtest_add_res(vtws, cbuf, res);
506b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
507b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
508b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic boolean virgl_vtest_res_is_ref(struct virgl_winsys *vws,
509b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                      struct virgl_cmd_buf *_cbuf,
510b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                      struct virgl_hw_res *res)
511b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
512b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!res->num_cs_references)
513b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return FALSE;
514b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
515b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return TRUE;
516b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
517b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
5187bac333508835776573e6f3192c819dbe4303480Emil Velikovstatic int virgl_vtest_get_caps(struct virgl_winsys *vws,
5197bac333508835776573e6f3192c819dbe4303480Emil Velikov                                struct virgl_drm_caps *caps)
520b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
521b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
522b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return virgl_vtest_send_get_caps(vtws, caps);
523b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
524b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
525b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic struct pipe_fence_handle *
526b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_cs_create_fence(struct virgl_winsys *vws)
527b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
528b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_hw_res *res;
529b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
530b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   res = virgl_vtest_winsys_resource_cache_create(vws,
531b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                                PIPE_BUFFER,
532b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                                PIPE_FORMAT_R8_UNORM,
533b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                                PIPE_BIND_CUSTOM,
534b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                                8, 1, 1, 0, 0, 0, 8);
535b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
536b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return (struct pipe_fence_handle *)res;
537b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
538b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
539b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic bool virgl_fence_wait(struct virgl_winsys *vws,
540b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                             struct pipe_fence_handle *fence,
541b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                             uint64_t timeout)
542b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
543b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vdws = virgl_vtest_winsys(vws);
5441ce685f05e798d1b3c0526b5431f8109dd8803faEmil Velikov   struct virgl_hw_res *res = virgl_hw_res(fence);
545b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
546b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (timeout == 0)
547dc81b3ad43dde0815baf957e7cf4c633d6f350f8Marc-André Lureau      return !virgl_vtest_resource_is_busy(vdws, res);
548b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
549b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (timeout != PIPE_TIMEOUT_INFINITE) {
550b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      int64_t start_time = os_time_get();
551b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      timeout /= 1000;
552b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      while (virgl_vtest_resource_is_busy(vdws, res)) {
553b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         if (os_time_get() - start_time >= timeout)
554b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie            return FALSE;
555b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie         os_time_sleep(10);
556b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      }
557b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return TRUE;
558b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
559b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_resource_wait(vws, res);
560b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return TRUE;
561b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
562b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
563b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_fence_reference(struct virgl_winsys *vws,
564b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                  struct pipe_fence_handle **dst,
565b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                  struct pipe_fence_handle *src)
566b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
567b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vdws = virgl_vtest_winsys(vws);
568b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_resource_reference(vdws, (struct virgl_hw_res **)dst,
5691ce685f05e798d1b3c0526b5431f8109dd8803faEmil Velikov                                  virgl_hw_res(src));
570b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
571b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
572b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void virgl_vtest_flush_frontbuffer(struct virgl_winsys *vws,
573b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                          struct virgl_hw_res *res,
574b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                          unsigned level, unsigned layer,
575b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                          void *winsys_drawable_handle,
576b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                          struct pipe_box *sub_box)
577b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
578b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
579b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct pipe_box box;
580b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   void *map;
581b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t size;
582b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   uint32_t offset = 0, valid_stride;
583b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!res->dt)
584b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return;
585b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
586b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   memset(&box, 0, sizeof(box));
587b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
588b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (sub_box) {
589b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      box = *sub_box;
5907bac333508835776573e6f3192c819dbe4303480Emil Velikov      offset = box.y / util_format_get_blockheight(res->format) * res->stride +
5917bac333508835776573e6f3192c819dbe4303480Emil Velikov               box.x / util_format_get_blockwidth(res->format) * util_format_get_blocksize(res->format);
592b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   } else {
593b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      box.z = layer;
594b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      box.width = res->width;
595b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      box.height = res->height;
596b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      box.depth = 1;
597b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   }
598b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
599b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   size = vtest_get_transfer_size(res, &box, res->stride, 0, level, &valid_stride);
600b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
601b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_busy_wait(vtws, res->res_handle, VCMD_BUSY_WAIT_FLAG_WAIT);
602b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   map = vtws->sws->displaytarget_map(vtws->sws, res->dt, 0);
603b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
604b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   /* execute a transfer */
605b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_send_transfer_cmd(vtws, VCMD_TRANSFER_GET, res->res_handle,
606b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie                                 level, res->stride, 0, &box, size);
6077bac333508835776573e6f3192c819dbe4303480Emil Velikov   virgl_vtest_recv_transfer_get_data(vtws, map + offset, size, valid_stride,
6087bac333508835776573e6f3192c819dbe4303480Emil Velikov                                      &box, res->format);
609b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->sws->displaytarget_unmap(vtws->sws, res->dt);
610b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
6117bac333508835776573e6f3192c819dbe4303480Emil Velikov   vtws->sws->displaytarget_display(vtws->sws, res->dt, winsys_drawable_handle,
6127bac333508835776573e6f3192c819dbe4303480Emil Velikov                                    sub_box);
613b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
614b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
615b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestatic void
616b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_vtest_winsys_destroy(struct virgl_winsys *vws)
617b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
618b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws = virgl_vtest_winsys(vws);
619b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
620b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_cache_flush(vtws);
621b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
622b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_mutex_destroy(vtws->mutex);
623b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   FREE(vtws);
624b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
625b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
626b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airliestruct virgl_winsys *
627b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlievirgl_vtest_winsys_wrap(struct sw_winsys *sws)
628b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie{
629b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   struct virgl_vtest_winsys *vtws;
630b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
631b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws = CALLOC_STRUCT(virgl_vtest_winsys);
632b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   if (!vtws)
633b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie      return NULL;
634b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
635b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   virgl_vtest_connect(vtws);
636b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->sws = sws;
637b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
638b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->usecs = 1000000;
639b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   LIST_INITHEAD(&vtws->delayed);
640b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   pipe_mutex_init(vtws->mutex);
641b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
642b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.destroy = virgl_vtest_winsys_destroy;
643b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
644b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.transfer_put = virgl_vtest_transfer_put;
645b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.transfer_get = virgl_vtest_transfer_get;
646b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
647b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.resource_create = virgl_vtest_winsys_resource_cache_create;
648b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.resource_unref = virgl_vtest_winsys_resource_unref;
649b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.resource_map = virgl_vtest_resource_map;
650b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.resource_wait = virgl_vtest_resource_wait;
651b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.cmd_buf_create = virgl_vtest_cmd_buf_create;
652b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.cmd_buf_destroy = virgl_vtest_cmd_buf_destroy;
653b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.submit_cmd = virgl_vtest_winsys_submit_cmd;
654b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
655b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.emit_res = virgl_vtest_emit_res;
656b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.res_is_referenced = virgl_vtest_res_is_ref;
657b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.get_caps = virgl_vtest_get_caps;
658b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
659b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.cs_create_fence = virgl_cs_create_fence;
660b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.fence_wait = virgl_fence_wait;
661b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.fence_reference = virgl_fence_reference;
662b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
663b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   vtws->base.flush_frontbuffer = virgl_vtest_flush_frontbuffer;
664b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie
665b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie   return &vtws->base;
666b3b82fe8ea1f7d02c93513920143cba2fe145b6cDave Airlie}
667