Path: blob/21.2-virgl/src/gallium/winsys/svga/drm/vmw_query.c
4573 views
/**********************************************************1* Copyright 2015 VMware, Inc. All rights reserved.2*3* Permission is hereby granted, free of charge, to any person4* obtaining a copy of this software and associated documentation5* files (the "Software"), to deal in the Software without6* restriction, including without limitation the rights to use, copy,7* modify, merge, publish, distribute, sublicense, and/or sell copies8* of the Software, and to permit persons to whom the Software is9* furnished to do so, subject to the following conditions:10*11* The above copyright notice and this permission notice shall be12* included in all copies or substantial portions of the Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,15* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND17* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS18* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN19* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN20* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21* SOFTWARE.22*23**********************************************************/2425#include "pipebuffer/pb_bufmgr.h"26#include "util/u_memory.h"2728#include "vmw_screen.h"29#include "vmw_buffer.h"30#include "vmw_query.h"31323334struct svga_winsys_gb_query *35vmw_svga_winsys_query_create(struct svga_winsys_screen *sws,36uint32 queryResultLen)37{38struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);39struct pb_manager *provider = vws->pools.gmr;40struct pb_desc desc = {0};41struct pb_buffer *pb_buf;42struct svga_winsys_gb_query *query;4344query = CALLOC_STRUCT(svga_winsys_gb_query);45if (!query)46return NULL;4748/* Allocate memory to hold queries for this context */49desc.alignment = 4096;50pb_buf = provider->create_buffer(provider, queryResultLen, &desc);51query->buf = vmw_svga_winsys_buffer_wrap(pb_buf);5253if (!query->buf) {54debug_printf("Failed to allocate memory for queries\n");55FREE(query);56query = NULL;57}5859return query;60}61626364void65vmw_svga_winsys_query_destroy(struct svga_winsys_screen *sws,66struct svga_winsys_gb_query *query)67{68vmw_svga_winsys_buffer_destroy(sws, query->buf);69FREE(query);70}71727374int75vmw_svga_winsys_query_init(struct svga_winsys_screen *sws,76struct svga_winsys_gb_query *query,77unsigned offset,78SVGA3dQueryState queryState)79{80SVGA3dQueryState *state;8182state = (SVGA3dQueryState *) vmw_svga_winsys_buffer_map(sws,83query->buf,84PIPE_MAP_WRITE);85if (!state) {86debug_printf("Failed to map query result memory for initialization\n");87return -1;88}8990/* Initialize the query state for the specified query slot */91state = (SVGA3dQueryState *)((char *)state + offset);92*state = queryState;9394vmw_svga_winsys_buffer_unmap(sws, query->buf);9596return 0;97}9899100101void102vmw_svga_winsys_query_get_result(struct svga_winsys_screen *sws,103struct svga_winsys_gb_query *query,104unsigned offset,105SVGA3dQueryState *queryState,106void *result, uint32 resultLen)107{108SVGA3dQueryState *state;109110state = (SVGA3dQueryState *) vmw_svga_winsys_buffer_map(sws,111query->buf,112PIPE_MAP_READ);113if (!state) {114debug_printf("Failed to lock query result memory\n");115116if (queryState)117*queryState = SVGA3D_QUERYSTATE_FAILED;118119return;120}121122state = (SVGA3dQueryState *)((char *)state + offset);123124if (queryState)125*queryState = *state;126127if (result) {128memcpy(result, state + 1, resultLen);129}130131vmw_svga_winsys_buffer_unmap(sws, query->buf);132}133134135enum pipe_error136vmw_swc_query_bind(struct svga_winsys_context *swc,137struct svga_winsys_gb_query *query,138unsigned flags)139{140/* no-op on Linux */141return PIPE_OK;142}143144145146