feat(d3d12): 新增纹理资源类,修复 Surface 重复释放问题
核心变更: - 新增 d3d12_texture 和 d3d12_render_texture 类 - 新增 d3d12_texture_init_info 结构,支持三种资源创建方式 - 新增 D3D12Helpers.h,提供堆属性辅助结构 - 改用 utl::free_list 管理 surface,解决重复释放问题 - 为 d3d12_surface 添加移动语义,支持撕裂检测 文档完善: - 为 FreeList.h 和 Vector.h 添加完整 Doxygen 中文注释 - 更新 D3D12 学习 Wiki,添加 SRV、资源创建方式、纹理资源类章节 - 新增变更记录文档
This commit is contained in:
@@ -69,7 +69,61 @@ public:
|
||||
* @details
|
||||
* 调用 release() 清理交换链和渲染目标资源。
|
||||
*/
|
||||
~d3d12_surface(){release();}
|
||||
~d3d12_surface(){ release(); }
|
||||
|
||||
|
||||
constexpr static u32 buffer_count{ 3 };
|
||||
|
||||
#if USE_STL_VECTOR
|
||||
DISABLE_COPY(d3d12_surface)
|
||||
|
||||
/**
|
||||
* @brief 移动构造函数
|
||||
*
|
||||
* @param o 要移动的源对象
|
||||
*
|
||||
* @details
|
||||
* 转移所有资源所有权,将源对象置为空状态。
|
||||
* 用于 vector 扩容时安全转移资源。
|
||||
*/
|
||||
constexpr d3d12_surface(d3d12_surface&& o) noexcept
|
||||
: _swap_chain{o._swap_chain}, _window{o._window}, _current_bb_index{o._current_bb_index}
|
||||
, _viewport{o._viewport}, _scissor_rect{o._scissor_rect}
|
||||
, _allow_tearing{o._allow_tearing}, _present_flags{o._present_flags}
|
||||
{
|
||||
for (u32 i = 0; i < frame_buffer_count; ++i)
|
||||
{
|
||||
_render_target_data[i].resource = o._render_target_data[i].resource;
|
||||
_render_target_data[i].rtv = o._render_target_data[i].rtv;
|
||||
}
|
||||
|
||||
o.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 移动赋值运算符
|
||||
*
|
||||
* @param o 要移动的源对象
|
||||
* @return 当前对象引用
|
||||
*
|
||||
* @details
|
||||
* 先释放当前资源,再转移所有权。
|
||||
*/
|
||||
constexpr d3d12_surface& operator=(d3d12_surface&& o) noexcept
|
||||
{
|
||||
assert(this != &o);
|
||||
if (this != &o)
|
||||
{
|
||||
release();
|
||||
move(o);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
#else
|
||||
DISABLE_COPY_AND_MOVE(d3d12_surface);
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @brief 创建交换链和渲染目标视图
|
||||
@@ -167,6 +221,43 @@ public:
|
||||
constexpr const D3D12_RECT& scissor_rect() const {return _scissor_rect;}
|
||||
|
||||
private:
|
||||
|
||||
#if USE_STL_VECTOR
|
||||
constexpr void move(d3d12_surface& o)
|
||||
{
|
||||
_swap_chain = o._swap_chain;
|
||||
for (u32 i = 0; i < frame_buffer_count; ++i)
|
||||
{
|
||||
_render_target_data[i] = o._render_target_data[i];
|
||||
}
|
||||
_window = o._window;
|
||||
_current_bb_index = o._current_bb_index;
|
||||
_viewport = o._viewport;
|
||||
_scissor_rect = o._scissor_rect;
|
||||
_allow_tearing = o._allow_tearing;
|
||||
_present_flags = o._present_flags;
|
||||
|
||||
o.reset();
|
||||
}
|
||||
|
||||
|
||||
constexpr void reset()
|
||||
{
|
||||
_swap_chain = nullptr;
|
||||
for (u32 i = 0; i < frame_buffer_count; ++i)
|
||||
{
|
||||
_render_target_data[i] = {};
|
||||
}
|
||||
_window = {};
|
||||
_current_bb_index = 0;
|
||||
_viewport = {};
|
||||
_scissor_rect = {};
|
||||
_allow_tearing = 0;
|
||||
_present_flags = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief 释放所有资源
|
||||
*
|
||||
@@ -200,11 +291,13 @@ private:
|
||||
};
|
||||
|
||||
IDXGISwapChain4* _swap_chain{nullptr}; ///< DXGI 交换链对象
|
||||
render_target_data _render_target_data[frame_buffer_count];///< 后台缓冲区数据数组
|
||||
render_target_data _render_target_data[buffer_count]; ///< 后台缓冲区数据数组
|
||||
platform::window _window{}; ///< 关联的平台窗口
|
||||
mutable u32 _current_bb_index{0}; ///< 当前后台缓冲区索引
|
||||
D3D12_VIEWPORT _viewport{}; ///< 视口描述
|
||||
D3D12_RECT _scissor_rect{}; ///< 裁剪矩形
|
||||
u32 _allow_tearing{ 0 }; ///< 是否允许撕裂
|
||||
u32 _present_flags{ 0 }; ///< 呈现标志位
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user