diff --git a/test_conformance/api/CMakeLists.txt b/test_conformance/api/CMakeLists.txt index 96d12f435d..9cba42e26d 100644 --- a/test_conformance/api/CMakeLists.txt +++ b/test_conformance/api/CMakeLists.txt @@ -37,6 +37,7 @@ set(${MODULE_NAME}_SOURCES test_queue_properties_queries.cpp test_pipe_properties_queries.cpp test_wg_suggested_local_work_size.cpp + test_device_command_queue.cpp ) include(../CMakeCommon.txt) diff --git a/test_conformance/api/main.cpp b/test_conformance/api/main.cpp index cdbf1f799a..2c2e4f32b3 100644 --- a/test_conformance/api/main.cpp +++ b/test_conformance/api/main.cpp @@ -157,6 +157,8 @@ test_definition test_list[] = { ADD_TEST_VERSION(negative_create_command_queue_with_properties, Version(2, 0)), ADD_TEST(negative_create_command_queue_with_properties_khr), + + ADD_TEST_VERSION(set_default_device_command_queue, Version(2, 1)), }; const int test_num = ARRAY_SIZE(test_list); diff --git a/test_conformance/api/procs.h b/test_conformance/api/procs.h index 22426be1b8..2e4abb7c2e 100644 --- a/test_conformance/api/procs.h +++ b/test_conformance/api/procs.h @@ -228,3 +228,8 @@ extern int test_negative_create_command_queue_with_properties( extern int test_negative_create_command_queue_with_properties_khr( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements); + +extern int test_set_default_device_command_queue(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, + int num_elements); diff --git a/test_conformance/api/test_device_command_queue.cpp b/test_conformance/api/test_device_command_queue.cpp new file mode 100644 index 0000000000..04c991e563 --- /dev/null +++ b/test_conformance/api/test_device_command_queue.cpp @@ -0,0 +1,88 @@ +// +// Copyright (c) 2021 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. +// +#include "testBase.h" +#include + +using namespace std; + + +int test_command_queue_helper(cl_context context, cl_device_id deviceID, + cl_command_queue queue) +{ + cl_int error; + cl_command_queue check_queue; + + error = clSetDefaultDeviceCommandQueue(context, deviceID, queue); + test_error(error, "clSetDefaultDeviceCommandQueue failed "); + + error = clGetCommandQueueInfo(queue, CL_QUEUE_DEVICE_DEFAULT, + sizeof(check_queue), &check_queue, nullptr); + test_error(error, + "clGetCommandQueueInfo failed for CL_QUEUE_DEVICE_DEFAULT"); + test_assert_error( + (check_queue == queue), + "Expected the queue to be returned as default device queue failed"); + + return TEST_PASS; +} + +int test_set_default_device_command_queue(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, + int num_elements) +{ + cl_int error; + constexpr cl_command_queue_properties PROPERTIES = CL_QUEUE_ON_DEVICE + | CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL_QUEUE_PROFILING_ENABLE; + std::array properties = { + CL_QUEUE_PROPERTIES, (PROPERTIES | CL_QUEUE_ON_DEVICE_DEFAULT), 0 + }; + + if (get_device_cl_version(deviceID) >= Version(3, 0)) + { + cl_device_device_enqueue_capabilities dseCaps = 0; + error = clGetDeviceInfo(deviceID, CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES, + sizeof(dseCaps), &dseCaps, NULL); + test_error(error, + "Unable to query CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES"); + + if (0 == (dseCaps & CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT)) + return TEST_SKIP; + } + + clCommandQueueWrapper cmd_queue_1 = clCreateCommandQueueWithProperties( + context, deviceID, properties.data(), &error); + test_error(error, "clCreateCommandQueueWithProperties failed"); + + properties[1] = PROPERTIES; + clCommandQueueWrapper cmd_queue_2 = clCreateCommandQueueWithProperties( + context, deviceID, properties.data(), &error); + test_error(error, "clCreateCommandQueueWithProperties failed"); + + // cmd_queue_1 + if (test_command_queue_helper(context, deviceID, cmd_queue_1) != 0) + { + test_fail("test_command_queue_helper failed for cmd_queue_1.\n"); + } + + // cmd_queue_2 - without CL_QUEUE_ON_DEVICE_DEFAULT + if (test_command_queue_helper(context, deviceID, cmd_queue_2) != 0) + { + test_fail("test_command_queue_helper failed for cmd_queue_2.\n"); + } + + return TEST_PASS; +}