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