1 /*
2 * Copyright (c) 2015-2024 Broadcom. All Rights Reserved.
3 * The term “Broadcom” refers to Broadcom Inc.
4 * and/or its subsidiaries.
5 * SPDX-License-Identifier: MIT
6 */
7
8 #include "pipebuffer/pb_bufmgr.h"
9 #include "util/u_memory.h"
10
11 #include "vmw_screen.h"
12 #include "vmw_buffer.h"
13 #include "vmw_query.h"
14
15
16
17 struct svga_winsys_gb_query *
vmw_svga_winsys_query_create(struct svga_winsys_screen * sws,uint32 queryResultLen)18 vmw_svga_winsys_query_create(struct svga_winsys_screen *sws,
19 uint32 queryResultLen)
20 {
21 struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
22 struct pb_manager *provider = vws->pools.dma_base;
23 struct pb_desc desc = {0};
24 struct pb_buffer *pb_buf;
25 struct svga_winsys_gb_query *query;
26
27 query = CALLOC_STRUCT(svga_winsys_gb_query);
28 if (!query)
29 return NULL;
30
31 /* Allocate memory to hold queries for this context */
32 desc.alignment = 4096;
33 pb_buf = provider->create_buffer(provider, queryResultLen, &desc);
34 query->buf = vmw_svga_winsys_buffer_wrap(pb_buf);
35
36 if (!query->buf) {
37 debug_printf("Failed to allocate memory for queries\n");
38 FREE(query);
39 query = NULL;
40 }
41
42 return query;
43 }
44
45
46
47 void
vmw_svga_winsys_query_destroy(struct svga_winsys_screen * sws,struct svga_winsys_gb_query * query)48 vmw_svga_winsys_query_destroy(struct svga_winsys_screen *sws,
49 struct svga_winsys_gb_query *query)
50 {
51 vmw_svga_winsys_buffer_destroy(sws, query->buf);
52 FREE(query);
53 }
54
55
56
57 int
vmw_svga_winsys_query_init(struct svga_winsys_screen * sws,struct svga_winsys_gb_query * query,unsigned offset,SVGA3dQueryState queryState)58 vmw_svga_winsys_query_init(struct svga_winsys_screen *sws,
59 struct svga_winsys_gb_query *query,
60 unsigned offset,
61 SVGA3dQueryState queryState)
62 {
63 SVGA3dQueryState *state;
64
65 state = (SVGA3dQueryState *) vmw_svga_winsys_buffer_map(sws,
66 query->buf,
67 PIPE_MAP_WRITE);
68 if (!state) {
69 debug_printf("Failed to map query result memory for initialization\n");
70 return -1;
71 }
72
73 /* Initialize the query state for the specified query slot */
74 state = (SVGA3dQueryState *)((char *)state + offset);
75 *state = queryState;
76
77 vmw_svga_winsys_buffer_unmap(sws, query->buf);
78
79 return 0;
80 }
81
82
83
84 void
vmw_svga_winsys_query_get_result(struct svga_winsys_screen * sws,struct svga_winsys_gb_query * query,unsigned offset,SVGA3dQueryState * queryState,void * result,uint32 resultLen)85 vmw_svga_winsys_query_get_result(struct svga_winsys_screen *sws,
86 struct svga_winsys_gb_query *query,
87 unsigned offset,
88 SVGA3dQueryState *queryState,
89 void *result, uint32 resultLen)
90 {
91 SVGA3dQueryState *state;
92
93 state = (SVGA3dQueryState *) vmw_svga_winsys_buffer_map(sws,
94 query->buf,
95 PIPE_MAP_READ);
96 if (!state) {
97 debug_printf("Failed to lock query result memory\n");
98
99 if (queryState)
100 *queryState = SVGA3D_QUERYSTATE_FAILED;
101
102 return;
103 }
104
105 state = (SVGA3dQueryState *)((char *)state + offset);
106
107 if (queryState)
108 *queryState = *state;
109
110 if (result) {
111 memcpy(result, state + 1, resultLen);
112 }
113
114 vmw_svga_winsys_buffer_unmap(sws, query->buf);
115 }
116
117
118 enum pipe_error
vmw_swc_query_bind(struct svga_winsys_context * swc,struct svga_winsys_gb_query * query,unsigned flags)119 vmw_swc_query_bind(struct svga_winsys_context *swc,
120 struct svga_winsys_gb_query *query,
121 unsigned flags)
122 {
123 /* no-op on Linux */
124 return PIPE_OK;
125 }
126
127