From 20aa362a7d67ae2ad0669d3dff243b90946cab32 Mon Sep 17 00:00:00 2001 From: Lukasz Towarek Date: Fri, 10 Aug 2018 08:26:09 +0200 Subject: [PATCH] Support CL_INVALID_PROGRAM_EXECUTABLE in clCreateKernel Change-Id: I7ff5b988d0e6187931ea4ad35a7aaeb92e37907a --- runtime/api/api.cpp | 5 +++++ runtime/program/program.h | 4 ++++ unit_tests/api/cl_create_kernel_tests.inl | 15 +++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/runtime/api/api.cpp b/runtime/api/api.cpp index 9918fa68d2..9d0af1773e 100644 --- a/runtime/api/api.cpp +++ b/runtime/api/api.cpp @@ -1452,6 +1452,11 @@ cl_kernel CL_API_CALL clCreateKernel(cl_program clProgram, break; } + if (pProgram->getBuildStatus() != CL_SUCCESS) { + retVal = CL_INVALID_PROGRAM_EXECUTABLE; + break; + } + const KernelInfo *pKernelInfo = pProgram->getKernelInfo(kernelName); if (!pKernelInfo) { retVal = CL_INVALID_KERNEL_NAME; diff --git a/runtime/program/program.h b/runtime/program/program.h index 514107a3b7..926586d3b3 100644 --- a/runtime/program/program.h +++ b/runtime/program/program.h @@ -154,6 +154,10 @@ class Program : public BaseObject<_cl_program> { cl_int getBuildInfo(cl_device_id device, cl_program_build_info paramName, size_t paramValueSize, void *paramValue, size_t *paramValueSizeRet) const; + cl_build_status getBuildStatus() const { + return buildStatus; + } + Context &getContext() const { return *context; } diff --git a/unit_tests/api/cl_create_kernel_tests.inl b/unit_tests/api/cl_create_kernel_tests.inl index d7ebbf4f41..d0f7ea279a 100644 --- a/unit_tests/api/cl_create_kernel_tests.inl +++ b/unit_tests/api/cl_create_kernel_tests.inl @@ -95,6 +95,7 @@ TEST_F(clCreateKernelTests, invalidKernel) { MockProgram *pMockProg = new MockProgram(pContext, false); pMockProg->addKernelInfo(pKernelInfo); + pMockProg->SetBuildStatus(CL_BUILD_SUCCESS); kernel = clCreateKernel( pMockProg, @@ -199,6 +200,20 @@ TEST_F(clCreateKernelTests, invalidProgram) { ASSERT_EQ(nullptr, kernel); } +TEST_F(clCreateKernelTests, givenProgramWithBuildErrorWhenCreatingNewKernelThenReturnClInvalidProgramExecutable) { + cl_kernel kernel = nullptr; + std::unique_ptr pMockProg = std::make_unique(pContext, false); + pMockProg->SetBuildStatus(CL_BUILD_ERROR); + + kernel = clCreateKernel( + pMockProg.get(), + "", + &retVal); + + EXPECT_EQ(CL_INVALID_PROGRAM_EXECUTABLE, retVal); + EXPECT_EQ(nullptr, kernel); +} + TEST_F(clCreateKernelTests, noRet) { cl_kernel kernel = nullptr; kernel = clCreateKernel(