ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
(Generate patch)

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.62 by root, Sat Apr 28 13:33:04 2012 UTC vs.
Revision 1.74 by root, Fri May 4 15:04:51 2012 UTC

43 43
44OpenCL::Event objects are used to signal when something is complete. 44OpenCL::Event objects are used to signal when something is complete.
45 45
46=head2 HELPFUL RESOURCES 46=head2 HELPFUL RESOURCES
47 47
48The OpenCL specs used to develop this module: 48The OpenCL specs used to develop this module - download these and keept
49hema round, they are required reference material:
49 50
50 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf 51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
51 http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf 52 http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf
52 http://www.khronos.org/registry/cl/specs/opencl-1.2-extensions.pdf 53 http://www.khronos.org/registry/cl/specs/opencl-1.2-extensions.pdf
53 54
210 211
211 # wait for the last event to complete 212 # wait for the last event to complete
212 $ev->wait; 213 $ev->wait;
213 214
214=head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia 215=head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia
215set tunnel effect. 216set flight effect.
216 217
217This is quite a long example to get you going. 218This is quite a long example to get you going - you can download it from
219L<http://cvs.schmorp.de/OpenCL/examples/juliaflight>.
218 220
219 use OpenGL ":all"; 221 use OpenGL ":all";
220 use OpenCL; 222 use OpenCL;
221 223
224 my $S = $ARGV[0] || 256; # window/texture size, smaller is faster
225
222 # open a window and create a gl texture 226 # open a window and create a gl texture
223 OpenGL::glpOpenWindow width => 256, height => 256; 227 OpenGL::glpOpenWindow width => $S, height => $S;
224 my $texid = glGenTextures_p 1; 228 my $texid = glGenTextures_p 1;
225 glBindTexture GL_TEXTURE_2D, $texid; 229 glBindTexture GL_TEXTURE_2D, $texid;
226 glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0; 230 glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, $S, $S, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0;
227 231
228 # find and use the first opencl device that let's us get a shared opengl context 232 # find and use the first opencl device that let's us get a shared opengl context
229 my $platform; 233 my $platform;
230 my $dev; 234 my $dev;
231 my $ctx; 235 my $ctx;
250 # now the boring opencl code 254 # now the boring opencl code
251 my $src = <<EOF; 255 my $src = <<EOF;
252 kernel void 256 kernel void
253 juliatunnel (write_only image2d_t img, float time) 257 juliatunnel (write_only image2d_t img, float time)
254 { 258 {
255 float2 p = (float2)(get_global_id (0), get_global_id (1)) / 256.f * 2.f - 1.f; 259 int2 xy = (int2)(get_global_id (0), get_global_id (1));
260 float2 p = convert_float2 (xy) / $S.f * 2.f - 1.f;
256 261
257 float2 m = (float2)(1.f, p.y) / fabs (p.x); 262 float2 m = (float2)(1.f, p.y) / fabs (p.x); // tunnel
258 m.x = fabs (fmod (m.x + time * 0.05f, 4.f)) - 2.f; 263 m.x = fabs (fmod (m.x + time * 0.05f, 4.f) - 2.f);
259 264
260 float2 z = m; 265 float2 z = m;
261 float2 c = (float2)(sin (time * 0.05005), cos (time * 0.06001)); 266 float2 c = (float2)(sin (time * 0.01133f), cos (time * 0.02521f));
262 267
263 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) 268 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) // standard julia
264 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c; 269 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
265 270
266 float3 colour = (float3)(z.x, z.y, z.x * z.y); 271 float3 colour = (float3)(z.x, z.y, atan2 (z.y, z.x));
267 write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.)); 272 write_imagef (img, xy, (float4)(colour * p.x * p.x, 1.));
268 } 273 }
269 EOF 274 EOF
270 275
271 my $prog = $ctx->build_program ($src); 276 my $prog = $ctx->build_program ($src);
272 my $kernel = $prog->kernel ("juliatunnel"); 277 my $kernel = $prog->kernel ("juliatunnel");
276 for (my $time; ; ++$time) { 281 for (my $time; ; ++$time) {
277 # acquire objects from opengl 282 # acquire objects from opengl
278 $queue->acquire_gl_objects ([$tex]); 283 $queue->acquire_gl_objects ([$tex]);
279 284
280 # configure and run our kernel 285 # configure and run our kernel
281 $kernel->set_image2d (0, $tex); 286 $kernel->setf ("mf", $tex, $time*2); # mf = memory object, float
282 $kernel->set_float (1, $time);
283 $queue->nd_range_kernel ($kernel, undef, [256, 256], undef); 287 $queue->nd_range_kernel ($kernel, undef, [$S, $S], undef);
284 288
285 # release objects to opengl again 289 # release objects to opengl again
286 $queue->release_gl_objects ([$tex]); 290 $queue->release_gl_objects ([$tex]);
287 291
288 # wait 292 # wait
301 305
302 glXSwapBuffers; 306 glXSwapBuffers;
303 307
304 select undef, undef, undef, 1/60; 308 select undef, undef, undef, 1/60;
305 } 309 }
310
311=head2 How to modify the previous example to not rely on GL sharing.
312
313For those poor souls with only a sucky CPU OpenCL implementation, you
314currently have to read the image into some perl scalar, and then modify a
315texture or use glDrawPixels or so).
316
317First, when you don't need gl sharing, you can create the context much simpler:
318
319 $ctx = $platform->context (undef, [$dev])
320
321To use a texture, you would modify the above example by creating an
322OpenCL::Image manually instead of deriving it from a texture:
323
324 my $tex = $ctx->image2d (OpenCL::MEM_WRITE_ONLY, OpenCL::RGBA, OpenCL::UNORM_INT8, $S, $S);
325
326And in the draw loop, intead of acquire_gl_objects/release_gl_objects, you
327would read the image2d after the kernel has written it:
328
329 $queue->read_image ($tex, 0, 0, 0, 0, $S, $S, 1, 0, 0, my $data);
330
331And then you would upload the pixel data to the texture (or use glDrawPixels):
332
333 glTexSubImage2D_s GL_TEXTURE_2D, 0, 0, 0, $S, $S, GL_RGBA, GL_UNSIGNED_BYTE, $data;
334
335The fully modified example can be found at
336L<http://cvs.schmorp.de/OpenCL/examples/juliaflight-nosharing>.
337
338=head2 Julia sets look soooo 80ies.
339
340Then colour them differently, e.g. using orbit traps! Replace the loop and
341colour calculation from the previous examples by this:
342
343 float2 dm = (float2)(1.f, 1.f);
344
345 for (int i = 0; i < 25; ++i)
346 {
347 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
348 dm = fmin (dm, (float2)(fabs (dot (z, z) - 1.f), fabs (z.x - 1.f)));
349 }
350
351 float3 colour = (float3)(dm.x * dm.y, dm.x * dm.y, dm.x);
352
353Also try C<-10.f> instead of C<-1.f>.
306 354
307=head1 DOCUMENTATION 355=head1 DOCUMENTATION
308 356
309=head2 BASIC CONVENTIONS 357=head2 BASIC CONVENTIONS
310 358
386OpenCL can generate a number of (potentially) asynchronous events, for 434OpenCL can generate a number of (potentially) asynchronous events, for
387example, after compiling a program, to signal a context-related error or, 435example, after compiling a program, to signal a context-related error or,
388perhaps most important, to signal completion of queued jobs (by setting 436perhaps most important, to signal completion of queued jobs (by setting
389callbacks on OpenCL::Event objects). 437callbacks on OpenCL::Event objects).
390 438
439The OpenCL module converts all these callbacks into events - you can
440still register callbacks, but they are not executed when your OpenCL
441implementation calls the actual callback, but only later. Therefore, none
442of the limitations of OpenCL callbacks apply to the perl implementation:
443it is perfectly safe to make blocking operations from event callbacks, and
444enqueued operations don't need to be flushed.
445
391To facilitate this, this module maintains an event queue - each 446To facilitate this, this module maintains an event queue - each
392time an asynchronous event happens, it is queued, and perl will be 447time an asynchronous event happens, it is queued, and perl will be
393interrupted. This is implemented via the L<Async::Interrupt> module. In 448interrupted. This is implemented via the L<Async::Interrupt> module. In
394addition, this module has L<AnyEvent> support, so it can seamlessly 449addition, this module has L<AnyEvent> support, so it can seamlessly
395integrate itself into many event loops. 450integrate itself into many event loops.
396 451
397Since this module is a bit hard to understand, here are some case examples: 452Since L<Async::Interrupt> is a bit hard to understand, here are some case examples:
398 453
399=head3 Don't use callbacks. 454=head3 Don't use callbacks.
400 455
401When your program never uses any callbacks, then there will never be any 456When your program never uses any callbacks, then there will never be any
402notifications you need to take care of, and therefore no need to worry 457notifications you need to take care of, and therefore no need to worry
499use Async::Interrupt (); 554use Async::Interrupt ();
500 555
501our $POLL_FUNC; # set by XS 556our $POLL_FUNC; # set by XS
502 557
503BEGIN { 558BEGIN {
504 our $VERSION = '0.98'; 559 our $VERSION = '0.99';
505 560
506 require XSLoader; 561 require XSLoader;
507 XSLoader::load (__PACKAGE__, $VERSION); 562 XSLoader::load (__PACKAGE__, $VERSION);
508 563
509 @OpenCL::Platform::ISA = 564 @OpenCL::Platform::ISA =
514 @OpenCL::Sampler::ISA = 569 @OpenCL::Sampler::ISA =
515 @OpenCL::Program::ISA = 570 @OpenCL::Program::ISA =
516 @OpenCL::Kernel::ISA = 571 @OpenCL::Kernel::ISA =
517 @OpenCL::Event::ISA = OpenCL::Object::; 572 @OpenCL::Event::ISA = OpenCL::Object::;
518 573
574 @OpenCL::SubDevice::ISA = OpenCL::Device::;
575
519 @OpenCL::Buffer::ISA = 576 @OpenCL::Buffer::ISA =
520 @OpenCL::Image::ISA = OpenCL::Memory::; 577 @OpenCL::Image::ISA = OpenCL::Memory::;
521 578
522 @OpenCL::BufferObj::ISA = OpenCL::Buffer::; 579 @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
523 580
527 @OpenCL::Image1D::ISA = 584 @OpenCL::Image1D::ISA =
528 @OpenCL::Image1DArray::ISA = 585 @OpenCL::Image1DArray::ISA =
529 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::; 586 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
530 587
531 @OpenCL::UserEvent::ISA = OpenCL::Event::; 588 @OpenCL::UserEvent::ISA = OpenCL::Event::;
589
590 @OpenCL::MappedBuffer::ISA =
591 @OpenCL::MappedImage::ISA = OpenCL::Mapped::;
532} 592}
533 593
534=head2 THE OpenCL PACKAGE 594=head2 THE OpenCL PACKAGE
535 595
536=over 4 596=over 4
561 621
562=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr 622=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr
563 623
564Tries to create a context from a default device and platform type - never worked for me. 624Tries to create a context from a default device and platform type - never worked for me.
565 625
626type: OpenCL::DEVICE_TYPE_DEFAULT, OpenCL::DEVICE_TYPE_CPU, OpenCL::DEVICE_TYPE_GPU,
627OpenCL::DEVICE_TYPE_ACCELERATOR, OpenCL::DEVICE_TYPE_CUSTOM, OpenCL::DEVICE_TYPE_ALL.
628
566L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 629L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
567 630
568=item $ctx = OpenCL::context $properties, \@devices, $callback->($err, $pvt) = $print_stderr) 631=item $ctx = OpenCL::context $properties, \@devices, $callback->($err, $pvt) = $print_stderr)
569 632
570Create a new OpenCL::Context object using the given device object(s). This 633Create a new OpenCL::Context object using the given device object(s). This
683 746
684=for gengetinfo begin platform 747=for gengetinfo begin platform
685 748
686=item $string = $platform->profile 749=item $string = $platform->profile
687 750
688Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result. 751Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_PROFILE> and returns the result.
689 752
690=item $string = $platform->version 753=item $string = $platform->version
691 754
692Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result. 755Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VERSION> and returns the result.
693 756
694=item $string = $platform->name 757=item $string = $platform->name
695 758
696Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result. 759Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_NAME> and returns the result.
697 760
698=item $string = $platform->vendor 761=item $string = $platform->vendor
699 762
700Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result. 763Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VENDOR> and returns the result.
701 764
702=item $string = $platform->extensions 765=item $string = $platform->extensions
703 766
704Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result. 767Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_EXTENSIONS> and returns the result.
705 768
706=for gengetinfo end platform 769=for gengetinfo end platform
707 770
708=back 771=back
709 772
715 778
716See C<< $platform->info >> for details. 779See C<< $platform->info >> for details.
717 780
718L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html> 781L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
719 782
783=item @devices = $device->sub_devices (\@properties)
784
785Creates OpencL::SubDevice objects by partitioning an existing device.
786
787L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateSubDevices.html>
788
720=for gengetinfo begin device 789=for gengetinfo begin device
721 790
722=item $device_type = $device->type 791=item $device_type = $device->type
723 792
724Calls C<clGetDeviceInfo> with C<CL_DEVICE_TYPE> and returns the result. 793Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_TYPE> and returns the result.
725 794
726=item $uint = $device->vendor_id 795=item $uint = $device->vendor_id
727 796
728Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR_ID> and returns the result. 797Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR_ID> and returns the result.
729 798
730=item $uint = $device->max_compute_units 799=item $uint = $device->max_compute_units
731 800
732Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_COMPUTE_UNITS> and returns the result. 801Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_COMPUTE_UNITS> and returns the result.
733 802
734=item $uint = $device->max_work_item_dimensions 803=item $uint = $device->max_work_item_dimensions
735 804
736Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result. 805Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
737 806
738=item $int = $device->max_work_group_size 807=item $int = $device->max_work_group_size
739 808
740Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_GROUP_SIZE> and returns the result. 809Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
741 810
742=item @ints = $device->max_work_item_sizes 811=item @ints = $device->max_work_item_sizes
743 812
744Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_SIZES> and returns the result. 813Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
745 814
746=item $uint = $device->preferred_vector_width_char 815=item $uint = $device->preferred_vector_width_char
747 816
748Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result. 817Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
749 818
750=item $uint = $device->preferred_vector_width_short 819=item $uint = $device->preferred_vector_width_short
751 820
752Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result. 821Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
753 822
754=item $uint = $device->preferred_vector_width_int 823=item $uint = $device->preferred_vector_width_int
755 824
756Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result. 825Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
757 826
758=item $uint = $device->preferred_vector_width_long 827=item $uint = $device->preferred_vector_width_long
759 828
760Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result. 829Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
761 830
762=item $uint = $device->preferred_vector_width_float 831=item $uint = $device->preferred_vector_width_float
763 832
764Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result. 833Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
765 834
766=item $uint = $device->preferred_vector_width_double 835=item $uint = $device->preferred_vector_width_double
767 836
768Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result. 837Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
769 838
770=item $uint = $device->max_clock_frequency 839=item $uint = $device->max_clock_frequency
771 840
772Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CLOCK_FREQUENCY> and returns the result. 841Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
773 842
774=item $bitfield = $device->address_bits 843=item $bitfield = $device->address_bits
775 844
776Calls C<clGetDeviceInfo> with C<CL_DEVICE_ADDRESS_BITS> and returns the result. 845Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ADDRESS_BITS> and returns the result.
777 846
778=item $uint = $device->max_read_image_args 847=item $uint = $device->max_read_image_args
779 848
780Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_READ_IMAGE_ARGS> and returns the result. 849Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
781 850
782=item $uint = $device->max_write_image_args 851=item $uint = $device->max_write_image_args
783 852
784Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result. 853Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
785 854
786=item $ulong = $device->max_mem_alloc_size 855=item $ulong = $device->max_mem_alloc_size
787 856
788Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result. 857Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
789 858
790=item $int = $device->image2d_max_width 859=item $int = $device->image2d_max_width
791 860
792Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_WIDTH> and returns the result. 861Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
793 862
794=item $int = $device->image2d_max_height 863=item $int = $device->image2d_max_height
795 864
796Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result. 865Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
797 866
798=item $int = $device->image3d_max_width 867=item $int = $device->image3d_max_width
799 868
800Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_WIDTH> and returns the result. 869Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
801 870
802=item $int = $device->image3d_max_height 871=item $int = $device->image3d_max_height
803 872
804Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result. 873Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
805 874
806=item $int = $device->image3d_max_depth 875=item $int = $device->image3d_max_depth
807 876
808Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_DEPTH> and returns the result. 877Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
809 878
810=item $uint = $device->image_support 879=item $uint = $device->image_support
811 880
812Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE_SUPPORT> and returns the result. 881Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE_SUPPORT> and returns the result.
813 882
814=item $int = $device->max_parameter_size 883=item $int = $device->max_parameter_size
815 884
816Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_PARAMETER_SIZE> and returns the result. 885Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_PARAMETER_SIZE> and returns the result.
817 886
818=item $uint = $device->max_samplers 887=item $uint = $device->max_samplers
819 888
820Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_SAMPLERS> and returns the result. 889Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_SAMPLERS> and returns the result.
821 890
822=item $uint = $device->mem_base_addr_align 891=item $uint = $device->mem_base_addr_align
823 892
824Calls C<clGetDeviceInfo> with C<CL_DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result. 893Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
825 894
826=item $uint = $device->min_data_type_align_size 895=item $uint = $device->min_data_type_align_size
827 896
828Calls C<clGetDeviceInfo> with C<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result. 897Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
829 898
830=item $device_fp_config = $device->single_fp_config 899=item $device_fp_config = $device->single_fp_config
831 900
832Calls C<clGetDeviceInfo> with C<CL_DEVICE_SINGLE_FP_CONFIG> and returns the result. 901Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_SINGLE_FP_CONFIG> and returns the result.
833 902
834=item $device_mem_cache_type = $device->global_mem_cache_type 903=item $device_mem_cache_type = $device->global_mem_cache_type
835 904
836Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result. 905Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
837 906
838=item $uint = $device->global_mem_cacheline_size 907=item $uint = $device->global_mem_cacheline_size
839 908
840Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result. 909Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
841 910
842=item $ulong = $device->global_mem_cache_size 911=item $ulong = $device->global_mem_cache_size
843 912
844Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result. 913Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
845 914
846=item $ulong = $device->global_mem_size 915=item $ulong = $device->global_mem_size
847 916
848Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_SIZE> and returns the result. 917Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_SIZE> and returns the result.
849 918
850=item $ulong = $device->max_constant_buffer_size 919=item $ulong = $device->max_constant_buffer_size
851 920
852Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result. 921Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
853 922
854=item $uint = $device->max_constant_args 923=item $uint = $device->max_constant_args
855 924
856Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_ARGS> and returns the result. 925Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_ARGS> and returns the result.
857 926
858=item $device_local_mem_type = $device->local_mem_type 927=item $device_local_mem_type = $device->local_mem_type
859 928
860Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_TYPE> and returns the result. 929Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_TYPE> and returns the result.
861 930
862=item $ulong = $device->local_mem_size 931=item $ulong = $device->local_mem_size
863 932
864Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_SIZE> and returns the result. 933Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_SIZE> and returns the result.
865 934
866=item $boolean = $device->error_correction_support 935=item $boolean = $device->error_correction_support
867 936
868Calls C<clGetDeviceInfo> with C<CL_DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result. 937Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
869 938
870=item $int = $device->profiling_timer_resolution 939=item $int = $device->profiling_timer_resolution
871 940
872Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result. 941Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
873 942
874=item $boolean = $device->endian_little 943=item $boolean = $device->endian_little
875 944
876Calls C<clGetDeviceInfo> with C<CL_DEVICE_ENDIAN_LITTLE> and returns the result. 945Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ENDIAN_LITTLE> and returns the result.
877 946
878=item $boolean = $device->available 947=item $boolean = $device->available
879 948
880Calls C<clGetDeviceInfo> with C<CL_DEVICE_AVAILABLE> and returns the result. 949Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AVAILABLE> and returns the result.
881 950
882=item $boolean = $device->compiler_available 951=item $boolean = $device->compiler_available
883 952
884Calls C<clGetDeviceInfo> with C<CL_DEVICE_COMPILER_AVAILABLE> and returns the result. 953Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_COMPILER_AVAILABLE> and returns the result.
885 954
886=item $device_exec_capabilities = $device->execution_capabilities 955=item $device_exec_capabilities = $device->execution_capabilities
887 956
888Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXECUTION_CAPABILITIES> and returns the result. 957Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXECUTION_CAPABILITIES> and returns the result.
889 958
890=item $command_queue_properties = $device->properties 959=item $command_queue_properties = $device->properties
891 960
892Calls C<clGetDeviceInfo> with C<CL_DEVICE_QUEUE_PROPERTIES> and returns the result. 961Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_QUEUE_PROPERTIES> and returns the result.
893 962
894=item $ = $device->platform 963=item $ = $device->platform
895 964
896Calls C<clGetDeviceInfo> with C<CL_DEVICE_PLATFORM> and returns the result. 965Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PLATFORM> and returns the result.
897 966
898=item $string = $device->name 967=item $string = $device->name
899 968
900Calls C<clGetDeviceInfo> with C<CL_DEVICE_NAME> and returns the result. 969Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NAME> and returns the result.
901 970
902=item $string = $device->vendor 971=item $string = $device->vendor
903 972
904Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR> and returns the result. 973Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR> and returns the result.
905 974
906=item $string = $device->driver_version 975=item $string = $device->driver_version
907 976
908Calls C<clGetDeviceInfo> with C<CL_DRIVER_VERSION> and returns the result. 977Calls C<clGetDeviceInfo> with C<OpenCL::DRIVER_VERSION> and returns the result.
909 978
910=item $string = $device->profile 979=item $string = $device->profile
911 980
912Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILE> and returns the result. 981Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILE> and returns the result.
913 982
914=item $string = $device->version 983=item $string = $device->version
915 984
916Calls C<clGetDeviceInfo> with C<CL_DEVICE_VERSION> and returns the result. 985Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VERSION> and returns the result.
917 986
918=item $string = $device->extensions 987=item $string = $device->extensions
919 988
920Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXTENSIONS> and returns the result. 989Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXTENSIONS> and returns the result.
921 990
922=item $uint = $device->preferred_vector_width_half 991=item $uint = $device->preferred_vector_width_half
923 992
924Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result. 993Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
925 994
926=item $uint = $device->native_vector_width_char 995=item $uint = $device->native_vector_width_char
927 996
928Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result. 997Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
929 998
930=item $uint = $device->native_vector_width_short 999=item $uint = $device->native_vector_width_short
931 1000
932Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result. 1001Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
933 1002
934=item $uint = $device->native_vector_width_int 1003=item $uint = $device->native_vector_width_int
935 1004
936Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result. 1005Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
937 1006
938=item $uint = $device->native_vector_width_long 1007=item $uint = $device->native_vector_width_long
939 1008
940Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result. 1009Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
941 1010
942=item $uint = $device->native_vector_width_float 1011=item $uint = $device->native_vector_width_float
943 1012
944Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result. 1013Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
945 1014
946=item $uint = $device->native_vector_width_double 1015=item $uint = $device->native_vector_width_double
947 1016
948Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result. 1017Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
949 1018
950=item $uint = $device->native_vector_width_half 1019=item $uint = $device->native_vector_width_half
951 1020
952Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result. 1021Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
953 1022
954=item $device_fp_config = $device->double_fp_config 1023=item $device_fp_config = $device->double_fp_config
955 1024
956Calls C<clGetDeviceInfo> with C<CL_DEVICE_DOUBLE_FP_CONFIG> and returns the result. 1025Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_DOUBLE_FP_CONFIG> and returns the result.
957 1026
958=item $device_fp_config = $device->half_fp_config 1027=item $device_fp_config = $device->half_fp_config
959 1028
960Calls C<clGetDeviceInfo> with C<CL_DEVICE_HALF_FP_CONFIG> and returns the result. 1029Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HALF_FP_CONFIG> and returns the result.
961 1030
962=item $boolean = $device->host_unified_memory 1031=item $boolean = $device->host_unified_memory
963 1032
964Calls C<clGetDeviceInfo> with C<CL_DEVICE_HOST_UNIFIED_MEMORY> and returns the result. 1033Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
965 1034
966=item $device = $device->parent_device_ext 1035=item $device = $device->parent_device_ext
967 1036
968Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARENT_DEVICE_EXT> and returns the result. 1037Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARENT_DEVICE_EXT> and returns the result.
969 1038
970=item @device_partition_property_exts = $device->partition_types_ext 1039=item @device_partition_property_exts = $device->partition_types_ext
971 1040
972Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_TYPES_EXT> and returns the result. 1041Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_TYPES_EXT> and returns the result.
973 1042
974=item @device_partition_property_exts = $device->affinity_domains_ext 1043=item @device_partition_property_exts = $device->affinity_domains_ext
975 1044
976Calls C<clGetDeviceInfo> with C<CL_DEVICE_AFFINITY_DOMAINS_EXT> and returns the result. 1045Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
977 1046
978=item $uint = $device->reference_count_ext 1047=item $uint = $device->reference_count_ext
979 1048
980Calls C<clGetDeviceInfo> with C<CL_DEVICE_REFERENCE_COUNT_EXT> and returns the result. 1049Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_REFERENCE_COUNT_EXT> and returns the result.
981 1050
982=item @device_partition_property_exts = $device->partition_style_ext 1051=item @device_partition_property_exts = $device->partition_style_ext
983 1052
984Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_STYLE_EXT> and returns the result. 1053Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_STYLE_EXT> and returns the result.
985 1054
986=for gengetinfo end device 1055=for gengetinfo end device
987 1056
988=back 1057=back
989 1058
990=head2 THE OpenCL::Context CLASS 1059=head2 THE OpenCL::Context CLASS
1060
1061An OpenCL::Context is basically a container, or manager, for a number of
1062devices of a platform. It is used to create all sorts of secondary objects
1063such as buffers, queues, programs and so on.
1064
1065All context creation functions and methods take a list of properties
1066(type-value pairs). All property values can be specified as integers -
1067some additionally support other types:
1068
1069=over 4
1070
1071=item OpenCL::CONTEXT_PLATFORM
1072
1073Also accepts OpenCL::Platform objects.
1074
1075=item OpenCL::GLX_DISPLAY_KHR
1076
1077Also accepts C<undef>, in which case a deep and troubling hack is engaged
1078to find the current glx display (see L<GLX SUPPORT>).
1079
1080=item OpenCL::GL_CONTEXT_KHR
1081
1082Also accepts C<undef>, in which case a deep and troubling hack is engaged
1083to find the current glx context (see L<GLX SUPPORT>).
1084
1085=back
991 1086
992=over 4 1087=over 4
993 1088
994=item $prog = $ctx->build_program ($program, $options = "") 1089=item $prog = $ctx->build_program ($program, $options = "")
995 1090
1009 $prog = $self->program_with_source ($prog) 1104 $prog = $self->program_with_source ($prog)
1010 unless ref $prog; 1105 unless ref $prog;
1011 1106
1012 eval { $prog->build (undef, $options); 1 } 1107 eval { $prog->build (undef, $options); 1 }
1013 or errno == BUILD_PROGRAM_FAILURE 1108 or errno == BUILD_PROGRAM_FAILURE
1109 or errno == INVALID_BINARY # workaround nvidia bug
1014 or Carp::croak "OpenCL::Context->build_program: " . err2str; 1110 or Carp::croak "OpenCL::Context->build_program: " . err2str;
1015 1111
1016 # we check status for all devices 1112 # we check status for all devices
1017 for my $dev ($self->devices) { 1113 for my $dev ($self->devices) {
1018 $prog->build_status ($dev) == BUILD_SUCCESS 1114 $prog->build_status ($dev) == BUILD_SUCCESS
1042=item $buf = $ctx->buffer ($flags, $len) 1138=item $buf = $ctx->buffer ($flags, $len)
1043 1139
1044Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the 1140Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
1045given flags and octet-size. 1141given flags and octet-size.
1046 1142
1143flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_WRITE_ONLY, OpenCL::MEM_READ_ONLY,
1144OpenCL::MEM_USE_HOST_PTR, OpenCL::MEM_ALLOC_HOST_PTR, OpenCL::MEM_COPY_HOST_PTR,
1145OpenCL::MEM_HOST_WRITE_ONLY, OpenCL::MEM_HOST_READ_ONLY, OpenCL::MEM_HOST_NO_ACCESS.
1146
1047L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html> 1147L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
1048 1148
1049=item $buf = $ctx->buffer_sv ($flags, $data) 1149=item $buf = $ctx->buffer_sv ($flags, $data)
1050 1150
1051Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and 1151Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
1054=item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth = 0, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef) 1154=item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth = 0, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef)
1055 1155
1056Creates a new OpenCL::Image object and optionally initialises it with 1156Creates a new OpenCL::Image object and optionally initialises it with
1057the given data values. 1157the given data values.
1058 1158
1159channel_order: OpenCL::R, OpenCL::A, OpenCL::RG, OpenCL::RA, OpenCL::RGB,
1160OpenCL::RGBA, OpenCL::BGRA, OpenCL::ARGB, OpenCL::INTENSITY, OpenCL::LUMINANCE,
1161OpenCL::Rx, OpenCL::RGx, OpenCL::RGBx.
1162
1163channel_type: OpenCL::SNORM_INT8, OpenCL::SNORM_INT16, OpenCL::UNORM_INT8,
1164OpenCL::UNORM_INT16, OpenCL::UNORM_SHORT_565, OpenCL::UNORM_SHORT_555,
1165OpenCL::UNORM_INT_101010, OpenCL::SIGNED_INT8, OpenCL::SIGNED_INT16,
1166OpenCL::SIGNED_INT32, OpenCL::UNSIGNED_INT8, OpenCL::UNSIGNED_INT16,
1167OpenCL::UNSIGNED_INT32, OpenCL::HALF_FLOAT, OpenCL::FLOAT.
1168
1169
1170type: OpenCL::MEM_OBJECT_BUFFER, OpenCL::MEM_OBJECT_IMAGE2D,
1171OpenCL::MEM_OBJECT_IMAGE3D, OpenCL::MEM_OBJECT_IMAGE2D_ARRAY,
1172OpenCL::MEM_OBJECT_IMAGE1D, OpenCL::MEM_OBJECT_IMAGE1D_ARRAY,
1173OpenCL::MEM_OBJECT_IMAGE1D_BUFFER.
1174
1059L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html> 1175L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
1060 1176
1061=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef) 1177=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
1062 1178
1063Creates a new OpenCL::Image2D object and optionally initialises it with 1179Creates a new OpenCL::Image2D object and optionally initialises it with
1075=item $buffer = $ctx->gl_buffer ($flags, $bufobj) 1191=item $buffer = $ctx->gl_buffer ($flags, $bufobj)
1076 1192
1077Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given 1193Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
1078OpenGL buffer object. 1194OpenGL buffer object.
1079 1195
1196flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_READ_ONLY, OpenCL::MEM_WRITE_ONLY.
1197
1080http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html 1198http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
1081 1199
1082=item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture) 1200=item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture)
1083 1201
1084Creates a new OpenCL::Image object that refers to the given OpenGL 1202Creates a new OpenCL::Image object that refers to the given OpenGL
1085texture object or buffer. 1203texture object or buffer.
1086 1204
1205target: GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BUFFER,
1206GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D,
1207GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1208GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
1209GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1210GL_TEXTURE_RECTANGLE/GL_TEXTURE_RECTANGLE_ARB.
1211
1087http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html 1212http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html
1088 1213
1089=item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture) 1214=item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
1090 1215
1091Creates a new OpenCL::Image2D object that refers to the given OpenGL 1216Creates a new OpenCL::Image2D object that refers to the given OpenGL
1116 1241
1117=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode) 1242=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
1118 1243
1119Creates a new OpenCL::Sampler object. 1244Creates a new OpenCL::Sampler object.
1120 1245
1246addressing_mode: OpenCL::ADDRESS_NONE, OpenCL::ADDRESS_CLAMP_TO_EDGE,
1247OpenCL::ADDRESS_CLAMP, OpenCL::ADDRESS_REPEAT, OpenCL::ADDRESS_MIRRORED_REPEAT.
1248
1249filter_mode: OpenCL::FILTER_NEAREST, OpenCL::FILTER_LINEAR.
1250
1121L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html> 1251L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
1122 1252
1123=item $program = $ctx->program_with_source ($string) 1253=item $program = $ctx->program_with_source ($string)
1124 1254
1125Creates a new OpenCL::Program object from the given source code. 1255Creates a new OpenCL::Program object from the given source code.
1126 1256
1127L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html> 1257L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
1128 1258
1259=item ($program, \@status) = $ctx->program_with_binary (\@devices, \@binaries)
1260
1261Creates a new OpenCL::Program object from the given binaries.
1262
1263L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithBinary.html>
1264
1265Example: clone an existing program object that contains a successfully
1266compiled program, no matter how useless this is.
1267
1268 my $clone = $ctx->program_with_binary ([$prog->devices], [$prog->binaries]);
1269
1270=item $program = $ctx->program_with_built_in_kernels (\@devices, $kernel_names)
1271
1272Creates a new OpenCL::Program object from the given built-in kernel names.
1273
1274L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateProgramWithBuiltInKernels.html>
1275
1129=item $packed_value = $ctx->info ($name) 1276=item $packed_value = $ctx->info ($name)
1130 1277
1131See C<< $platform->info >> for details. 1278See C<< $platform->info >> for details.
1132 1279
1133L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html> 1280L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
1134 1281
1135=for gengetinfo begin context 1282=for gengetinfo begin context
1136 1283
1137=item $uint = $context->reference_count 1284=item $uint = $context->reference_count
1138 1285
1139Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result. 1286Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_REFERENCE_COUNT> and returns the result.
1140 1287
1141=item @devices = $context->devices 1288=item @devices = $context->devices
1142 1289
1143Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result. 1290Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_DEVICES> and returns the result.
1144 1291
1145=item @property_ints = $context->properties 1292=item @property_ints = $context->properties
1146 1293
1147Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result. 1294Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_PROPERTIES> and returns the result.
1148 1295
1149=item $uint = $context->num_devices 1296=item $uint = $context->num_devices
1150 1297
1151Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result. 1298Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_NUM_DEVICES> and returns the result.
1152 1299
1153=for gengetinfo end context 1300=for gengetinfo end context
1154 1301
1155=back 1302=back
1156 1303
1203 1350
1204=item $ev = $queue->write_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...) 1351=item $ev = $queue->write_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
1205 1352
1206http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html 1353http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1207 1354
1355=item $ev = $queue->copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1356
1357L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>
1358
1208=item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1359=item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1209 1360
1210L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html> 1361C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1211 1362module uses the image width (and height) to supply default values.
1212=item $ev = $queue->copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1213 1363
1214L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html> 1364L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1215 1365
1216=item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1366=item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1217 1367
1368C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1369module uses the image width (and height) to supply default values.
1218L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html> 1370L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1219 1371
1220=item $ev = $queue->copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...) 1372=item $ev = $queue->copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1221 1373
1222L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html> 1374L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1267reference to an array of local work sizes, with the same number of 1419reference to an array of local work sizes, with the same number of
1268elements as \@global_work_size. 1420elements as \@global_work_size.
1269 1421
1270L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html> 1422L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1271 1423
1424=item $ev = $queue->migrate_mem_objects (\@mem_objects, $flags, $wait_events...)
1425
1426Migrates a number of OpenCL::Memory objects to or from the device.
1427
1428flags: OpenCL::MIGRATE_MEM_OBJECT_HOST, OpenCL::MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED
1429
1430L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMigrateMemObjects.html>
1431
1272=item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...) 1432=item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...)
1273 1433
1274Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired 1434Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1275for subsequent OpenCL usage. 1435for subsequent OpenCL usage.
1276 1436
1311 1471
1312=for gengetinfo begin command_queue 1472=for gengetinfo begin command_queue
1313 1473
1314=item $ctx = $command_queue->context 1474=item $ctx = $command_queue->context
1315 1475
1316Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result. 1476Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_CONTEXT> and returns the result.
1317 1477
1318=item $device = $command_queue->device 1478=item $device = $command_queue->device
1319 1479
1320Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result. 1480Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_DEVICE> and returns the result.
1321 1481
1322=item $uint = $command_queue->reference_count 1482=item $uint = $command_queue->reference_count
1323 1483
1324Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result. 1484Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_REFERENCE_COUNT> and returns the result.
1325 1485
1326=item $command_queue_properties = $command_queue->properties 1486=item $command_queue_properties = $command_queue->properties
1327 1487
1328Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result. 1488Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_PROPERTIES> and returns the result.
1329 1489
1330=for gengetinfo end command_queue 1490=for gengetinfo end command_queue
1491
1492=back
1493
1494=head3 MEMORY MAPPED BUFFERS
1495
1496OpenCL allows you to map buffers and images to host memory (read: perl
1497scalars). This is done much like reading or copying a buffer, by enqueuing
1498a map or unmap operation on the command queue.
1499
1500The map operations return an C<OpenCL::Mapped> object - see L<THE
1501OpenCL::Mapped CLASS> section for details on what to do with these
1502objects.
1503
1504The object will be unmapped automatically when the mapped object is
1505destroyed (you can use a barrier to make sure the unmap has finished,
1506before using the buffer in a kernel), but you can also enqueue an unmap
1507operation manually.
1508
1509=over 4
1510
1511=item $mapped_buffer = $queue->map_buffer ($buf, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=undef, $wait_events...)
1512
1513Maps the given buffer into host memory and returns an
1514C<OpenCL::MappedBuffer> object. If C<$size> is specified as undef, then
1515the map will extend to the end of the buffer.
1516
1517map_flags: OpenCL::MAP_READ, OpenCL::MAP_WRITE, OpenCL::MAP_WRITE_INVALIDATE_REGION.
1518
1519L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html>
1520
1521Example: map the buffer $buf fully and replace the first 4 bytes by "abcd", then unmap.
1522
1523 {
1524 my $mapped = $queue->map_buffer ($buf, 1, OpenCL::MAP_WRITE);
1525 substr $$mapped, 0, 4, "abcd";
1526 } # asynchronously unmap because $mapped is destroyed
1527
1528=item $mapped_image = $queue->map_image ($img, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $x=0, $y=0, $z=0, $width=undef, $height=undef, $depth=undef, $wait_events...)
1529
1530Maps the given image area into host memory and return an
1531C<OpenCL::MappedImage> object.
1532
1533If any of C<$width>, C<$height> and/or C<$depth> are C<undef> then they
1534will be replaced by the maximum possible value.
1535
1536L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapImage.html>
1537
1538Example: map an image (with OpenCL::UNSIGNED_INT8 channel type) and set
1539the first channel of the leftmost column to 5, then explicitly unmap
1540it. You are not necessarily meant to do it this way, this example just
1541shows you the accessors to use :)
1542
1543 my $mapped = $queue->map_image ($image, 1, OpenCL::MAP_WRITE);
1544
1545 $mapped->set ($_ * $mapped->row_pitch, pack "C", 5)
1546 for 0..$image->height;
1547
1548 $mapped->unmap;.
1549 $mapped->wait; # only needed for out of order queues normally
1550
1551=item $ev = $queue->unmap ($mapped, $wait_events...)
1552
1553Unmaps the data from host memory. You must not call any methods that
1554modify the data, or modify the data scalar directly, after calling this
1555method.
1556
1557The mapped event object will always be passed as part of the
1558$wait_events. The mapped event object will be replaced by the new event
1559object that this request creates.
1331 1560
1332=back 1561=back
1333 1562
1334=head2 THE OpenCL::Memory CLASS 1563=head2 THE OpenCL::Memory CLASS
1335 1564
1346 1575
1347=for gengetinfo begin mem 1576=for gengetinfo begin mem
1348 1577
1349=item $mem_object_type = $mem->type 1578=item $mem_object_type = $mem->type
1350 1579
1351Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result. 1580Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_TYPE> and returns the result.
1352 1581
1353=item $mem_flags = $mem->flags 1582=item $mem_flags = $mem->flags
1354 1583
1355Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result. 1584Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_FLAGS> and returns the result.
1356 1585
1357=item $int = $mem->size 1586=item $int = $mem->size
1358 1587
1359Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result. 1588Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_SIZE> and returns the result.
1360 1589
1361=item $ptr_value = $mem->host_ptr 1590=item $ptr_value = $mem->host_ptr
1362 1591
1363Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result. 1592Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_HOST_PTR> and returns the result.
1364 1593
1365=item $uint = $mem->map_count 1594=item $uint = $mem->map_count
1366 1595
1367Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result. 1596Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_MAP_COUNT> and returns the result.
1368 1597
1369=item $uint = $mem->reference_count 1598=item $uint = $mem->reference_count
1370 1599
1371Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result. 1600Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_REFERENCE_COUNT> and returns the result.
1372 1601
1373=item $ctx = $mem->context 1602=item $ctx = $mem->context
1374 1603
1375Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result. 1604Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_CONTEXT> and returns the result.
1376 1605
1377=item $mem = $mem->associated_memobject 1606=item $mem = $mem->associated_memobject
1378 1607
1379Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result. 1608Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1380 1609
1381=item $int = $mem->offset 1610=item $int = $mem->offset
1382 1611
1383Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result. 1612Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_OFFSET> and returns the result.
1384 1613
1385=for gengetinfo end mem 1614=for gengetinfo end mem
1386 1615
1387=item ($type, $name) = $mem->gl_object_info 1616=item ($type, $name) = $mem->gl_object_info
1388 1617
1440 1669
1441=for gengetinfo begin image 1670=for gengetinfo begin image
1442 1671
1443=item $int = $image->element_size 1672=item $int = $image->element_size
1444 1673
1445Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result. 1674Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ELEMENT_SIZE> and returns the result.
1446 1675
1447=item $int = $image->row_pitch 1676=item $int = $image->row_pitch
1448 1677
1449Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result. 1678Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ROW_PITCH> and returns the result.
1450 1679
1451=item $int = $image->slice_pitch 1680=item $int = $image->slice_pitch
1452 1681
1453Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result. 1682Calls C<clGetImageInfo> with C<OpenCL::IMAGE_SLICE_PITCH> and returns the result.
1454 1683
1455=item $int = $image->width 1684=item $int = $image->width
1456 1685
1457Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result. 1686Calls C<clGetImageInfo> with C<OpenCL::IMAGE_WIDTH> and returns the result.
1458 1687
1459=item $int = $image->height 1688=item $int = $image->height
1460 1689
1461Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result. 1690Calls C<clGetImageInfo> with C<OpenCL::IMAGE_HEIGHT> and returns the result.
1462 1691
1463=item $int = $image->depth 1692=item $int = $image->depth
1464 1693
1465Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result. 1694Calls C<clGetImageInfo> with C<OpenCL::IMAGE_DEPTH> and returns the result.
1466 1695
1467=for gengetinfo end image 1696=for gengetinfo end image
1468 1697
1469=for gengetinfo begin gl_texture 1698=for gengetinfo begin gl_texture
1470 1699
1471=item $GLenum = $gl_texture->target 1700=item $GLenum = $gl_texture->target
1472 1701
1473Calls C<clGetGLTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result. 1702Calls C<clGetGLTextureInfo> with C<OpenCL::GL_TEXTURE_TARGET> and returns the result.
1474 1703
1475=item $GLint = $gl_texture->gl_mipmap_level 1704=item $GLint = $gl_texture->gl_mipmap_level
1476 1705
1477Calls C<clGetGLTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result. 1706Calls C<clGetGLTextureInfo> with C<OpenCL::GL_MIPMAP_LEVEL> and returns the result.
1478 1707
1479=for gengetinfo end gl_texture 1708=for gengetinfo end gl_texture
1480 1709
1481=back 1710=back
1482 1711
1492 1721
1493=for gengetinfo begin sampler 1722=for gengetinfo begin sampler
1494 1723
1495=item $uint = $sampler->reference_count 1724=item $uint = $sampler->reference_count
1496 1725
1497Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result. 1726Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_REFERENCE_COUNT> and returns the result.
1498 1727
1499=item $ctx = $sampler->context 1728=item $ctx = $sampler->context
1500 1729
1501Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result. 1730Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_CONTEXT> and returns the result.
1502 1731
1503=item $addressing_mode = $sampler->normalized_coords 1732=item $addressing_mode = $sampler->normalized_coords
1504 1733
1505Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result. 1734Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_NORMALIZED_COORDS> and returns the result.
1506 1735
1507=item $filter_mode = $sampler->addressing_mode 1736=item $filter_mode = $sampler->addressing_mode
1508 1737
1509Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result. 1738Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_ADDRESSING_MODE> and returns the result.
1510 1739
1511=item $boolean = $sampler->filter_mode 1740=item $boolean = $sampler->filter_mode
1512 1741
1513Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result. 1742Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_FILTER_MODE> and returns the result.
1514 1743
1515=for gengetinfo end sampler 1744=for gengetinfo end sampler
1516 1745
1517=back 1746=back
1518 1747
1528If a callback is specified, then it will be called when compilation is 1757If a callback is specified, then it will be called when compilation is
1529finished. Note that many OpenCL implementations block your program while 1758finished. Note that many OpenCL implementations block your program while
1530compiling whether you use a callback or not. See C<build_async> if you 1759compiling whether you use a callback or not. See C<build_async> if you
1531want to make sure the build is done in the background. 1760want to make sure the build is done in the background.
1532 1761
1533Note that some OpenCL implementations atc up badly, and don't call the 1762Note that some OpenCL implementations act up badly, and don't call the
1534callback in some error cases (but call it in others). This implementation 1763callback in some error cases (but call it in others). This implementation
1535assumes the callback will always be called, and leaks memory if this is 1764assumes the callback will always be called, and leaks memory if this is
1536not so. So best make sure you don't pass in invalid values. 1765not so. So best make sure you don't pass in invalid values.
1537 1766
1767Some implementations fail with C<OpenCL::INVALID_BINARY> when the
1768compilation state is successful but some later stage fails.
1769
1770options: C<-D name>, C<-D name=definition>, C<-I dir>,
1771C<-cl-single-precision-constant>, C<-cl-denorms-are-zero>,
1772C<-cl-fp32-correctly-rounded-divide-sqrt>, C<-cl-opt-disable>,
1773C<-cl-mad-enable>, C<-cl-no-signed-zeros>, C<-cl-unsafe-math-optimizations>,
1774C<-cl-finite-math-only>, C<-cl-fast-relaxed-math>,
1775C<-w>, C<-Werror>, C<-cl-std=CL1.1/CL1.2>, C<-cl-kernel-arg-info>,
1776C<-create-library>, C<-enable-link-options>.
1777
1538L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html> 1778L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1539 1779
1540=item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef) 1780=item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef)
1541 1781
1542Similar to C<< ->build >>, except it starts a thread, and never fails (you 1782Similar to C<< ->build >>, except it starts a thread, and never fails (you
1543need to check the compilation status form the callback, or by polling). 1783need to check the compilation status form the callback, or by polling).
1544 1784
1785build_status: OpenCL::BUILD_SUCCESS, OpenCL::BUILD_NONE,
1786OpenCL::BUILD_ERROR, OpenCL::BUILD_IN_PROGRESS.
1787
1545=item $packed_value = $program->build_info ($device, $name) 1788=item $packed_value = $program->build_info ($device, $name)
1546 1789
1547Similar to C<< $platform->info >>, but returns build info for a previous 1790Similar to C<< $platform->info >>, but returns build info for a previous
1548build attempt for the given device. 1791build attempt for the given device.
1549 1792
1564 1807
1565=for gengetinfo begin program_build 1808=for gengetinfo begin program_build
1566 1809
1567=item $build_status = $program->build_status ($device) 1810=item $build_status = $program->build_status ($device)
1568 1811
1569Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result. 1812Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_STATUS> and returns the result.
1570 1813
1571=item $string = $program->build_options ($device) 1814=item $string = $program->build_options ($device)
1572 1815
1573Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result. 1816Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_OPTIONS> and returns the result.
1574 1817
1575=item $string = $program->build_log ($device) 1818=item $string = $program->build_log ($device)
1576 1819
1577Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result. 1820Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_LOG> and returns the result.
1578 1821
1579=for gengetinfo end program_build 1822=for gengetinfo end program_build
1580 1823
1581=item $packed_value = $program->info ($name) 1824=item $packed_value = $program->info ($name)
1582 1825
1586 1829
1587=for gengetinfo begin program 1830=for gengetinfo begin program
1588 1831
1589=item $uint = $program->reference_count 1832=item $uint = $program->reference_count
1590 1833
1591Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result. 1834Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_REFERENCE_COUNT> and returns the result.
1592 1835
1593=item $ctx = $program->context 1836=item $ctx = $program->context
1594 1837
1595Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result. 1838Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_CONTEXT> and returns the result.
1596 1839
1597=item $uint = $program->num_devices 1840=item $uint = $program->num_devices
1598 1841
1599Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result. 1842Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_NUM_DEVICES> and returns the result.
1600 1843
1601=item @devices = $program->devices 1844=item @devices = $program->devices
1602 1845
1603Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result. 1846Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_DEVICES> and returns the result.
1604 1847
1605=item $string = $program->source 1848=item $string = $program->source
1606 1849
1607Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result. 1850Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_SOURCE> and returns the result.
1608 1851
1609=item @ints = $program->binary_sizes 1852=item @ints = $program->binary_sizes
1610 1853
1611Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result. 1854Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_BINARY_SIZES> and returns the result.
1612 1855
1613=for gengetinfo end program 1856=for gengetinfo end program
1614 1857
1615=item @blobs = $program->binaries 1858=item @blobs = $program->binaries
1616 1859
1637 1880
1638=for gengetinfo begin kernel 1881=for gengetinfo begin kernel
1639 1882
1640=item $string = $kernel->function_name 1883=item $string = $kernel->function_name
1641 1884
1642Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result. 1885Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_FUNCTION_NAME> and returns the result.
1643 1886
1644=item $uint = $kernel->num_args 1887=item $uint = $kernel->num_args
1645 1888
1646Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result. 1889Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_NUM_ARGS> and returns the result.
1647 1890
1648=item $uint = $kernel->reference_count 1891=item $uint = $kernel->reference_count
1649 1892
1650Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result. 1893Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_REFERENCE_COUNT> and returns the result.
1651 1894
1652=item $ctx = $kernel->context 1895=item $ctx = $kernel->context
1653 1896
1654Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result. 1897Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_CONTEXT> and returns the result.
1655 1898
1656=item $program = $kernel->program 1899=item $program = $kernel->program
1657 1900
1658Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result. 1901Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_PROGRAM> and returns the result.
1659 1902
1660=for gengetinfo end kernel 1903=for gengetinfo end kernel
1661 1904
1662=item $packed_value = $kernel->work_group_info ($device, $name) 1905=item $packed_value = $kernel->work_group_info ($device, $name)
1663 1906
1664See C<< $platform->info >> for details. 1907See C<< $platform->info >> for details.
1665 1908
1666The reason this method is not called C<info> is that there already is an
1667C<< ->info >> method.
1668
1669L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html> 1909L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1670 1910
1671=for gengetinfo begin kernel_work_group 1911=for gengetinfo begin kernel_work_group
1672 1912
1673=item $int = $kernel->work_group_size ($device) 1913=item $int = $kernel->work_group_size ($device)
1674 1914
1675Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result. 1915Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_WORK_GROUP_SIZE> and returns the result.
1676 1916
1677=item @ints = $kernel->compile_work_group_size ($device) 1917=item @ints = $kernel->compile_work_group_size ($device)
1678 1918
1679Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result. 1919Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1680 1920
1681=item $ulong = $kernel->local_mem_size ($device) 1921=item $ulong = $kernel->local_mem_size ($device)
1682 1922
1683Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result. 1923Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_LOCAL_MEM_SIZE> and returns the result.
1684 1924
1685=item $int = $kernel->preferred_work_group_size_multiple ($device) 1925=item $int = $kernel->preferred_work_group_size_multiple ($device)
1686 1926
1687Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result. 1927Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1688 1928
1689=item $ulong = $kernel->private_mem_size ($device) 1929=item $ulong = $kernel->private_mem_size ($device)
1690 1930
1691Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result. 1931Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1692 1932
1693=for gengetinfo end kernel_work_group 1933=for gengetinfo end kernel_work_group
1934
1935=item $packed_value = $kernel->arg_info ($idx, $name)
1936
1937See C<< $platform->info >> for details.
1938
1939L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clGetKernelArgInfo.html>
1940
1941=for gengetinfo begin kernel_arg
1942
1943=item $kernel_arg_address_qualifier = $kernel->arg_address_qualifier ($idx)
1944
1945Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ADDRESS_QUALIFIER> and returns the result.
1946
1947=item $kernel_arg_access_qualifier = $kernel->arg_access_qualifier ($idx)
1948
1949Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ACCESS_QUALIFIER> and returns the result.
1950
1951=item $string = $kernel->arg_type_name ($idx)
1952
1953Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_NAME> and returns the result.
1954
1955=item $kernel_arg_type_qualifier = $kernel->arg_type_qualifier ($idx)
1956
1957Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_QUALIFIER> and returns the result.
1958
1959=item $string = $kernel->arg_name ($idx)
1960
1961Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_NAME> and returns the result.
1962
1963=for gengetinfo end kernel_arg
1694 1964
1695=item $kernel->setf ($format, ...) 1965=item $kernel->setf ($format, ...)
1696 1966
1697Sets the arguments of a kernel. Since OpenCL 1.1 doesn't have a generic 1967Sets the arguments of a kernel. Since OpenCL 1.1 doesn't have a generic
1698way to set arguments (and with OpenCL 1.2 it might be rather slow), you 1968way to set arguments (and with OpenCL 1.2 it might be rather slow), you
1810 2080
1811=for gengetinfo begin event 2081=for gengetinfo begin event
1812 2082
1813=item $queue = $event->command_queue 2083=item $queue = $event->command_queue
1814 2084
1815Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result. 2085Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_QUEUE> and returns the result.
1816 2086
1817=item $command_type = $event->command_type 2087=item $command_type = $event->command_type
1818 2088
1819Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result. 2089Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_TYPE> and returns the result.
1820 2090
1821=item $uint = $event->reference_count 2091=item $uint = $event->reference_count
1822 2092
1823Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result. 2093Calls C<clGetEventInfo> with C<OpenCL::EVENT_REFERENCE_COUNT> and returns the result.
1824 2094
1825=item $uint = $event->command_execution_status 2095=item $uint = $event->command_execution_status
1826 2096
1827Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result. 2097Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1828 2098
1829=item $ctx = $event->context 2099=item $ctx = $event->context
1830 2100
1831Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result. 2101Calls C<clGetEventInfo> with C<OpenCL::EVENT_CONTEXT> and returns the result.
1832 2102
1833=for gengetinfo end event 2103=for gengetinfo end event
1834 2104
1835=item $packed_value = $ev->profiling_info ($name) 2105=item $packed_value = $ev->profiling_info ($name)
1836 2106
1843 2113
1844=for gengetinfo begin profiling 2114=for gengetinfo begin profiling
1845 2115
1846=item $ulong = $event->profiling_command_queued 2116=item $ulong = $event->profiling_command_queued
1847 2117
1848Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result. 2118Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_QUEUED> and returns the result.
1849 2119
1850=item $ulong = $event->profiling_command_submit 2120=item $ulong = $event->profiling_command_submit
1851 2121
1852Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result. 2122Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_SUBMIT> and returns the result.
1853 2123
1854=item $ulong = $event->profiling_command_start 2124=item $ulong = $event->profiling_command_start
1855 2125
1856Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result. 2126Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_START> and returns the result.
1857 2127
1858=item $ulong = $event->profiling_command_end 2128=item $ulong = $event->profiling_command_end
1859 2129
1860Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result. 2130Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_END> and returns the result.
1861 2131
1862=for gengetinfo end profiling 2132=for gengetinfo end profiling
1863 2133
1864=back 2134=back
1865 2135
1872=item $ev->set_status ($execution_status) 2142=item $ev->set_status ($execution_status)
1873 2143
1874Sets the execution status of the user event. Can only be called once, 2144Sets the execution status of the user event. Can only be called once,
1875either with OpenCL::COMPLETE or a negative number as status. 2145either with OpenCL::COMPLETE or a negative number as status.
1876 2146
2147execution_status: OpenCL::COMPLETE or a negative integer.
2148
1877L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html> 2149L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1878 2150
1879=back 2151=back
2152
2153=head2 THE OpenCL::Mapped CLASS
2154
2155This class represents objects mapped into host memory. They are
2156represented by a blessed string scalar. The string data is the mapped
2157memory area, that is, if you read or write it, then the mapped object is
2158accessed directly.
2159
2160You must only ever use operations that modify the string in-place - for
2161example, a C<substr> that doesn't change the length, or maybe a regex that
2162doesn't change the length. Any other operation might cause the data to be
2163copied.
2164
2165When the object is destroyed it will enqueue an implicit unmap operation
2166on the queue that was used to create it.
2167
2168Keep in mind that you I<need> to unmap (or destroy) mapped objects before
2169OpenCL sees the changes, even if some implementations don't need this
2170sometimes.
2171
2172Example, replace the first two floats in the mapped buffer by 1 and 2.
2173
2174 my $mapped = $queue->map_buffer ($buf, ...
2175 $mapped->event->wait; # make sure it's there
2176
2177 # now replace first 8 bytes by new data, which is exactly 8 bytes long
2178 # we blindly assume device endianness to equal host endianness
2179 # (and of course, we assume iee 754 single precision floats :)
2180 substr $$mapped, 0, 8, pack "f*", 1, 2;
2181
2182=over 4
2183
2184=item $ev = $mapped->unmap ($wait_events...)
2185
2186Unmaps the mapped memory object, using the queue originally used to create
2187it, quite similarly to C<< $queue->unmap ($mapped, ...) >>.
2188
2189=item $bool = $mapped->mapped
2190
2191Returns whether the object is still mapped - true before an C<unmap> is
2192enqueued, false afterwards.
2193
2194=item $ev = $mapped->event
2195
2196Return the event object associated with the mapped object. Initially, this
2197will be the event object created when mapping the object, and after an
2198unmap, this will be the event object that the unmap operation created.
2199
2200=item $mapped->wait
2201
2202Same as C<< $mapped->event->wait >> - makes sure no operations on this
2203mapped object are outstanding.
2204
2205=item $bytes = $mapped->size
2206
2207Returns the size of the mapped area, in bytes. Same as C<length $$mapped>.
2208
2209=item $ptr = $mapped->ptr
2210
2211Returns the raw memory address of the mapped area.
2212
2213=item $mapped->set ($offset, $data)
2214
2215Replaces the data at the given C<$offset> in the memory area by the new
2216C<$data>. This method is safer than direct manipulation of C<$mapped>
2217because it does bounds-checking, but also slower.
2218
2219=item $data = $mapped->get ($offset, $length)
2220
2221Returns (without copying) a scalar representing the data at the given
2222C<$offset> and C<$length> in the mapped memory area. This is the same as
2223the following substr, except much slower;
2224
2225 $data = substr $$mapped, $offset, $length
2226
2227=cut
2228
2229sub OpenCL::Mapped::get {
2230 substr ${$_[0]}, $_[1], $_[2]
2231}
2232
2233=back
2234
2235=head2 THE OpenCL::MappedBuffer CLASS
2236
2237This is a subclass of OpenCL::Mapped, representing mapped buffers.
2238
2239=head2 THE OpenCL::MappedImage CLASS
2240
2241This is a subclass of OpenCL::Mapped, representing mapped images.
2242
2243=over 4
2244
2245=item $bytes = $mapped->row_pitch
2246
2247=item $bytes = $mapped->slice_pitch
2248
2249Return the row or slice pitch of the image that has been mapped.
2250
2251=back
2252
1880 2253
1881=cut 2254=cut
1882 2255
18831; 22561;
1884 2257

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines