opencl_ruby_ffi 0.994 → 0.995
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/opencl_ruby_ffi/CommandQueue.rb +14 -9
- data/lib/opencl_ruby_ffi/Context.rb +17 -12
- data/lib/opencl_ruby_ffi/Device.rb +29 -24
- data/lib/opencl_ruby_ffi/Event.rb +25 -20
- data/lib/opencl_ruby_ffi/Image.rb +10 -11
- data/lib/opencl_ruby_ffi/Kernel.rb +36 -26
- data/lib/opencl_ruby_ffi/Mem.rb +27 -22
- data/lib/opencl_ruby_ffi/Pipe.rb +6 -1
- data/lib/opencl_ruby_ffi/Platform.rb +14 -9
- data/lib/opencl_ruby_ffi/Program.rb +31 -58
- data/lib/opencl_ruby_ffi/Sampler.rb +11 -6
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +186 -154
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +110 -96
- data/opencl_ruby_ffi.gemspec +1 -1
- metadata +2 -2
| @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            module FFI
         | 
| 2 | 
            +
             | 
| 2 3 | 
             
              class Pointer
         | 
| 3 4 | 
             
                alias_method :orig_method_missing, :method_missing
         | 
| 4 5 | 
             
                # if a missing write_type, read_type, get_array_of_type can transitively get a replacement, an alias is created and the method is called
         | 
| @@ -42,36 +43,8 @@ module FFI | |
| 42 43 | 
             
            end
         | 
| 43 44 |  | 
| 44 45 | 
             
            module OpenCL
         | 
| 45 | 
            -
              @@type_converter = {
         | 
| 46 | 
            -
                :cl_device_type => Device::Type,
         | 
| 47 | 
            -
                :cl_device_fp_config => Device::FPConfig,
         | 
| 48 | 
            -
                :cl_device_mem_cache_type => Device::MemCacheType,
         | 
| 49 | 
            -
                :cl_device_local_mem_type => Device::LocalMemType,
         | 
| 50 | 
            -
                :cl_device_exec_capabilities => Device::ExecCapabilities,
         | 
| 51 | 
            -
                :cl_command_queue_properties => CommandQueue::Properties,
         | 
| 52 | 
            -
                :cl_device_affinity_domain => Device::AffinityDomain,
         | 
| 53 | 
            -
                :cl_device_svm_capabilities => Device::SVMCapabilities,
         | 
| 54 | 
            -
                :cl_channel_order => ChannelOrder,
         | 
| 55 | 
            -
                :cl_channel_type => ChannelType,
         | 
| 56 | 
            -
                :cl_mem_flags => Mem::Flags,
         | 
| 57 | 
            -
                :cl_mem_object_type => Mem::Type,
         | 
| 58 | 
            -
                :cl_mem_migration_flags => Mem::MigrationFlags,
         | 
| 59 | 
            -
                :cl_addressing_mode => AddressingMode,
         | 
| 60 | 
            -
                :cl_filter_mode => FilterMode,
         | 
| 61 | 
            -
                :cl_map_flags => MapFlags,
         | 
| 62 | 
            -
                :cl_program_binary_type => Program::BinaryType,
         | 
| 63 | 
            -
                :cl_kernel_arg_address_qualifier => Kernel::Arg::AddressQualifier,
         | 
| 64 | 
            -
                :cl_kernel_arg_access_qualifier => Kernel::Arg::AccessQualifier,
         | 
| 65 | 
            -
                :cl_kernel_arg_type_qualifier => Kernel::Arg::TypeQualifier,
         | 
| 66 | 
            -
                :cl_command_type => CommandType,
         | 
| 67 | 
            -
                :cl_build_status => BuildStatus
         | 
| 68 | 
            -
              }
         | 
| 69 | 
            -
              @@callbacks = []
         | 
| 70 46 |  | 
| 71 | 
            -
               | 
| 72 | 
            -
              def self.convert_type(type)
         | 
| 73 | 
            -
                return @@type_converter[type]
         | 
| 74 | 
            -
              end
         | 
| 47 | 
            +
              @@callbacks = []
         | 
| 75 48 |  | 
| 76 49 | 
             
              # Maps the :cl_image_fomat type of OpenCL
         | 
| 77 50 | 
             
              class ImageFormat < FFI::Struct
         | 
| @@ -87,7 +60,7 @@ module OpenCL | |
| 87 60 |  | 
| 88 61 | 
             
                # Returns a new ChannelOrder corresponding to the ImageFormat internal value
         | 
