summaryrefslogtreecommitdiff
path: root/src/gallium/frontends/rusticl/core/util.rs
blob: ad73f6e2f0df12fab70ff60be817f8834acc1b43 (plain)
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
use crate::api::{icd::CLResult, types::CLVec};

use mesa_rust_gen::*;
use rusticl_opencl_gen::*;

use std::mem;

pub fn cl_mem_type_to_texture_target(mem_type: cl_mem_object_type) -> pipe_texture_target {
    match mem_type {
        CL_MEM_OBJECT_IMAGE1D => pipe_texture_target::PIPE_TEXTURE_1D,
        CL_MEM_OBJECT_IMAGE2D => pipe_texture_target::PIPE_TEXTURE_2D,
        CL_MEM_OBJECT_IMAGE3D => pipe_texture_target::PIPE_TEXTURE_3D,
        CL_MEM_OBJECT_IMAGE1D_ARRAY => pipe_texture_target::PIPE_TEXTURE_1D_ARRAY,
        CL_MEM_OBJECT_IMAGE2D_ARRAY => pipe_texture_target::PIPE_TEXTURE_2D_ARRAY,
        CL_MEM_OBJECT_IMAGE1D_BUFFER => pipe_texture_target::PIPE_TEXTURE_1D,
        _ => pipe_texture_target::PIPE_TEXTURE_2D,
    }
}

pub fn create_pipe_box(
    base: CLVec<usize>,
    region: CLVec<usize>,
    mem_type: cl_mem_object_type,
) -> CLResult<pipe_box> {
    let x = base[0].try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?;
    let mut y = base[1].try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?;
    let mut z = base[2].try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?;
    let width = region[0].try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?;
    let mut height = region[1].try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?;
    let mut depth = region[2].try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?;

    if matches!(
        mem_type,
        CL_MEM_OBJECT_BUFFER
            | CL_MEM_OBJECT_IMAGE1D
            | CL_MEM_OBJECT_IMAGE1D_ARRAY
            | CL_MEM_OBJECT_IMAGE1D_BUFFER
            | CL_MEM_OBJECT_IMAGE2D
    ) {
        debug_assert!(depth == 1);
        depth = 1;
    }

    if matches!(
        mem_type,
        CL_MEM_OBJECT_BUFFER | CL_MEM_OBJECT_IMAGE1D | CL_MEM_OBJECT_IMAGE1D_BUFFER
    ) {
        debug_assert!(height == 1);
        height = 1;
    }

    if mem_type == CL_MEM_OBJECT_IMAGE1D_ARRAY {
        mem::swap(&mut height, &mut depth);
        mem::swap(&mut y, &mut z);
    }

    Ok(pipe_box {
        x: x,
        y: y,
        z: z,
        width: width,
        height: height,
        depth: depth,
    })
}