xref: /aosp_15_r20/external/mesa3d/src/gallium/winsys/svga/drm/vmw_query.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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