Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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 "api/util.hpp"
  24. #include "core/platform.hpp"
  25. #include "core/device.hpp"
  26.  
  27. using namespace clover;
  28.  
  29. PUBLIC cl_int
  30. clGetDeviceIDs(cl_platform_id platform, cl_device_type device_type,
  31.                cl_uint num_entries, cl_device_id *devices,
  32.                cl_uint *num_devices) {
  33.    std::vector<cl_device_id> devs;
  34.  
  35.    if ((!num_entries && devices) ||
  36.        (!num_devices && !devices))
  37.       return CL_INVALID_VALUE;
  38.  
  39.    // Collect matching devices
  40.    for (device &dev : *platform) {
  41.       if (((device_type & CL_DEVICE_TYPE_DEFAULT) &&
  42.            &dev == &platform->front()) ||
  43.           (device_type & dev.type()))
  44.          devs.push_back(&dev);
  45.    }
  46.  
  47.    if (devs.empty())
  48.       return CL_DEVICE_NOT_FOUND;
  49.  
  50.    // ...and return the requested data.
  51.    if (num_devices)
  52.       *num_devices = devs.size();
  53.    if (devices)
  54.       std::copy_n(devs.begin(),
  55.                   std::min((cl_uint)devs.size(), num_entries),
  56.                   devices);
  57.  
  58.    return CL_SUCCESS;
  59. }
  60.  
  61. PUBLIC cl_int
  62. clGetDeviceInfo(cl_device_id dev, cl_device_info param,
  63.                 size_t size, void *buf, size_t *size_ret) {
  64.    if (!dev)
  65.       return CL_INVALID_DEVICE;
  66.  
  67.    switch (param) {
  68.    case CL_DEVICE_TYPE:
  69.       return scalar_property<cl_device_type>(buf, size, size_ret, dev->type());
  70.  
  71.    case CL_DEVICE_VENDOR_ID:
  72.       return scalar_property<cl_uint>(buf, size, size_ret, dev->vendor_id());
  73.  
  74.    case CL_DEVICE_MAX_COMPUTE_UNITS:
  75.       return scalar_property<cl_uint>(buf, size, size_ret, 1);
  76.  
  77.    case CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:
  78.       return scalar_property<cl_uint>(buf, size, size_ret,
  79.                                       dev->max_block_size().size());
  80.  
  81.    case CL_DEVICE_MAX_WORK_ITEM_SIZES:
  82.       return vector_property<size_t>(buf, size, size_ret,
  83.                                      dev->max_block_size());
  84.  
  85.    case CL_DEVICE_MAX_WORK_GROUP_SIZE:
  86.       return scalar_property<size_t>(buf, size, size_ret,
  87.                                      dev->max_threads_per_block());
  88.  
  89.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR:
  90.       return scalar_property<cl_uint>(buf, size, size_ret, 16);
  91.  
  92.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT:
  93.       return scalar_property<cl_uint>(buf, size, size_ret, 8);
  94.  
  95.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT:
  96.       return scalar_property<cl_uint>(buf, size, size_ret, 4);
  97.  
  98.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG:
  99.       return scalar_property<cl_uint>(buf, size, size_ret, 2);
  100.  
  101.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT:
  102.       return scalar_property<cl_uint>(buf, size, size_ret, 4);
  103.  
  104.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE:
  105.       return scalar_property<cl_uint>(buf, size, size_ret, 2);
  106.  
  107.    case CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF:
  108.       return scalar_property<cl_uint>(buf, size, size_ret, 0);
  109.  
  110.    case CL_DEVICE_MAX_CLOCK_FREQUENCY:
  111.       return scalar_property<cl_uint>(buf, size, size_ret, 0);
  112.  
  113.    case CL_DEVICE_ADDRESS_BITS:
  114.       return scalar_property<cl_uint>(buf, size, size_ret, 32);
  115.  
  116.    case CL_DEVICE_MAX_READ_IMAGE_ARGS:
  117.       return scalar_property<cl_uint>(buf, size, size_ret,
  118.                                       dev->max_images_read());
  119.  
  120.    case CL_DEVICE_MAX_WRITE_IMAGE_ARGS:
  121.       return scalar_property<cl_uint>(buf, size, size_ret,
  122.                                       dev->max_images_write());
  123.  
  124.    case CL_DEVICE_MAX_MEM_ALLOC_SIZE:
  125.       return scalar_property<cl_ulong>(buf, size, size_ret,
  126.                                        dev->max_mem_alloc_size());
  127.  
  128.    case CL_DEVICE_IMAGE2D_MAX_WIDTH:
  129.    case CL_DEVICE_IMAGE2D_MAX_HEIGHT:
  130.       return scalar_property<size_t>(buf, size, size_ret,
  131.                                      1 << dev->max_image_levels_2d());
  132.  
  133.    case CL_DEVICE_IMAGE3D_MAX_WIDTH:
  134.    case CL_DEVICE_IMAGE3D_MAX_HEIGHT:
  135.    case CL_DEVICE_IMAGE3D_MAX_DEPTH:
  136.       return scalar_property<size_t>(buf, size, size_ret,
  137.                                      1 << dev->max_image_levels_3d());
  138.  
  139.    case CL_DEVICE_IMAGE_SUPPORT:
  140.       return scalar_property<cl_bool>(buf, size, size_ret, CL_TRUE);
  141.  
  142.    case CL_DEVICE_MAX_PARAMETER_SIZE:
  143.       return scalar_property<size_t>(buf, size, size_ret,
  144.                                      dev->max_mem_input());
  145.  
  146.    case CL_DEVICE_MAX_SAMPLERS:
  147.       return scalar_property<cl_uint>(buf, size, size_ret,
  148.                                       dev->max_samplers());
  149.  
  150.    case CL_DEVICE_MEM_BASE_ADDR_ALIGN:
  151.    case CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE:
  152.       return scalar_property<cl_uint>(buf, size, size_ret, 128);
  153.  
  154.    case CL_DEVICE_SINGLE_FP_CONFIG:
  155.       return scalar_property<cl_device_fp_config>(buf, size, size_ret,
  156.          CL_FP_DENORM | CL_FP_INF_NAN | CL_FP_ROUND_TO_NEAREST);
  157.  
  158.    case CL_DEVICE_GLOBAL_MEM_CACHE_TYPE:
  159.       return scalar_property<cl_device_mem_cache_type>(buf, size, size_ret,
  160.                                                        CL_NONE);
  161.  
  162.    case CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE:
  163.       return scalar_property<cl_uint>(buf, size, size_ret, 0);
  164.  
  165.    case CL_DEVICE_GLOBAL_MEM_CACHE_SIZE:
  166.       return scalar_property<cl_ulong>(buf, size, size_ret, 0);
  167.  
  168.    case CL_DEVICE_GLOBAL_MEM_SIZE:
  169.       return scalar_property<cl_ulong>(buf, size, size_ret,
  170.                                        dev->max_mem_global());
  171.  
  172.    case CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:
  173.       return scalar_property<cl_ulong>(buf, size, size_ret,
  174.                                        dev->max_const_buffer_size());
  175.  
  176.    case CL_DEVICE_MAX_CONSTANT_ARGS:
  177.       return scalar_property<cl_uint>(buf, size, size_ret,
  178.                                       dev->max_const_buffers());
  179.  
  180.    case CL_DEVICE_LOCAL_MEM_TYPE:
  181.       return scalar_property<cl_device_local_mem_type>(buf, size, size_ret,
  182.                                                        CL_LOCAL);
  183.  
  184.    case CL_DEVICE_LOCAL_MEM_SIZE:
  185.       return scalar_property<cl_ulong>(buf, size, size_ret,
  186.                                        dev->max_mem_local());
  187.  
  188.    case CL_DEVICE_ERROR_CORRECTION_SUPPORT:
  189.       return scalar_property<cl_bool>(buf, size, size_ret, CL_FALSE);
  190.  
  191.    case CL_DEVICE_PROFILING_TIMER_RESOLUTION:
  192.       return scalar_property<size_t>(buf, size, size_ret, 0);
  193.  
  194.    case CL_DEVICE_ENDIAN_LITTLE:
  195.       return scalar_property<cl_bool>(buf, size, size_ret,
  196.                                       dev->endianness() == PIPE_ENDIAN_LITTLE);
  197.  
  198.    case CL_DEVICE_AVAILABLE:
  199.    case CL_DEVICE_COMPILER_AVAILABLE:
  200.       return scalar_property<cl_bool>(buf, size, size_ret, CL_TRUE);
  201.  
  202.    case CL_DEVICE_EXECUTION_CAPABILITIES:
  203.       return scalar_property<cl_device_exec_capabilities>(buf, size, size_ret,
  204.                                                           CL_EXEC_KERNEL);
  205.  
  206.    case CL_DEVICE_QUEUE_PROPERTIES:
  207.       return scalar_property<cl_command_queue_properties>(buf, size, size_ret,
  208.          CL_QUEUE_PROFILING_ENABLE);
  209.  
  210.    case CL_DEVICE_NAME:
  211.       return string_property(buf, size, size_ret, dev->device_name());
  212.  
  213.    case CL_DEVICE_VENDOR:
  214.       return string_property(buf, size, size_ret, dev->vendor_name());
  215.  
  216.    case CL_DRIVER_VERSION:
  217.       return string_property(buf, size, size_ret, PACKAGE_VERSION);
  218.  
  219.    case CL_DEVICE_PROFILE:
  220.       return string_property(buf, size, size_ret, "FULL_PROFILE");
  221.  
  222.    case CL_DEVICE_VERSION:
  223.       return string_property(buf, size, size_ret,
  224.                              "OpenCL 1.1 MESA " PACKAGE_VERSION);
  225.  
  226.    case CL_DEVICE_EXTENSIONS:
  227.       return string_property(buf, size, size_ret, "");
  228.  
  229.    case CL_DEVICE_PLATFORM:
  230.       return scalar_property<cl_platform_id>(buf, size, size_ret,
  231.                                              &dev->platform);
  232.  
  233.    case CL_DEVICE_HOST_UNIFIED_MEMORY:
  234.       return scalar_property<cl_bool>(buf, size, size_ret, CL_TRUE);
  235.  
  236.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR:
  237.       return scalar_property<cl_uint>(buf, size, size_ret, 16);
  238.  
  239.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT:
  240.       return scalar_property<cl_uint>(buf, size, size_ret, 8);
  241.  
  242.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_INT:
  243.       return scalar_property<cl_uint>(buf, size, size_ret, 4);
  244.  
  245.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG:
  246.       return scalar_property<cl_uint>(buf, size, size_ret, 2);
  247.  
  248.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT:
  249.       return scalar_property<cl_uint>(buf, size, size_ret, 4);
  250.  
  251.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE:
  252.       return scalar_property<cl_uint>(buf, size, size_ret, 2);
  253.  
  254.    case CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF:
  255.       return scalar_property<cl_uint>(buf, size, size_ret, 0);
  256.  
  257.    case CL_DEVICE_OPENCL_C_VERSION:
  258.       return string_property(buf, size, size_ret, "OpenCL C 1.1");
  259.  
  260.    default:
  261.       return CL_INVALID_VALUE;
  262.    }
  263. }
  264.