| 89 62 | 
             
                def channel_order
         | 
| 90 | 
            -
                  return  | 
| 63 | 
            +
                  return ChannelOrder::new(self[:image_channel_order])
         | 
| 91 64 | 
             
                end
         | 
| 92 65 |  | 
| 93 66 | 
             
                # Sets the ImageFormat internal value for the image channel order
         | 
| @@ -97,7 +70,7 @@ module OpenCL | |
| 97 70 |  | 
| 98 71 | 
             
                # Returns a new ChannelType corresponding to the ImageFormat internal value
         | 
| 99 72 | 
             
                def channel_data_type
         | 
| 100 | 
            -
                  return  | 
| 73 | 
            +
                  return ChannelType::new(self[:image_channel_data_type])
         | 
| 101 74 | 
             
                end
         | 
| 102 75 |  | 
| 103 76 | 
             
                # Sets the ImageFormat internal value for the image channel data type
         | 
| @@ -134,7 +107,7 @@ module OpenCL | |
| 134 107 | 
             
                       :image_slice_pitch,    :size_t,
         | 
| 135 108 | 
             
                       :num_mip_levels,       :cl_uint, 
         | 
| 136 109 | 
             
                       :num_samples,          :cl_uint,  
         | 
| 137 | 
            -
                       :buffer,                | 
| 110 | 
            +
                       :buffer,               Mem.ptr
         | 
| 138 111 |  | 
| 139 112 | 
             
                 # Creates anew ImageDesc using the values provided by the user
         | 
| 140 113 | 
             
                 def initialize( image_type, image_width, image_height, image_depth, image_array_size, image_row_pitch, image_slice_pitch, num_mip_levels, num_samples, buffer )
         | 
| @@ -165,163 +138,222 @@ module OpenCL | |
| 165 138 | 
             
                end
         | 
| 166 139 | 
             
              end
         | 
| 167 140 |  | 
| 168 | 
            -
               | 
| 169 | 
            -
               | 
| 170 | 
            -
             | 
| 171 | 
            -
                 | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 141 | 
            +
              #:stopdoc:
         | 
| 142 | 
            +
              module InnerInterface
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                private
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                # Extracts the :flags named option from the hash given and returns the flags value
         | 
| 147 | 
            +
                def get_flags( options )
         | 
| 148 | 
            +
                  flags = 0
         | 
| 149 | 
            +
                  if options[:flags] then
         | 
| 150 | 
            +
                    if options[:flags].respond_to?(:each) then
         | 
| 151 | 
            +
                      options[:flags].each { |f| flags = flags | f }
         | 
| 152 | 
            +
                    else
         | 
| 153 | 
            +
                      flags = options[:flags]
         | 
| 154 | 
            +
                    end
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
                  return flags
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
              
         | 
| 159 | 
            +
                # Extracts the :event_wait_list named option from the hash given and returns a tuple containing the number of events and a pointer to those events
         | 
| 160 | 
            +
                def get_event_wait_list( options )
         | 
| 161 | 
            +
                  num_events = 0
         | 
| 162 | 
            +
                  events = nil
         | 
| 163 | 
            +
                  if options[:event_wait_list] then
         | 
| 164 | 
            +
                    num_events = options[:event_wait_list].length
         | 
| 165 | 
            +
                    if num_events > 0 then
         | 
| 166 | 
            +
                      events = FFI::MemoryPointer::new( Event, num_events )
         | 
| 167 | 
            +
                      options[:event_wait_list].each_with_index { |e, i|
         | 
| 168 | 
            +
                        events[i].write_pointer(e)
         | 
| 169 | 
            +
                      }
         | 
| 170 | 
            +
                    end
         | 
| 171 | 
            +
                  end
         | 
| 172 | 
            +
                  return [num_events, events]
         | 
| 173 | 
            +
                end
         | 
| 174 | 
            +
              
         | 
| 175 | 
            +
                # Extracts the :properties named option (for a CommandQueue) from the hash given and returns the properties values
         | 
| 176 | 
            +
                def get_command_queue_properties( options )
         | 
| 177 | 
            +
                  properties = CommandQueue::Properties::new(0)
         | 
| 178 | 
            +
                  if options[:properties] then
         | 
| 179 | 
            +
                    if options[:properties].respond_to?(:each) then
         | 
| 180 | 
            +
                      options[:properties].each { |f| properties = properties | f }
         | 
| 181 | 
            +
                    else
         | 
