mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-24 15:59:03 +00:00
[Command-buffer] Test finalizing empty command-buffer (#1782)
This patch adds two test cases related to command-buffer finalization: 1) That it is an error to finalize and already finalized command-buffer. See https://github.com/KhronosGroup/OpenCL-Docs/pull/817 2) That it is not an error to create, finalize, and execute an empty command-buffer. Closes issue #1781
This commit is contained in:
@@ -14,6 +14,7 @@ set(${MODULE_NAME}_SOURCES
|
|||||||
command_buffer_test_copy.cpp
|
command_buffer_test_copy.cpp
|
||||||
command_buffer_test_barrier.cpp
|
command_buffer_test_barrier.cpp
|
||||||
command_buffer_test_event_info.cpp
|
command_buffer_test_event_info.cpp
|
||||||
|
command_buffer_finalize.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
include(../../CMakeCommon.txt)
|
include(../../CMakeCommon.txt)
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
#include "basic_command_buffer.h"
|
||||||
|
#include "procs.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// Test that finalizing a command-buffer that has already been finalized returns
|
||||||
|
// the correct error code.
|
||||||
|
struct FinalizeInvalid : public BasicCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicCommandBufferTest::BasicCommandBufferTest;
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
cl_int error = clCommandNDRangeKernelKHR(
|
||||||
|
command_buffer, nullptr, nullptr, kernel, 1, nullptr, &num_elements,
|
||||||
|
nullptr, 0, nullptr, nullptr, nullptr);
|
||||||
|
test_error(error, "clCommandNDRangeKernelKHR failed");
|
||||||
|
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
// Finalizing an already finalized command-buffer must return
|
||||||
|
// CL_INVALID_OPERATION
|
||||||
|
error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_failure_error_ret(
|
||||||
|
error, CL_INVALID_OPERATION,
|
||||||
|
"clFinalizeCommandBufferKHR should return CL_INVALID_OPERATION",
|
||||||
|
TEST_FAIL);
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check that an empty command-buffer can be finalized and then executed.
|
||||||
|
struct FinalizeEmpty : public BasicCommandBufferTest
|
||||||
|
{
|
||||||
|
using BasicCommandBufferTest::BasicCommandBufferTest;
|
||||||
|
|
||||||
|
cl_int Run() override
|
||||||
|
{
|
||||||
|
// Finalize an empty command-buffer
|
||||||
|
cl_int error = clFinalizeCommandBufferKHR(command_buffer);
|
||||||
|
test_error(error, "clFinalizeCommandBufferKHR failed");
|
||||||
|
|
||||||
|
// Execute empty command-buffer and then wait to complete
|
||||||
|
clEventWrapper event;
|
||||||
|
error = clEnqueueCommandBufferKHR(0, nullptr, command_buffer, 0,
|
||||||
|
nullptr, &event);
|
||||||
|
test_error(error, "clEnqueueCommandBufferKHR failed");
|
||||||
|
|
||||||
|
error = clWaitForEvents(1, &event);
|
||||||
|
test_error(error, "clWaitForEvents failed");
|
||||||
|
|
||||||
|
return CL_SUCCESS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
int test_finalize_invalid(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<FinalizeInvalid>(device, context, queue,
|
||||||
|
num_elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_finalize_empty(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements)
|
||||||
|
{
|
||||||
|
return MakeAndRunTest<FinalizeEmpty>(device, context, queue, num_elements);
|
||||||
|
}
|
||||||
@@ -59,7 +59,9 @@ test_definition test_list[] = {
|
|||||||
ADD_TEST(event_info_command_queue),
|
ADD_TEST(event_info_command_queue),
|
||||||
ADD_TEST(event_info_execution_status),
|
ADD_TEST(event_info_execution_status),
|
||||||
ADD_TEST(event_info_context),
|
ADD_TEST(event_info_context),
|
||||||
ADD_TEST(event_info_reference_count)
|
ADD_TEST(event_info_reference_count),
|
||||||
|
ADD_TEST(finalize_invalid),
|
||||||
|
ADD_TEST(finalize_empty)
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, const char *argv[])
|
int main(int argc, const char *argv[])
|
||||||
|
|||||||
@@ -132,5 +132,9 @@ extern int test_event_info_reference_count(cl_device_id device,
|
|||||||
cl_context context,
|
cl_context context,
|
||||||
cl_command_queue queue,
|
cl_command_queue queue,
|
||||||
int num_elements);
|
int num_elements);
|
||||||
|
extern int test_finalize_invalid(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements);
|
||||||
|
extern int test_finalize_empty(cl_device_id device, cl_context context,
|
||||||
|
cl_command_queue queue, int num_elements);
|
||||||
|
|
||||||
#endif // CL_KHR_COMMAND_BUFFER_PROCS_H
|
#endif // CL_KHR_COMMAND_BUFFER_PROCS_H
|
||||||
|
|||||||
Reference in New Issue
Block a user