Class: Barracuda::Buffer

Inherits:
Object show all
Defined in:
ext/barracuda.c

Direct Known Subclasses

OutputBuffer

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Object



376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
# File 'ext/barracuda.c', line 376

static VALUE
buffer_initialize(int argc, VALUE *argv, VALUE self)
{
    GET_BUFFER();
    
    if (argc == 0) {
        rb_raise(rb_eArgError, "no buffer data given");
    }
    
    if (TYPE(argv[0]) == T_ARRAY) {
        buffer_data_set(self, argv[0]);
    }
    else {
        buffer_data_set(self, rb_ary_new4(argc, argv));
    }
    
    return self;
}

Instance Method Details

#dataObject



356
357
358
359
360
361
# File 'ext/barracuda.c', line 356

static VALUE
buffer_data(VALUE self)
{
    GET_BUFFER();
    return buffer->arr;
}

#data=(new_value) ⇒ Object



363
364
365
366
367
368
369
370
371
372
373
374
# File 'ext/barracuda.c', line 363

static VALUE
buffer_data_set(VALUE self, VALUE new_value)
{
    GET_BUFFER();
    
    if (RTEST(buffer->arr)) {
        rb_gc_mark(buffer->arr);
    }
    buffer->arr = new_value;
    buffer_size_changed(self);
    return buffer->arr;
}

#readObject



321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
# File 'ext/barracuda.c', line 321

static VALUE
buffer_read(VALUE self)
{
    unsigned int i, index;
    
    GET_BUFFER();
    
    rb_gc_mark(buffer->arr);
    buffer->arr = rb_ary_new2(buffer->num_items);

    for (i = 0, index = 0; i < buffer->num_items; i++, index += buffer->member_size) {
        VALUE value = type_to_ruby(((int8_t*)buffer->cachebuf) + index, buffer->type);
        rb_ary_push(buffer->arr, value);
    }
    
    return self;
}

#size_changedObject



339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
# File 'ext/barracuda.c', line 339

static VALUE
buffer_size_changed(VALUE self)
{
    GET_BUFFER();
    
    if (buffer->data) {
        clReleaseMemObject(buffer->data);
    }
    buffer_update_cache_info(buffer);
    buffer->data = clCreateBuffer(context, CL_MEM_READ_WRITE, 
        buffer->num_items * buffer->member_size, NULL, NULL);

    buffer_write(self);
    
    return self;
}

#writeObject



296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'ext/barracuda.c', line 296

static VALUE
buffer_write(VALUE self)
{
    unsigned int i, index;
    unsigned long data_ptr[16]; // data buffer
    
    GET_BUFFER();
    
    buffer_update_cache_info(buffer);
    
    if (buffer->cachebuf) {
        xfree(buffer->cachebuf);
    }
    buffer->cachebuf = malloc(buffer->num_items * buffer->member_size);
    
    for (i = 0, index = 0; i < RARRAY_LEN(buffer->arr); i++, index += buffer->member_size) {
        VALUE item = RARRAY_PTR(buffer->arr)[i];
        
        type_to_native(item, buffer->type, (void *)data_ptr);
        memcpy(((int8_t*)buffer->cachebuf) + index, (void *)data_ptr, buffer->member_size);
    }
    
    return self;
}