| 182 | 
            +
                      properties = properties | options[:properties]
         | 
| 183 | 
            +
                    end
         | 
| 184 | 
            +
                  end
         | 
| 185 | 
            +
                  return properties
         | 
| 186 | 
            +
                end
         | 
| 187 | 
            +
              
         | 
| 188 | 
            +
                # Extracts the origin_symbol and region_symbol named options for image from the given hash. Returns the read (or detemined suitable) origin and region in a tuple
         | 
| 189 | 
            +
                def get_origin_region( image, options, origin_symbol, region_symbol )
         | 
| 190 | 
            +
                  origin = FFI::MemoryPointer::new( :size_t, 3 )
         | 
| 191 | 
            +
                  (0..2).each { |i| origin[i].write_size_t(0) }
         | 
| 192 | 
            +
                  if options[origin_symbol] then
         | 
| 193 | 
            +
                    options[origin_symbol].each_with_index { |e, i|
         | 
| 194 | 
            +
                      origin[i].write_size_t(e)
         | 
| 195 | 
            +
                    }
         | 
| 196 | 
            +
                  end
         | 
| 197 | 
            +
                  region = FFI::MemoryPointer::new( :size_t, 3 )
         | 
| 198 | 
            +
                  (0..2).each { |i| region[i].write_size_t(1) }
         | 
| 199 | 
            +
                  if options[region_symbol] then
         | 
| 200 | 
            +
                    options[region_symbol].each_with_index { |e, i|
         | 
| 201 | 
            +
                      region[i].write_size_t(e)
         | 
| 202 | 
            +
                    }
         | 
| 174 203 | 
             
                  else
         | 
| 175 | 
            -
             | 
| 204 | 
            +
                     region[0].write_size_t( image.width - origin[0].read_size_t )
         | 
| 205 | 
            +
                     if image.type == Mem::IMAGE1D_ARRAY then
         | 
| 206 | 
            +
                       region[1].write_size_t( image.array_size - origin[1].read_size_t )
         | 
| 207 | 
            +
                     else
         | 
| 208 | 
            +
                       region[1].write_size_t( image.height != 0 ? image.height - origin[1].read_size_t : 1 )
         | 
| 209 | 
            +
                     end
         | 
| 210 | 
            +
                     if image.type == Mem::IMAGE2D_ARRAY then
         | 
| 211 | 
            +
                       region[2].write_size_t( image.array_size - origin[2].read_size_t )
         | 
| 212 | 
            +
                     else 
         | 
| 213 | 
            +
                       region[2].write_size_t( image.depth != 0 ? image.depth - origin[2].read_size_t : 1 )
         | 
| 214 | 
            +
                     end
         | 
| 176 215 | 
             
                  end
         | 
| 216 | 
            +
                  return [origin, region]
         | 
| 177 217 | 
             
                end
         | 
| 178 | 
            -
             | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
             | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
                  num_events = options[:event_wait_list].length
         | 
| 187 | 
            -
                  if num_events > 0 then
         | 
| 188 | 
            -
                    events = FFI::MemoryPointer::new( Event, num_events )
         | 
