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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines