|
|
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 | |
733 | static SV * |
742 | static SV * |
734 | mapped_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) |
743 | mapped_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 | |
|
|
822 | static size_t |
|
|
823 | mapped_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 | |
805 | MODULE = OpenCL PACKAGE = OpenCL |
833 | MODULE = 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 | |
1847 | void |
1875 | void |
1848 | map_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, ...) |
1876 | map_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 | |
1891 | void |
1923 | void |
1892 | unmap (OpenCL::Queue self, OpenCL::Mapped mapped, ...) |
1924 | unmap (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 | |
3044 | size_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 | |
|
|
3083 | IV |
3045 | size (OpenCL::Mapped self) |
3084 | size (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 | |
3051 | IV |
3097 | IV |
3052 | ptr (OpenCL::Mapped self) |
3098 | ptr (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 | |
|
|
3115 | void |
|
|
3116 | get_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 | |
|
|
3138 | void |
|
|
3139 | set_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 | |
3069 | MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer |
3159 | MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer |
3070 | |
3160 | |
3071 | MODULE = OpenCL PACKAGE = OpenCL::MappedImage |
3161 | MODULE = OpenCL PACKAGE = OpenCL::MappedImage |
3072 | |
3162 | |
3073 | IV |
3163 | IV |
3074 | row_pitch (OpenCL::Mapped self) |
3164 | element_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 | |
|
|