| 189 | 
            -
                    options[:event_wait_list].each_with_index { |e, i|
         | 
| 190 | 
            -
                      events[i].write_pointer(e)
         | 
| 218 | 
            +
              
         | 
| 219 | 
            +
                # Extracts the :properties named option (for a Context) from the hash given and returns an FFI:Pointer to a 0 terminated list of properties 
         | 
| 220 | 
            +
                def get_context_properties( options )
         | 
| 221 | 
            +
                  properties = nil
         | 
| 222 | 
            +
                  if options[:properties] then
         | 
| 223 | 
            +
                    properties = FFI::MemoryPointer::new( :cl_context_properties, options[:properties].length + 1 )
         | 
| 224 | 
            +
                    options[:properties].each_with_index { |e,i|
         | 
| 225 | 
            +
                      properties[i].write_cl_context_properties(e)
         | 
| 191 226 | 
             
                    }
         | 
| 227 | 
            +
                    properties[options[:properties].length].write_cl_context_properties(0)
         | 
| 192 228 | 
             
                  end
         | 
| 229 | 
            +
                  return properties
         | 
| 193 230 | 
             
                end
         | 
| 194 | 
            -
             | 
| 195 | 
            -
             | 
| 196 | 
            -
             | 
| 197 | 
            -
             | 
| 198 | 
            -
             | 
| 199 | 
            -
             | 
| 200 | 
            -
             | 
| 201 | 
            -
                  if  | 
| 202 | 
            -
                     | 
| 231 | 
            +
              
         | 
| 232 | 
            +
                # Extracts the :device_list named option from the hash given and returns [ number of devices, an FFI:Pointer to the list of Device or nil ]
         | 
| 233 | 
            +
                def get_device_list( options )
         | 
| 234 | 
            +
                  devices = options[:device_list]
         | 
| 235 | 
            +
                  devices = [devices].flatten if devices
         | 
| 236 | 
            +
                  devices_p = nil
         | 
| 237 | 
            +
                  num_devices = 0
         | 
| 238 | 
            +
                  if devices and devices.size > 0 then
         | 
| 239 | 
            +
                    num_devices = devices.size
         | 
| 240 | 
            +
                    devices_p = FFI::MemoryPointer::new( Device, num_devices)
         | 
| 241 | 
            +
                    devices_p.write_array_of_pointer(devices)
         | 
| 242 | 
            +
                  end
         | 
| 243 | 
            +
                  return [num_devices, devices_p]
         | 
| 244 | 
            +
                end
         | 
| 245 | 
            +
              
         | 
| 246 | 
            +
                # checks if a :cl_int corresponds to an error code and raises the apropriate Error
         | 
| 247 | 
            +
                def error_check(errcode)
         | 
| 248 | 
            +
                  return nil if errcode == SUCCESS
         | 
| 249 | 
            +
                  klass = Error::CLASSES[errcode]
         | 
| 250 | 
            +
                  if klass then
         | 
| 251 | 
            +
                    raise klass::new
         | 
| 203 252 | 
             
                  else
         | 
| 204 | 
            -
                     | 
| 253 | 
            +
                    raise Error::new("#{errcode}")
         | 
| 205 254 | 
             
                  end
         | 
| 206 255 | 
             
                end
         | 
| 207 | 
            -
                return properties
         | 
| 208 | 
            -
              end
         | 
| 209 256 |  | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 215 | 
            -
                   | 
| 216 | 
            -
             | 
| 217 | 
            -
                   | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
                   | 
| 223 | 
            -
             | 
| 224 | 
            -
                   | 
| 225 | 
            -
             | 
| 226 | 
            -
             | 
| 227 | 
            -
             | 
| 228 | 
            -
             | 
| 229 | 
            -
             | 
| 230 | 
            -
             | 
| 231 | 
            -
             | 
| 232 | 
            -
             | 
| 233 | 
            -
             | 
| 234 | 
            -
             | 
| 235 | 
            -
             | 
| 236 | 
            -
             | 
| 257 | 
            +
                TYPE_CONVERTER = {
         | 
| 258 | 
            +
                  :cl_device_type => Device::Type,
         | 
| 259 | 
            +
                  :cl_device_fp_config => Device::FPConfig,
         | 
| 260 | 
            +
                  :cl_device_mem_cache_type => Device::MemCacheType,
         | 
| 261 | 
            +
                  :cl_device_local_mem_type => Device::LocalMemType,
         | 
| 262 | 
            +
                  :cl_device_exec_capabilities => Device::ExecCapabilities,
         | 
| 263 | 
            +
                  :cl_command_queue_properties => CommandQueue::Properties,
         | 
| 264 | 
            +
                  :cl_device_affinity_domain => Device::AffinityDomain,
         | 
| 265 | 
            +
                  :cl_device_svm_capabilities => Device::SVMCapabilities,
         | 
| 266 | 
            +
                  :cl_channel_order => ChannelOrder,
         | 
| 267 | 
            +
                  :cl_channel_type => ChannelType,
         | 
| 268 | 
            +
                  :cl_mem_flags => Mem::Flags,
         | 
| 269 | 
            +
                  :cl_mem_object_type => Mem::Type,
         | 
| 270 | 
            +
                  :cl_mem_migration_flags => Mem::MigrationFlags,
         | 
| 271 | 
            +
                  :cl_addressing_mode => AddressingMode,
         | 
| 272 | 
            +
                  :cl_filter_mode => FilterMode,
         | 
| 273 | 
            +
                  :cl_map_flags => MapFlags,
         | 
| 274 | 
            +
                  :cl_program_binary_type => Program::BinaryType,
         | 
| 275 | 
            +
                  :cl_kernel_arg_address_qualifier => Kernel::Arg::AddressQualifier,
         | 
| 276 | 
            +
                  :cl_kernel_arg_access_qualifier => Kernel::Arg::AccessQualifier,
         | 
| 277 | 
            +
                  :cl_kernel_arg_type_qualifier => Kernel::Arg::TypeQualifier,
         | 
| 278 | 
            +
                  :cl_command_type => CommandType,
         | 
| 279 | 
            +
                  :cl_build_status => BuildStatus
         | 
| 280 | 
            +
                }
         | 
| 281 | 
            +
                
         | 
| 282 | 
            +
                private_constant :TYPE_CONVERTER
         | 
| 283 | 
            +
              
         | 
| 284 | 
            +
                # Converts a type from a symbol to an OpenCL class if a convertion is found
         | 
| 285 | 
            +
                def convert_type(type)
         | 
| 286 | 
            +
                  return TYPE_CONVERTER[type]
         | 
| 237 287 | 
             
                end
         | 
| 238 | 
            -
                return [origin, region]
         | 
| 239 | 
            -
              end
         | 
| 240 288 |  | 
| 241 | 
            -
              # Extracts the :properties named option (for a Context) from the hash given and returns an FFI:Pointer to a 0 terminated list of properties 
         | 
| 242 | 
            -
              def self.get_context_properties( options )
         | 
| 243 | 
            -
                properties = nil
         | 
| 244 | 
            -
                if options[:properties] then
         | 
| 245 | 
            -
                  properties = FFI::MemoryPointer::new( :cl_context_properties, options[:properties].length + 1 )
         | 
| 246 | 
            -
                  options[:properties].each_with_index { |e,i|
         | 
| 247 | 
            -
                    properties[i].write_cl_context_properties(e)
         | 
| 248 | 
            -
                  }
         | 
| 249 | 
            -
                  properties[options[:properties].length].write_cl_context_properties(0)
         | 
| 250 | 
            -
                end
         | 
| 251 | 
            -
                return properties
         | 
| 252 289 | 
             
              end
         | 
| 253 290 |  | 
| 254 | 
            -
               | 
| 255 | 
            -
               | 
| 256 | 
            -
             | 
| 257 | 
            -
             | 
| 258 | 
            -
                if klass then
         | 
| 259 | 
            -
                  raise klass::new
         | 
| 260 | 
            -
                else
         | 
| 261 | 
            -
                  raise Error::new("#{errcode}")
         | 
| 262 | 
            -
                end
         | 
| 263 | 
            -
              end
         | 
| 291 | 
            +
              private_constant :InnerInterface
         | 
| 292 | 
            +
              extend InnerInterface
         | 
| 293 | 
            +
             | 
| 294 | 
            +
              module InnerGenerator
         | 
| 264 295 |  | 
| 265 | 
            -
             | 
| 266 | 
            -
             | 
| 267 | 
            -
                 | 
| 268 | 
            -
                 | 
| 269 | 
            -
             | 
| 296 | 
            +
                private
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                #  Generates a new method for klass that use the apropriate clGetKlassInfo, to read an element of the given type. The info queried is specified by name.
         | 
| 299 | 
            +
                def get_info(klass, type, name)
         | 
| 300 | 
            +
                  klass_name = klass
         | 
| 301 | 
            +
                  klass_name = "MemObject" if klass == "Mem"
         | 
| 302 | 
            +
                  s = <<EOF
         | 
| 270 303 | 
             
                  def #{name.downcase}
         | 
| 271 304 | 
             
                    ptr1 = FFI::MemoryPointer::new( :size_t, 1)
         | 
| 272 305 | 
             
                    error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, 0, nil, ptr1)
         | 
