blob: 052b5897a32c7af1be1862eb35812e434e05dd48 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#ifdef HAS_EGL
#include "EGL/egl.h"
#include "EGL/eglext.h"
#endif
#include "cl_platform_id.h"
#include "cl_internals.h"
#include "CL/cl.h"
#include "cl_utils.h"
#include <stdlib.h>
#include <string.h>
static struct cl_extensions intel_extensions =
{
{
#define DECL_EXT(name) \
{(struct cl_extension_base){.ext_id = cl_##name##_ext_id, .ext_name = "cl_" #name, .ext_enabled = 0}},
DECL_ALL_EXTENSIONS
},
#undef DECL_EXT
{""}
};
void check_basic_extension(cl_extensions_t *extensions)
{
int id;
for(id = BASE_EXT_START_ID; id <= BASE_EXT_END_ID; id++)
//It seems we only support this mandatory extension.
if (id == EXT_ID(khr_byte_addressable_store))
extensions->extensions[id].base.ext_enabled = 1;
}
void check_opt1_extension(cl_extensions_t *extensions)
{
int id;
for(id = OPT1_EXT_START_ID; id <= OPT1_EXT_END_ID; id++)
if (id == EXT_ID(khr_icd))
extensions->extensions[id].base.ext_enabled = 1;
}
void
check_gl_extension(cl_extensions_t *extensions) {
#ifdef HAS_EGL
static struct cl_gl_ext_deps egl_funcs;
int id;
#if defined(EGL_KHR_image) && defined(EGL_KHR_gl_texture_2D_image) && defined(HAS_GBM)
egl_funcs.eglCreateImageKHR_func = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR");
egl_funcs.eglDestroyImageKHR_func = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR");
#else
egl_funcs.eglCreateImageKHR_func = NULL;
egl_funcs.eglDestroyImageKHR_func = NULL;
#endif
if (egl_funcs.eglCreateImageKHR_func != NULL
&& egl_funcs.eglDestroyImageKHR_func != NULL) {
/* For now, we only support cl_khr_gl_sharing. */
for(id = GL_EXT_START_ID; id <= GL_EXT_END_ID; id++)
if (id == EXT_ID(khr_gl_sharing)) {
extensions->extensions[id].base.ext_enabled = 1;
extensions->extensions[id].EXT_STRUCT_NAME(khr_gl_sharing).gl_ext_deps = &egl_funcs;
}
}
#endif
}
void
check_intel_extension(cl_extensions_t *extensions)
{
/* Should put those map/unmap extensions here. */
}
void
process_extension_str(cl_extensions_t *extensions)
{
int str_max = sizeof(extensions->ext_str);
int str_offset = 0;
int id;
extensions->ext_str[str_max] = '\0';
for(id = 0; id < cl_khr_extension_id_max; id++)
{
if (extensions->extensions[id].base.ext_enabled) {
int copy_len;
char *ext_name = extensions->extensions[id].base.ext_name;
if (str_offset + 1 >= str_max)
return;
if (str_offset != 0)
extensions->ext_str[str_offset - 1] = ' ';
copy_len = (strlen(ext_name) + 1 + str_offset) < str_max
? (strlen(ext_name) + 1) : (str_max - str_offset - 1);
strncpy(&extensions->ext_str[str_offset],
extensions->extensions[id].base.ext_name, copy_len);
str_offset += copy_len;
}
}
}
LOCAL void
cl_intel_platform_extension_init(cl_platform_id intel_platform)
{
static int initialized = 0;
if (initialized) {
intel_platform->internal_extensions = &intel_extensions;
intel_platform->extensions = intel_extensions.ext_str;
return;
}
check_basic_extension(&intel_extensions);
check_opt1_extension(&intel_extensions);
check_gl_extension(&intel_extensions);
check_intel_extension(&intel_extensions);
process_extension_str(&intel_extensions);
intel_platform->internal_extensions = &intel_extensions;
intel_platform->extensions = intel_extensions.ext_str;
initialized = 1;
return;
}
|