1 /*
2  * Copyright (C) 2018-2020 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #include "opencl/source/sharings/gl/gl_texture.h"
9 
10 #include "config.h"
11 #include "gtest/gtest.h"
12 
13 namespace NEO {
14 namespace glTypes {
15 static const std::tuple<int, uint32_t /*cl_channel_type*/, uint32_t /*cl_channel_order*/> allImageFormats[] = {
16     // input, output, output
17     std::make_tuple(GL_RGBA8, CL_UNORM_INT8, CL_RGBA),
18     std::make_tuple(GL_RGBA8I, CL_SIGNED_INT8, CL_RGBA),
19     std::make_tuple(GL_RGBA16, CL_UNORM_INT16, CL_RGBA),
20     std::make_tuple(GL_RGBA16I, CL_SIGNED_INT16, CL_RGBA),
21     std::make_tuple(GL_RGBA32I, CL_SIGNED_INT32, CL_RGBA),
22     std::make_tuple(GL_RGBA8UI, CL_UNSIGNED_INT8, CL_RGBA),
23     std::make_tuple(GL_RGBA16UI, CL_UNSIGNED_INT16, CL_RGBA),
24     std::make_tuple(GL_RGBA32UI, CL_UNSIGNED_INT32, CL_RGBA),
25     std::make_tuple(GL_RGBA16F, CL_HALF_FLOAT, CL_RGBA),
26     std::make_tuple(GL_RGBA32F, CL_FLOAT, CL_RGBA),
27     std::make_tuple(GL_RGBA, CL_UNORM_INT8, CL_RGBA),
28     std::make_tuple(GL_RGBA8_SNORM, CL_SNORM_INT8, CL_RGBA),
29     std::make_tuple(GL_RGBA16_SNORM, CL_SNORM_INT16, CL_RGBA),
30     std::make_tuple(GL_BGRA, CL_UNORM_INT8, CL_BGRA),
31     std::make_tuple(GL_R8, CL_UNORM_INT8, CL_R),
32     std::make_tuple(GL_R8_SNORM, CL_SNORM_INT8, CL_R),
33     std::make_tuple(GL_R16, CL_UNORM_INT16, CL_R),
34     std::make_tuple(GL_R16_SNORM, CL_SNORM_INT16, CL_R),
35     std::make_tuple(GL_R16F, CL_HALF_FLOAT, CL_R),
36     std::make_tuple(GL_R32F, CL_FLOAT, CL_R),
37     std::make_tuple(GL_R8I, CL_SIGNED_INT8, CL_R),
38     std::make_tuple(GL_R16I, CL_SIGNED_INT16, CL_R),
39     std::make_tuple(GL_R32I, CL_SIGNED_INT32, CL_R),
40     std::make_tuple(GL_R8UI, CL_UNSIGNED_INT8, CL_R),
41     std::make_tuple(GL_R16UI, CL_UNSIGNED_INT16, CL_R),
42     std::make_tuple(GL_R32UI, CL_UNSIGNED_INT32, CL_R),
43     std::make_tuple(GL_DEPTH_COMPONENT32F, CL_FLOAT, CL_DEPTH),
44     std::make_tuple(GL_DEPTH_COMPONENT16, CL_UNORM_INT16, CL_DEPTH),
45     std::make_tuple(GL_DEPTH24_STENCIL8, CL_UNORM_INT24, CL_DEPTH_STENCIL),
46     std::make_tuple(GL_DEPTH32F_STENCIL8, CL_FLOAT, CL_DEPTH_STENCIL),
47     std::make_tuple(GL_SRGB8_ALPHA8, CL_UNORM_INT8, CL_sRGBA),
48     std::make_tuple(GL_RG8, CL_UNORM_INT8, CL_RG),
49     std::make_tuple(GL_RG8_SNORM, CL_SNORM_INT8, CL_RG),
50     std::make_tuple(GL_RG16, CL_UNORM_INT16, CL_RG),
51     std::make_tuple(GL_RG16_SNORM, CL_SNORM_INT16, CL_RG),
52     std::make_tuple(GL_RG16F, CL_HALF_FLOAT, CL_RG),
53     std::make_tuple(GL_RG32F, CL_FLOAT, CL_RG),
54     std::make_tuple(GL_RG8I, CL_SIGNED_INT8, CL_RG),
55     std::make_tuple(GL_RG16I, CL_SIGNED_INT16, CL_RG),
56     std::make_tuple(GL_RG32I, CL_SIGNED_INT32, CL_RG),
57     std::make_tuple(GL_RG8UI, CL_UNSIGNED_INT8, CL_RG),
58     std::make_tuple(GL_RG16UI, CL_UNSIGNED_INT16, CL_RG),
59     std::make_tuple(GL_RG32UI, CL_UNSIGNED_INT32, CL_RG),
60     std::make_tuple(GL_RGB10, CL_UNORM_INT16, CL_RGBA),
61     std::make_tuple(CL_INVALID_VALUE, 0, 0)};
62 
63 static const std::tuple<unsigned int, uint32_t /*cl_gl_object_type*/, uint32_t /*cl_mem_object_type*/> allObjTypes[] = {
64     // input, output, output
65     std::make_tuple(GL_TEXTURE_1D, CL_GL_OBJECT_TEXTURE1D, CL_MEM_OBJECT_IMAGE1D),
66     std::make_tuple(GL_TEXTURE_1D_ARRAY, CL_GL_OBJECT_TEXTURE1D_ARRAY, CL_MEM_OBJECT_IMAGE1D_ARRAY),
67     std::make_tuple(GL_TEXTURE_2D, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
68     std::make_tuple(GL_TEXTURE_RECTANGLE, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
69     std::make_tuple(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
70     std::make_tuple(GL_TEXTURE_CUBE_MAP_POSITIVE_X, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
71     std::make_tuple(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
72     std::make_tuple(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
73     std::make_tuple(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
74     std::make_tuple(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
75     std::make_tuple(GL_TEXTURE_2D_MULTISAMPLE, CL_GL_OBJECT_TEXTURE2D, CL_MEM_OBJECT_IMAGE2D),
76     std::make_tuple(GL_TEXTURE_2D_ARRAY, CL_GL_OBJECT_TEXTURE2D_ARRAY, CL_MEM_OBJECT_IMAGE2D_ARRAY),
77     std::make_tuple(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, CL_GL_OBJECT_TEXTURE2D_ARRAY, CL_MEM_OBJECT_IMAGE2D_ARRAY),
78     std::make_tuple(GL_TEXTURE_3D, CL_GL_OBJECT_TEXTURE3D, CL_MEM_OBJECT_IMAGE3D),
79     std::make_tuple(GL_TEXTURE_BUFFER, CL_GL_OBJECT_TEXTURE_BUFFER, CL_MEM_OBJECT_IMAGE1D_BUFFER),
80     std::make_tuple(GL_RENDERBUFFER_EXT, CL_GL_OBJECT_RENDERBUFFER, CL_MEM_OBJECT_IMAGE2D),
81     std::make_tuple(CL_INVALID_VALUE, 0, 0)};
82 } // namespace glTypes
83 struct GlClImageFormatTests
84     : public ::testing::WithParamInterface<std::tuple<int, uint32_t /*cl_channel_type*/, uint32_t /*cl_channel_order*/>>,
85       public ::testing::Test {};
86 
87 INSTANTIATE_TEST_CASE_P(GlClImageFormatTests, GlClImageFormatTests, testing::ValuesIn(glTypes::allImageFormats));
88 
TEST_P(GlClImageFormatTests,WhenSettingClImageFormatThenValidFormatIsSet)89 TEST_P(GlClImageFormatTests, WhenSettingClImageFormatThenValidFormatIsSet) {
90     cl_image_format imgFormat = {};
91     auto glFormat = std::get<0>(GetParam());
92     auto expectedClChannelType = static_cast<cl_channel_type>(std::get<1>(GetParam()));
93     auto expectedClChannelOrder = static_cast<cl_channel_order>(std::get<2>(GetParam()));
94 
95     GlTexture::setClImageFormat(glFormat, imgFormat);
96 
97     EXPECT_EQ(imgFormat.image_channel_data_type, expectedClChannelType);
98     EXPECT_EQ(imgFormat.image_channel_order, expectedClChannelOrder);
99 }
100 
101 struct GlClObjTypesTests
102     : public ::testing::WithParamInterface<std::tuple<unsigned int, uint32_t /*cl_gl_object_type*/, uint32_t /*cl_mem_object_type*/>>,
103       public ::testing::Test {};
104 
105 INSTANTIATE_TEST_CASE_P(GlClObjTypesTests, GlClObjTypesTests, testing::ValuesIn(glTypes::allObjTypes));
106 
TEST_P(GlClObjTypesTests,WhenConvertingTypeThenTypeIsSetCorrectly)107 TEST_P(GlClObjTypesTests, WhenConvertingTypeThenTypeIsSetCorrectly) {
108     auto glType = static_cast<cl_GLenum>(std::get<0>(GetParam()));
109     auto expectedClGlObjType = static_cast<cl_gl_object_type>(std::get<1>(GetParam()));
110     auto expectedClMemObjType = static_cast<cl_mem_object_type>(std::get<2>(GetParam()));
111 
112     auto clGlObjType = GlTexture::getClGlObjectType(glType);
113     auto clMemObjType = GlTexture::getClMemObjectType(glType);
114 
115     EXPECT_EQ(expectedClGlObjType, clGlObjType);
116     EXPECT_EQ(clMemObjType, expectedClMemObjType);
117 }
118 } // namespace NEO
119