| 273 | 
            -
                     | 
| 274 | 
            -
            EOF
         | 
| 275 | 
            -
                if ( klass == "Device" and name == "PARTITION_TYPE" ) or ( klass == "Context" and name == "PROPERTIES" ) then
         | 
| 276 | 
            -
                  s+= <<EOF
         | 
| 277 | 
            -
                    return [] if ptr1.read_size_t == 0
         | 
| 278 | 
            -
            EOF
         | 
| 279 | 
            -
                end
         | 
| 280 | 
            -
                s += <<EOF
         | 
| 306 | 
            +
                    error_check(error)
         | 
| 281 307 | 
             
                    ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
         | 
| 282 308 | 
             
                    error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, ptr1.read_size_t, ptr2, nil)
         | 
| 283 | 
            -
                     | 
| 284 | 
            -
                     | 
| 285 | 
            -
             | 
| 286 | 
            -
             | 
| 287 | 
            -
             | 
| 288 | 
            -
                     | 
| 289 | 
            -
                  end
         | 
| 290 | 
            -
            EOF
         | 
| 291 | 
            -
                else
         | 
| 292 | 
            -
                  s+= <<EOF
         | 
| 293 | 
            -
                    return arr
         | 
| 309 | 
            +
                    error_check(error)
         | 
| 310 | 
            +
                    if(convert_type(:#{type})) then
         | 
| 311 | 
            +
                      return convert_type(:#{type})::new(ptr2.read_#{type})
         | 
| 312 | 
            +
                    else
         | 
| 313 | 
            +
                      return ptr2.read_#{type}
         | 
| 314 | 
            +
                    end
         | 
| 294 315 | 
             
                  end
         | 
| 295 316 | 
             
            EOF
         | 
| 317 | 
            +
                  return s
         | 
| 296 318 | 
             
                end
         | 
| 297 | 
            -
                return s
         | 
| 298 | 
            -
              end
         | 
| 299 319 |  | 
| 300 | 
            -
             | 
| 301 | 
            -
             | 
| 302 | 
            -
             | 
| 303 | 
            -
             | 
| 304 | 
            -
             | 
| 320 | 
            +
                #  Generates a new method for klass that use the apropriate clGetKlassInfo, to read an Array of element of the given type. The info queried is specified by name.
         | 
| 321 | 
            +
                def get_info_array(klass, type, name)
         | 
| 322 | 
            +
                  klass_name = klass
         | 
| 323 | 
            +
                  klass_name = "MemObject" if klass == "Mem"
         | 
| 324 | 
            +
                  s = <<EOF
         | 
| 305 325 | 
             
                  def #{name.downcase}
         | 
| 306 326 | 
             
                    ptr1 = FFI::MemoryPointer::new( :size_t, 1)
         | 
| 307 327 | 
             
                    error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, 0, nil, ptr1)
         | 
| 308 | 
            -
                     | 
| 328 | 
            +
                    error_check(error)
         | 
| 329 | 
            +
            EOF
         | 
| 330 | 
            +
                  if ( klass == "Device" and name == "PARTITION_TYPE" ) or ( klass == "Context" and name == "PROPERTIES" ) then
         | 
| 331 | 
            +
                    s+= <<EOF
         | 
| 332 | 
            +
                    return [] if ptr1.read_size_t == 0
         | 
| 333 | 
            +
            EOF
         | 
| 334 | 
            +
                  end
         | 
| 335 | 
            +
                  s += <<EOF
         | 
| 309 336 | 
             
                    ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
         | 
| 310 337 | 
             
                    error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, ptr1.read_size_t, ptr2, nil)
         | 
| 311 | 
            -
                     | 
| 338 | 
            +
                    error_check(error)
         | 
| 339 | 
            +
                    arr = ptr2.get_array_of_#{type}(0, ptr1.read_size_t/ FFI.find_type(:#{type}).size)
         | 
| 312 340 | 
             
            EOF
         | 
| 313 | 
            -
             | 
| 314 | 
            -
             | 
| 315 | 
            -
                    return  | 
| 341 | 
            +
                  if ( klass == "Device" and ( name == "PARTITION_TYPE" or name == "PARTITION_PROPERTIES" ) ) or ( klass == "Context" and name == "PROPERTIES" ) then
         | 
| 342 | 
            +
                    s+= <<EOF
         | 
| 343 | 
            +
                    return arr.reject! { |e| e == 0 }
         | 
| 316 344 | 
             
                  end
         | 
| 317 345 | 
             
            EOF
         | 
| 318 | 
            -
             | 
| 319 | 
            -
             | 
| 320 | 
            -
                    return  | 
| 346 | 
            +
                  else
         | 
| 347 | 
            +
                    s+= <<EOF
         | 
| 348 | 
            +
                    return arr
         | 
| 321 349 | 
             
                  end
         | 
| 322 350 | 
             
            EOF
         | 
| 351 | 
            +
                  end
         | 
| 352 | 
            +
                  return s
         | 
| 323 353 | 
             
                end
         | 
| 324 | 
            -
             | 
| 354 | 
            +
             | 
| 325 355 | 
             
              end
         | 
| 356 | 
            +
              private_constant :InnerGenerator
         | 
| 357 | 
            +
              #:startdoc:
         | 
| 326 358 |  | 
| 327 359 | 
             
            end
         |