diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-10-16 21:25:33 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-10-16 21:25:33 +0800 |
commit | d5327ddc5fdc2a8b967699ea06ef5b5503657123 (patch) | |
tree | 9872db19a62cb21fc68e7c3e27a8bf8b9fcc63bd /Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go | |
parent | b74775400906cc582bdbb98bf5067c5258ee491f (diff) | |
parent | ec6a548ee3555813d83f86f82bd25694bfd9c303 (diff) | |
download | go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.tar go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.tar.gz go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.tar.bz2 go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.tar.lz go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.tar.xz go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.tar.zst go-tangerine-d5327ddc5fdc2a8b967699ea06ef5b5503657123.zip |
Merge pull request #1869 from Gustav-Simonsson/gpu_miner
all: Add GPU mining, disabled by default
Diffstat (limited to 'Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go')
-rw-r--r-- | Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go b/Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go new file mode 100644 index 000000000..d6a996377 --- /dev/null +++ b/Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go @@ -0,0 +1,83 @@ +// +build cl12 + +package cl + +// #ifdef __APPLE__ +// #include "OpenCL/opencl.h" +// #else +// #include "cl.h" +// #endif +import "C" +import ( + "image" + "unsafe" +) + +func (ctx *Context) CreateImage(flags MemFlag, imageFormat ImageFormat, imageDesc ImageDescription, data []byte) (*MemObject, error) { + format := imageFormat.toCl() + desc := imageDesc.toCl() + var dataPtr unsafe.Pointer + if data != nil { + dataPtr = unsafe.Pointer(&data[0]) + } + var err C.cl_int + clBuffer := C.clCreateImage(ctx.clContext, C.cl_mem_flags(flags), &format, &desc, dataPtr, &err) + if err != C.CL_SUCCESS { + return nil, toError(err) + } + if clBuffer == nil { + return nil, ErrUnknown + } + return newMemObject(clBuffer, len(data)), nil +} + +func (ctx *Context) CreateImageSimple(flags MemFlag, width, height int, channelOrder ChannelOrder, channelDataType ChannelDataType, data []byte) (*MemObject, error) { + format := ImageFormat{channelOrder, channelDataType} + desc := ImageDescription{ + Type: MemObjectTypeImage2D, + Width: width, + Height: height, + } + return ctx.CreateImage(flags, format, desc, data) +} + +func (ctx *Context) CreateImageFromImage(flags MemFlag, img image.Image) (*MemObject, error) { + switch m := img.(type) { + case *image.Gray: + format := ImageFormat{ChannelOrderIntensity, ChannelDataTypeUNormInt8} + desc := ImageDescription{ + Type: MemObjectTypeImage2D, + Width: m.Bounds().Dx(), + Height: m.Bounds().Dy(), + RowPitch: m.Stride, + } + return ctx.CreateImage(flags, format, desc, m.Pix) + case *image.RGBA: + format := ImageFormat{ChannelOrderRGBA, ChannelDataTypeUNormInt8} + desc := ImageDescription{ + Type: MemObjectTypeImage2D, + Width: m.Bounds().Dx(), + Height: m.Bounds().Dy(), + RowPitch: m.Stride, + } + return ctx.CreateImage(flags, format, desc, m.Pix) + } + + b := img.Bounds() + w := b.Dx() + h := b.Dy() + data := make([]byte, w*h*4) + dataOffset := 0 + for y := 0; y < h; y++ { + for x := 0; x < w; x++ { + c := img.At(x+b.Min.X, y+b.Min.Y) + r, g, b, a := c.RGBA() + data[dataOffset] = uint8(r >> 8) + data[dataOffset+1] = uint8(g >> 8) + data[dataOffset+2] = uint8(b >> 8) + data[dataOffset+3] = uint8(a >> 8) + dataOffset += 4 + } + } + return ctx.CreateImageSimple(flags, w, h, ChannelOrderRGBA, ChannelDataTypeUNormInt8, data) +} |