Я хочу взять несколько пикселей из текстуры OpenGL и поработать с ними. Я думаю, что лучший способ реализовать sh это ядро OpenCL. Есть функция OpenCL clCreateFromGLTexture
, которая, я подозреваю, даст мне буфер, который позволит мне получить доступ к пикселям текстуры в моем ядре OpenCL. Пока у меня есть следующий код:
extern crate ocl;
extern crate cl_sys;
use ocl::ProQue;
use ocl::Context;
use ocl::MemFlags;
use std::ffi;
use std::rc::Rc;
pub fn lower_level(tex_id: cl_sys::cl_GLuint, gl_context: &Rc<glium::backend::Context>)
->Result<(), String>
{
let ll_ctx: *mut ffi::c_void = gl_context.??; // XXX what goes here?
let ctx: Context = Context::builder()
.gl_context(ll_ctx) // without this I get an INVALID_CONTEXT error
.build()?;
let ctx2 :cl_sys::cl_context = ctx.as_ptr();
let builder :ocl::builders::BufferBuilder<f32> = ocl::Buffer::builder();
let buffer : ocl::Buffer<f32> = builder
.context(&ctx)
.flags(MemFlags::READ_WRITE)
.len(999) // XXX definitely not the right size
.build()?;
let mut errcode_ret:i32=0;
let xx = unsafe {
//let flags = MemFlags::READ_WRITE.bits as u64;
let flags = cl_sys::CL_MEM_READ_WRITE;
cl_sys::clCreateFromGLTexture(ctx2, flags, cl_sys::GL_TEXTURE_2D_ARRAY as u32, 0, tex_id, &mut errcode_ret)
};
println!("err {}", errcode_ret);
println!("{:?}", xx);
Ok(())
}
Я думаю, что могу получить идентификатор текстуры из glium::Texture2d::get_id()
.
Если я создаю свой собственный контекст OpenCL, я получаю ошибку -34, которая Я думаю, что означает INVALID_CONTEXT. Я предполагаю, что мне нужна версия OpenCL контекста OpenGL, в которой живет текстура, но я не уверен, как получить правильный слепок данных из глия.
Я понятия не имею, есть ли другие вещи, которые взорвутся после того, как я решу эту проблему, но не стесняйтесь обращаться и к ним.