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