xref: /aosp_15_r20/external/OpenCL-CTS/test_common/gl/setup_osx.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 #include "setup.h"
17*6467f958SSadaf Ebrahimi #include "harness/errorHelpers.h"
18*6467f958SSadaf Ebrahimi #include <OpenGL/CGLDevice.h>
19*6467f958SSadaf Ebrahimi 
20*6467f958SSadaf Ebrahimi class OSXGLEnvironment : public GLEnvironment
21*6467f958SSadaf Ebrahimi {
22*6467f958SSadaf Ebrahimi     public:
OSXGLEnvironment()23*6467f958SSadaf Ebrahimi         OSXGLEnvironment()
24*6467f958SSadaf Ebrahimi         {
25*6467f958SSadaf Ebrahimi       mCGLContext = NULL;
26*6467f958SSadaf Ebrahimi         }
27*6467f958SSadaf Ebrahimi 
Init(int * argc,char ** argv,int use_opengl_32)28*6467f958SSadaf Ebrahimi   virtual int Init( int *argc, char **argv, int use_opengl_32 )
29*6467f958SSadaf Ebrahimi         {
30*6467f958SSadaf Ebrahimi       if (!use_opengl_32) {
31*6467f958SSadaf Ebrahimi 
32*6467f958SSadaf Ebrahimi         // Create a GLUT window to render into
33*6467f958SSadaf Ebrahimi         glutInit( argc, argv );
34*6467f958SSadaf Ebrahimi         glutInitWindowSize( 512, 512 );
35*6467f958SSadaf Ebrahimi         glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
36*6467f958SSadaf Ebrahimi         glutCreateWindow( "OpenCL <-> OpenGL Test" );
37*6467f958SSadaf Ebrahimi       }
38*6467f958SSadaf Ebrahimi 
39*6467f958SSadaf Ebrahimi       else {
40*6467f958SSadaf Ebrahimi 
41*6467f958SSadaf Ebrahimi         CGLPixelFormatAttribute attribs[] = {
42*6467f958SSadaf Ebrahimi           kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core,
43*6467f958SSadaf Ebrahimi           kCGLPFAAllowOfflineRenderers,
44*6467f958SSadaf Ebrahimi           kCGLPFANoRecovery,
45*6467f958SSadaf Ebrahimi           kCGLPFAAccelerated,
46*6467f958SSadaf Ebrahimi           kCGLPFADoubleBuffer,
47*6467f958SSadaf Ebrahimi           (CGLPixelFormatAttribute)0
48*6467f958SSadaf Ebrahimi         };
49*6467f958SSadaf Ebrahimi 
50*6467f958SSadaf Ebrahimi         CGLError err;
51*6467f958SSadaf Ebrahimi         CGLPixelFormatObj pix;
52*6467f958SSadaf Ebrahimi         GLint npix;
53*6467f958SSadaf Ebrahimi         err = CGLChoosePixelFormat (attribs, &pix, &npix);
54*6467f958SSadaf Ebrahimi         if(err != kCGLNoError)
55*6467f958SSadaf Ebrahimi           {
56*6467f958SSadaf Ebrahimi             log_error("Failed to choose pixel format\n");
57*6467f958SSadaf Ebrahimi             return -1;
58*6467f958SSadaf Ebrahimi           }
59*6467f958SSadaf Ebrahimi         err = CGLCreateContext(pix, NULL, &mCGLContext);
60*6467f958SSadaf Ebrahimi         if(err != kCGLNoError)
61*6467f958SSadaf Ebrahimi           {
62*6467f958SSadaf Ebrahimi             log_error("Failed to create GL context\n");
63*6467f958SSadaf Ebrahimi             return -1;
64*6467f958SSadaf Ebrahimi           }
65*6467f958SSadaf Ebrahimi         CGLSetCurrentContext(mCGLContext);
66*6467f958SSadaf Ebrahimi       }
67*6467f958SSadaf Ebrahimi 
68*6467f958SSadaf Ebrahimi             return 0;
69*6467f958SSadaf Ebrahimi         }
70*6467f958SSadaf Ebrahimi 
CreateCLContext(void)71*6467f958SSadaf Ebrahimi         virtual cl_context CreateCLContext( void )
72*6467f958SSadaf Ebrahimi     {
73*6467f958SSadaf Ebrahimi       int error;
74*6467f958SSadaf Ebrahimi 
75*6467f958SSadaf Ebrahimi       if( mCGLContext == NULL )
76*6467f958SSadaf Ebrahimi         mCGLContext = CGLGetCurrentContext();
77*6467f958SSadaf Ebrahimi 
78*6467f958SSadaf Ebrahimi       CGLShareGroupObj share_group = CGLGetShareGroup(mCGLContext);
79*6467f958SSadaf Ebrahimi       cl_context_properties properties[] = { CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE, (cl_context_properties)share_group, 0 };
80*6467f958SSadaf Ebrahimi       cl_context context = clCreateContext(properties, 0, 0, 0, 0, &error);
81*6467f958SSadaf Ebrahimi       if (error) {
82*6467f958SSadaf Ebrahimi         print_error(error, "clCreateContext failed");
83*6467f958SSadaf Ebrahimi         return NULL;
84*6467f958SSadaf Ebrahimi       }
85*6467f958SSadaf Ebrahimi 
86*6467f958SSadaf Ebrahimi       // Verify that all devices in the context support the required extension
87*6467f958SSadaf Ebrahimi       cl_device_id devices[64];
88*6467f958SSadaf Ebrahimi       size_t size_out;
89*6467f958SSadaf Ebrahimi       error = clGetContextInfo(context, CL_CONTEXT_DEVICES, sizeof(devices), devices, &size_out);
90*6467f958SSadaf Ebrahimi       if (error) {
91*6467f958SSadaf Ebrahimi         print_error(error, "clGetContextInfo failed");
92*6467f958SSadaf Ebrahimi         return NULL;
93*6467f958SSadaf Ebrahimi       }
94*6467f958SSadaf Ebrahimi 
95*6467f958SSadaf Ebrahimi       for (int i=0; i<(int)(size_out/sizeof(cl_device_id)); i++) {
96*6467f958SSadaf Ebrahimi         if (!is_extension_available(devices[i], "cl_APPLE_gl_sharing")) {
97*6467f958SSadaf Ebrahimi           log_error("Device %d does not support required extension cl_APPLE_gl_sharing.\n", i);
98*6467f958SSadaf Ebrahimi           return NULL;
99*6467f958SSadaf Ebrahimi         }
100*6467f958SSadaf Ebrahimi       }
101*6467f958SSadaf Ebrahimi       return context;
102*6467f958SSadaf Ebrahimi     }
103*6467f958SSadaf Ebrahimi 
SupportsCLGLInterop(cl_device_type device_type)104*6467f958SSadaf Ebrahimi     virtual int SupportsCLGLInterop( cl_device_type device_type )
105*6467f958SSadaf Ebrahimi     {
106*6467f958SSadaf Ebrahimi       int found_valid_device = 0;
107*6467f958SSadaf Ebrahimi       cl_device_id devices[64];
108*6467f958SSadaf Ebrahimi       cl_uint num_of_devices;
109*6467f958SSadaf Ebrahimi       int error;
110*6467f958SSadaf Ebrahimi       error = clGetDeviceIDs(NULL, device_type, 64, devices, &num_of_devices);
111*6467f958SSadaf Ebrahimi       if (error) {
112*6467f958SSadaf Ebrahimi         print_error(error, "clGetDeviceIDs failed");
113*6467f958SSadaf Ebrahimi         return -1;
114*6467f958SSadaf Ebrahimi       }
115*6467f958SSadaf Ebrahimi 
116*6467f958SSadaf Ebrahimi       for (int i=0; i<(int)num_of_devices; i++) {
117*6467f958SSadaf Ebrahimi         if (!is_extension_available(devices[i], "cl_APPLE_gl_sharing")) {
118*6467f958SSadaf Ebrahimi           log_info("Device %d of %d does not support required extension cl_APPLE_gl_sharing.\n", i, num_of_devices);
119*6467f958SSadaf Ebrahimi         } else {
120*6467f958SSadaf Ebrahimi           log_info("Device %d of %d does support required extension cl_APPLE_gl_sharing.\n", i, num_of_devices);
121*6467f958SSadaf Ebrahimi           found_valid_device = 1;
122*6467f958SSadaf Ebrahimi         }
123*6467f958SSadaf Ebrahimi       }
124*6467f958SSadaf Ebrahimi             return found_valid_device;
125*6467f958SSadaf Ebrahimi     }
126*6467f958SSadaf Ebrahimi 
~OSXGLEnvironment()127*6467f958SSadaf Ebrahimi         virtual ~OSXGLEnvironment()
128*6467f958SSadaf Ebrahimi         {
129*6467f958SSadaf Ebrahimi             CGLDestroyContext( mCGLContext );
130*6467f958SSadaf Ebrahimi         }
131*6467f958SSadaf Ebrahimi 
132*6467f958SSadaf Ebrahimi         CGLContextObj mCGLContext;
133*6467f958SSadaf Ebrahimi 
134*6467f958SSadaf Ebrahimi };
135*6467f958SSadaf Ebrahimi 
Instance(void)136*6467f958SSadaf Ebrahimi GLEnvironment * GLEnvironment::Instance( void )
137*6467f958SSadaf Ebrahimi {
138*6467f958SSadaf Ebrahimi     static OSXGLEnvironment * env = NULL;
139*6467f958SSadaf Ebrahimi     if( env == NULL )
140*6467f958SSadaf Ebrahimi         env = new OSXGLEnvironment();
141*6467f958SSadaf Ebrahimi     return env;
142*6467f958SSadaf Ebrahimi }
143