• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2022 The Khronos Group Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //    http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef _TEST_CL_EXT_IMAGE_BUFFER
18 #define _TEST_CL_EXT_IMAGE_BUFFER
19 
20 #define TEST_IMAGE_SIZE 20
21 
22 #define GET_EXTENSION_FUNC(platform, function_name)                            \
23     function_name##_fn function_name = reinterpret_cast<function_name##_fn>(   \
24         clGetExtensionFunctionAddressForPlatform(platform, #function_name));   \
25     if (function_name == nullptr)                                              \
26     {                                                                          \
27         return TEST_FAIL;                                                      \
28     }                                                                          \
29     do                                                                         \
30     {                                                                          \
31     } while (false)
32 
aligned_size(size_t size,size_t alignment)33 static inline size_t aligned_size(size_t size, size_t alignment)
34 {
35     return (size + alignment - 1) & ~(alignment - 1);
36 }
37 
aligned_ptr(void * ptr,size_t alignment)38 static inline void* aligned_ptr(void* ptr, size_t alignment)
39 {
40     return (void*)(((uintptr_t)ptr + alignment - 1) & ~(alignment - 1));
41 }
42 
get_format_size(cl_context context,cl_image_format * format,cl_mem_object_type imageType,cl_mem_flags flags)43 static inline size_t get_format_size(cl_context context,
44                                      cl_image_format* format,
45                                      cl_mem_object_type imageType,
46                                      cl_mem_flags flags)
47 {
48     cl_image_desc image_desc = { 0 };
49     image_desc.image_type = imageType;
50 
51     /* Size 1 only to query element size */
52     image_desc.image_width = 1;
53     if (CL_MEM_OBJECT_IMAGE1D_BUFFER != imageType
54         && CL_MEM_OBJECT_IMAGE1D != imageType)
55     {
56         image_desc.image_height = 1;
57     }
58     if (CL_MEM_OBJECT_IMAGE3D == imageType
59         || CL_MEM_OBJECT_IMAGE2D_ARRAY == imageType)
60     {
61         image_desc.image_depth = 1;
62     }
63     if (CL_MEM_OBJECT_IMAGE1D_ARRAY == imageType
64         || CL_MEM_OBJECT_IMAGE2D_ARRAY == imageType)
65     {
66         image_desc.image_array_size = 1;
67     }
68 
69     cl_int error = 0;
70     cl_mem buffer;
71     if (imageType == CL_MEM_OBJECT_IMAGE1D_BUFFER)
72     {
73         buffer = clCreateBuffer(context, flags,
74                                 get_pixel_size(format) * image_desc.image_width,
75                                 NULL, &error);
76         test_error(error, "Unable to create buffer");
77 
78         image_desc.buffer = buffer;
79     }
80 
81     cl_mem image =
82         clCreateImage(context, flags, format, &image_desc, nullptr, &error);
83     test_error(error, "Unable to create image");
84 
85     size_t element_size = 0;
86     error = clGetImageInfo(image, CL_IMAGE_ELEMENT_SIZE, sizeof(element_size),
87                            &element_size, nullptr);
88     test_error(error, "Error clGetImageInfo");
89 
90     error = clReleaseMemObject(image);
91     test_error(error, "Unable to release image");
92 
93     if (imageType == CL_MEM_OBJECT_IMAGE1D_BUFFER)
94     {
95         error = clReleaseMemObject(buffer);
96         test_error(error, "Unable to release buffer");
97     }
98 
99     return element_size;
100 }
101 
image_desc_init(cl_image_desc * desc,cl_mem_object_type imageType)102 static inline void image_desc_init(cl_image_desc* desc,
103                                    cl_mem_object_type imageType)
104 {
105     desc->image_type = imageType;
106     desc->image_width = TEST_IMAGE_SIZE;
107     if (CL_MEM_OBJECT_IMAGE1D_BUFFER != imageType
108         && CL_MEM_OBJECT_IMAGE1D != imageType)
109     {
110         desc->image_height = TEST_IMAGE_SIZE;
111     }
112     if (CL_MEM_OBJECT_IMAGE3D == imageType
113         || CL_MEM_OBJECT_IMAGE2D_ARRAY == imageType)
114     {
115         desc->image_depth = TEST_IMAGE_SIZE;
116     }
117     if (CL_MEM_OBJECT_IMAGE1D_ARRAY == imageType
118         || CL_MEM_OBJECT_IMAGE2D_ARRAY == imageType)
119     {
120         desc->image_array_size = TEST_IMAGE_SIZE;
121     }
122 }
123 
124 #endif /* _TEST_CL_EXT_IMAGE_BUFFER */