mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
Add mutable dispatch tests. (#1651)
* Add mutable dispatch tests. Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Mutable dispatch buffer tests redesigned to inherit from command buffer tests. Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Add remaining tests for clGetMutableCommandInfoKHR. Added tests for missing queries: * CL_MUTABLE_DISPATCH_PROPERTIES_ARRAY_KHR * CL_MUTABLE_DISPATCH_KERNEL_KHR * CL_MUTABLE_DISPATCH_DIMENSIONS_KHR Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Minor code cleanup. Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Introduce review changes. Introduce changes requested in review: - Remove bitwise chceck for CL_DEVICE_MUTABLE_DISPATCH_CAPABILITIES_KHR - Add error check for clFinalizeCommandBufferKHR - Add global_work_size to clCommandNDRangeKernelKHR for CL_MUTABLE_COMMAND_COMMAND_BUFFER_KHR - Move BasicMutableCommandBufferTest to a separate header file - Change name of file command_buffer_test_mutable_dispatch.cpp to mutable_command_info.cpp Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Set global_work_size on every use of clCommandNDRangeKernelKHR. Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Apply changes for review. - Add error check for init_extension_functions() - Check mutable_capabilities for non-zero - Replace clKernelWrapper with cl_kernel for CL_MUTABLE_DISPATCH_KERNEL_KHR test - Replace clCommandBufferWrapper with cl_command_buffer_khr for CL_MUTABLE_COMMAND_COMMAND_BUFFER_KHR test - Remove unneded test_command_buffer declarations - Check type for CL_MUTABLE_COMMAND_COMMAND_TYPE_KHR - Remove retain() from operator= in clCommandBufferWrapper Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> * Apply changes for review. Apply changes for review: - Fix header guards - Add copyright header - Change checks for test_kernel, test_queue Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com> --------- Signed-off-by: Paweł Jastrzębski <p.k.jastrzebski@gmail.com>
This commit is contained in:
committed by
GitHub
parent
63b0f441f1
commit
3478f3d304
@@ -15,3 +15,5 @@ set(${MODULE_NAME}_SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
include(../../CMakeCommon.txt)
|
include(../../CMakeCommon.txt)
|
||||||
|
|
||||||
|
add_subdirectory( cl_khr_command_buffer_mutable_dispatch )
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
set(MODULE_NAME CL_KHR_MUTABLE_DISPATCH)
|
||||||
|
|
||||||
|
set(${MODULE_NAME}_SOURCES
|
||||||
|
main.cpp
|
||||||
|
mutable_command_info.cpp
|
||||||
|
../basic_command_buffer.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
include(../../../CMakeCommon.txt)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (c) 2022 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 "procs.h"
|
||||||
|
#include "harness/testHarness.h"
|
||||||
|
|
||||||
|
test_definition test_list[] = {
|
||||||
|
ADD_TEST(mutable_command_info_device_query),
|
||||||
|
ADD_TEST(mutable_command_info_buffer),
|
||||||
|
ADD_TEST(mutable_command_properties_array),
|
||||||
|
ADD_TEST(mutable_command_kernel),
|
||||||
|
ADD_TEST(mutable_command_dimensions),
|
||||||
|
ADD_TEST(mutable_command_info_type),
|
||||||
|
ADD_TEST(mutable_command_info_queue),
|
||||||
|
ADD_TEST(mutable_command_info_global_work_offset),
|
||||||
|
ADD_TEST(mutable_command_info_local_work_size),
|
||||||
|
ADD_TEST(mutable_command_info_global_work_size),
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
// A device may report the required properties of a queue that
|
||||||
|
// is compatible with command-buffers via the query
|
||||||
|
// CL_DEVICE_COMMAND_BUFFER_REQUIRED_QUEUE_PROPERTIES_KHR. We account
|
||||||
|
// for this in the tests themselves, rather than here, where we have a
|
||||||
|
// device to query.
|
||||||
|
const cl_command_queue_properties queue_properties = 0;
|
||||||
|
return runTestHarnessWithCheck(argc, argv, ARRAY_SIZE(test_list), test_list,
|
||||||
|
false, queue_properties, nullptr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2023 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.
|
||||||
|
|
||||||
|
#ifndef _CL_KHR_MUTABLE_COMMAND_BASIC_H
|
||||||
|
#define _CL_KHR_MUTABLE_COMMAND_BASIC_H
|
||||||
|
|
||||||
|
#include "../basic_command_buffer.h"
|
||||||
|
#include "../command_buffer_test_base.h"
|
||||||
|
|
||||||
|
struct BasicMutableCommandBufferTest : BasicCommandBufferTest
|
||||||
|
{
|
||||||
|
BasicMutableCommandBufferTest(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue)
|
||||||
|
: BasicCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual cl_int SetUp(int elements) override
|
||||||
|
{
|
||||||
|
BasicCommandBufferTest::SetUp(elements);
|
||||||
|
|
||||||
|
cl_int error = init_extension_functions();
|
||||||
|
test_error(error, "Unable to initialise extension functions");
|
||||||
|
|
||||||
|
const cl_command_buffer_properties_khr props[] = {
|
||||||
|
CL_COMMAND_BUFFER_FLAGS_KHR,
|
||||||
|
CL_COMMAND_BUFFER_MUTABLE_KHR,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
command_buffer = clCreateCommandBufferKHR(1, &queue, props, &error);
|
||||||
|
test_error(error, "Unable to create command buffer");
|
||||||
|
|
||||||
|
clProgramWrapper program = clCreateProgramWithSource(
|
||||||
|
context, 1, &kernelString, nullptr, &error);
|
||||||
|
test_error(error, "Unable to create program");
|
||||||
|
|
||||||
|
error = clBuildProgram(program, 1, &device, nullptr, nullptr, nullptr);
|
||||||
|
test_error(error, "Unable to build program");
|
||||||
|
|
||||||
|
kernel = clCreateKernel(program, "empty", &error);
|
||||||
|
test_error(error, "Unable to create kernel");
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Skip() override
|
||||||
|
{
|
||||||
|
bool extension_avaliable =
|
||||||
|
is_extension_available(device,
|
||||||
|
"cl_khr_command_buffer_mutable_dispatch")
|
||||||
|
== true;
|
||||||
|
|
||||||
|
cl_mutable_dispatch_fields_khr mutable_capabilities;
|
||||||
|
|
||||||
|
bool mutable_support =
|
||||||
|
!clGetDeviceInfo(
|
||||||
|
device, CL_DEVICE_MUTABLE_DISPATCH_CAPABILITIES_KHR,
|
||||||
|
sizeof(mutable_capabilities), &mutable_capabilities, nullptr)
|
||||||
|
&& mutable_capabilities != 0;
|
||||||
|
|
||||||
|
return !mutable_support || !extension_avaliable
|
||||||
|
|| BasicCommandBufferTest::Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_int init_extension_functions()
|
||||||
|
{
|
||||||
|
BasicCommandBufferTest::init_extension_functions();
|
||||||
|
|
||||||
|
cl_platform_id platform;
|
||||||
|
cl_int error =
|
||||||
|
clGetDeviceInfo(device, CL_DEVICE_PLATFORM, sizeof(cl_platform_id),
|
||||||
|
&platform, nullptr);
|
||||||
|
test_error(error, "clGetDeviceInfo for CL_DEVICE_PLATFORM failed");
|
||||||
|
|
||||||
|
// If it is supported get the addresses of all the APIs here.
|
||||||
|
#define GET_EXTENSION_ADDRESS(FUNC) \
|
||||||
|
FUNC = reinterpret_cast<FUNC##_fn>( \
|
||||||
|
clGetExtensionFunctionAddressForPlatform(platform, #FUNC)); \
|
||||||
|
if (FUNC == nullptr) \
|
||||||
|
{ \
|
||||||
|
log_error("ERROR: clGetExtensionFunctionAddressForPlatform failed" \
|
||||||
|
" with " #FUNC "\n"); \
|
||||||
|
return TEST_FAIL; \
|
||||||
|
}
|
||||||
|
GET_EXTENSION_ADDRESS(clGetMutableCommandInfoKHR);
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
clGetMutableCommandInfoKHR_fn clGetMutableCommandInfoKHR = nullptr;
|
||||||
|
const char* kernelString = "__kernel void empty() {}";
|
||||||
|
const size_t global_work_size = 4 * sizeof(cl_int);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_CL_KHR_MUTABLE_COMMAND_BASIC_H
|
||||||
@@ -0,0 +1,497 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2022 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 <extensionHelpers.h>
|
||||||
|
#include "typeWrappers.h"
|
||||||
|
#include "procs.h"
|
||||||
|
#include "testHarness.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <memory>
|
||||||
|
#include "mutable_command_basic.h"
|
||||||
|
|
||||||
|
#include <CL/cl.h>
|
||||||
|
#include <CL/cl_ext.h>
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// mutable dispatch tests which handle following cases:
|
||||||
|
//
|
||||||
|
// CL_DEVICE_MUTABLE_DISPATCH_CAPABILITIES_KHR
|
||||||
|
// CL_MUTABLE_COMMAND_COMMAND_QUEUE_KHR
|
||||||
|
// CL_MUTABLE_COMMAND_COMMAND_BUFFER_KHR
|
||||||
|
// CL_MUTABLE_DISPATCH_PROPERTIES_ARRAY_KHR
|
||||||
|
// CL_MUTABLE_DISPATCH_KERNEL_KHR
|
||||||
|
// CL_MUTABLE_DISPATCH_DIMENSIONS_KHR
|
||||||
|
// CL_MUTABLE_DISPATCH_GLOBAL_WORK_OFFSET_KHR
|
||||||
|
// CL_MUTABLE_DISPATCH_GLOBAL_WORK_SIZE_KHR
|
||||||
|
// CL_MUTABLE_DISPATCH_LOCAL_WORK_SIZE_KHR
|
||||||
|
// CL_MUTABLE_COMMAND_COMMAND_TYPE_KHR
|
||||||
|
|
||||||
|
struct InfoDeviceQuery : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoDeviceQuery(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_mutable_dispatch_fields_khr mutable_capabilities;
|
||||||
|
|
||||||
|
cl_int error = clGetDeviceInfo(
|
||||||
|
device, CL_DEVICE_MUTABLE_DISPATCH_CAPABILITIES_KHR,
|
||||||
|
sizeof(mutable_capabilities), &mutable_capabilities, nullptr);
|
||||||
|
test_error(error, "clGetDeviceInfo failed");
|
||||||
|
|
||||||
|
if (!mutable_capabilities)
|
||||||
|
{
|
||||||
|
log_error("Device does not support update arguments to a "
|
||||||
|
"mutable-dispatch.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InfoBuffer : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoBuffer(cl_device_id device, cl_context context, cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_COMMAND_COMMAND_BUFFER_KHR,
|
||||||
|
sizeof(test_command_buffer), &test_command_buffer, nullptr);
|
||||||
|
test_error(error, "clGetMutableCommandInfoKHR failed");
|
||||||
|
|
||||||
|
if (test_command_buffer != command_buffer)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Incorrect command buffer returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_command_buffer_khr test_command_buffer = nullptr;
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PropertiesArray : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
PropertiesArray(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_ndrange_kernel_command_properties_khr props[] = {
|
||||||
|
CL_MUTABLE_DISPATCH_UPDATABLE_FIELDS_KHR,
|
||||||
|
CL_MUTABLE_DISPATCH_ARGUMENTS_KHR, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, props, kernel, 1, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
cl_ndrange_kernel_command_properties_khr test_props[] = { 0, 0, 0 };
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_DISPATCH_PROPERTIES_ARRAY_KHR,
|
||||||
|
sizeof(test_props), test_props, &size);
|
||||||
|
test_error(error, "clGetMutableCommandInfoKHR failed");
|
||||||
|
|
||||||
|
if (size != sizeof(props) || test_props[0] != props[0]
|
||||||
|
|| test_props[1] != props[1])
|
||||||
|
{
|
||||||
|
log_error("ERROR: Incorrect command buffer returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Kernel : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
Kernel(cl_device_id device, cl_context context, cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
cl_kernel test_kernel;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_DISPATCH_KERNEL_KHR, sizeof(test_kernel),
|
||||||
|
&test_kernel, &size);
|
||||||
|
test_error(error, "clGetMutableCommandInfoKHR failed");
|
||||||
|
|
||||||
|
// We can not check if this is the right kernel because this is an
|
||||||
|
// opaque object.
|
||||||
|
if (test_kernel != kernel)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Incorrect command buffer returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Dimensions : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
Dimensions(cl_device_id device, cl_context context, cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, dimensions, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
size_t test_dimensions;
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_DISPATCH_DIMENSIONS_KHR,
|
||||||
|
sizeof(test_dimensions), &test_dimensions, nullptr);
|
||||||
|
test_error(error, "clGetMutableCommandInfoKHR failed");
|
||||||
|
|
||||||
|
if (test_dimensions != dimensions)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Incorrect command buffer returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
const size_t dimensions = 3;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InfoType : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoType(cl_device_id device, cl_context context, cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
cl_command_type type = 0;
|
||||||
|
error = clGetMutableCommandInfoKHR(command,
|
||||||
|
CL_MUTABLE_COMMAND_COMMAND_TYPE_KHR,
|
||||||
|
sizeof(type), &type, NULL);
|
||||||
|
test_error(error, "clGetMutableCommandInfoKHR failed");
|
||||||
|
|
||||||
|
if (type != CL_COMMAND_NDRANGE_KERNEL)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Wrong type returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InfoQueue : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoQueue(cl_device_id device, cl_context context, cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
cl_command_queue test_queue = nullptr;
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_COMMAND_COMMAND_QUEUE_KHR, sizeof(test_queue),
|
||||||
|
&test_queue, nullptr);
|
||||||
|
test_error(error, "clGetMutableCommandInfoKHR failed");
|
||||||
|
|
||||||
|
if (test_queue != queue)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Incorrect queue returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InfoGlobalWorkOffset : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoGlobalWorkOffset(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, &global_work_offset,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_DISPATCH_GLOBAL_WORK_OFFSET_KHR,
|
||||||
|
sizeof(test_global_work_offset), &test_global_work_offset, nullptr);
|
||||||
|
|
||||||
|
if (test_global_work_offset != global_work_offset)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Wrong size returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
const size_t global_work_offset = 4 * sizeof(cl_int);
|
||||||
|
size_t test_global_work_offset = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InfoGlobalWorkSize : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoGlobalWorkSize(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr,
|
||||||
|
&global_work_size, nullptr, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_DISPATCH_GLOBAL_WORK_SIZE_KHR,
|
||||||
|
sizeof(test_global_work_size), &test_global_work_size, nullptr);
|
||||||
|
|
||||||
|
if (test_global_work_size != global_work_size)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Wrong size returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return TEST_PASS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
size_t test_global_work_size = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InfoLocalWorkSize : public BasicMutableCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicMutableCommandBufferTest::BasicMutableCommandBufferTest;
|
||||||
|
|
||||||
|
InfoLocalWorkSize(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue)
|
||||||
|
: BasicMutableCommandBufferTest(device, context, queue)
|
||||||
|
{}
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr,
|
||||||
|
&global_work_size, &local_work_size, 0, nullptr, nullptr, &command);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
error = clGetMutableCommandInfoKHR(
|
||||||
|
command, CL_MUTABLE_DISPATCH_LOCAL_WORK_SIZE_KHR,
|
||||||
|
sizeof(test_local_work_size), &test_local_work_size, nullptr);
|
||||||
|
|
||||||
|
if (test_local_work_size != local_work_size)
|
||||||
|
{
|
||||||
|
log_error("ERROR: Wrong size returned from "
|
||||||
|
"clGetMutableCommandInfoKHR.");
|
||||||
|
return TEST_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl_mutable_command_khr command = nullptr;
|
||||||
|
const size_t local_work_size = 4 * sizeof(cl_int);
|
||||||
|
size_t test_local_work_size = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
int test_mutable_command_info_device_query(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoDeviceQuery>(device, context, queue,
|
||||||
|
num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_info_buffer(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoBuffer>(device, context, queue, num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_properties_array(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<PropertiesArray>(device, context, queue,
|
||||||
|
num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_kernel(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<Kernel>(device, context, queue, num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_dimensions(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<Dimensions>(device, context, queue, num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_info_type(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoType>(device, context, queue, num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_info_queue(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoQueue>(device, context, queue, num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_info_global_work_offset(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoGlobalWorkOffset>(device, context, queue,
|
||||||
|
num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_info_global_work_size(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoGlobalWorkSize>(device, context, queue,
|
||||||
|
num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_mutable_command_info_local_work_size(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<InfoLocalWorkSize>(device, context, queue,
|
||||||
|
num_elements);
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2023 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.
|
||||||
|
//
|
||||||
|
#ifndef _CL_KHR_COMMAND_BUFFER_MUTABLE_DISPATCH_PROCS_H
|
||||||
|
#define _CL_KHR_COMMAND_BUFFER_MUTABLE_DISPATCH_PROCS_H
|
||||||
|
|
||||||
|
#include <CL/cl.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Basic mutable dispatch tests
|
||||||
|
extern int test_mutable_command_info_device_query(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_info_buffer(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_info_type(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_info_queue(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_properties_array(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_kernel(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_dimensions(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_info_global_work_offset(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_info_local_work_size(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
extern int test_mutable_command_info_global_work_size(cl_device_id device,
|
||||||
|
cl_context context,
|
||||||
|
cl_command_queue queue,
|
||||||
|
int num_elements);
|
||||||
|
#endif /*_CL_KHR_COMMAND_BUFFER_MUTABLE_DISPATCH_PROCS_H*/
|
||||||
Reference in New Issue
Block a user