xref: /aosp_15_r20/external/OpenCL-CTS/test_common/gl/setup_x11.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi 
17*6467f958SSadaf Ebrahimi #include "setup.h"
18*6467f958SSadaf Ebrahimi #include "testBase.h"
19*6467f958SSadaf Ebrahimi #include "harness/errorHelpers.h"
20*6467f958SSadaf Ebrahimi 
21*6467f958SSadaf Ebrahimi #include <GL/glx.h>
22*6467f958SSadaf Ebrahimi #include <CL/cl_ext.h>
23*6467f958SSadaf Ebrahimi 
24*6467f958SSadaf Ebrahimi class X11GLEnvironment : public GLEnvironment
25*6467f958SSadaf Ebrahimi {
26*6467f958SSadaf Ebrahimi private:
27*6467f958SSadaf Ebrahimi     cl_device_id m_devices[64];
28*6467f958SSadaf Ebrahimi     cl_uint m_device_count;
29*6467f958SSadaf Ebrahimi 
30*6467f958SSadaf Ebrahimi public:
X11GLEnvironment()31*6467f958SSadaf Ebrahimi     X11GLEnvironment()
32*6467f958SSadaf Ebrahimi     {
33*6467f958SSadaf Ebrahimi         m_device_count = 0;
34*6467f958SSadaf Ebrahimi     }
Init(int * argc,char ** argv,int use_opencl_32)35*6467f958SSadaf Ebrahimi     virtual int Init( int *argc, char **argv, int use_opencl_32 )
36*6467f958SSadaf Ebrahimi     {
37*6467f958SSadaf Ebrahimi          // Create a GLUT window to render into
38*6467f958SSadaf Ebrahimi         glutInit( argc, argv );
39*6467f958SSadaf Ebrahimi         glutInitWindowSize( 512, 512 );
40*6467f958SSadaf Ebrahimi         glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
41*6467f958SSadaf Ebrahimi         glutCreateWindow( "OpenCL <-> OpenGL Test" );
42*6467f958SSadaf Ebrahimi         glewInit();
43*6467f958SSadaf Ebrahimi         return 0;
44*6467f958SSadaf Ebrahimi     }
45*6467f958SSadaf Ebrahimi 
CreateCLContext(void)46*6467f958SSadaf Ebrahimi     virtual cl_context CreateCLContext( void )
47*6467f958SSadaf Ebrahimi     {
48*6467f958SSadaf Ebrahimi         GLXContext context = glXGetCurrentContext();
49*6467f958SSadaf Ebrahimi         Display *dpy = glXGetCurrentDisplay();
50*6467f958SSadaf Ebrahimi 
51*6467f958SSadaf Ebrahimi         cl_context_properties properties[] = {
52*6467f958SSadaf Ebrahimi             CL_GL_CONTEXT_KHR,  (cl_context_properties) context,
53*6467f958SSadaf Ebrahimi             CL_GLX_DISPLAY_KHR, (cl_context_properties) dpy,
54*6467f958SSadaf Ebrahimi             0
55*6467f958SSadaf Ebrahimi         };
56*6467f958SSadaf Ebrahimi         cl_int status;
57*6467f958SSadaf Ebrahimi 
58*6467f958SSadaf Ebrahimi         if (!context || !dpy) {
59*6467f958SSadaf Ebrahimi             print_error(CL_INVALID_CONTEXT, "No GL context bound");
60*6467f958SSadaf Ebrahimi             return 0;
61*6467f958SSadaf Ebrahimi         }
62*6467f958SSadaf Ebrahimi 
63*6467f958SSadaf Ebrahimi         return clCreateContext(properties, 1, m_devices, NULL, NULL, &status);
64*6467f958SSadaf Ebrahimi     }
65*6467f958SSadaf Ebrahimi 
SupportsCLGLInterop(cl_device_type device_type)66*6467f958SSadaf Ebrahimi     virtual int SupportsCLGLInterop( cl_device_type device_type )
67*6467f958SSadaf Ebrahimi     {
68*6467f958SSadaf Ebrahimi         int found_valid_device = 0;
69*6467f958SSadaf Ebrahimi         cl_platform_id platform;
70*6467f958SSadaf Ebrahimi         cl_device_id devices[64];
71*6467f958SSadaf Ebrahimi         cl_uint num_of_devices;
72*6467f958SSadaf Ebrahimi         int error;
73*6467f958SSadaf Ebrahimi         error = clGetPlatformIDs(1, &platform, NULL);
74*6467f958SSadaf Ebrahimi         if (error) {
75*6467f958SSadaf Ebrahimi             print_error(error, "clGetPlatformIDs failed");
76*6467f958SSadaf Ebrahimi             return -1;
77*6467f958SSadaf Ebrahimi         }
78*6467f958SSadaf Ebrahimi         error = clGetDeviceIDs(platform, device_type, 64, devices, &num_of_devices);
79*6467f958SSadaf Ebrahimi         // If this platform doesn't have any of the requested device_type (namely GPUs) then return 0
80*6467f958SSadaf Ebrahimi         if (error == CL_DEVICE_NOT_FOUND)
81*6467f958SSadaf Ebrahimi           return 0;
82*6467f958SSadaf Ebrahimi         if (error) {
83*6467f958SSadaf Ebrahimi             print_error(error, "clGetDeviceIDs failed");
84*6467f958SSadaf Ebrahimi             return -1;
85*6467f958SSadaf Ebrahimi         }
86*6467f958SSadaf Ebrahimi 
87*6467f958SSadaf Ebrahimi         for (int i=0; i<(int)num_of_devices; i++) {
88*6467f958SSadaf Ebrahimi             if (!is_extension_available(devices[i], "cl_khr_gl_sharing"))
89*6467f958SSadaf Ebrahimi             {
90*6467f958SSadaf Ebrahimi                 log_info("Device %d of %d does not support required extension "
91*6467f958SSadaf Ebrahimi                          "cl_khr_gl_sharing.\n",
92*6467f958SSadaf Ebrahimi                          i + 1, num_of_devices);
93*6467f958SSadaf Ebrahimi             }
94*6467f958SSadaf Ebrahimi             else
95*6467f958SSadaf Ebrahimi             {
96*6467f958SSadaf Ebrahimi                 log_info("Device %d of %d supports required extension "
97*6467f958SSadaf Ebrahimi                          "cl_khr_gl_sharing.\n",
98*6467f958SSadaf Ebrahimi                          i + 1, num_of_devices);
99*6467f958SSadaf Ebrahimi                 found_valid_device = 1;
100*6467f958SSadaf Ebrahimi                 m_devices[m_device_count++] = devices[i];
101*6467f958SSadaf Ebrahimi             }
102*6467f958SSadaf Ebrahimi         }
103*6467f958SSadaf Ebrahimi         return found_valid_device;
104*6467f958SSadaf Ebrahimi     }
105*6467f958SSadaf Ebrahimi 
~X11GLEnvironment()106*6467f958SSadaf Ebrahimi     virtual ~X11GLEnvironment()
107*6467f958SSadaf Ebrahimi     {
108*6467f958SSadaf Ebrahimi     }
109*6467f958SSadaf Ebrahimi };
110*6467f958SSadaf Ebrahimi 
Instance(void)111*6467f958SSadaf Ebrahimi GLEnvironment * GLEnvironment::Instance( void )
112*6467f958SSadaf Ebrahimi {
113*6467f958SSadaf Ebrahimi     static X11GLEnvironment * env = NULL;
114*6467f958SSadaf Ebrahimi     if( env == NULL )
115*6467f958SSadaf Ebrahimi         env = new X11GLEnvironment();
116*6467f958SSadaf Ebrahimi     return env;
117*6467f958SSadaf Ebrahimi }
118