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