Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/frontends/clover/api/platform.cpp
4572 views
1
//
2
// Copyright 2012 Francisco Jerez
3
//
4
// Permission is hereby granted, free of charge, to any person obtaining a
5
// copy of this software and associated documentation files (the "Software"),
6
// to deal in the Software without restriction, including without limitation
7
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
// and/or sell copies of the Software, and to permit persons to whom the
9
// Software is furnished to do so, subject to the following conditions:
10
//
11
// The above copyright notice and this permission notice shall be included in
12
// all copies or substantial portions of the Software.
13
//
14
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20
// OTHER DEALINGS IN THE SOFTWARE.
21
//
22
23
#include <unordered_map>
24
25
#include "api/dispatch.hpp"
26
#include "api/util.hpp"
27
#include "core/platform.hpp"
28
#include "git_sha1.h"
29
#include "util/u_debug.h"
30
31
using namespace clover;
32
33
namespace {
34
platform _clover_platform;
35
}
36
37
CLOVER_API cl_int
38
clGetPlatformIDs(cl_uint num_entries, cl_platform_id *rd_platforms,
39
cl_uint *rnum_platforms) {
40
if ((!num_entries && rd_platforms) ||
41
(!rnum_platforms && !rd_platforms))
42
return CL_INVALID_VALUE;
43
44
if (rnum_platforms)
45
*rnum_platforms = 1;
46
if (rd_platforms)
47
*rd_platforms = desc(_clover_platform);
48
49
return CL_SUCCESS;
50
}
51
52
cl_int
53
clover::GetPlatformInfo(cl_platform_id d_platform, cl_platform_info param,
54
size_t size, void *r_buf, size_t *r_size) try {
55
property_buffer buf { r_buf, size, r_size };
56
57
auto &platform = obj(d_platform);
58
59
switch (param) {
60
case CL_PLATFORM_PROFILE:
61
buf.as_string() = "FULL_PROFILE";
62
break;
63
64
case CL_PLATFORM_VERSION: {
65
buf.as_string() = "OpenCL " + platform.platform_version_as_string() + " Mesa " PACKAGE_VERSION MESA_GIT_SHA1;
66
break;
67
}
68
case CL_PLATFORM_NAME:
69
buf.as_string() = "Clover";
70
break;
71
72
case CL_PLATFORM_VENDOR:
73
buf.as_string() = "Mesa";
74
break;
75
76
case CL_PLATFORM_EXTENSIONS:
77
buf.as_string() = platform.supported_extensions_as_string();
78
break;
79
80
case CL_PLATFORM_ICD_SUFFIX_KHR:
81
buf.as_string() = "MESA";
82
break;
83
84
case CL_PLATFORM_NUMERIC_VERSION: {
85
buf.as_scalar<cl_version>() = platform.platform_version();
86
break;
87
}
88
89
case CL_PLATFORM_EXTENSIONS_WITH_VERSION:
90
buf.as_vector<cl_name_version>() = platform.supported_extensions();
91
break;
92
93
case CL_PLATFORM_HOST_TIMER_RESOLUTION:
94
buf.as_scalar<cl_ulong>() = 0;
95
break;
96
97
default:
98
throw error(CL_INVALID_VALUE);
99
}
100
101
return CL_SUCCESS;
102
103
} catch (error &e) {
104
return e.get();
105
}
106
107
void *
108
clover::GetExtensionFunctionAddressForPlatform(cl_platform_id d_platform,
109
const char *p_name) try {
110
obj(d_platform);
111
return GetExtensionFunctionAddress(p_name);
112
113
} catch (error &e) {
114
return NULL;
115
}
116
117
namespace {
118
119
cl_int
120
enqueueSVMFreeARM(cl_command_queue command_queue,
121
cl_uint num_svm_pointers,
122
void *svm_pointers[],
123
void (CL_CALLBACK *pfn_free_func) (
124
cl_command_queue queue, cl_uint num_svm_pointers,
125
void *svm_pointers[], void *user_data),
126
void *user_data,
127
cl_uint num_events_in_wait_list,
128
const cl_event *event_wait_list,
129
cl_event *event) {
130
131
return EnqueueSVMFree(command_queue, num_svm_pointers, svm_pointers,
132
pfn_free_func, user_data, num_events_in_wait_list,
133
event_wait_list, event, CL_COMMAND_SVM_FREE_ARM);
134
}
135
136
cl_int
137
enqueueSVMMapARM(cl_command_queue command_queue,
138
cl_bool blocking_map,
139
cl_map_flags map_flags,
140
void *svm_ptr,
141
size_t size,
142
cl_uint num_events_in_wait_list,
143
const cl_event *event_wait_list,
144
cl_event *event) {
145
146
return EnqueueSVMMap(command_queue, blocking_map, map_flags, svm_ptr, size,
147
num_events_in_wait_list, event_wait_list, event,
148
CL_COMMAND_SVM_MAP_ARM);
149
}
150
151
cl_int
152
enqueueSVMMemcpyARM(cl_command_queue command_queue,
153
cl_bool blocking_copy,
154
void *dst_ptr,
155
const void *src_ptr,
156
size_t size,
157
cl_uint num_events_in_wait_list,
158
const cl_event *event_wait_list,
159
cl_event *event) {
160
161
return EnqueueSVMMemcpy(command_queue, blocking_copy, dst_ptr, src_ptr,
162
size, num_events_in_wait_list, event_wait_list,
163
event, CL_COMMAND_SVM_MEMCPY_ARM);
164
}
165
166
cl_int
167
enqueueSVMMemFillARM(cl_command_queue command_queue,
168
void *svm_ptr,
169
const void *pattern,
170
size_t pattern_size,
171
size_t size,
172
cl_uint num_events_in_wait_list,
173
const cl_event *event_wait_list,
174
cl_event *event) {
175
176
return EnqueueSVMMemFill(command_queue, svm_ptr, pattern, pattern_size,
177
size, num_events_in_wait_list, event_wait_list,
178
event, CL_COMMAND_SVM_MEMFILL_ARM);
179
}
180
181
cl_int
182
enqueueSVMUnmapARM(cl_command_queue command_queue,
183
void *svm_ptr,
184
cl_uint num_events_in_wait_list,
185
const cl_event *event_wait_list,
186
cl_event *event) {
187
188
return EnqueueSVMUnmap(command_queue, svm_ptr, num_events_in_wait_list,
189
event_wait_list, event, CL_COMMAND_SVM_UNMAP_ARM);
190
}
191
192
const std::unordered_map<std::string, void *>
193
ext_funcs = {
194
// cl_arm_shared_virtual_memory
195
{ "clEnqueueSVMFreeARM", reinterpret_cast<void *>(enqueueSVMFreeARM) },
196
{ "clEnqueueSVMMapARM", reinterpret_cast<void *>(enqueueSVMMapARM) },
197
{ "clEnqueueSVMMemcpyARM", reinterpret_cast<void *>(enqueueSVMMemcpyARM) },
198
{ "clEnqueueSVMMemFillARM", reinterpret_cast<void *>(enqueueSVMMemFillARM) },
199
{ "clEnqueueSVMUnmapARM", reinterpret_cast<void *>(enqueueSVMUnmapARM) },
200
{ "clSetKernelArgSVMPointerARM", reinterpret_cast<void *>(clSetKernelArgSVMPointer) },
201
{ "clSetKernelExecInfoARM", reinterpret_cast<void *>(clSetKernelExecInfo) },
202
{ "clSVMAllocARM", reinterpret_cast<void *>(clSVMAlloc) },
203
{ "clSVMFreeARM", reinterpret_cast<void *>(clSVMFree) },
204
205
// cl_khr_icd
206
{ "clIcdGetPlatformIDsKHR", reinterpret_cast<void *>(IcdGetPlatformIDsKHR) },
207
208
// cl_khr_il_program
209
{ "clCreateProgramWithILKHR", reinterpret_cast<void *>(CreateProgramWithILKHR) },
210
};
211
212
} // anonymous namespace
213
214
void *
215
clover::GetExtensionFunctionAddress(const char *p_name) try {
216
return ext_funcs.at(p_name);
217
} catch (...) {
218
return nullptr;
219
}
220
221
cl_int
222
clover::IcdGetPlatformIDsKHR(cl_uint num_entries, cl_platform_id *rd_platforms,
223
cl_uint *rnum_platforms) {
224
return clGetPlatformIDs(num_entries, rd_platforms, rnum_platforms);
225
}
226
227
CLOVER_ICD_API cl_int
228
clGetPlatformInfo(cl_platform_id d_platform, cl_platform_info param,
229
size_t size, void *r_buf, size_t *r_size) {
230
return GetPlatformInfo(d_platform, param, size, r_buf, r_size);
231
}
232
233
CLOVER_ICD_API void *
234
clGetExtensionFunctionAddress(const char *p_name) {
235
return GetExtensionFunctionAddress(p_name);
236
}
237
238
CLOVER_ICD_API void *
239
clGetExtensionFunctionAddressForPlatform(cl_platform_id d_platform,
240
const char *p_name) {
241
return GetExtensionFunctionAddressForPlatform(d_platform, p_name);
242
}
243
244
CLOVER_ICD_API cl_int
245
clIcdGetPlatformIDsKHR(cl_uint num_entries, cl_platform_id *rd_platforms,
246
cl_uint *rnum_platforms) {
247
return IcdGetPlatformIDsKHR(num_entries, rd_platforms, rnum_platforms);
248
}
249
250