|
|
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 | |
5 | #include "ecb.h"//D |
7 | #include "ecb.h"//D |
… | |
… | |
726 | void *ptr; |
728 | void *ptr; |
727 | size_t cb; |
729 | size_t cb; |
728 | cl_event event; |
730 | cl_event event; |
729 | size_t row_pitch; |
731 | size_t row_pitch; |
730 | size_t slice_pitch; |
732 | size_t slice_pitch; |
|
|
733 | |
|
|
734 | size_t element_size; |
|
|
735 | size_t width, height, depth; |
731 | }; |
736 | }; |
732 | |
737 | |
733 | static SV * |
738 | 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) |
739 | mapped_new ( |
|
|
740 | HV *stash, cl_command_queue queue, cl_mem memobj, cl_map_flags flags, |
|
|
741 | void *ptr, size_t cb, cl_event ev, |
|
|
742 | size_t row_pitch, size_t slice_pitch, size_t element_size, |
|
|
743 | size_t width, size_t height, size_t depth |
|
|
744 | ) |
735 | { |
745 | { |
736 | SV *data = newSV (0); |
746 | SV *data = newSV (0); |
737 | SvUPGRADE (data, SVt_PVMG); |
747 | SvUPGRADE (data, SVt_PVMG); |
738 | |
748 | |
739 | OpenCL__Mapped mapped; |
749 | OpenCL__Mapped mapped; |
740 | New (0, mapped, 1, struct mapped); |
750 | New (0, mapped, 1, struct mapped); |
741 | |
751 | |
742 | clRetainCommandQueue (queue); |
752 | clRetainCommandQueue (queue); |
743 | |
753 | |
744 | mapped->queue = queue; |
754 | mapped->queue = queue; |
745 | mapped->memobj = memobj; |
755 | mapped->memobj = memobj; |
746 | mapped->ptr = ptr; |
756 | mapped->ptr = ptr; |
747 | mapped->cb = cb; |
757 | mapped->cb = cb; |
748 | mapped->event = ev; |
758 | mapped->event = ev; |
749 | mapped->row_pitch = row_pitch; |
759 | mapped->row_pitch = row_pitch; |
750 | mapped->slice_pitch = slice_pitch; |
760 | mapped->slice_pitch = slice_pitch; |
|
|
761 | |
|
|
762 | mapped->element_size = element_size; |
|
|
763 | mapped->width = width; |
|
|
764 | mapped->height = height; |
|
|
765 | mapped->depth = depth; |
751 | |
766 | |
752 | sv_magicext (data, 0, PERL_MAGIC_ext, 0, (char *)mapped, 0); |
767 | sv_magicext (data, 0, PERL_MAGIC_ext, 0, (char *)mapped, 0); |
753 | |
768 | |
754 | if (SvLEN (data)) |
769 | if (SvLEN (data)) |
755 | Safefree (data); |
770 | Safefree (data); |
… | |
… | |
796 | |
811 | |
797 | clReleaseEvent (mapped->event); |
812 | clReleaseEvent (mapped->event); |
798 | mapped->event = ev; |
813 | mapped->event = ev; |
799 | |
814 | |
800 | mapped_detach (self, mapped); |
815 | mapped_detach (self, mapped); |
|
|
816 | } |
|
|
817 | |
|
|
818 | static size_t |
|
|
819 | mapped_element_size (OpenCL__Mapped self) |
|
|
820 | { |
|
|
821 | if (!self->element_size) |
|
|
822 | clGetImageInfo (self->memobj, CL_IMAGE_ELEMENT_SIZE, sizeof (self->element_size), &self->element_size, 0); |
|
|
823 | |
|
|
824 | return self->element_size; |
801 | } |
825 | } |
802 | |
826 | |
803 | /*****************************************************************************/ |
827 | /*****************************************************************************/ |
804 | |
828 | |
805 | MODULE = OpenCL PACKAGE = OpenCL |
829 | MODULE = OpenCL PACKAGE = OpenCL |
… | |
… | |
1840 | cb -= offset; |
1864 | cb -= offset; |
1841 | } |
1865 | } |
1842 | |
1866 | |
1843 | cl_event ev; |
1867 | 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)); |
1868 | 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)); |
1869 | XPUSHs (mapped_new (stash_mappedbuffer, self, buf, map_flags, ptr, cb, ev, 0, 0, 1, cb, 1, 1)); |
1846 | |
1870 | |
1847 | void |
1871 | 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, ...) |
1872 | 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: |
1873 | ALIAS: |
1850 | enqueue_map_image = 0 |
1874 | enqueue_map_image = 0 |
… | |
… | |
1859 | size_t height = SvIV (width_); |
1883 | size_t height = SvIV (width_); |
1860 | if (!SvOK (height_)) |
1884 | if (!SvOK (height_)) |
1861 | { |
1885 | { |
1862 | NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_HEIGHT, sizeof (height), &height, 0)); |
1886 | NEED_SUCCESS (GetImageInfo, (img, CL_IMAGE_HEIGHT, sizeof (height), &height, 0)); |
1863 | height -= y; |
1887 | height -= y; |
|
|
1888 | |
|
|
1889 | // stupid opencl returns 0 for depth, but requires 1 for 2d images |
|
|
1890 | if (!height) |
|
|
1891 | height = 1; |
1864 | } |
1892 | } |
1865 | |
1893 | |
1866 | size_t depth = SvIV (width_); |
1894 | size_t depth = SvIV (width_); |
1867 | if (!SvOK (depth_)) |
1895 | if (!SvOK (depth_)) |
1868 | { |
1896 | { |
… | |
… | |
1884 | |
1912 | |
1885 | size_t cb = slice_pitch ? slice_pitch * region [2] |
1913 | size_t cb = slice_pitch ? slice_pitch * region [2] |
1886 | : row_pitch ? row_pitch * region [1] |
1914 | : row_pitch ? row_pitch * region [1] |
1887 | : region [0]; |
1915 | : region [0]; |
1888 | |
1916 | |
1889 | XPUSHs (mapped_new (stash_mappedimage, self, img, map_flags, ptr, cb, ev, row_pitch, slice_pitch)); |
1917 | XPUSHs (mapped_new (stash_mappedimage, self, img, map_flags, ptr, cb, ev, row_pitch, slice_pitch, 0, width, height, depth)); |
1890 | |
1918 | |
1891 | void |
1919 | void |
1892 | unmap (OpenCL::Queue self, OpenCL::Mapped mapped, ...) |
1920 | unmap (OpenCL::Queue self, OpenCL::Mapped mapped, ...) |
1893 | PPCODE: |
1921 | PPCODE: |
1894 | mapped_unmap (cv, ST (1), mapped, self, &ST (2), items - 2); |
1922 | mapped_unmap (cv, ST (1), mapped, self, &ST (2), items - 2); |
… | |
… | |
3039 | XSRETURN_UNDEF; |
3067 | XSRETURN_UNDEF; |
3040 | |
3068 | |
3041 | clRetainEvent (self->event); |
3069 | clRetainEvent (self->event); |
3042 | XPUSH_CLOBJ (stash_event, self->event); |
3070 | XPUSH_CLOBJ (stash_event, self->event); |
3043 | |
3071 | |
3044 | size_t |
3072 | #define MAPPED_OFFSET_CB offsetof (struct mapped, cb) |
|
|
3073 | #define MAPPED_OFFSET_ROW_PITCH offsetof (struct mapped, row_pitch) |
|
|
3074 | #define MAPPED_OFFSET_SLICE_PITCH offsetof (struct mapped, slice_pitch) |
|
|
3075 | #define MAPPED_OFFSET_WIDTH offsetof (struct mapped, width) |
|
|
3076 | #define MAPPED_OFFSET_HEIGHT offsetof (struct mapped, height) |
|
|
3077 | #define MAPPED_OFFSET_DEPTH offsetof (struct mapped, depth) |
|
|
3078 | |
|
|
3079 | IV |
3045 | size (OpenCL::Mapped self) |
3080 | size (OpenCL::Mapped self) |
|
|
3081 | ALIAS: |
|
|
3082 | size = MAPPED_OFFSET_CB |
|
|
3083 | row_pitch = MAPPED_OFFSET_ROW_PITCH |
|
|
3084 | slice_pitch = MAPPED_OFFSET_SLICE_PITCH |
|
|
3085 | width = MAPPED_OFFSET_WIDTH |
|
|
3086 | height = MAPPED_OFFSET_HEIGHT |
|
|
3087 | depth = MAPPED_OFFSET_DEPTH |
3046 | CODE: |
3088 | CODE: |
3047 | RETVAL = self->cb; |
3089 | RETVAL = *(size_t *)((char *)self + ix); |
3048 | OUTPUT: |
3090 | OUTPUT: |
3049 | RETVAL |
3091 | RETVAL |
3050 | |
3092 | |
3051 | IV |
3093 | IV |
3052 | ptr (OpenCL::Mapped self) |
3094 | ptr (OpenCL::Mapped self) |
… | |
… | |
3064 | if (offset + len > self->cb) |
3106 | if (offset + len > self->cb) |
3065 | croak ("OpenCL::Mapped::set out of bound condition detected"); |
3107 | croak ("OpenCL::Mapped::set out of bound condition detected"); |
3066 | |
3108 | |
3067 | memcpy (offset + (char *)self->ptr, ptr, len); |
3109 | memcpy (offset + (char *)self->ptr, ptr, len); |
3068 | |
3110 | |
|
|
3111 | void |
|
|
3112 | get_row (OpenCL::Mapped self, size_t count, size_t x = 0, size_t y = 0, size_t z = 0) |
|
|
3113 | PPCODE: |
|
|
3114 | if (!SvOK (ST (1))) |
|
|
3115 | count = self->width - x; |
|
|
3116 | |
|
|
3117 | if (x + count > self->width) |
|
|
3118 | croak ("OpenCL::Mapped::get: x + count crosses a row boundary"); |
|
|
3119 | |
|
|
3120 | if (y >= self->height) |
|
|
3121 | croak ("OpenCL::Mapped::get: y coordinate out of bounds"); |
|
|
3122 | |
|
|
3123 | if (z >= self->depth) |
|
|
3124 | croak ("OpenCL::Mapped::get: z coordinate out of bounds"); |
|
|
3125 | |
|
|
3126 | size_t element = mapped_element_size (self); |
|
|
3127 | |
|
|
3128 | count *= element; |
|
|
3129 | x *= element; |
|
|
3130 | |
|
|
3131 | char *ptr = (char *)self->ptr + x + y * self->row_pitch + z * self->slice_pitch; |
|
|
3132 | XPUSHs (sv_2mortal (newSVpvn (ptr, count))); |
|
|
3133 | |
|
|
3134 | void |
|
|
3135 | set_row (OpenCL::Mapped self, SV *data, size_t x = 0, size_t y = 0, size_t z = 0) |
|
|
3136 | PPCODE: |
|
|
3137 | STRLEN count; |
|
|
3138 | char *dataptr = SvPVbyte (data, count); |
|
|
3139 | size_t element = mapped_element_size (self); |
|
|
3140 | |
|
|
3141 | x *= element; |
|
|
3142 | |
|
|
3143 | if (x + count > self->width * element) |
|
|
3144 | croak ("OpenCL::Mapped::set: x + data size crosses a row boundary"); |
|
|
3145 | |
|
|
3146 | if (y >= self->height) |
|
|
3147 | croak ("OpenCL::Mapped::set: y coordinate out of bounds"); |
|
|
3148 | |
|
|
3149 | if (z >= self->depth) |
|
|
3150 | croak ("OpenCL::Mapped::set: z coordinate out of bounds"); |
|
|
3151 | |
|
|
3152 | char *ptr = (char *)self->ptr + x + y * self->row_pitch + z * self->slice_pitch; |
|
|
3153 | memcpy (ptr, dataptr, count); |
|
|
3154 | |
3069 | MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer |
3155 | MODULE = OpenCL PACKAGE = OpenCL::MappedBuffer |
3070 | |
3156 | |
3071 | MODULE = OpenCL PACKAGE = OpenCL::MappedImage |
3157 | MODULE = OpenCL PACKAGE = OpenCL::MappedImage |
3072 | |
3158 | |
3073 | IV |
3159 | IV |
3074 | row_pitch (OpenCL::Mapped self) |
3160 | element_size (OpenCL::Mapped self) |
3075 | ALIAS: |
|
|
3076 | slice_pitch = 1 |
|
|
3077 | CODE: |
3161 | CODE: |
3078 | RETVAL = ix ? self->slice_pitch : self->row_pitch; |
3162 | RETVAL = mapped_element_size (self); |
3079 | OUTPUT: |
3163 | OUTPUT: |
3080 | RETVAL |
3164 | RETVAL |
3081 | |
3165 | |
3082 | |
|
|
3083 | |
|
|