mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 14:09:03 +00:00
The maintenance of the conformance tests is moving to Github. This commit contains all the changes that have been done in Gitlab since the first public release of the conformance tests. Signed-off-by: Kevin Petit <kevin.petit@arm.com>
123 lines
3.7 KiB
C++
123 lines
3.7 KiB
C++
//
|
|
// Copyright (c) 2017 The Khronos Group Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
#define GL_GLEXT_PROTOTYPES
|
|
|
|
#include "setup.h"
|
|
#include "testBase.h"
|
|
#include "../../test_common/harness/errorHelpers.h"
|
|
|
|
#include <GL/gl.h>
|
|
#include <GL/glut.h>
|
|
#include <GL/glext.h>
|
|
#include <GL/freeglut.h>
|
|
#include <GL/glx.h>
|
|
#include <CL/cl_ext.h>
|
|
|
|
class X11GLEnvironment : public GLEnvironment
|
|
{
|
|
private:
|
|
cl_device_id m_devices[64];
|
|
cl_uint m_device_count;
|
|
|
|
public:
|
|
X11GLEnvironment()
|
|
{
|
|
m_device_count = 0;
|
|
}
|
|
virtual int Init( int *argc, char **argv, int use_opencl_32 )
|
|
{
|
|
// Create a GLUT window to render into
|
|
glutInit( argc, argv );
|
|
glutInitWindowSize( 512, 512 );
|
|
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
|
glutCreateWindow( "OpenCL <-> OpenGL Test" );
|
|
glewInit();
|
|
return 0;
|
|
}
|
|
|
|
virtual cl_context CreateCLContext( void )
|
|
{
|
|
GLXContext context = glXGetCurrentContext();
|
|
Display *dpy = glXGetCurrentDisplay();
|
|
|
|
cl_context_properties properties[] = {
|
|
CL_GL_CONTEXT_KHR, (cl_context_properties) context,
|
|
CL_GLX_DISPLAY_KHR, (cl_context_properties) dpy,
|
|
0
|
|
};
|
|
cl_int status;
|
|
|
|
if (!context || !dpy) {
|
|
print_error(CL_INVALID_CONTEXT, "No GL context bound");
|
|
return 0;
|
|
}
|
|
|
|
return clCreateContext(properties, 1, m_devices, NULL, NULL, &status);
|
|
}
|
|
|
|
virtual int SupportsCLGLInterop( cl_device_type device_type )
|
|
{
|
|
int found_valid_device = 0;
|
|
cl_platform_id platform;
|
|
cl_device_id devices[64];
|
|
cl_uint num_of_devices;
|
|
int error;
|
|
error = clGetPlatformIDs(1, &platform, NULL);
|
|
if (error) {
|
|
print_error(error, "clGetPlatformIDs failed");
|
|
return -1;
|
|
}
|
|
error = clGetDeviceIDs(platform, device_type, 64, devices, &num_of_devices);
|
|
// If this platform doesn't have any of the requested device_type (namely GPUs) then return 0
|
|
if (error == CL_DEVICE_NOT_FOUND)
|
|
return 0;
|
|
if (error) {
|
|
print_error(error, "clGetDeviceIDs failed");
|
|
return -1;
|
|
}
|
|
|
|
char extensions[8192];
|
|
for (int i=0; i<(int)num_of_devices; i++) {
|
|
error = clGetDeviceInfo(devices[i], CL_DEVICE_EXTENSIONS, sizeof(extensions), extensions, NULL);
|
|
if (error) {
|
|
print_error(error, "clGetDeviceInfo failed");
|
|
return -1;
|
|
}
|
|
|
|
if (strstr(extensions, "cl_khr_gl_sharing ") == NULL) {
|
|
log_info("Device %d of %d does not support required extension cl_khr_gl_sharing.\n", i+1, num_of_devices);
|
|
} else {
|
|
log_info("Device %d of %d supports required extension cl_khr_gl_sharing.\n", i+1, num_of_devices);
|
|
found_valid_device = 1;
|
|
m_devices[m_device_count++] = devices[i];
|
|
}
|
|
}
|
|
return found_valid_device;
|
|
}
|
|
|
|
virtual ~X11GLEnvironment()
|
|
{
|
|
}
|
|
};
|
|
|
|
GLEnvironment * GLEnvironment::Instance( void )
|
|
{
|
|
static X11GLEnvironment * env = NULL;
|
|
if( env == NULL )
|
|
env = new X11GLEnvironment();
|
|
return env;
|
|
}
|