init
This commit is contained in:
commit
3a0593c3ff
15
CMakeLists.txt
Normal file
15
CMakeLists.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
project(aorii)
|
||||||
|
|
||||||
|
include(cmake/retrieve_files.cmake)
|
||||||
|
|
||||||
|
find_package(Eigen3 REQUIRED)
|
||||||
|
find_package(spdlog REQUIRED)
|
||||||
|
|
||||||
|
# 如果是Debug模式, 添加宏定义
|
||||||
|
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
add_definitions(-DDEBUG=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(src/renderer)
|
||||||
|
add_subdirectory(src/widget)
|
61
cmake/retrieve_files.cmake
Normal file
61
cmake/retrieve_files.cmake
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
function(retrieve_files_custom path extension out_files)
|
||||||
|
message(STATUS "Retrieving files in ${path}")
|
||||||
|
set(EXTENSIONS "")
|
||||||
|
foreach(ext ${extension})
|
||||||
|
list(APPEND EXTENSIONS "${path}/*.${ext}")
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
|
# 递归查找文件夹下的 .h .hpp. ini 文件保存到 HEAD_FILES
|
||||||
|
file(GLOB_RECURSE FIND_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS ${EXTENSIONS})
|
||||||
|
# 将 HEDADER_FILES 和 SRC_FILES 保存到 ALL_FILES 变量
|
||||||
|
set(ALL_FILES ${FIND_FILES})
|
||||||
|
|
||||||
|
set(RESULT "")
|
||||||
|
|
||||||
|
# 对 ALL_FILES 变量里面的所有文件分类(保留资源管理器的目录结构)
|
||||||
|
foreach(fileItem ${ALL_FILES})
|
||||||
|
# Get the directory of the source file
|
||||||
|
get_filename_component(PARENT_DIR "${fileItem}" DIRECTORY)
|
||||||
|
|
||||||
|
# 用于检查平台的条件
|
||||||
|
if(PARENT_DIR STREQUAL "windows")
|
||||||
|
if(WIN32)
|
||||||
|
set(RESULT "${RESULT};${fileItem}")
|
||||||
|
else()
|
||||||
|
continue()
|
||||||
|
endif()
|
||||||
|
elseif(PARENT_DIR STREQUAL "linux")
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
set(RESULT "${RESULT};${fileItem}")
|
||||||
|
else()
|
||||||
|
continue()
|
||||||
|
endif()
|
||||||
|
elseif(PARENT_DIR STREQUAL "mac")
|
||||||
|
if(APPLE)
|
||||||
|
set(RESULT "${RESULT};${fileItem}")
|
||||||
|
else()
|
||||||
|
continue()
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# 如果文件夹名称不是平台,则始终包含
|
||||||
|
set(RESULT "${RESULT};${fileItem}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Remove common directory prefix to make the group
|
||||||
|
string(REPLACE "${path}" "" GROUP "${PARENT_DIR}")
|
||||||
|
# Make sure we are using windows slashes
|
||||||
|
string(REPLACE "/" "\\" GROUP "${GROUP}")
|
||||||
|
# Group into "Source Files" and "Header Files"
|
||||||
|
set(GROUP "${GROUP}")
|
||||||
|
source_group("${GROUP}" FILES "${fileItem}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(${out_files} ${RESULT} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(retrieve_files path out_files)
|
||||||
|
set(temp_files "")
|
||||||
|
retrieve_files_custom(${path} "h;hpp;ini;cpp;c;ixx" temp_files)
|
||||||
|
set(${out_files} ${${out_files}} ${temp_files} PARENT_SCOPE)
|
||||||
|
endfunction()
|
39
src/renderer/CMakeLists.txt
Normal file
39
src/renderer/CMakeLists.txt
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
project(renderer)
|
||||||
|
|
||||||
|
set(GL_BACKEND FALSE CACHE BOOL "OpenGL backend to use")
|
||||||
|
set(DX_BACKEND FALSE CACHE BOOL "DirectX backend to use")
|
||||||
|
set(VK_BACKEND FALSE CACHE BOOL "Vulkan backend to use")
|
||||||
|
|
||||||
|
if (NOT GL_BACKEND AND NOT DX_BACKEND AND NOT VK_BACKEND)
|
||||||
|
message(FATAL_ERROR "No backend selected")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(RENDERER_SOURCES
|
||||||
|
renderer.cpp
|
||||||
|
renderer.h
|
||||||
|
renderer_buffer.cpp
|
||||||
|
renderer_buffer.h
|
||||||
|
renderer_texture.cpp
|
||||||
|
renderer_texture.h
|
||||||
|
)
|
||||||
|
|
||||||
|
if (GL_BACKEND)
|
||||||
|
retrieve_files(backend/gl RENDERER_SOURCES)
|
||||||
|
add_definitions(-DGL_BACKEND=1)
|
||||||
|
endif()
|
||||||
|
if (DX_BACKEND)
|
||||||
|
retrieve_files(backend/dx RENDERER_SOURCES)
|
||||||
|
add_definitions(-DDX_BACKEND=1)
|
||||||
|
endif ()
|
||||||
|
if (VK_BACKEND)
|
||||||
|
retrieve_files(backend/vk RENDERER_SOURCES)
|
||||||
|
add_definitions(-DVK_BACKEND=1)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_library(${PROJECT_NAME} STATIC ${RENDERER_SOURCES})
|
||||||
|
target_link_libraries(${PROJECT_NAME} Eigen3::Eigen spdlog::spdlog)
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
if (DX_BACKEND)
|
||||||
|
target_link_libraries(${PROJECT_NAME} d3d11 d3dcompiler dxgi)
|
||||||
|
endif ()
|
51
src/renderer/backend/dx/dx_backend.cpp
Normal file
51
src/renderer/backend/dx/dx_backend.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include "dx_backend.h"
|
||||||
|
|
||||||
|
#include "dx_texture.h"
|
||||||
|
#include "spdlog/spdlog.h"
|
||||||
|
|
||||||
|
std::shared_ptr<renderer_texture> dx_backend::create_texture(const Eigen::Vector2i& size) {
|
||||||
|
D3D11_TEXTURE2D_DESC desc = {};
|
||||||
|
desc.Width = size.x();
|
||||||
|
desc.Height = size.y();
|
||||||
|
desc.MipLevels = 1;
|
||||||
|
desc.ArraySize = 1;
|
||||||
|
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
desc.SampleDesc.Count = 1;
|
||||||
|
desc.SampleDesc.Quality = 0;
|
||||||
|
desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
|
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
desc.MiscFlags = 0;
|
||||||
|
|
||||||
|
ID3D11Texture2D* texture = nullptr;
|
||||||
|
if (FAILED(device->CreateTexture2D(&desc, nullptr, &texture))) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::make_shared<dx_texture>(texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dx_backend::destroy_texture(renderer_texture* texture) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
spdlog::info("Destroying texture");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dx_backend::init() {
|
||||||
|
if (!create_device())
|
||||||
|
return false;
|
||||||
|
if (!create_context())
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dx_backend::create_device() {
|
||||||
|
D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_11_1 };
|
||||||
|
const auto result = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, featureLevels, 2, D3D11_SDK_VERSION, &device, nullptr, nullptr);
|
||||||
|
return SUCCEEDED(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dx_backend::create_context() {
|
||||||
|
device->GetImmediateContext(&context);
|
||||||
|
return true;
|
||||||
|
}
|
22
src/renderer/backend/dx/dx_backend.h
Normal file
22
src/renderer/backend/dx/dx_backend.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "renderer.h"
|
||||||
|
#include <d3d11.h>
|
||||||
|
|
||||||
|
class dx_backend : public renderer {
|
||||||
|
inline static dx_backend* instance = nullptr;
|
||||||
|
public:
|
||||||
|
static dx_backend* get_instance() {
|
||||||
|
return static_cast<dx_backend*>(aorii::s_renderer);
|
||||||
|
}
|
||||||
|
bool init() override;
|
||||||
|
|
||||||
|
std::shared_ptr<renderer_texture> create_texture(const Eigen::Vector2i& size) override;
|
||||||
|
void destroy_texture(renderer_texture* texture) override;
|
||||||
|
private:
|
||||||
|
bool create_device();
|
||||||
|
bool create_context();
|
||||||
|
|
||||||
|
ID3D11Device* device = nullptr;
|
||||||
|
ID3D11DeviceContext* context = nullptr;
|
||||||
|
};
|
||||||
|
|
44
src/renderer/backend/dx/dx_texture.cpp
Normal file
44
src/renderer/backend/dx/dx_texture.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#include "dx_texture.h"
|
||||||
|
|
||||||
|
#include "dx_backend.h"
|
||||||
|
|
||||||
|
dx_texture::dx_texture(ID3D11Texture2D* texture) {
|
||||||
|
m_texture = texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
dx_texture::~dx_texture() {
|
||||||
|
// 如果是Debug模式, 检查m_data是否被释放
|
||||||
|
#if defined(DEBUG)
|
||||||
|
assert(!m_data);
|
||||||
|
#endif
|
||||||
|
free(m_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* dx_texture::lock() {
|
||||||
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
m_texture->GetDesc(&desc);
|
||||||
|
m_data = new char[desc.Width * desc.Height * 4];
|
||||||
|
return m_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dx_texture::unlock() {
|
||||||
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
m_texture->GetDesc(&desc);
|
||||||
|
D3D11_MAPPED_SUBRESOURCE mappedResource;
|
||||||
|
auto context = dx_backend::get_instance();
|
||||||
|
context->Map(m_texture.get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
|
||||||
|
memcpy(mappedResource.pData, m_data, desc.Width * desc.Height * 4);
|
||||||
|
context->Unmap(m_texture.get(), 0);
|
||||||
|
delete[] m_data;
|
||||||
|
m_data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dx_texture::resize(const Eigen::Vector2i& size) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Eigen::Vector2i dx_texture::size() {
|
||||||
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
m_texture->GetDesc(&desc);
|
||||||
|
return { desc.Width, desc.Height };
|
||||||
|
}
|
19
src/renderer/backend/dx/dx_texture.h
Normal file
19
src/renderer/backend/dx/dx_texture.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "renderer_texture.h"
|
||||||
|
#include <d3d11.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
// DX11纹理
|
||||||
|
class dx_texture : public renderer_texture {
|
||||||
|
public:
|
||||||
|
explicit dx_texture(ID3D11Texture2D* texture);
|
||||||
|
~dx_texture() override;
|
||||||
|
void* lock() override;
|
||||||
|
void unlock() override;
|
||||||
|
|
||||||
|
bool resize(const Eigen::Vector2i& size) override;
|
||||||
|
Eigen::Vector2i size() override;
|
||||||
|
private:
|
||||||
|
void* m_data = nullptr;
|
||||||
|
ID3D11Texture2D* m_texture;
|
||||||
|
};
|
29
src/renderer/renderer.cpp
Normal file
29
src/renderer/renderer.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "renderer.h"
|
||||||
|
|
||||||
|
#ifdef DX_BACKEND
|
||||||
|
#include "backend/dx/dx_backend.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool aorii::create_renderer(renderer_api api) {
|
||||||
|
if (s_renderer)
|
||||||
|
return true;
|
||||||
|
switch (api) {
|
||||||
|
#ifdef DX_BACKEND
|
||||||
|
case renderer_api::dx11:
|
||||||
|
s_renderer = new dx_backend();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef GL_BACKEND
|
||||||
|
case renderer_api::opengl:
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef VK_BACKEND
|
||||||
|
case renderer_api::vulkan:
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return s_renderer->init();
|
||||||
|
}
|
26
src/renderer/renderer.h
Normal file
26
src/renderer/renderer.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <memory>
|
||||||
|
#include <Eigen/Eigen>
|
||||||
|
|
||||||
|
class renderer_texture;
|
||||||
|
|
||||||
|
enum class renderer_api {
|
||||||
|
dx11,
|
||||||
|
opengl,
|
||||||
|
vulkan,
|
||||||
|
};
|
||||||
|
|
||||||
|
class renderer {
|
||||||
|
public:
|
||||||
|
virtual ~renderer() = default;
|
||||||
|
|
||||||
|
virtual std::shared_ptr<renderer_texture> create_texture(const Eigen::Vector2i& size) = 0;
|
||||||
|
virtual void destroy_texture(renderer_texture* texture) = 0;
|
||||||
|
|
||||||
|
virtual bool init() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace aorii {
|
||||||
|
inline static renderer* s_renderer = nullptr;
|
||||||
|
bool create_renderer(renderer_api api);
|
||||||
|
}
|
1
src/renderer/renderer_buffer.cpp
Normal file
1
src/renderer/renderer_buffer.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "renderer_buffer.h"
|
5
src/renderer/renderer_buffer.h
Normal file
5
src/renderer/renderer_buffer.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
class renderer_buffer {
|
||||||
|
|
||||||
|
};
|
1
src/renderer/renderer_texture.cpp
Normal file
1
src/renderer/renderer_texture.cpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "renderer_texture.h"
|
14
src/renderer/renderer_texture.h
Normal file
14
src/renderer/renderer_texture.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Eigen/Eigen>
|
||||||
|
|
||||||
|
class renderer_texture {
|
||||||
|
public:
|
||||||
|
virtual ~renderer_texture() = default;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void* lock() = 0;
|
||||||
|
virtual void unlock() = 0;
|
||||||
|
|
||||||
|
virtual bool resize(const Eigen::Vector2i& size) = 0;
|
||||||
|
virtual Eigen::Vector2i size() = 0;
|
||||||
|
};
|
0
src/widget/CMakeLists.txt
Normal file
0
src/widget/CMakeLists.txt
Normal file
Loading…
x
Reference in New Issue
Block a user