From fe0f259eaa96e48c95c1a9b0006e2fa6469b997c Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Thu, 12 Mar 2020 12:55:57 +0100 Subject: [PATCH] Pass proper spec const values to IGC Change-Id: Id02f6fca1ce3ab603ac8b539ecb8ae5383276473 Signed-off-by: Lukasz Jobczyk --- opencl/source/program/program.cpp | 18 ++----- .../program/program_spec_constants_tests.cpp | 53 ++++++++----------- .../compiler_interface/compiler_interface.cpp | 6 +-- 3 files changed, 29 insertions(+), 48 deletions(-) diff --git a/opencl/source/program/program.cpp b/opencl/source/program/program.cpp index 32a4b874ba..b1ee5a172d 100644 --- a/opencl/source/program/program.cpp +++ b/opencl/source/program/program.cpp @@ -130,15 +130,6 @@ Program::~Program() { if (context && !isBuiltIn) { context->decRefInternal(); } - - if (specConstantsValues.get() != nullptr) { - for (auto i = 0u; i < specConstantsValues->GetSize(); i++) { - auto specConstPtr = specConstantsValues->GetMemory()[i]; - if (specConstPtr != nullptr) { - delete[] reinterpret_cast(specConstPtr); - } - } - } } cl_int Program::createProgramFromBinary( @@ -250,12 +241,9 @@ cl_int Program::updateSpecializationConstant(cl_uint specId, size_t specSize, co for (uint32_t i = 0; i < specConstantsIds->GetSize(); i++) { if (specConstantsIds->GetMemory()[i] == specId) { if (specConstantsSizes->GetMemory()[i] == static_cast(specSize)) { - auto specConstPtr = specConstantsValues->GetMemoryWriteable()[i]; - if (specConstPtr == nullptr) { - specConstPtr = new char[specSize]; - } - memcpy_s(specConstPtr, specSize, specValue, specSize); - specConstantsValues->GetMemoryWriteable()[i] = specConstPtr; + uint64_t specConstValue = 0u; + memcpy_s(&specConstValue, sizeof(uint64_t), specValue, specSize); + specConstantsValues->GetMemoryWriteable()[i] = specConstValue; return CL_SUCCESS; } else { return CL_INVALID_VALUE; diff --git a/opencl/test/unit_test/program/program_spec_constants_tests.cpp b/opencl/test/unit_test/program/program_spec_constants_tests.cpp index a6c8f569c3..82eeb117ab 100644 --- a/opencl/test/unit_test/program/program_spec_constants_tests.cpp +++ b/opencl/test/unit_test/program/program_spec_constants_tests.cpp @@ -42,29 +42,23 @@ struct UpdateSpecConstantsTest : public ::testing::Test { mockProgram->specConstantsSizes->PushBackRawCopy(size2); mockProgram->specConstantsSizes->PushBackRawCopy(size3); - val1 = new char; - val2 = new uint16_t; + mockProgram->specConstantsValues->PushBackRawCopy(static_cast(val1)); + mockProgram->specConstantsValues->PushBackRawCopy(static_cast(val2)); + mockProgram->specConstantsValues->PushBackRawCopy(static_cast(val3)); - *val1 = 5; - *val2 = 50; + values = mockProgram->specConstantsValues->GetMemoryWriteable(); - mockProgram->specConstantsValues->PushBackRawCopy(val1); - mockProgram->specConstantsValues->PushBackRawCopy(val2); - mockProgram->specConstantsValues->PushBackRawCopy(val3); - - values = mockProgram->specConstantsValues->GetMemoryWriteable(); - - EXPECT_EQ(val1, reinterpret_cast(values[0])); - EXPECT_EQ(val2, reinterpret_cast(values[1])); - EXPECT_EQ(val3, reinterpret_cast(values[2])); + EXPECT_EQ(val1, static_cast(values[0])); + EXPECT_EQ(val2, static_cast(values[1])); + EXPECT_EQ(val3, static_cast(values[2])); } ExecutionEnvironment executionEnvironment; std::unique_ptr mockProgram; - char *val1 = nullptr; - uint16_t *val2 = nullptr; - int *val3 = nullptr; - void **values; + char val1 = 5; + uint16_t val2 = 50; + int val3 = 500; + uint64_t *values; }; TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWhenUpdateSpecializationConstantThenProperValueIsCopiedAndUpdated) { @@ -73,18 +67,17 @@ TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWhenUpdateSpecializationCo auto ret = mockProgram->updateSpecializationConstant(3, sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_SUCCESS, ret); - EXPECT_EQ(val1, reinterpret_cast(values[0])); - EXPECT_EQ(val2, reinterpret_cast(values[1])); - EXPECT_EQ(newSpecConstVal3, *reinterpret_cast(values[2])); - EXPECT_NE(&newSpecConstVal3, values[2]); - EXPECT_NE(val3, values[2]); + EXPECT_EQ(val1, static_cast(values[0])); + EXPECT_EQ(val2, static_cast(values[1])); + EXPECT_EQ(newSpecConstVal3, static_cast(values[2])); + EXPECT_NE(val3, static_cast(values[2])); newSpecConstVal3 = 50000; - EXPECT_NE(newSpecConstVal3, *reinterpret_cast(values[2])); + EXPECT_NE(newSpecConstVal3, static_cast(values[2])); ret = mockProgram->updateSpecializationConstant(3, sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_SUCCESS, ret); - EXPECT_EQ(newSpecConstVal3, *reinterpret_cast(values[2])); + EXPECT_EQ(newSpecConstVal3, static_cast(values[2])); } TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperSizeWhenUpdateSpecializationConstantThenErrorIsReturned) { @@ -93,9 +86,9 @@ TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperSizeWhenUpdate auto ret = mockProgram->updateSpecializationConstant(3, 10 * sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_INVALID_VALUE, ret); - EXPECT_EQ(val1, reinterpret_cast(values[0])); - EXPECT_EQ(val2, reinterpret_cast(values[1])); - EXPECT_EQ(val3, reinterpret_cast(values[2])); + EXPECT_EQ(val1, static_cast(values[0])); + EXPECT_EQ(val2, static_cast(values[1])); + EXPECT_EQ(val3, static_cast(values[2])); } TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperIdAndSizeWhenUpdateSpecializationConstantThenErrorIsReturned) { @@ -104,7 +97,7 @@ TEST_F(UpdateSpecConstantsTest, givenNewSpecConstValueWithUnproperIdAndSizeWhenU auto ret = mockProgram->updateSpecializationConstant(4, sizeof(int), &newSpecConstVal3); EXPECT_EQ(CL_INVALID_SPEC_ID, ret); - EXPECT_EQ(val1, reinterpret_cast(values[0])); - EXPECT_EQ(val2, reinterpret_cast(values[1])); - EXPECT_EQ(val3, reinterpret_cast(values[2])); + EXPECT_EQ(val1, static_cast(values[0])); + EXPECT_EQ(val2, static_cast(values[1])); + EXPECT_EQ(val3, static_cast(values[2])); } diff --git a/shared/source/compiler_interface/compiler_interface.cpp b/shared/source/compiler_interface/compiler_interface.cpp index 69ea387ee2..0e92900f90 100644 --- a/shared/source/compiler_interface/compiler_interface.cpp +++ b/shared/source/compiler_interface/compiler_interface.cpp @@ -258,9 +258,9 @@ TranslationOutput::ErrorCode CompilerInterface::getSpecConstantsInfo(const NEO:: return TranslationOutput::ErrorCode::UnknownError; } - output.valuesBuffer->Resize(output.idsBuffer->GetSize() * sizeof(void *)); - for (uint32_t i = 0; i < output.valuesBuffer->GetSize(); i++) { - output.valuesBuffer->GetMemoryWriteable()[i] = nullptr; + output.valuesBuffer->Resize(output.idsBuffer->GetSizeRaw() * 2); + for (uint32_t i = 0; i < output.valuesBuffer->GetSize(); i++) { + output.valuesBuffer->GetMemoryWriteable()[i] = 0u; } return TranslationOutput::ErrorCode::Success;