84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
// +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)
|
|
}
|