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

Comparing OpenCL/OpenCL.xs (file contents):
Revision 1.79 by root, Sat May 5 15:43:02 2012 UTC vs.
Revision 1.83 by root, Mon Apr 7 22:36:54 2014 UTC

1#include <stddef.h>
2
1#include "EXTERN.h" 3#include "EXTERN.h"
2#include "perl.h" 4#include "perl.h"
3#include "XSUB.h" 5#include "XSUB.h"
4 6
7#define ECB_NO_THREADS 1
8#define ECB_NO_LIBM 1
5#include "ecb.h"//D 9#include "ecb.h"
6 10
7#define X_STACKSIZE sizeof (void *) * 512 * 1024 // 2-4mb should be enough, really 11#define X_STACKSIZE sizeof (void *) * 512 * 1024 // 2-4mb should be enough, really
8#include "xthread.h" 12#include "xthread.h"
9#include "schmorp.h" 13#include "schmorp.h"
10 14
35 #define CLHDR(name) <CL/name> 39 #define CLHDR(name) <CL/name>
36#endif 40#endif
37 41
38#include CLHDR(opencl.h) 42#include CLHDR(opencl.h)
39 43
44#if 0
40#ifndef CL_VERSION_1_2 45#ifndef CL_VERSION_1_2
41 #include CLHDR(cl_d3d9.h) 46 #include CLHDR(cl_d3d9.h)
42#endif 47#endif
48#endif
43 49
44#if _WIN32 50#if _WIN32
45 #include CLHDR(cl_d3d10.h) 51 #include CLHDR(cl_d3d10.h)
46 #if CL_VERSION_1_2 52 #if CL_VERSION_1_2
47 #include CLHDR<cl_d3d11.h> 53 #include CLHDR(cl_d3d11.h)
48 #endif 54 #endif
49 #include CLHDR<cl_dx9_media_sharing.h.h> 55 #include CLHDR(cl_dx9_media_sharing.h)
50#endif 56#endif
51 57
52#ifndef CL_VERSION_1_2 58#ifndef CL_VERSION_1_2
53 #undef PREFER_1_1 59 #undef PREFER_1_1
54 #define PREFER_1_1 1 60 #define PREFER_1_1 1
614 arg->user_data = user_data; 620 arg->user_data = user_data;
615 arg->num_devices = num_devices; 621 arg->num_devices = num_devices;
616 memcpy (arg + 1, device_list, sizeof (*device_list) * num_devices); 622 memcpy (arg + 1, device_list, sizeof (*device_list) * num_devices);
617 623
618 xthread_t id; 624 xthread_t id;
619 thread_create (&id, build_program_thread, arg); 625 xthread_create (&id, build_program_thread, arg);
620} 626}
621 627
622/*****************************************************************************/ 628/*****************************************************************************/
623/* mem object destructor notify */ 629/* mem object destructor notify */
624 630
726 void *ptr; 732 void *ptr;
727 size_t cb; 733 size_t cb;
728 cl_event event; 734 cl_event event;
729 size_t row_pitch; 735 size_t row_pitch;
730 size_t slice_pitch; 736 size_t slice_pitch;
737
738 size_t element_size;
739 size_t width, height, depth;
731}; 740};
732 741
733static SV * 742static SV *
734mapped_new (HV *stash, cl_command_queue queue, cl_mem memobj, cl_map_flags flags, void *ptr, size_t cb, cl_event ev, size_t row_pitch, size_t slice_pitch) 743mapped_new (
744 HV *stash, cl_command_queue queue, cl_mem memobj, cl_map_flags flags,
745 void *ptr, size_t cb, cl_event ev,
746 size_t row_pitch, size_t slice_pitch, size_t element_size,
747 size_t width, size_t height, size_t depth
748)
735{ 749{
736 SV *data = newSV (0); 750 SV *data = newSV (0);
737 SvUPGRADE (data, SVt_PVMG); 751 SvUPGRADE (data, SVt_PVMG);
738 752
739 OpenCL__Mapped mapped; 753 OpenCL__Mapped mapped;
740 New (0, mapped, 1, struct mapped); 754 New (0, mapped, 1, struct mapped);
741 755
742 clRetainCommandQueue (queue); 756 clRetainCommandQueue (queue);
743 757
744 mapped->queue = queue; 758 mapped->queue = queue;
745 mapped->memobj = memobj; 759 mapped->memobj = memobj;
746 mapped->ptr = ptr; 760 mapped->ptr = ptr;
747 mapped->cb = cb; 761 mapped->cb = cb;
748 mapped->event = ev; 762 mapped->event = ev;
749 mapped->row_pitch = row_pitch; 763 mapped->row_pitch = row_pitch;
750 mapped->slice_pitch = slice_pitch; 764 mapped->slice_pitch = slice_pitch;
765
766 mapped->element_size = element_size;
767 mapped->width = width;
768 mapped->height = height;
769 mapped->depth = depth;
751 770
752 sv_magicext (data, 0, PERL_MAGIC_ext, 0, (char *)mapped, 0); 771 sv_magicext (data, 0, PERL_MAGIC_ext, 0, (char *)mapped, 0);
753 772
754 if (SvLEN (data)) 773 if (SvLEN (data))
755 Safefree (data); 774 Safefree (data);
796 815
797 clReleaseEvent (mapped->event); 816 clReleaseEvent (mapped->event);
798 mapped->event = ev; 817 mapped->event = ev;
799 818
800 mapped_detach (self, mapped); 819 mapped_detach (self, mapped);
820}
821
822static size_t
823mapped_element_size (OpenCL__Mapped self)
824{
825 if (!self->element_size)
826 clGetImageInfo (self->memobj, CL_IMAGE_ELEMENT_SIZE, sizeof (self->element_size), &self->element_size, 0);
827
828 return self->element_size;
801} 829}
802 830
803/*****************************************************************************/ 831/*****************************************************************************/
804 832
805MODULE = OpenCL PACKAGE = OpenCL 833MODULE = OpenCL PACKAGE = OpenCL
1840 cb -= offset; 1868 cb -= offset;
1841 } 1869 }
1842 1870
1843 cl_event ev; 1871 cl_event ev;
1844 NEED_SUCCESS_ARG (void *ptr, EnqueueMapBuffer, (self, buf, blocking, map_flags, offset, cb, event_list_count, event_list_ptr, &ev, &res)); 1872 NEED_SUCCESS_ARG (void *ptr, EnqueueMapBuffer, (self, buf, blocking, map_flags, offset, cb, event_list_count, event_list_ptr, &ev, &res));
1845 XPUSHs (mapped_new (stash_mappedbuffer, self, buf, map_flags, ptr, cb, ev, 0, 0)); 1873 XPUSHs (mapped_new (stash_mappedbuffer, self, buf, map_flags, ptr, cb, ev, 0, 0, 1, cb, 1, 1));
1846 1874
1847void 1875void
1848map_image (OpenCL::Queue self, OpenCL::Image img, cl_bool blocking = 1, cl_map_flags map_flags = CL_MAP_READ | CL_MAP_WRITE, size_t x = 0, size_t y = 0, size_t z = 0, SV *width_ = &PL_sv_undef, SV *height_ = &PL_sv_undef, SV *depth_ = &PL_sv_undef, ...) 1876map_image (OpenCL::Queue self, OpenCL::Image img, cl_bool blocking = 1, cl_map_flags map_flags = CL_MAP_READ | CL_MAP_WRITE, size_t x = 0, size_t y = 0, size_t z = 0, SV *width_ = &PL_sv_undef, SV *height_ = &PL_sv_undef, SV *depth_ = &PL_sv_undef, ...)
1849 ALIAS: 1877 ALIAS:
1850 enqueue_map_image = 0 1878 enqueue_map_image = 0
1859 size_t height = SvIV (width_); 1887 size_t height = SvIV (width_);
1860 if (!SvOK (height_)) 1888 if (!SvOK (height_))
1861 { 1889 {
1862 NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_HEIGHT, sizeof (height), &height, 0)); 1890 NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_HEIGHT, sizeof (height), &height, 0));
1863 height -= y; 1891 height -= y;
1892
1893 // stupid opencl returns 0 for depth, but requires 1 for 2d images
1894 if (!height)
1895 height = 1;
1864 } 1896 }
1865 1897
1866 size_t depth = SvIV (width_); 1898 size_t depth = SvIV (width_);
1867 if (!SvOK (depth_)) 1899 if (!SvOK (depth_))
1868 { 1900 {
1884 1916
1885 size_t cb = slice_pitch ? slice_pitch * region [2] 1917 size_t cb = slice_pitch ? slice_pitch * region [2]
1886 : row_pitch ? row_pitch * region [1] 1918 : row_pitch ? row_pitch * region [1]
1887 : region [0]; 1919 : region [0];
1888 1920
1889 XPUSHs (mapped_new (stash_mappedimage, self, img, map_flags, ptr, cb, ev, row_pitch, slice_pitch)); 1921 XPUSHs (mapped_new (stash_mappedimage, self, img, map_flags, ptr, cb, ev, row_pitch, slice_pitch, 0, width, height, depth));
1890 1922
1891void 1923void
1892unmap (OpenCL::Queue self, OpenCL::Mapped mapped, ...) 1924unmap (OpenCL::Queue self, OpenCL::Mapped mapped, ...)
1893 PPCODE: 1925 PPCODE:
1894 mapped_unmap (cv, ST (1), mapped, self, &ST (2), items - 2); 1926 mapped_unmap (cv, ST (1), mapped, self, &ST (2), items - 2);
3039 XSRETURN_UNDEF; 3071 XSRETURN_UNDEF;
3040 3072
3041 clRetainEvent (self->event); 3073 clRetainEvent (self->event);
3042 XPUSH_CLOBJ (stash_event, self->event); 3074 XPUSH_CLOBJ (stash_event, self->event);
3043 3075
3044size_t 3076#define MAPPED_OFFSET_CB offsetof (struct mapped, cb)
3077#define MAPPED_OFFSET_ROW_PITCH offsetof (struct mapped, row_pitch)
3078#define MAPPED_OFFSET_SLICE_PITCH offsetof (struct mapped, slice_pitch)
3079#define MAPPED_OFFSET_WIDTH offsetof (struct mapped, width)
3080#define MAPPED_OFFSET_HEIGHT offsetof (struct mapped, height)
3081#define MAPPED_OFFSET_DEPTH offsetof (struct mapped, depth)
3082
3083IV
3045size (OpenCL::Mapped self) 3084size (OpenCL::Mapped self)
3085 ALIAS:
3086 size = MAPPED_OFFSET_CB
3087 row_pitch = MAPPED_OFFSET_ROW_PITCH
3088 slice_pitch = MAPPED_OFFSET_SLICE_PITCH
3089 width = MAPPED_OFFSET_WIDTH
3090 height = MAPPED_OFFSET_HEIGHT
3091 depth = MAPPED_OFFSET_DEPTH
3046 CODE: 3092 CODE:
3047 RETVAL = self->cb; 3093 RETVAL = *(size_t *)((char *)self + ix);
3048 OUTPUT: 3094 OUTPUT:
3049 RETVAL 3095 RETVAL
3050 3096
3051IV 3097IV
3052ptr (OpenCL::Mapped self) 3098ptr (OpenCL::Mapped self)
3064 if (offset + len > self->cb) 3110 if (offset + len > self->cb)
3065 croak ("OpenCL::Mapped::set out of bound condition detected"); 3111 croak ("OpenCL::Mapped::set out of bound condition detected");
3066 3112
3067 memcpy (offset + (char *)self->ptr, ptr, len); 3113 memcpy (offset + (char *)self->ptr, ptr, len);
3068 3114
3115void
3116get_row (OpenCL::Mapped self, size_t count, size_t x = 0, size_t y = 0, size_t z = 0)
3117 PPCODE:
3118 if (!SvOK (ST (1)))
3119 count = self->width - x;
3120
3121 if (x + count > self->width)
3122 croak ("OpenCL::Mapped::get: x + count crosses a row boundary");
3123
3124 if (y >= self->height)
3125 croak ("OpenCL::Mapped::get: y coordinate out of bounds");
3126
3127 if (z >= self->depth)
3128 croak ("OpenCL::Mapped::get: z coordinate out of bounds");
3129
3130 size_t element = mapped_element_size (self);
3131
3132 count *= element;
3133 x *= element;
3134
3135 char *ptr = (char *)self->ptr + x + y * self->row_pitch + z * self->slice_pitch;
3136 XPUSHs (sv_2mortal (newSVpvn (ptr, count)));
3137
3138void
3139set_row (OpenCL::Mapped self, SV *data, size_t x = 0, size_t y = 0, size_t z = 0)
3140 PPCODE:
3141 STRLEN count;
3142 char *dataptr = SvPVbyte (data, count);
3143 size_t element = mapped_element_size (self);
3144
3145 x *= element;
3146
3147 if (x + count > self->width * element)
3148 croak ("OpenCL::Mapped::set: x + data size crosses a row boundary");
3149
3150 if (y >= self->height)
3151 croak ("OpenCL::Mapped::set: y coordinate out of bounds");
3152
3153 if (z >= self->depth)
3154 croak ("OpenCL::Mapped::set: z coordinate out of bounds");
3155
3156 char *ptr = (char *)self->ptr + x + y * self->row_pitch + z * self->slice_pitch;
3157 memcpy (ptr, dataptr, count);
3158
3069MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer 3159MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer
3070 3160
3071MODULE = OpenCL PACKAGE = OpenCL::MappedImage 3161MODULE = OpenCL PACKAGE = OpenCL::MappedImage
3072 3162
3073IV 3163IV
3074row_pitch (OpenCL::Mapped self) 3164element_size (OpenCL::Mapped self)
3075 ALIAS:
3076 slice_pitch = 1
3077 CODE: 3165 CODE:
3078 RETVAL = ix ? self->slice_pitch : self->row_pitch; 3166 RETVAL = mapped_element_size (self);
3079 OUTPUT: 3167 OUTPUT:
3080 RETVAL 3168 RETVAL
3081 3169
3082
3083

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines