Как преобразовать текстуру GL в буфер OpenCL с помощью rust / glium / cl_sys? - PullRequest
0 голосов
/ 11 марта 2020

Я хочу взять несколько пикселей из текстуры 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, в которой живет текстура, но я не уверен, как получить правильный слепок данных из глия.

Я понятия не имею, есть ли другие вещи, которые взорвутся после того, как я решу эту проблему, но не стесняйтесь обращаться и к ним.

...