Path: blob/21.2-virgl/src/gallium/frontends/clover/api/platform.cpp
4572 views
//1// Copyright 2012 Francisco Jerez2//3// Permission is hereby granted, free of charge, to any person obtaining a4// copy of this software and associated documentation files (the "Software"),5// to deal in the Software without restriction, including without limitation6// the rights to use, copy, modify, merge, publish, distribute, sublicense,7// and/or sell copies of the Software, and to permit persons to whom the8// Software is furnished to do so, subject to the following conditions:9//10// The above copyright notice and this permission notice shall be included in11// all copies or substantial portions of the Software.12//13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL16// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR17// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,18// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR19// OTHER DEALINGS IN THE SOFTWARE.20//2122#include <unordered_map>2324#include "api/dispatch.hpp"25#include "api/util.hpp"26#include "core/platform.hpp"27#include "git_sha1.h"28#include "util/u_debug.h"2930using namespace clover;3132namespace {33platform _clover_platform;34}3536CLOVER_API cl_int37clGetPlatformIDs(cl_uint num_entries, cl_platform_id *rd_platforms,38cl_uint *rnum_platforms) {39if ((!num_entries && rd_platforms) ||40(!rnum_platforms && !rd_platforms))41return CL_INVALID_VALUE;4243if (rnum_platforms)44*rnum_platforms = 1;45if (rd_platforms)46*rd_platforms = desc(_clover_platform);4748return CL_SUCCESS;49}5051cl_int52clover::GetPlatformInfo(cl_platform_id d_platform, cl_platform_info param,53size_t size, void *r_buf, size_t *r_size) try {54property_buffer buf { r_buf, size, r_size };5556auto &platform = obj(d_platform);5758switch (param) {59case CL_PLATFORM_PROFILE:60buf.as_string() = "FULL_PROFILE";61break;6263case CL_PLATFORM_VERSION: {64buf.as_string() = "OpenCL " + platform.platform_version_as_string() + " Mesa " PACKAGE_VERSION MESA_GIT_SHA1;65break;66}67case CL_PLATFORM_NAME:68buf.as_string() = "Clover";69break;7071case CL_PLATFORM_VENDOR:72buf.as_string() = "Mesa";73break;7475case CL_PLATFORM_EXTENSIONS:76buf.as_string() = platform.supported_extensions_as_string();77break;7879case CL_PLATFORM_ICD_SUFFIX_KHR:80buf.as_string() = "MESA";81break;8283case CL_PLATFORM_NUMERIC_VERSION: {84buf.as_scalar<cl_version>() = platform.platform_version();85break;86}8788case CL_PLATFORM_EXTENSIONS_WITH_VERSION:89buf.as_vector<cl_name_version>() = platform.supported_extensions();90break;9192case CL_PLATFORM_HOST_TIMER_RESOLUTION:93buf.as_scalar<cl_ulong>() = 0;94break;9596default:97throw error(CL_INVALID_VALUE);98}99100return CL_SUCCESS;101102} catch (error &e) {103return e.get();104}105106void *107clover::GetExtensionFunctionAddressForPlatform(cl_platform_id d_platform,108const char *p_name) try {109obj(d_platform);110return GetExtensionFunctionAddress(p_name);111112} catch (error &e) {113return NULL;114}115116namespace {117118cl_int119enqueueSVMFreeARM(cl_command_queue command_queue,120cl_uint num_svm_pointers,121void *svm_pointers[],122void (CL_CALLBACK *pfn_free_func) (123cl_command_queue queue, cl_uint num_svm_pointers,124void *svm_pointers[], void *user_data),125void *user_data,126cl_uint num_events_in_wait_list,127const cl_event *event_wait_list,128cl_event *event) {129130return EnqueueSVMFree(command_queue, num_svm_pointers, svm_pointers,131pfn_free_func, user_data, num_events_in_wait_list,132event_wait_list, event, CL_COMMAND_SVM_FREE_ARM);133}134135cl_int136enqueueSVMMapARM(cl_command_queue command_queue,137cl_bool blocking_map,138cl_map_flags map_flags,139void *svm_ptr,140size_t size,141cl_uint num_events_in_wait_list,142const cl_event *event_wait_list,143cl_event *event) {144145return EnqueueSVMMap(command_queue, blocking_map, map_flags, svm_ptr, size,146num_events_in_wait_list, event_wait_list, event,147CL_COMMAND_SVM_MAP_ARM);148}149150cl_int151enqueueSVMMemcpyARM(cl_command_queue command_queue,152cl_bool blocking_copy,153void *dst_ptr,154const void *src_ptr,155size_t size,156cl_uint num_events_in_wait_list,157const cl_event *event_wait_list,158cl_event *event) {159160return EnqueueSVMMemcpy(command_queue, blocking_copy, dst_ptr, src_ptr,161size, num_events_in_wait_list, event_wait_list,162event, CL_COMMAND_SVM_MEMCPY_ARM);163}164165cl_int166enqueueSVMMemFillARM(cl_command_queue command_queue,167void *svm_ptr,168const void *pattern,169size_t pattern_size,170size_t size,171cl_uint num_events_in_wait_list,172const cl_event *event_wait_list,173cl_event *event) {174175return EnqueueSVMMemFill(command_queue, svm_ptr, pattern, pattern_size,176size, num_events_in_wait_list, event_wait_list,177event, CL_COMMAND_SVM_MEMFILL_ARM);178}179180cl_int181enqueueSVMUnmapARM(cl_command_queue command_queue,182void *svm_ptr,183cl_uint num_events_in_wait_list,184const cl_event *event_wait_list,185cl_event *event) {186187return EnqueueSVMUnmap(command_queue, svm_ptr, num_events_in_wait_list,188event_wait_list, event, CL_COMMAND_SVM_UNMAP_ARM);189}190191const std::unordered_map<std::string, void *>192ext_funcs = {193// cl_arm_shared_virtual_memory194{ "clEnqueueSVMFreeARM", reinterpret_cast<void *>(enqueueSVMFreeARM) },195{ "clEnqueueSVMMapARM", reinterpret_cast<void *>(enqueueSVMMapARM) },196{ "clEnqueueSVMMemcpyARM", reinterpret_cast<void *>(enqueueSVMMemcpyARM) },197{ "clEnqueueSVMMemFillARM", reinterpret_cast<void *>(enqueueSVMMemFillARM) },198{ "clEnqueueSVMUnmapARM", reinterpret_cast<void *>(enqueueSVMUnmapARM) },199{ "clSetKernelArgSVMPointerARM", reinterpret_cast<void *>(clSetKernelArgSVMPointer) },200{ "clSetKernelExecInfoARM", reinterpret_cast<void *>(clSetKernelExecInfo) },201{ "clSVMAllocARM", reinterpret_cast<void *>(clSVMAlloc) },202{ "clSVMFreeARM", reinterpret_cast<void *>(clSVMFree) },203204// cl_khr_icd205{ "clIcdGetPlatformIDsKHR", reinterpret_cast<void *>(IcdGetPlatformIDsKHR) },206207// cl_khr_il_program208{ "clCreateProgramWithILKHR", reinterpret_cast<void *>(CreateProgramWithILKHR) },209};210211} // anonymous namespace212213void *214clover::GetExtensionFunctionAddress(const char *p_name) try {215return ext_funcs.at(p_name);216} catch (...) {217return nullptr;218}219220cl_int221clover::IcdGetPlatformIDsKHR(cl_uint num_entries, cl_platform_id *rd_platforms,222cl_uint *rnum_platforms) {223return clGetPlatformIDs(num_entries, rd_platforms, rnum_platforms);224}225226CLOVER_ICD_API cl_int227clGetPlatformInfo(cl_platform_id d_platform, cl_platform_info param,228size_t size, void *r_buf, size_t *r_size) {229return GetPlatformInfo(d_platform, param, size, r_buf, r_size);230}231232CLOVER_ICD_API void *233clGetExtensionFunctionAddress(const char *p_name) {234return GetExtensionFunctionAddress(p_name);235}236237CLOVER_ICD_API void *238clGetExtensionFunctionAddressForPlatform(cl_platform_id d_platform,239const char *p_name) {240return GetExtensionFunctionAddressForPlatform(d_platform, p_name);241}242243CLOVER_ICD_API cl_int244clIcdGetPlatformIDsKHR(cl_uint num_entries, cl_platform_id *rd_platforms,245cl_uint *rnum_platforms) {246return IcdGetPlatformIDsKHR(num_entries, rd_platforms, rnum_platforms);247}248249250