diff --git a/runtime/api/api.cpp b/runtime/api/api.cpp index 332f45497a..a2f7219144 100644 --- a/runtime/api/api.cpp +++ b/runtime/api/api.cpp @@ -41,6 +41,7 @@ #include "runtime/kernel/kernel.h" #include "runtime/mem_obj/buffer.h" #include "runtime/mem_obj/image.h" +#include "runtime/mem_obj/mem_obj_helper.h" #include "runtime/mem_obj/pipe.h" #include "runtime/memory_manager/svm_memory_manager.h" #include "runtime/os_interface/debug_settings_manager.h" @@ -551,10 +552,6 @@ cl_mem CL_API_CALL clCreateBuffer(cl_context context, "size", size, "hostPtr", DebugManager.infoPointerToString(hostPtr, size)); cl_mem buffer = nullptr; - const cl_mem_flags allValidFlags = - CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | - CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR | - CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS; do { if (size == 0) { @@ -563,7 +560,7 @@ cl_mem CL_API_CALL clCreateBuffer(cl_context context, } /* Are there some invalid flag bits? */ - if ((flags & (~allValidFlags)) != 0) { + if (!MemObjHelper::checkMemFlagsForBuffer(flags)) { retVal = CL_INVALID_VALUE; break; } @@ -618,9 +615,6 @@ cl_mem CL_API_CALL clCreateSubBuffer(cl_mem buffer, "bufferCreateInfo", bufferCreateInfo); cl_mem subBuffer = nullptr; Buffer *parentBuffer = castToObject(buffer); - const cl_mem_flags allValidFlags = - CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | - CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS; do { if (parentBuffer == nullptr) { @@ -629,7 +623,7 @@ cl_mem CL_API_CALL clCreateSubBuffer(cl_mem buffer, } /* Are there some invalid flag bits? */ - if ((flags & (~allValidFlags)) != 0) { + if (!MemObjHelper::checkMemFlagsForSubBuffer(flags)) { retVal = CL_INVALID_VALUE; break; } diff --git a/runtime/mem_obj/CMakeLists.txt b/runtime/mem_obj/CMakeLists.txt index cc8a1ef25e..d0c7e6453b 100644 --- a/runtime/mem_obj/CMakeLists.txt +++ b/runtime/mem_obj/CMakeLists.txt @@ -32,6 +32,8 @@ set(RUNTIME_SRCS_MEM_OBJ ${CMAKE_CURRENT_SOURCE_DIR}/map_operations_handler.h ${CMAKE_CURRENT_SOURCE_DIR}/mem_obj.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mem_obj.h + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/mem_obj_helper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/mem_obj_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/pipe.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pipe.h ) diff --git a/runtime/mem_obj/mem_obj_helper.cpp b/runtime/mem_obj/mem_obj_helper.cpp new file mode 100644 index 0000000000..941e363f22 --- /dev/null +++ b/runtime/mem_obj/mem_obj_helper.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "runtime/mem_obj/mem_obj_helper.h" + +namespace OCLRT { + +bool MemObjHelper::checkExtraMemFlagsForBuffer(cl_mem_flags flags) { + return true; +} + +} // namespace OCLRT diff --git a/runtime/mem_obj/mem_obj_helper.h b/runtime/mem_obj/mem_obj_helper.h new file mode 100644 index 0000000000..558b4777cb --- /dev/null +++ b/runtime/mem_obj/mem_obj_helper.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018, Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#pragma once +#include "CL/cl.h" +#include "runtime/mem_obj/mem_obj.h" + +namespace OCLRT { + +class MemObjHelper { + public: + static bool checkMemFlagsForBuffer(cl_mem_flags flags) { + const cl_mem_flags allValidFlags = + CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | + CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR | + CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS; + + bool flagsValidated = (flags & (~allValidFlags)) == 0; + flagsValidated &= checkExtraMemFlagsForBuffer(flags); + + return flagsValidated; + } + + static bool checkExtraMemFlagsForBuffer(cl_mem_flags flags); + + static bool checkMemFlagsForSubBuffer(cl_mem_flags flags) { + const cl_mem_flags allValidFlags = + CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | + CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS; + + if ((flags & (~allValidFlags)) != 0) { + return false; + } + return true; + } +}; +} // namespace OCLRT diff --git a/unit_tests/mem_obj/CMakeLists.txt b/unit_tests/mem_obj/CMakeLists.txt index 55254b1d9d..48065b2b3b 100644 --- a/unit_tests/mem_obj/CMakeLists.txt +++ b/unit_tests/mem_obj/CMakeLists.txt @@ -45,6 +45,7 @@ set(IGDRCL_SRCS_tests_mem_obj ${CMAKE_CURRENT_SOURCE_DIR}/map_operations_handler_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mem_obj_destruction_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mem_obj_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/mem_obj_helper_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nv12_image_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/packed_yuv_image_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pipe_tests.cpp diff --git a/unit_tests/mem_obj/mem_obj_helper_tests.cpp b/unit_tests/mem_obj/mem_obj_helper_tests.cpp new file mode 100644 index 0000000000..af4060ec51 --- /dev/null +++ b/unit_tests/mem_obj/mem_obj_helper_tests.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2017 - 2018, Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "runtime/mem_obj/mem_obj_helper.h" +#include "gtest/gtest.h" + +using namespace OCLRT; + +TEST(MemObjHelper, givenValidMemFlagsForBufferWhenFlagsAreCheckedThenTrueIsReturned) { + cl_mem_flags flags = CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | + CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR | + CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS; + + EXPECT_TRUE(MemObjHelper::checkMemFlagsForBuffer(flags)); +} + +TEST(MemObjHelper, givenInvalidMemFlagsForBufferWhenFlagsAreCheckedThenFalseIsReturned) { + cl_mem_flags flags = (1 << 13) | (1 << 14) | (1 << 30) | (1 << 31); + + if (MemObjHelper::checkExtraMemFlagsForBuffer(flags)) { + EXPECT_FALSE(MemObjHelper::checkMemFlagsForBuffer(flags)); + } +} + +TEST(MemObjHelper, givenValidMemFlagsForSubBufferWhenFlagsAreCheckedThenTrueIsReturned) { + cl_mem_flags flags = CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | + CL_MEM_HOST_WRITE_ONLY | CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS; + + EXPECT_TRUE(MemObjHelper::checkMemFlagsForSubBuffer(flags)); +} + +TEST(MemObjHelper, givenInValidMemFlagsForSubBufferWhenFlagsAreCheckedThenTrueIsReturned) { + cl_mem_flags flags = CL_MEM_ALLOC_HOST_PTR | CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR; + + EXPECT_FALSE(MemObjHelper::checkMemFlagsForSubBuffer(flags)); +}