• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CLOVER_CORE_DEVICE_HPP
24 #define CLOVER_CORE_DEVICE_HPP
25 
26 #include <set>
27 #include <vector>
28 
29 #include "core/object.hpp"
30 #include "core/format.hpp"
31 #include "core/module.hpp"
32 #include "util/lazy.hpp"
33 #include "pipe-loader/pipe_loader.h"
34 
35 struct nir_shader;
36 struct disk_cache;
37 
38 namespace clover {
39    class platform;
40    class root_resource;
41    class hard_event;
42 
43    class device : public ref_counter, public _cl_device_id {
44    public:
45       device(clover::platform &platform, pipe_loader_device *ldev);
46       ~device();
47 
48       device(const device &dev) = delete;
49       device &
50       operator=(const device &dev) = delete;
51 
52       bool
53       operator==(const device &dev) const;
54 
55       cl_device_type type() const;
56       cl_uint vendor_id() const;
57       size_t max_images_read() const;
58       size_t max_images_write() const;
59       size_t max_image_buffer_size() const;
60       cl_uint max_image_levels_2d() const;
61       cl_uint max_image_levels_3d() const;
62       size_t max_image_array_number() const;
63       cl_uint max_samplers() const;
64       cl_ulong max_mem_global() const;
65       cl_ulong max_mem_local() const;
66       cl_ulong max_mem_input() const;
67       cl_ulong max_const_buffer_size() const;
68       cl_uint max_const_buffers() const;
69       size_t max_threads_per_block() const;
70       cl_ulong max_mem_alloc_size() const;
71       cl_uint max_clock_frequency() const;
72       cl_uint max_compute_units() const;
73       bool image_support() const;
74       bool has_doubles() const;
75       bool has_halves() const;
76       bool has_int64_atomics() const;
77       bool has_unified_memory() const;
78       size_t mem_base_addr_align() const;
79       cl_device_svm_capabilities svm_support() const;
80       bool allows_user_pointers() const;
81 
82       std::vector<size_t> max_block_size() const;
83       cl_uint subgroup_size() const;
84       cl_uint address_bits() const;
85       std::string device_name() const;
86       std::string vendor_name() const;
87       std::string device_version() const;
88       std::string device_clc_version() const;
89       enum pipe_shader_ir ir_format() const;
90       std::string ir_target() const;
91       enum pipe_endian endianness() const;
92       bool supports_ir(enum pipe_shader_ir ir) const;
93       std::string supported_extensions() const;
94 
95       friend class command_queue;
96       friend class root_resource;
97       friend class hard_event;
98       friend std::set<cl_image_format>
99       supported_formats(const context &, cl_mem_object_type);
100       const void *get_compiler_options(enum pipe_shader_ir ir) const;
101 
102       clover::platform &platform;
103 
104       inline bool
has_system_svm() const105       has_system_svm() const {
106          return svm_support() & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM;
107       }
108 
109       lazy<std::shared_ptr<nir_shader>> clc_nir;
110       disk_cache *clc_cache;
111    private:
112       pipe_screen *pipe;
113       pipe_loader_device *ldev;
114    };
115 }
116 
117 #endif
118