From 8318a7847340736a505e2ba7a422fdb551f66c3e Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Mon, 10 Oct 2022 12:31:09 -0500 Subject: [PATCH 1/8] Implement clGetICDLoaderInfoOCLICD. --- CMakeLists.txt | 8 +++++++ loader/cl_icdl.h | 28 ++++++++++++++++++++++++ loader/icd_dispatch.c | 47 +++++++++++++++++++++++++++++++++++++++- loader/icd_version.h | 29 +++++++++++++++++++++++++ loader/windows/OpenCL.rc | 12 +--------- 5 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 loader/cl_icdl.h create mode 100644 loader/icd_version.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0266ad65..08f7ba6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,8 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/loader/icd_cmake_config.h.in set (OPENCL_ICD_LOADER_SOURCES loader/icd.c loader/icd.h + loader/icd_version.h + loader/cl_icdl.h loader/icd_dispatch.c loader/icd_dispatch.h loader/icd_dispatch_generated.c @@ -148,6 +150,12 @@ endif () target_compile_definitions (OpenCL PRIVATE CL_TARGET_OPENCL_VERSION=300 + CL_ICDL_OCL_VERSION_STRING="OpenCL 3.0" + OPENCL_ICD_LOADER_VERSION_MAJOR=3 + OPENCL_ICD_LOADER_VERSION_MINOR=0 + OPENCL_ICD_LOADER_VERSION_REV=4 + CL_ICDL_NAME_STRING="OpenCL ICD Loader" + CL_ICDL_VENDOR_STRING="Khronos Group" $<$:CL_ENABLE_LAYERS> ) diff --git a/loader/cl_icdl.h b/loader/cl_icdl.h new file mode 100644 index 00000000..a22fe2e1 --- /dev/null +++ b/loader/cl_icdl.h @@ -0,0 +1,28 @@ +#ifndef OPENCL_CL_ICDL_H +#define OPENCL_CL_ICDL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum _cl_icdl_info{ + CL_ICDL_OCL_VERSION = 1, + CL_ICDL_VERSION = 2, + CL_ICDL_NAME = 3, + CL_ICDL_VENDOR = 4, +} cl_icdl_info; + +typedef cl_int +(CL_API_CALL * pfn_clGetICDLoaderInfoOCLICD)(cl_icdl_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret); + +#ifdef __cplusplus +} +#endif + + +#endif /* OPENCL_CL_ICDL_H */ diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c index 58ce0459..c4e49da3 100644 --- a/loader/icd_dispatch.c +++ b/loader/icd_dispatch.c @@ -18,10 +18,52 @@ #include "icd.h" #include "icd_dispatch.h" - +#include "cl_icdl.h" +#include "icd_version.h" #include #include +static cl_int +clGetICDLoaderInfoOCLICD( + cl_icdl_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) +{ + static const char cl_icdl_OCL_VERSION[] = CL_ICDL_OCL_VERSION_STRING; + static const char cl_icdl_VERSION[] = OPENCL_ICD_LOADER_VERSION_STRING; + static const char cl_icdl_NAME[] = CL_ICDL_NAME_STRING; + static const char cl_icdl_VENDOR[] = CL_ICDL_VENDOR_STRING; + size_t pvs; + void * pv; + +#define KHR_ICD_CASE_PARAM_NAME(name) \ + case CL_ICDL_ ## name: \ + pvs = sizeof(cl_icdl_ ## name); \ + pv = (void *)cl_icdl_ ## name; \ + break + + switch (param_name) { + KHR_ICD_CASE_PARAM_NAME(OCL_VERSION); + KHR_ICD_CASE_PARAM_NAME(VERSION); + KHR_ICD_CASE_PARAM_NAME(NAME); + KHR_ICD_CASE_PARAM_NAME(VENDOR); + default: + return CL_INVALID_VALUE; + } + +#undef KHR_ICD_CASE_PARAM_NAME + + if (param_value) { + if (param_value_size < pvs) + return CL_INVALID_VALUE; + memcpy(param_value, pv, pvs); + } + if (param_value_size_ret != NULL) + *param_value_size_ret = pvs; + return CL_SUCCESS; +} + static void* khrIcdGetExtensionFunctionAddress(const char* function_name) { // Most extensions, including multi-vendor KHR and EXT extensions, @@ -93,6 +135,9 @@ static void* khrIcdGetExtensionFunctionAddress(const char* function_name) // cl_khr_sub_groups KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetKernelSubGroupInfoKHR); + // cl_icdl + KHR_ICD_CHECK_EXTENSION_FUNCTION(clGetICDLoaderInfoOCLICD); + #undef KHR_ICD_CHECK_EXTENSION_FUNCTION return NULL; diff --git a/loader/icd_version.h b/loader/icd_version.h new file mode 100644 index 00000000..fccc999c --- /dev/null +++ b/loader/icd_version.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016-2020 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. + * + * OpenCL is a trademark of Apple Inc. used under license by Khronos. + */ + +#ifndef _ICD_VERSION_H_ +#define _ICD_VERSION_H_ + +#define OPENCL_ICD_LOADER_VAL(_v) #_v +#define OPENCL_ICD_LOADER_TOSTRING(_d) OPENCL_ICD_LOADER_VAL(_d) +#define OPENCL_ICD_LOADER_VERSION_STRING \ + OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_MAJOR) "." \ + OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_MINOR) "." \ + OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_REV) + +#endif diff --git a/loader/windows/OpenCL.rc b/loader/windows/OpenCL.rc index cbf0036d..9a7ef2b4 100644 --- a/loader/windows/OpenCL.rc +++ b/loader/windows/OpenCL.rc @@ -17,20 +17,10 @@ */ #include - -#define OPENCL_ICD_LOADER_VERSION_MAJOR 3 -#define OPENCL_ICD_LOADER_VERSION_MINOR 0 -#define OPENCL_ICD_LOADER_VERSION_REV 4 +#include #ifdef RC_INVOKED -#define OPENCL_ICD_LOADER_VAL(_v) #_v -#define OPENCL_ICD_LOADER_TOSTRING(_d) OPENCL_ICD_LOADER_VAL(_d) -#define OPENCL_ICD_LOADER_VERSION_STRING \ - OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_MAJOR) "." \ - OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_MINOR) "." \ - OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_REV) - VS_VERSION_INFO VERSIONINFO FILEVERSION OPENCL_ICD_LOADER_VERSION_MAJOR,OPENCL_ICD_LOADER_VERSION_MINOR,OPENCL_ICD_LOADER_VERSION_REV,0 PRODUCTVERSION OPENCL_ICD_LOADER_VERSION_MAJOR,OPENCL_ICD_LOADER_VERSION_MINOR,OPENCL_ICD_LOADER_VERSION_REV,0 From d8ea0944dd78b42f945495d2cd64a0cfb0a3b658 Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Mon, 10 Oct 2022 14:16:15 -0500 Subject: [PATCH 2/8] Synchronize `clGetICDLoaderInfoOCLICD` and `OpenCL.rc`. --- CMakeLists.txt | 2 +- loader/windows/OpenCL.rc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08f7ba6e..1a74131e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,7 +154,7 @@ target_compile_definitions (OpenCL OPENCL_ICD_LOADER_VERSION_MAJOR=3 OPENCL_ICD_LOADER_VERSION_MINOR=0 OPENCL_ICD_LOADER_VERSION_REV=4 - CL_ICDL_NAME_STRING="OpenCL ICD Loader" + CL_ICDL_NAME_STRING="Khronos OpenCL ICD Loader" CL_ICDL_VENDOR_STRING="Khronos Group" $<$:CL_ENABLE_LAYERS> ) diff --git a/loader/windows/OpenCL.rc b/loader/windows/OpenCL.rc index 9a7ef2b4..0e4c6a40 100644 --- a/loader/windows/OpenCL.rc +++ b/loader/windows/OpenCL.rc @@ -32,10 +32,10 @@ BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription" ,"OpenCL Client DLL" - VALUE "ProductName" ,"Khronos OpenCL ICD Loader" + VALUE "ProductName" ,CL_ICDL_NAME_STRING VALUE "LegalCopyright" ,"Copyright \251 The Khronos Group Inc 2016-2020" VALUE "FileVersion" ,OPENCL_ICD_LOADER_VERSION_STRING ".0" - VALUE "CompanyName" ,"Khronos Group" + VALUE "CompanyName" ,CL_ICDL_VENDOR_STRING VALUE "InternalName" ,"OpenCL" VALUE "OriginalFilename","OpenCL.dll" END From b85a4cb44a3f0bfef17565c1325682d66f792ef6 Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Tue, 8 Nov 2022 11:11:23 -0600 Subject: [PATCH 3/8] Change CMake variables prefix to match commonly used prefix. --- CMakeLists.txt | 6 +++--- loader/icd_dispatch.c | 12 ++++++------ loader/windows/OpenCL.rc | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a74131e..271843bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,12 +150,12 @@ endif () target_compile_definitions (OpenCL PRIVATE CL_TARGET_OPENCL_VERSION=300 - CL_ICDL_OCL_VERSION_STRING="OpenCL 3.0" + OPENCL_ICD_LOADER_OCL_VERSION_STRING="OpenCL 3.0" OPENCL_ICD_LOADER_VERSION_MAJOR=3 OPENCL_ICD_LOADER_VERSION_MINOR=0 OPENCL_ICD_LOADER_VERSION_REV=4 - CL_ICDL_NAME_STRING="Khronos OpenCL ICD Loader" - CL_ICDL_VENDOR_STRING="Khronos Group" + OPENCL_ICD_LOADER_NAME_STRING="Khronos OpenCL ICD Loader" + OPENCL_ICD_LOADER_VENDOR_STRING="Khronos Group" $<$:CL_ENABLE_LAYERS> ) diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c index c4e49da3..0897c625 100644 --- a/loader/icd_dispatch.c +++ b/loader/icd_dispatch.c @@ -30,12 +30,12 @@ clGetICDLoaderInfoOCLICD( void * param_value, size_t * param_value_size_ret) { - static const char cl_icdl_OCL_VERSION[] = CL_ICDL_OCL_VERSION_STRING; - static const char cl_icdl_VERSION[] = OPENCL_ICD_LOADER_VERSION_STRING; - static const char cl_icdl_NAME[] = CL_ICDL_NAME_STRING; - static const char cl_icdl_VENDOR[] = CL_ICDL_VENDOR_STRING; - size_t pvs; - void * pv; + static const char cl_icdl_OCL_VERSION[] = OPENCL_ICD_LOADER_OCL_VERSION_STRING; + static const char cl_icdl_VERSION[] = OPENCL_ICD_LOADER_VERSION_STRING; + static const char cl_icdl_NAME[] = OPENCL_ICD_LOADER_NAME_STRING; + static const char cl_icdl_VENDOR[] = OPENCL_ICD_LOADER_VENDOR_STRING; + size_t pvs; + void * pv; #define KHR_ICD_CASE_PARAM_NAME(name) \ case CL_ICDL_ ## name: \ diff --git a/loader/windows/OpenCL.rc b/loader/windows/OpenCL.rc index 0e4c6a40..df342329 100644 --- a/loader/windows/OpenCL.rc +++ b/loader/windows/OpenCL.rc @@ -32,10 +32,10 @@ BEGIN BLOCK "040904E4" BEGIN VALUE "FileDescription" ,"OpenCL Client DLL" - VALUE "ProductName" ,CL_ICDL_NAME_STRING + VALUE "ProductName" ,OPENCL_ICD_LOADER_NAME_STRING VALUE "LegalCopyright" ,"Copyright \251 The Khronos Group Inc 2016-2020" VALUE "FileVersion" ,OPENCL_ICD_LOADER_VERSION_STRING ".0" - VALUE "CompanyName" ,CL_ICDL_VENDOR_STRING + VALUE "CompanyName" ,OPENCL_ICD_LOADER_VENDOR_STRING VALUE "InternalName" ,"OpenCL" VALUE "OriginalFilename","OpenCL.dll" END From e74b7516ad3a07f8e627db62a1bcb832058eff31 Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Tue, 8 Nov 2022 11:45:13 -0600 Subject: [PATCH 4/8] Generate OPENCL_ICD_LOADER_OCL_VERSION_STRING from CL_TARGET_OPENCL_VERSION. --- CMakeLists.txt | 1 - loader/icd_version.h | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 271843bd..b186b533 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,7 +150,6 @@ endif () target_compile_definitions (OpenCL PRIVATE CL_TARGET_OPENCL_VERSION=300 - OPENCL_ICD_LOADER_OCL_VERSION_STRING="OpenCL 3.0" OPENCL_ICD_LOADER_VERSION_MAJOR=3 OPENCL_ICD_LOADER_VERSION_MINOR=0 OPENCL_ICD_LOADER_VERSION_REV=4 diff --git a/loader/icd_version.h b/loader/icd_version.h index fccc999c..f34a979a 100644 --- a/loader/icd_version.h +++ b/loader/icd_version.h @@ -26,4 +26,29 @@ OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_MINOR) "." \ OPENCL_ICD_LOADER_TOSTRING(OPENCL_ICD_LOADER_VERSION_REV) +#if CL_TARGET_OPENCL_VERSION == 100 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "1.0" +#endif +#if CL_TARGET_OPENCL_VERSION == 110 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "1.1" +#endif +#if CL_TARGET_OPENCL_VERSION == 120 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "1.2" +#endif +#if CL_TARGET_OPENCL_VERSION == 200 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "2.0" +#endif +#if CL_TARGET_OPENCL_VERSION == 210 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "2.1" +#endif +#if CL_TARGET_OPENCL_VERSION == 220 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "2.2" +#endif +#if CL_TARGET_OPENCL_VERSION == 300 +#define OPENCL_ICD_LOADER_OCL_VERSION_NUMBER "3.0" +#endif + +#define OPENCL_ICD_LOADER_OCL_VERSION_STRING \ + "OpenCL " OPENCL_ICD_LOADER_OCL_VERSION_NUMBER + #endif From 7dcd050eaf0222386954532127dd5893891e3af5 Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Thu, 10 Nov 2022 10:42:19 -0600 Subject: [PATCH 5/8] Renamed cl_icdl.h to cl_icdl_private.h. Change enum to typedef + defines. --- CMakeLists.txt | 2 +- loader/cl_icdl.h | 28 ------------------------ loader/cl_icdl_private.h | 46 ++++++++++++++++++++++++++++++++++++++++ loader/icd_dispatch.c | 2 +- 4 files changed, 48 insertions(+), 30 deletions(-) delete mode 100644 loader/cl_icdl.h create mode 100644 loader/cl_icdl_private.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b186b533..e9a40d0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,7 @@ set (OPENCL_ICD_LOADER_SOURCES loader/icd.c loader/icd.h loader/icd_version.h - loader/cl_icdl.h + loader/cl_icdl_private.h loader/icd_dispatch.c loader/icd_dispatch.h loader/icd_dispatch_generated.c diff --git a/loader/cl_icdl.h b/loader/cl_icdl.h deleted file mode 100644 index a22fe2e1..00000000 --- a/loader/cl_icdl.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef OPENCL_CL_ICDL_H -#define OPENCL_CL_ICDL_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum _cl_icdl_info{ - CL_ICDL_OCL_VERSION = 1, - CL_ICDL_VERSION = 2, - CL_ICDL_NAME = 3, - CL_ICDL_VENDOR = 4, -} cl_icdl_info; - -typedef cl_int -(CL_API_CALL * pfn_clGetICDLoaderInfoOCLICD)(cl_icdl_info param_name, - size_t param_value_size, - void * param_value, - size_t * param_value_size_ret); - -#ifdef __cplusplus -} -#endif - - -#endif /* OPENCL_CL_ICDL_H */ diff --git a/loader/cl_icdl_private.h b/loader/cl_icdl_private.h new file mode 100644 index 00000000..c6dde0d9 --- /dev/null +++ b/loader/cl_icdl_private.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016-2020 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. + * + * OpenCL is a trademark of Apple Inc. used under license by Khronos. + */ + +#ifndef OPENCL_CL_ICDL_H +#define OPENCL_CL_ICDL_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef cl_uint cl_icdl_info; + +#define CL_ICDL_OCL_VERSION 1 +#define CL_ICDL_VERSION 2 +#define CL_ICDL_NAME 3 +#define CL_ICDL_VENDOR 4 + +typedef cl_int +(CL_API_CALL * pfn_clGetICDLoaderInfoOCLICD)(cl_icdl_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret); + +#ifdef __cplusplus +} +#endif + + +#endif /* OPENCL_CL_ICDL_H */ diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c index 0897c625..8f3cca6f 100644 --- a/loader/icd_dispatch.c +++ b/loader/icd_dispatch.c @@ -18,7 +18,7 @@ #include "icd.h" #include "icd_dispatch.h" -#include "cl_icdl.h" +#include "cl_icdl_private.h" #include "icd_version.h" #include #include From 6f4bf352a244d39d45b56ad141e09d3412618d65 Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Thu, 10 Nov 2022 11:35:38 -0600 Subject: [PATCH 6/8] Use macro dedicated for string parameter values. --- loader/icd_dispatch.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c index 8f3cca6f..137c66fb 100644 --- a/loader/icd_dispatch.c +++ b/loader/icd_dispatch.c @@ -37,17 +37,17 @@ clGetICDLoaderInfoOCLICD( size_t pvs; void * pv; -#define KHR_ICD_CASE_PARAM_NAME(name) \ +#define KHR_ICD_CASE_STRING_PARAM_NAME(name) \ case CL_ICDL_ ## name: \ - pvs = sizeof(cl_icdl_ ## name); \ + pvs = strlen(cl_icdl_ ## name) + 1; \ pv = (void *)cl_icdl_ ## name; \ break switch (param_name) { - KHR_ICD_CASE_PARAM_NAME(OCL_VERSION); - KHR_ICD_CASE_PARAM_NAME(VERSION); - KHR_ICD_CASE_PARAM_NAME(NAME); - KHR_ICD_CASE_PARAM_NAME(VENDOR); + KHR_ICD_CASE_STRING_PARAM_NAME(OCL_VERSION); + KHR_ICD_CASE_STRING_PARAM_NAME(VERSION); + KHR_ICD_CASE_STRING_PARAM_NAME(NAME); + KHR_ICD_CASE_STRING_PARAM_NAME(VENDOR); default: return CL_INVALID_VALUE; } From da780ce0ab1d35a55d70eeb223513522f886c69c Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Fri, 18 Nov 2022 13:31:41 -0600 Subject: [PATCH 7/8] Formating. --- loader/icd_dispatch.c | 1 + 1 file changed, 1 insertion(+) diff --git a/loader/icd_dispatch.c b/loader/icd_dispatch.c index 137c66fb..70a71cb7 100644 --- a/loader/icd_dispatch.c +++ b/loader/icd_dispatch.c @@ -20,6 +20,7 @@ #include "icd_dispatch.h" #include "cl_icdl_private.h" #include "icd_version.h" + #include #include From ee24548d7400c6f5757eabe9d5edb496669b6804 Mon Sep 17 00:00:00 2001 From: Brice Videau Date: Fri, 18 Nov 2022 13:32:05 -0600 Subject: [PATCH 8/8] Bumped loader version to 3.0.5. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e9a40d0f..3722f7ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,7 +152,7 @@ target_compile_definitions (OpenCL CL_TARGET_OPENCL_VERSION=300 OPENCL_ICD_LOADER_VERSION_MAJOR=3 OPENCL_ICD_LOADER_VERSION_MINOR=0 - OPENCL_ICD_LOADER_VERSION_REV=4 + OPENCL_ICD_LOADER_VERSION_REV=5 OPENCL_ICD_LOADER_NAME_STRING="Khronos OpenCL ICD Loader" OPENCL_ICD_LOADER_VENDOR_STRING="Khronos Group" $<$:CL_ENABLE_LAYERS>