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