Add skeleton code for OpenCL handling
This commit is contained in:
parent
19e4dfcb1c
commit
e07691f71d
3 changed files with 101 additions and 1 deletions
|
@ -4,9 +4,10 @@ project(EN605.617.81.FA21_StephenSeo_DitheringProject)
|
||||||
set(Project_SOURCES
|
set(Project_SOURCES
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/image.cc
|
${CMAKE_CURRENT_SOURCE_DIR}/src/image.cc
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/opencl_handle.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g")
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g")
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG")
|
||||||
|
|
||||||
|
@ -17,6 +18,7 @@ endif()
|
||||||
|
|
||||||
add_executable(DitheringProject
|
add_executable(DitheringProject
|
||||||
${Project_SOURCES})
|
${Project_SOURCES})
|
||||||
|
#target_compile_features(DitheringProject PUBLIC cxx_std_11)
|
||||||
|
|
||||||
find_package(PNG REQUIRED)
|
find_package(PNG REQUIRED)
|
||||||
|
|
||||||
|
|
43
src/opencl_handle.cc
Normal file
43
src/opencl_handle.cc
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#include "opencl_handle.h"
|
||||||
|
|
||||||
|
std::unique_ptr<OpenCLContext> OpenCLContext::instance_ = {};
|
||||||
|
|
||||||
|
OpenCLHandle::OpenCLHandle() {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenCLHandle::~OpenCLHandle() { OpenCLContext::CheckRefCount(); }
|
||||||
|
|
||||||
|
OpenCLContext::OpenCLContext() {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenCLContext::~OpenCLContext() {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenCLHandle::Ptr OpenCLContext::GetHandle() {
|
||||||
|
if (!instance_) {
|
||||||
|
// cannot use make_unique due to private constructor
|
||||||
|
instance_ = std::unique_ptr<OpenCLContext>(new OpenCLContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto strong_handle = instance_->weak_handle_.lock();
|
||||||
|
if (strong_handle) {
|
||||||
|
return strong_handle;
|
||||||
|
}
|
||||||
|
// cannot use make_shared due to private constructor
|
||||||
|
strong_handle = std::shared_ptr<OpenCLHandle>(new OpenCLHandle());
|
||||||
|
instance_->weak_handle_ = strong_handle;
|
||||||
|
|
||||||
|
return strong_handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenCLContext::CheckRefCount() {
|
||||||
|
if (instance_) {
|
||||||
|
if (instance_->weak_handle_.use_count() <= 1) {
|
||||||
|
// Last shared_ptr is destructing, cleanup context by calling destructor
|
||||||
|
instance_.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
55
src/opencl_handle.h
Normal file
55
src/opencl_handle.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#ifndef IGPUP_DITHERING_PROJECT_OPENCL_H_
|
||||||
|
#define IGPUP_DITHERING_PROJECT_OPENCL_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class OpenCLHandle {
|
||||||
|
public:
|
||||||
|
typedef std::shared_ptr<OpenCLHandle> Ptr;
|
||||||
|
typedef std::weak_ptr<OpenCLHandle> WeakPtr;
|
||||||
|
|
||||||
|
~OpenCLHandle();
|
||||||
|
|
||||||
|
// no copy
|
||||||
|
OpenCLHandle(const OpenCLHandle &other) = delete;
|
||||||
|
OpenCLHandle &operator=(const OpenCLHandle &other) = delete;
|
||||||
|
|
||||||
|
// allow move
|
||||||
|
OpenCLHandle(OpenCLHandle &&other) = default;
|
||||||
|
OpenCLHandle &operator=(OpenCLHandle &&other) = default;
|
||||||
|
|
||||||
|
// TODO add functions here that allow creating/deleting/using kernel function
|
||||||
|
// programs
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class OpenCLContext;
|
||||||
|
|
||||||
|
OpenCLHandle();
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpenCLContext {
|
||||||
|
public:
|
||||||
|
~OpenCLContext();
|
||||||
|
|
||||||
|
// no copy
|
||||||
|
OpenCLContext(const OpenCLContext &other) = delete;
|
||||||
|
OpenCLContext &operator=(const OpenCLContext &other) = delete;
|
||||||
|
|
||||||
|
// no move
|
||||||
|
OpenCLContext(OpenCLContext &&other) = delete;
|
||||||
|
OpenCLContext &operator=(OpenCLContext &&other) = delete;
|
||||||
|
|
||||||
|
OpenCLHandle::Ptr GetHandle();
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class OpenCLHandle;
|
||||||
|
|
||||||
|
OpenCLContext();
|
||||||
|
|
||||||
|
static std::unique_ptr<OpenCLContext> instance_;
|
||||||
|
OpenCLHandle::WeakPtr weak_handle_;
|
||||||
|
|
||||||
|
static void CheckRefCount();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue