aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/Gustav-Simonsson/go-opencl/cl/image.go
blob: d6a9963770f68312872a10cb388c946f3b411785 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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)
}