diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 99ed99e..be8ba52 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,8 +27,8 @@ endif() if(MOCK_HAL) target_compile_definitions(VC4CL PRIVATE MOCK_HAL=1) elseif(CROSS_COMPILE OR EXISTS "/opt/vc/include/bcm_host.h") - find_library(BCMHOST_LIBRARY NAMES bcm_host libbcm_host HINTS "/opt/vc/lib") - find_library(VCSM_LIBRARY NAMES vcsm libvcsm HINTS "/opt/vc/lib") + find_library(BCMHOST_LIBRARY NAMES bcm_host libbcm_host HINTS "/opt/vc/lib" "/usr/lib/arm-linux-gnueabihf") + find_library(VCSM_LIBRARY NAMES vcsm libvcsm HINTS "/opt/vc/lib" "/usr/lib/arm-linux-gnueabihf") target_link_libraries(VC4CL ${BCMHOST_LIBRARY} ${VCSM_LIBRARY} ${SYSROOT_LIBRARY_FLAGS}) endif() if(ENABLE_COVERAGE) diff --git a/src/Context.cpp b/src/Context.cpp index fc95543..5362065 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -391,4 +391,4 @@ cl_int VC4CL_FUNC(clSetContextDestructorCallback)( auto con = toType(context); return con->setReleaseCallback(pfn_notify, user_data); } -#endif \ No newline at end of file +#endif diff --git a/src/Program.cpp b/src/Program.cpp index e30e8ec..014fbfb 100644 --- a/src/Program.cpp +++ b/src/Program.cpp @@ -127,9 +127,7 @@ static cl_int precompile_program(Program* program, const std::string& options, tempHeaderIncludes = " -I /tmp/ "; auto out = vc4c::Precompiler::precompile(sourceCode, config, tempHeaderIncludes + options); - if(auto rawData = out.getRawData()) - program->intermediateCode = *std::move(rawData); - else + if(!out.getRawData(program->intermediateCode)) { std::stringstream tmpStream{}; out.readInto(tmpStream); @@ -195,9 +193,7 @@ static cl_int link_programs( return returnError( CL_LINKER_NOT_AVAILABLE, __FILE__, __LINE__, "No linker available for this type of input modules!"); auto linkedCode = vc4c::Precompiler::linkSourceCode(inputModules, includeStandardLibrary); - if(auto rawData = linkedCode.getRawData()) - program->intermediateCode = *std::move(rawData); - else + if(!linkedCode.getRawData(program->intermediateCode)) { std::stringstream tmpStream{}; linkedCode.readInto(tmpStream); @@ -274,8 +270,9 @@ static cl_int compile_program(Program* program, const std::string& options) auto result = vc4c::Compiler::compile(intermediateCode, config, options); program->binaryCode.resize(result.second / sizeof(uint64_t), '\0'); - if(auto rawData = result.first.getRawData()) - memcpy(program->binaryCode.data(), rawData->data(), result.second); + std::vector rawData; + if(result.first.getRawData(rawData)) + memcpy(program->binaryCode.data(), rawData.data(), result.second); else { std::stringstream tmpStream{}; diff --git a/src/common.h b/src/common.h index 4957a4e..73ef139 100644 --- a/src/common.h +++ b/src/common.h @@ -123,7 +123,7 @@ namespace vc4cl // the reason is for documentation only if(state != CL_SUCCESS) DEBUG_LOG(DebugLevel::API_CALLS, - std::cout << "Error in '" << file << ":" << line << "', returning status " << state << std::endl); + std::cout << "Error in '" << file << ":" << line << "', returning status " << state << std::endl) } template diff --git a/src/hal/hal.h b/src/hal/hal.h index bd97b0e..56b6677 100644 --- a/src/hal/hal.h +++ b/src/hal/hal.h @@ -148,4 +148,4 @@ namespace vc4cl } /* namespace vc4cl */ -#endif /* VC4CL_HAL */ \ No newline at end of file +#endif /* VC4CL_HAL */ diff --git a/src/shared/BinaryHeader.cpp b/src/shared/BinaryHeader.cpp index c6d6299..97963fd 100644 --- a/src/shared/BinaryHeader.cpp +++ b/src/shared/BinaryHeader.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef VC4CL_BITFIELD #include "../Program.h" @@ -76,6 +77,12 @@ static T readByteContainer(const std::vector& data, std::size_t& dataI static auto readString = readByteContainer; +template +static constexpr std::enable_if_t::value && std::is_unsigned::value, R> truncate(T val) noexcept +{ + return static_cast(val & ((T{1} << (sizeof(R) * 8u)) - 1u)); +} + MetaData::Type MetaData::getType() const { if(payload.empty()) @@ -145,8 +152,8 @@ void MetaData::setString(Type type, const std::string& text) payload.clear(); auto numBytes = text.size() + 3u /* length + type */; payload.reserve(numBytes); - payload.push_back(static_cast(numBytes & 0xFF)); - payload.push_back(static_cast((numBytes >> 8) & 0xFF)); + payload.push_back(truncate(numBytes)); + payload.push_back(truncate(numBytes >> 8)); payload.push_back(static_cast(type)); payload.insert(payload.end(), text.begin(), text.end()); } @@ -170,18 +177,18 @@ void MetaData::setSizes(Type type, const std::array& sizes) payload[1] = 0; // upper size payload[2] = static_cast(type); payload[3] = 0; // padding - payload[4] = static_cast(sizes[0] & 0xFF); - payload[5] = static_cast((sizes[0] >> 8u) & 0xFF); - payload[6] = static_cast((sizes[0] >> 16u) & 0xFF); - payload[7] = static_cast((sizes[0] >> 24u) & 0xFF); - payload[8] = static_cast(sizes[1] & 0xFF); - payload[9] = static_cast((sizes[1] >> 8u) & 0xFF); - payload[10] = static_cast((sizes[1] >> 16u) & 0xFF); - payload[11] = static_cast((sizes[1] >> 24u) & 0xFF); - payload[12] = static_cast(sizes[2] & 0xFF); - payload[13] = static_cast((sizes[2] >> 8u) & 0xFF); - payload[14] = static_cast((sizes[2] >> 16u) & 0xFF); - payload[15] = static_cast((sizes[2] >> 24u) & 0xFF); + payload[4] = truncate(sizes[0]); + payload[5] = truncate(sizes[0] >> 8u); + payload[6] = truncate(sizes[0] >> 16u); + payload[7] = truncate(sizes[0] >> 24u); + payload[8] = truncate(sizes[1]); + payload[9] = truncate(sizes[1] >> 8u); + payload[10] = truncate(sizes[1] >> 16u); + payload[11] = truncate(sizes[1] >> 24u); + payload[12] = truncate(sizes[2]); + payload[13] = truncate(sizes[2] >> 8u); + payload[14] = truncate(sizes[2] >> 16u); + payload[15] = truncate(sizes[2] >> 24u); } uint32_t MetaData::getInt() const @@ -197,10 +204,10 @@ void MetaData::setInt(Type type, uint32_t val) payload[1] = 0; // upper size payload[2] = static_cast(type); payload[3] = 0; // padding - payload[4] = static_cast(val & 0xFF); - payload[5] = static_cast((val >> 8u) & 0xFF); - payload[6] = static_cast((val >> 16u) & 0xFF); - payload[7] = static_cast((val >> 24u) & 0xFF); + payload[4] = truncate(val); + payload[5] = truncate(val >> 8u); + payload[6] = truncate(val >> 16u); + payload[7] = truncate(val >> 24u); } LCOV_EXCL_START @@ -338,14 +345,14 @@ KernelHeader KernelHeader::fromBinaryData(const std::vector& data, std kernel.value = data[dataIndex]; ++dataIndex; auto secondWord = data[dataIndex]; - kernel.workGroupSize[0] = static_cast(secondWord & 0xFFFFU); - kernel.workGroupSize[1] = static_cast((secondWord >> 16) & 0xFFFFU); - kernel.workGroupSize[2] = static_cast((secondWord >> 32) & 0xFFFFU); - kernel.workItemMergeFactor = static_cast((secondWord >> 48) & 0xFFU); + kernel.workGroupSize[0] = truncate(secondWord); + kernel.workGroupSize[1] = truncate(secondWord >> 16); + kernel.workGroupSize[2] = truncate(secondWord >> 32); + kernel.workItemMergeFactor = truncate(secondWord >> 48); ++dataIndex; auto thirdWord = data[dataIndex]; - kernel.uniformsUsed.value = static_cast(thirdWord & 0xFFFFFFFFU); - auto numMetaDataEntries = static_cast((thirdWord >> 32) & 0xFFFFFFFFU); + kernel.uniformsUsed.value = truncate(thirdWord); + auto numMetaDataEntries = truncate(thirdWord >> 32); ++dataIndex; kernel.name = readString(data, dataIndex, kernel.getNameLength()); while(kernel.parameters.size() < kernel.getParamCount()) diff --git a/test/TestExecutions.cpp b/test/TestExecutions.cpp index 2be215d..b254657 100644 --- a/test/TestExecutions.cpp +++ b/test/TestExecutions.cpp @@ -24,10 +24,6 @@ static std::string sourceFFT; static constexpr int COUNTER_IDLE = 0; static constexpr int COUNTER_EXECUTIONS = 1; -// TODO add execution tests for: -// - multiple work-groups -// - with/without "loop-work-groups" optimization enabled - TestExecutions::TestExecutions() : Test::Suite(), context(nullptr), queue(nullptr) { for(const auto& test : test_data::getAllTests())