Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
GamebabyRockSun_QQ
GRSD3D12Sample
提交
c663963f
G
GRSD3D12Sample
项目概览
GamebabyRockSun_QQ
/
GRSD3D12Sample
大约 1 年 前同步成功
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
1
Wiki
分析
仓库
DevOps
项目成员
Pages
G
GRSD3D12Sample
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
1
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c663963f
编写于
6月 04, 2021
作者:
GamebabyRockSun_QQ
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
去除了示例6中关于d3dx12.h的所有引用
上级
9f7cc4ec
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
314 addition
and
92 deletion
+314
-92
6-MultiThread/6-MultiThreadWithMsgWait.cpp
6-MultiThread/6-MultiThreadWithMsgWait.cpp
+314
-92
未找到文件。
6-MultiThread/6-MultiThreadWithMsgWait.cpp
浏览文件 @
c663963f
...
...
@@ -14,7 +14,7 @@
#include <dxgidebug.h>
#endif
#include <DirectXMath.h>
#include "..\WindowsCommons\d3dx12.h"
//
#include "..\WindowsCommons\d3dx12.h"
#include "..\WindowsCommons\DDSTextureLoader12.h"
using
namespace
std
;
...
...
@@ -37,6 +37,12 @@ using namespace DirectX;
//更简洁的向上边界对齐算法 内存管理中常用 请记住
#define GRS_UPPER(A,B) ((UINT)(((A)+((B)-1))&~(B - 1)))
// 内存分配的宏定义
#define GRS_ALLOC(sz) ::HeapAlloc(GetProcessHeap(),0,(sz))
#define GRS_CALLOC(sz) ::HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(sz))
#define GRS_CREALLOC(p,sz) ::HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(p),(sz))
#define GRS_SAFE_FREE(p) if( nullptr != (p) ){ ::HeapFree( ::GetProcessHeap(),0,(p) ); (p) = nullptr; }
//------------------------------------------------------------------------------------------------------------
// 为了调试加入下面的内联函数和宏定义,为每个接口对象设置名称,方便查看调试输出
#if defined(_DEBUG)
...
...
@@ -158,11 +164,11 @@ struct ST_GRS_THREAD_PARAMS
ID3D12PipelineState
*
pIPSO
;
};
int
g_iWndWidth
=
1024
;
int
g_iWndHeight
=
768
;
int
g_iWndWidth
=
1024
;
int
g_iWndHeight
=
768
;
CD3DX12_VIEWPORT
g_stViewPort
(
0.0
f
,
0.0
f
,
static_cast
<
float
>
(
g_iWndWidth
),
static_cast
<
float
>
(
g_iWndHeight
))
;
CD3DX12_RECT
g_stScissorRect
(
0
,
0
,
static_cast
<
LONG
>
(
g_iWndWidth
),
static_cast
<
LONG
>
(
g_iWndHeight
))
;
D3D12_VIEWPORT
g_stViewPort
=
{
0.0
f
,
0.0
f
,
static_cast
<
float
>
(
g_iWndWidth
),
static_cast
<
float
>
(
g_iWndHeight
)
}
;
D3D12_RECT
g_stScissorRect
=
{
0
,
0
,
static_cast
<
LONG
>
(
g_iWndWidth
),
static_cast
<
LONG
>
(
g_iWndHeight
)
}
;
//初始的默认摄像机的位置
XMFLOAT3
g_f3EyePos
=
XMFLOAT3
(
0.0
f
,
5.0
f
,
-
10.0
f
);
//眼睛位置
...
...
@@ -193,9 +199,9 @@ ComPtr<ID3D12DescriptorHeap> g_pIDSVHeap; //
TCHAR
g_pszAppPath
[
MAX_PATH
]
=
{};
UINT
__stdcall
RenderThread
(
void
*
pParam
);
UINT
__stdcall
RenderThread
(
void
*
pParam
);
LRESULT
CALLBACK
WndProc
(
HWND
,
UINT
,
WPARAM
,
LPARAM
);
BOOL
LoadMeshVertex
(
const
CHAR
*
pszMeshFileName
,
UINT
&
nVertexCnt
,
ST_GRS_VERTEX
*&
ppVertex
,
UINT
*&
ppIndices
);
BOOL
LoadMeshVertex
(
const
CHAR
*
pszMeshFileName
,
UINT
&
nVertexCnt
,
ST_GRS_VERTEX
*&
ppVertex
,
UINT
*&
ppIndices
);
int
APIENTRY
_tWinMain
(
HINSTANCE
hInstance
,
HINSTANCE
hPrevInstance
,
LPWSTR
lpCmdLine
,
int
nCmdShow
)
{
...
...
@@ -316,8 +322,6 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
{
GRS_THROW_IF_FAILED
(
CreateDXGIFactory2
(
nDXGIFactoryFlags
,
IID_PPV_ARGS
(
&
pIDXGIFactory5
)));
GRS_SET_DXGI_DEBUGNAME_COMPTR
(
pIDXGIFactory5
);
// 关闭ALT+ENTER键切换全屏的功能,因为我们没有实现OnSize处理,所以先关闭
GRS_THROW_IF_FAILED
(
pIDXGIFactory5
->
MakeWindowAssociation
(
hWnd
,
DXGI_MWA_NO_ALT_ENTER
));
}
//4、枚举适配器创建设备
...
...
@@ -413,36 +417,53 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
g_nRTVDescriptorSize
=
pID3D12Device4
->
GetDescriptorHandleIncrementSize
(
D3D12_DESCRIPTOR_HEAP_TYPE_RTV
);
//---------------------------------------------------------------------------------------------
CD3DX12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
(
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
()
);
D3D12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
=
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
(
);
for
(
UINT
i
=
0
;
i
<
g_nFrameBackBufCount
;
i
++
)
{
//这个循环暴漏了描述符堆实际上是个数组的本质
GRS_THROW_IF_FAILED
(
pISwapChain3
->
GetBuffer
(
i
,
IID_PPV_ARGS
(
&
g_pIARenderTargets
[
i
])));
GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR
(
g_pIARenderTargets
,
i
);
pID3D12Device4
->
CreateRenderTargetView
(
g_pIARenderTargets
[
i
].
Get
(),
nullptr
,
stRTVHandle
);
stRTVHandle
.
Offset
(
1
,
g_nRTVDescriptorSize
)
;
stRTVHandle
.
ptr
+=
g_nRTVDescriptorSize
;
}
// 关闭ALT+ENTER键切换全屏的功能,因为我们没有实现OnSize处理,所以先关闭
GRS_THROW_IF_FAILED
(
pIDXGIFactory5
->
MakeWindowAssociation
(
hWnd
,
DXGI_MWA_NO_ALT_ENTER
));
}
//7、创建深度缓冲及深度缓冲描述符堆
{
D3D12_HEAP_PROPERTIES
stDSBufHeapDesc
=
{};
stDSBufHeapDesc
.
Type
=
D3D12_HEAP_TYPE_DEFAULT
;
stDSBufHeapDesc
.
CPUPageProperty
=
D3D12_CPU_PAGE_PROPERTY_UNKNOWN
;
stDSBufHeapDesc
.
MemoryPoolPreference
=
D3D12_MEMORY_POOL_UNKNOWN
;
stDSBufHeapDesc
.
CreationNodeMask
=
0
;
stDSBufHeapDesc
.
VisibleNodeMask
=
0
;
D3D12_CLEAR_VALUE
stDepthOptimizedClearValue
=
{};
stDepthOptimizedClearValue
.
Format
=
emDSFormat
;
stDepthOptimizedClearValue
.
DepthStencil
.
Depth
=
1.0
f
;
stDepthOptimizedClearValue
.
DepthStencil
.
Stencil
=
0
;
D3D12_RESOURCE_DESC
stDSResDesc
=
{};
stDSResDesc
.
Dimension
=
D3D12_RESOURCE_DIMENSION_TEXTURE2D
;
stDSResDesc
.
Alignment
=
0
;
stDSResDesc
.
Format
=
emDSFormat
;
stDSResDesc
.
Width
=
g_iWndWidth
;
stDSResDesc
.
Height
=
g_iWndHeight
;
stDSResDesc
.
DepthOrArraySize
=
1
;
stDSResDesc
.
MipLevels
=
0
;
stDSResDesc
.
SampleDesc
.
Count
=
1
;
stDSResDesc
.
SampleDesc
.
Quality
=
0
;
stDSResDesc
.
Layout
=
D3D12_TEXTURE_LAYOUT_UNKNOWN
;
stDSResDesc
.
Flags
=
D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL
;
//使用隐式默认堆创建一个深度蜡板缓冲区,
//因为基本上深度缓冲区会一直被使用,重用的意义不大,所以直接使用隐式堆,图方便
GRS_THROW_IF_FAILED
(
pID3D12Device4
->
CreateCommittedResource
(
&
CD3DX12_HEAP_PROPERTIES
(
D3D12_HEAP_TYPE_DEFAULT
)
&
stDSBufHeapDesc
,
D3D12_HEAP_FLAG_NONE
,
&
CD3DX12_RESOURCE_DESC
::
Tex2D
(
emDSFormat
,
g_iWndWidth
,
g_iWndHeight
,
1
,
0
,
1
,
0
,
D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL
)
,
&
stDSResDesc
,
D3D12_RESOURCE_STATE_DEPTH_WRITE
,
&
stDepthOptimizedClearValue
,
IID_PPV_ARGS
(
&
pIDepthStencilBuffer
)
...
...
@@ -491,31 +512,61 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
// 检测是否支持V1.1版本的根签名
stFeatureData
.
HighestVersion
=
D3D_ROOT_SIGNATURE_VERSION_1_1
;
if
(
FAILED
(
pID3D12Device4
->
CheckFeatureSupport
(
D3D12_FEATURE_ROOT_SIGNATURE
,
&
stFeatureData
,
sizeof
(
stFeatureData
))))
{
stFeatureData
.
HighestVersion
=
D3D_ROOT_SIGNATURE_VERSION_1_0
;
{
// 1.0版 直接丢异常退出了
GRS_THROW_IF_FAILED
(
E_NOTIMPL
)
;
}
CD3DX12_DESCRIPTOR_RANGE1
stDSPRanges
[
3
];
stDSPRanges
[
0
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_CBV
,
1
,
0
);
stDSPRanges
[
1
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_SRV
,
1
,
0
);
stDSPRanges
[
2
].
Init
(
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER
,
1
,
0
);
CD3DX12_ROOT_PARAMETER1
stRootParameters
[
3
];
stRootParameters
[
0
].
InitAsDescriptorTable
(
1
,
&
stDSPRanges
[
0
],
D3D12_SHADER_VISIBILITY_ALL
);
//CBV是所有Shader可见
stRootParameters
[
1
].
InitAsDescriptorTable
(
1
,
&
stDSPRanges
[
1
],
D3D12_SHADER_VISIBILITY_PIXEL
);
//SRV仅PS可见
stRootParameters
[
2
].
InitAsDescriptorTable
(
1
,
&
stDSPRanges
[
2
],
D3D12_SHADER_VISIBILITY_PIXEL
);
//SAMPLE仅PS可见
CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC
stRootSignatureDesc
;
stRootSignatureDesc
.
Init_1_1
(
_countof
(
stRootParameters
)
,
stRootParameters
,
0
,
nullptr
,
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
);
D3D12_DESCRIPTOR_RANGE1
stDSPRanges
[
3
]
=
{};
stDSPRanges
[
0
].
RangeType
=
D3D12_DESCRIPTOR_RANGE_TYPE_CBV
;
stDSPRanges
[
0
].
NumDescriptors
=
1
;
stDSPRanges
[
0
].
BaseShaderRegister
=
0
;
stDSPRanges
[
0
].
RegisterSpace
=
0
;
stDSPRanges
[
0
].
Flags
=
D3D12_DESCRIPTOR_RANGE_FLAG_NONE
;
stDSPRanges
[
0
].
OffsetInDescriptorsFromTableStart
=
0
;
stDSPRanges
[
1
].
RangeType
=
D3D12_DESCRIPTOR_RANGE_TYPE_SRV
;
stDSPRanges
[
1
].
NumDescriptors
=
1
;
stDSPRanges
[
1
].
BaseShaderRegister
=
0
;
stDSPRanges
[
1
].
RegisterSpace
=
0
;
stDSPRanges
[
1
].
Flags
=
D3D12_DESCRIPTOR_RANGE_FLAG_NONE
;
stDSPRanges
[
1
].
OffsetInDescriptorsFromTableStart
=
0
;
stDSPRanges
[
2
].
RangeType
=
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER
;
stDSPRanges
[
2
].
NumDescriptors
=
1
;
stDSPRanges
[
2
].
BaseShaderRegister
=
0
;
stDSPRanges
[
2
].
RegisterSpace
=
0
;
stDSPRanges
[
2
].
Flags
=
D3D12_DESCRIPTOR_RANGE_FLAG_NONE
;
stDSPRanges
[
2
].
OffsetInDescriptorsFromTableStart
=
0
;
D3D12_ROOT_PARAMETER1
stRootParameters
[
3
]
=
{};
stRootParameters
[
0
].
ParameterType
=
D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
;
stRootParameters
[
0
].
ShaderVisibility
=
D3D12_SHADER_VISIBILITY_ALL
;
stRootParameters
[
0
].
DescriptorTable
.
NumDescriptorRanges
=
1
;
stRootParameters
[
0
].
DescriptorTable
.
pDescriptorRanges
=
&
stDSPRanges
[
0
];
stRootParameters
[
1
].
ParameterType
=
D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
;
stRootParameters
[
1
].
ShaderVisibility
=
D3D12_SHADER_VISIBILITY_PIXEL
;
stRootParameters
[
1
].
DescriptorTable
.
NumDescriptorRanges
=
1
;
stRootParameters
[
1
].
DescriptorTable
.
pDescriptorRanges
=
&
stDSPRanges
[
1
];
stRootParameters
[
2
].
ParameterType
=
D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE
;
stRootParameters
[
2
].
ShaderVisibility
=
D3D12_SHADER_VISIBILITY_PIXEL
;
stRootParameters
[
2
].
DescriptorTable
.
NumDescriptorRanges
=
1
;
stRootParameters
[
2
].
DescriptorTable
.
pDescriptorRanges
=
&
stDSPRanges
[
2
];
D3D12_VERSIONED_ROOT_SIGNATURE_DESC
stRootSignatureDesc
=
{};
stRootSignatureDesc
.
Version
=
D3D_ROOT_SIGNATURE_VERSION_1_1
;
stRootSignatureDesc
.
Desc_1_1
.
Flags
=
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
;
stRootSignatureDesc
.
Desc_1_1
.
NumParameters
=
_countof
(
stRootParameters
);
stRootSignatureDesc
.
Desc_1_1
.
pParameters
=
stRootParameters
;
stRootSignatureDesc
.
Desc_1_1
.
NumStaticSamplers
=
0
;
stRootSignatureDesc
.
Desc_1_1
.
pStaticSamplers
=
nullptr
;
ComPtr
<
ID3DBlob
>
pISignatureBlob
;
ComPtr
<
ID3DBlob
>
pIErrorBlob
;
GRS_THROW_IF_FAILED
(
D3DX12SerializeVersionedRootSignature
(
&
stRootSignatureDesc
,
stFeatureData
.
HighestVersion
GRS_THROW_IF_FAILED
(
D3D12SerializeVersionedRootSignature
(
&
stRootSignatureDesc
,
&
pISignatureBlob
,
&
pIErrorBlob
));
...
...
@@ -558,10 +609,18 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
D3D12_GRAPHICS_PIPELINE_STATE_DESC
stPSODesc
=
{};
stPSODesc
.
InputLayout
=
{
stIALayoutSphere
,
_countof
(
stIALayoutSphere
)
};
stPSODesc
.
pRootSignature
=
pIRootSignature
.
Get
();
stPSODesc
.
VS
=
CD3DX12_SHADER_BYTECODE
(
pIVSSphere
.
Get
());
stPSODesc
.
PS
=
CD3DX12_SHADER_BYTECODE
(
pIPSSphere
.
Get
());
stPSODesc
.
RasterizerState
=
CD3DX12_RASTERIZER_DESC
(
D3D12_DEFAULT
);
stPSODesc
.
BlendState
=
CD3DX12_BLEND_DESC
(
D3D12_DEFAULT
);
stPSODesc
.
VS
.
BytecodeLength
=
pIVSSphere
->
GetBufferSize
();
stPSODesc
.
VS
.
pShaderBytecode
=
pIVSSphere
->
GetBufferPointer
();
stPSODesc
.
PS
.
BytecodeLength
=
pIPSSphere
->
GetBufferSize
();
stPSODesc
.
PS
.
pShaderBytecode
=
pIPSSphere
->
GetBufferPointer
();
stPSODesc
.
RasterizerState
.
FillMode
=
D3D12_FILL_MODE_SOLID
;
stPSODesc
.
RasterizerState
.
CullMode
=
D3D12_CULL_MODE_BACK
;
stPSODesc
.
BlendState
.
AlphaToCoverageEnable
=
FALSE
;
stPSODesc
.
BlendState
.
IndependentBlendEnable
=
FALSE
;
stPSODesc
.
BlendState
.
RenderTarget
[
0
].
RenderTargetWriteMask
=
D3D12_COLOR_WRITE_ENABLE_ALL
;
stPSODesc
.
SampleMask
=
UINT_MAX
;
stPSODesc
.
SampleDesc
.
Count
=
1
;
stPSODesc
.
PrimitiveTopologyType
=
D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE
;
...
...
@@ -657,6 +716,25 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
}
}
D3D12_RESOURCE_BARRIER
stBeginResBarrier
=
{};
D3D12_RESOURCE_BARRIER
stEneResBarrier
=
{};
{
stBeginResBarrier
.
Type
=
D3D12_RESOURCE_BARRIER_TYPE_TRANSITION
;
stBeginResBarrier
.
Flags
=
D3D12_RESOURCE_BARRIER_FLAG_NONE
;
stBeginResBarrier
.
Transition
.
pResource
=
g_pIARenderTargets
[
nCurrentFrameIndex
].
Get
();
stBeginResBarrier
.
Transition
.
StateBefore
=
D3D12_RESOURCE_STATE_PRESENT
;
stBeginResBarrier
.
Transition
.
StateAfter
=
D3D12_RESOURCE_STATE_RENDER_TARGET
;
stBeginResBarrier
.
Transition
.
Subresource
=
D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES
;
stEneResBarrier
.
Type
=
D3D12_RESOURCE_BARRIER_TYPE_TRANSITION
;
stEneResBarrier
.
Flags
=
D3D12_RESOURCE_BARRIER_FLAG_NONE
;
stEneResBarrier
.
Transition
.
pResource
=
g_pIARenderTargets
[
nCurrentFrameIndex
].
Get
();
stEneResBarrier
.
Transition
.
StateBefore
=
D3D12_RESOURCE_STATE_RENDER_TARGET
;
stEneResBarrier
.
Transition
.
StateAfter
=
D3D12_RESOURCE_STATE_PRESENT
;
stEneResBarrier
.
Transition
.
Subresource
=
D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES
;
}
UINT
nStates
=
0
;
//初始状态为0
DWORD
dwRet
=
0
;
DWORD
dwWaitCnt
=
0
;
...
...
@@ -753,17 +831,13 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
//渲染前处理
{
pICmdListPre
->
ResourceBarrier
(
1
,
&
CD3DX12_RESOURCE_BARRIER
::
Transition
(
g_pIARenderTargets
[
nCurrentFrameIndex
].
Get
()
,
D3D12_RESOURCE_STATE_PRESENT
,
D3D12_RESOURCE_STATE_RENDER_TARGET
)
);
stBeginResBarrier
.
Transition
.
pResource
=
g_pIARenderTargets
[
nCurrentFrameIndex
].
Get
();
pICmdListPre
->
ResourceBarrier
(
1
,
&
stBeginResBarrier
);
//偏移描述符指针到指定帧缓冲视图位置
CD3DX12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
(
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
()
,
nCurrentFrameIndex
,
g_nRTVDescriptorSize
);
CD3DX12_CPU_DESCRIPTOR_HANDLE
dsvHandle
(
g_pIDSVHeap
->
GetCPUDescriptorHandleForHeapStart
()
);
D3D12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
=
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
();
stRTVHandle
.
ptr
+=
(
nCurrentFrameIndex
*
g_nRTVDescriptorSize
);
D3D12_CPU_DESCRIPTOR_HANDLE
dsvHandle
=
g_pIDSVHeap
->
GetCPUDescriptorHandleForHeapStart
(
);
//设置渲染目标
pICmdListPre
->
OMSetRenderTargets
(
1
,
&
stRTVHandle
,
FALSE
,
&
dsvHandle
);
...
...
@@ -795,11 +869,8 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
break
;
case
2
:
// 状态2 表示所有的渲染命令列表都记录完成了,开始后处理和执行命令列表
{
pICmdListPost
->
ResourceBarrier
(
1
,
&
CD3DX12_RESOURCE_BARRIER
::
Transition
(
g_pIARenderTargets
[
nCurrentFrameIndex
].
Get
()
,
D3D12_RESOURCE_STATE_RENDER_TARGET
,
D3D12_RESOURCE_STATE_PRESENT
));
stEneResBarrier
.
Transition
.
pResource
=
g_pIARenderTargets
[
nCurrentFrameIndex
].
Get
();
pICmdListPost
->
ResourceBarrier
(
1
,
&
stEneResBarrier
);
//关闭命令列表,可以去执行了
GRS_THROW_IF_FAILED
(
pICmdListPre
->
Close
());
...
...
@@ -871,7 +942,6 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR l
}
KillTimer
(
hWnd
,
WM_USER
+
100
);
}
catch
(
CGRSCOMException
&
e
)
{
//发生了COM异常
...
...
@@ -949,32 +1019,144 @@ UINT __stdcall RenderThread(void* pParam)
,
pbDDSData
,
stArSubResources
,
SIZE_MAX
,
&
emAlphaMode
,
&
bIsCube
));
GRS_SET_D3D12_DEBUGNAME_COMPTR
(
pITexture
);
UINT64
n64szUpSphere
=
GetRequiredIntermediateSize
(
pITexture
.
Get
(),
0
,
static_cast
<
UINT
>
(
stArSubResources
.
size
()));
D3D12_RESOURCE_DESC
stTXDesc
=
pITexture
->
GetDesc
();
UINT64
n64szUpSphere
=
0
;
pThdPms
->
pID3D12Device4
->
GetCopyableFootprints
(
&
stTXDesc
,
0
,
1
,
0
,
nullptr
,
nullptr
,
nullptr
,
&
n64szUpSphere
);
D3D12_HEAP_PROPERTIES
stHeapProp
=
{};
stHeapProp
.
Type
=
D3D12_HEAP_TYPE_UPLOAD
;
stHeapProp
.
CPUPageProperty
=
D3D12_CPU_PAGE_PROPERTY_UNKNOWN
;
stHeapProp
.
MemoryPoolPreference
=
D3D12_MEMORY_POOL_UNKNOWN
;
stHeapProp
.
CreationNodeMask
=
1
;
stHeapProp
.
VisibleNodeMask
=
1
;
D3D12_RESOURCE_DESC
stUploadBufDesc
=
{};
stUploadBufDesc
.
Dimension
=
D3D12_RESOURCE_DIMENSION_BUFFER
;
stUploadBufDesc
.
Alignment
=
D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT
;
stUploadBufDesc
.
Width
=
n64szUpSphere
;
stUploadBufDesc
.
Height
=
1
;
stUploadBufDesc
.
DepthOrArraySize
=
1
;
stUploadBufDesc
.
MipLevels
=
1
;
stUploadBufDesc
.
Format
=
DXGI_FORMAT_UNKNOWN
;
stUploadBufDesc
.
SampleDesc
.
Count
=
1
;
stUploadBufDesc
.
SampleDesc
.
Quality
=
0
;
stUploadBufDesc
.
Layout
=
D3D12_TEXTURE_LAYOUT_ROW_MAJOR
;
stUploadBufDesc
.
Flags
=
D3D12_RESOURCE_FLAG_NONE
;
GRS_THROW_IF_FAILED
(
pThdPms
->
pID3D12Device4
->
CreateCommittedResource
(
&
CD3DX12_HEAP_PROPERTIES
(
D3D12_HEAP_TYPE_UPLOAD
)
&
stHeapProp
,
D3D12_HEAP_FLAG_NONE
,
&
CD3DX12_RESOURCE_DESC
::
Buffer
(
n64szUpSphere
)
,
&
stUploadBufDesc
,
D3D12_RESOURCE_STATE_GENERIC_READ
,
nullptr
,
IID_PPV_ARGS
(
&
pITextureUpload
)));
GRS_SET_D3D12_DEBUGNAME_COMPTR
(
pITextureUpload
);
UpdateSubresources
(
pThdPms
->
pICmdList
,
pITexture
.
Get
()
,
pITextureUpload
.
Get
()
,
0
,
0
,
static_cast
<
UINT
>
(
stArSubResources
.
size
())
,
stArSubResources
.
data
());
//UpdateSubresources(pThdPms->pICmdList
// , pITexture.Get()
// , pITextureUpload.Get()
// , 0
// , 0
// , static_cast<UINT>(stArSubResources.size())
// , stArSubResources.data());
UINT
nFirstSubresource
=
0
;
UINT
nNumSubresources
=
static_cast
<
UINT
>
(
stArSubResources
.
size
());
D3D12_RESOURCE_DESC
stUploadResDesc
=
pITextureUpload
->
GetDesc
();
D3D12_RESOURCE_DESC
stDefaultResDesc
=
pITexture
->
GetDesc
();
UINT64
n64RequiredSize
=
0
;
SIZE_T
szMemToAlloc
=
static_cast
<
UINT64
>
(
sizeof
(
D3D12_PLACED_SUBRESOURCE_FOOTPRINT
)
+
sizeof
(
UINT
)
+
sizeof
(
UINT64
))
*
nNumSubresources
;
void
*
pMem
=
GRS_CALLOC
(
static_cast
<
SIZE_T
>
(
szMemToAlloc
));
if
(
nullptr
==
pMem
)
{
throw
CGRSCOMException
(
HRESULT_FROM_WIN32
(
GetLastError
()));
}
D3D12_PLACED_SUBRESOURCE_FOOTPRINT
*
pLayouts
=
reinterpret_cast
<
D3D12_PLACED_SUBRESOURCE_FOOTPRINT
*>
(
pMem
);
UINT64
*
pRowSizesInBytes
=
reinterpret_cast
<
UINT64
*>
(
pLayouts
+
nNumSubresources
);
UINT
*
pNumRows
=
reinterpret_cast
<
UINT
*>
(
pRowSizesInBytes
+
nNumSubresources
);
// 这里是第二次调用GetCopyableFootprints,就得到了所有子资源的详细信息
pThdPms
->
pID3D12Device4
->
GetCopyableFootprints
(
&
stDefaultResDesc
,
nFirstSubresource
,
nNumSubresources
,
0
,
pLayouts
,
pNumRows
,
pRowSizesInBytes
,
&
n64RequiredSize
);
BYTE
*
pData
=
nullptr
;
HRESULT
hr
=
pITextureUpload
->
Map
(
0
,
nullptr
,
reinterpret_cast
<
void
**>
(
&
pData
));
if
(
FAILED
(
hr
))
{
return
0
;
}
// 第一遍Copy!注意3重循环每重的意思
for
(
UINT
i
=
0
;
i
<
nNumSubresources
;
++
i
)
{
// SubResources
if
(
pRowSizesInBytes
[
i
]
>
(
SIZE_T
)
-
1
)
{
throw
CGRSCOMException
(
E_FAIL
);
}
D3D12_MEMCPY_DEST
stCopyDestData
=
{
pData
+
pLayouts
[
i
].
Offset
,
pLayouts
[
i
].
Footprint
.
RowPitch
,
pLayouts
[
i
].
Footprint
.
RowPitch
*
pNumRows
[
i
]
};
for
(
UINT
z
=
0
;
z
<
pLayouts
[
i
].
Footprint
.
Depth
;
++
z
)
{
// Mipmap
BYTE
*
pDestSlice
=
reinterpret_cast
<
BYTE
*>
(
stCopyDestData
.
pData
)
+
stCopyDestData
.
SlicePitch
*
z
;
const
BYTE
*
pSrcSlice
=
reinterpret_cast
<
const
BYTE
*>
(
stArSubResources
[
i
].
pData
)
+
stArSubResources
[
i
].
SlicePitch
*
z
;
for
(
UINT
y
=
0
;
y
<
pNumRows
[
i
];
++
y
)
{
// Rows
memcpy
(
pDestSlice
+
stCopyDestData
.
RowPitch
*
y
,
pSrcSlice
+
stArSubResources
[
i
].
RowPitch
*
y
,
(
SIZE_T
)
pRowSizesInBytes
[
i
]);
}
}
}
pITextureUpload
->
Unmap
(
0
,
nullptr
);
// 第二次Copy!
if
(
stDefaultResDesc
.
Dimension
==
D3D12_RESOURCE_DIMENSION_BUFFER
)
{
// Buffer 一次性复制就可以了,因为没有行对齐和行大小不一致的问题,Buffer中行数就是1
pThdPms
->
pICmdList
->
CopyBufferRegion
(
pITexture
.
Get
(),
0
,
pITextureUpload
.
Get
(),
pLayouts
[
0
].
Offset
,
pLayouts
[
0
].
Footprint
.
Width
);
}
else
{
for
(
UINT
i
=
0
;
i
<
nNumSubresources
;
++
i
)
{
D3D12_TEXTURE_COPY_LOCATION
stDstCopyLocation
=
{};
stDstCopyLocation
.
pResource
=
pITexture
.
Get
();
stDstCopyLocation
.
Type
=
D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX
;
stDstCopyLocation
.
SubresourceIndex
=
i
;
D3D12_TEXTURE_COPY_LOCATION
stSrcCopyLocation
=
{};
stSrcCopyLocation
.
pResource
=
pITextureUpload
.
Get
();
stSrcCopyLocation
.
Type
=
D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT
;
stSrcCopyLocation
.
PlacedFootprint
=
pLayouts
[
i
];
pThdPms
->
pICmdList
->
CopyTextureRegion
(
&
stDstCopyLocation
,
0
,
0
,
0
,
&
stSrcCopyLocation
,
nullptr
);
}
}
D3D12_RESOURCE_BARRIER
stTransResBarrier
=
{};
stTransResBarrier
.
Type
=
D3D12_RESOURCE_BARRIER_TYPE_TRANSITION
;
stTransResBarrier
.
Flags
=
D3D12_RESOURCE_BARRIER_FLAG_NONE
;
stTransResBarrier
.
Transition
.
pResource
=
pITexture
.
Get
();
stTransResBarrier
.
Transition
.
StateBefore
=
D3D12_RESOURCE_STATE_COPY_DEST
;
stTransResBarrier
.
Transition
.
StateAfter
=
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
;
stTransResBarrier
.
Transition
.
Subresource
=
D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES
;
//同步
pThdPms
->
pICmdList
->
ResourceBarrier
(
1
,
&
CD3DX12_RESOURCE_BARRIER
::
Transition
(
pITexture
.
Get
()
,
D3D12_RESOURCE_STATE_COPY_DEST
,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE
));
pThdPms
->
pICmdList
->
ResourceBarrier
(
1
,
&
stTransResBarrier
);
// 创建描述符堆
D3D12_DESCRIPTOR_HEAP_DESC
stSRVCBVHPDesc
=
{};
stSRVCBVHPDesc
.
NumDescriptors
=
2
;
// 1 CBV + 1 SRV
stSRVCBVHPDesc
.
Type
=
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
;
...
...
@@ -990,12 +1172,12 @@ UINT __stdcall RenderThread(void* pParam)
stSRVDesc
.
ViewDimension
=
D3D12_SRV_DIMENSION_TEXTURE2D
;
stSRVDesc
.
Texture2D
.
MipLevels
=
1
;
CD3DX12_CPU_DESCRIPTOR_HANDLE
stCbvSrvHandle
(
pISRVCBVHp
->
GetCPUDescriptorHandleForHeapStart
()
,
1
,
pThdPms
->
pID3D12Device4
->
GetDescriptorHandleIncrementSize
(
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
));
D3D12_CPU_DESCRIPTOR_HANDLE
stCbvSrvHandle
=
pISRVCBVHp
->
GetCPUDescriptorHandleForHeapStart
();
stCbvSrvHandle
.
ptr
+=
pThdPms
->
pID3D12Device4
->
GetDescriptorHandleIncrementSize
(
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
);
pThdPms
->
pID3D12Device4
->
CreateShaderResourceView
(
pITexture
.
Get
()
,
&
stSRVDesc
,
stCbvSrvHandle
);
}
//2、创建Sample
...
...
@@ -1027,11 +1209,31 @@ UINT __stdcall RenderThread(void* pParam)
LoadMeshVertex
(
pThdPms
->
pszMeshFile
,
nVertexCnt
,
pstVertices
,
pnIndices
);
nIndexCnt
=
nVertexCnt
;
D3D12_HEAP_PROPERTIES
stHeapProp
=
{};
stHeapProp
.
Type
=
D3D12_HEAP_TYPE_UPLOAD
;
stHeapProp
.
CPUPageProperty
=
D3D12_CPU_PAGE_PROPERTY_UNKNOWN
;
stHeapProp
.
MemoryPoolPreference
=
D3D12_MEMORY_POOL_UNKNOWN
;
stHeapProp
.
CreationNodeMask
=
1
;
stHeapProp
.
VisibleNodeMask
=
1
;
D3D12_RESOURCE_DESC
stUploadBufDesc
=
{};
stUploadBufDesc
.
Dimension
=
D3D12_RESOURCE_DIMENSION_BUFFER
;
stUploadBufDesc
.
Alignment
=
D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT
;
stUploadBufDesc
.
Width
=
nVertexCnt
*
sizeof
(
ST_GRS_VERTEX
);
stUploadBufDesc
.
Height
=
1
;
stUploadBufDesc
.
DepthOrArraySize
=
1
;
stUploadBufDesc
.
MipLevels
=
1
;
stUploadBufDesc
.
Format
=
DXGI_FORMAT_UNKNOWN
;
stUploadBufDesc
.
SampleDesc
.
Count
=
1
;
stUploadBufDesc
.
SampleDesc
.
Quality
=
0
;
stUploadBufDesc
.
Layout
=
D3D12_TEXTURE_LAYOUT_ROW_MAJOR
;
stUploadBufDesc
.
Flags
=
D3D12_RESOURCE_FLAG_NONE
;
//创建 Vertex Buffer 仅使用Upload隐式堆
GRS_THROW_IF_FAILED
(
pThdPms
->
pID3D12Device4
->
CreateCommittedResource
(
&
CD3DX12_HEAP_PROPERTIES
(
D3D12_HEAP_TYPE_UPLOAD
)
&
stHeapProp
,
D3D12_HEAP_FLAG_NONE
,
&
CD3DX12_RESOURCE_DESC
::
Buffer
(
nVertexCnt
*
sizeof
(
ST_GRS_VERTEX
))
,
&
stUploadBufDesc
,
D3D12_RESOURCE_STATE_GENERIC_READ
,
nullptr
,
IID_PPV_ARGS
(
&
pIVB
)));
...
...
@@ -1039,17 +1241,19 @@ UINT __stdcall RenderThread(void* pParam)
//使用map-memcpy-unmap大法将数据传至顶点缓冲对象
UINT8
*
pVertexDataBegin
=
nullptr
;
CD3DX12_RANGE
stReadRange
(
0
,
0
)
;
// We do not intend to read from this resource on the CPU.
D3D12_RANGE
stReadRange
=
{
0
,
0
}
;
// We do not intend to read from this resource on the CPU.
GRS_THROW_IF_FAILED
(
pIVB
->
Map
(
0
,
&
stReadRange
,
reinterpret_cast
<
void
**>
(
&
pVertexDataBegin
)));
memcpy
(
pVertexDataBegin
,
pstVertices
,
nVertexCnt
*
sizeof
(
ST_GRS_VERTEX
));
pIVB
->
Unmap
(
0
,
nullptr
);
//创建 Index Buffer 仅使用Upload隐式堆
stUploadBufDesc
.
Width
=
nIndexCnt
*
sizeof
(
UINT
);
GRS_THROW_IF_FAILED
(
pThdPms
->
pID3D12Device4
->
CreateCommittedResource
(
&
CD3DX12_HEAP_PROPERTIES
(
D3D12_HEAP_TYPE_UPLOAD
)
&
stHeapProp
,
D3D12_HEAP_FLAG_NONE
,
&
CD3DX12_RESOURCE_DESC
::
Buffer
(
nIndexCnt
*
sizeof
(
UINT
))
,
&
stUploadBufDesc
,
D3D12_RESOURCE_STATE_GENERIC_READ
,
nullptr
,
IID_PPV_ARGS
(
&
pIIB
)));
...
...
@@ -1076,10 +1280,30 @@ UINT __stdcall RenderThread(void* pParam)
//4、创建常量缓冲
{
D3D12_HEAP_PROPERTIES
stHeapProp
=
{};
stHeapProp
.
Type
=
D3D12_HEAP_TYPE_UPLOAD
;
stHeapProp
.
CPUPageProperty
=
D3D12_CPU_PAGE_PROPERTY_UNKNOWN
;
stHeapProp
.
MemoryPoolPreference
=
D3D12_MEMORY_POOL_UNKNOWN
;
stHeapProp
.
CreationNodeMask
=
1
;
stHeapProp
.
VisibleNodeMask
=
1
;
D3D12_RESOURCE_DESC
stUploadBufDesc
=
{};
stUploadBufDesc
.
Dimension
=
D3D12_RESOURCE_DIMENSION_BUFFER
;
stUploadBufDesc
.
Alignment
=
D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT
;
stUploadBufDesc
.
Width
=
szMVPBuf
;
stUploadBufDesc
.
Height
=
1
;
stUploadBufDesc
.
DepthOrArraySize
=
1
;
stUploadBufDesc
.
MipLevels
=
1
;
stUploadBufDesc
.
Format
=
DXGI_FORMAT_UNKNOWN
;
stUploadBufDesc
.
SampleDesc
.
Count
=
1
;
stUploadBufDesc
.
SampleDesc
.
Quality
=
0
;
stUploadBufDesc
.
Layout
=
D3D12_TEXTURE_LAYOUT_ROW_MAJOR
;
stUploadBufDesc
.
Flags
=
D3D12_RESOURCE_FLAG_NONE
;
GRS_THROW_IF_FAILED
(
pThdPms
->
pID3D12Device4
->
CreateCommittedResource
(
&
CD3DX12_HEAP_PROPERTIES
(
D3D12_HEAP_TYPE_UPLOAD
)
&
stHeapProp
,
D3D12_HEAP_FLAG_NONE
,
&
CD3DX12_RESOURCE_DESC
::
Buffer
(
szMVPBuf
)
//注意缓冲尺寸设置为256边界对齐大小
,
&
stUploadBufDesc
//注意缓冲尺寸设置为256边界对齐大小
,
D3D12_RESOURCE_STATE_GENERIC_READ
,
nullptr
,
IID_PPV_ARGS
(
&
pICBWVP
)));
...
...
@@ -1093,7 +1317,7 @@ UINT __stdcall RenderThread(void* pParam)
cbvDesc
.
BufferLocation
=
pICBWVP
->
GetGPUVirtualAddress
();
cbvDesc
.
SizeInBytes
=
static_cast
<
UINT
>
(
szMVPBuf
);
CD3DX12_CPU_DESCRIPTOR_HANDLE
stCbvSrvHandle
(
pISRVCBVHp
->
GetCPUDescriptorHandleForHeapStart
()
);
D3D12_CPU_DESCRIPTOR_HANDLE
stCbvSrvHandle
=
pISRVCBVHp
->
GetCPUDescriptorHandleForHeapStart
(
);
pThdPms
->
pID3D12Device4
->
CreateConstantBufferView
(
&
cbvDesc
,
stCbvSrvHandle
);
}
...
...
@@ -1164,10 +1388,9 @@ UINT __stdcall RenderThread(void* pParam)
//---------------------------------------------------------------------------------------------
//设置对应的渲染目标和视裁剪框(这是渲染子线程必须要做的步骤,基本也就是所谓多线程渲染的核心秘密所在了)
{
CD3DX12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
(
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
()
,
pThdPms
->
nCurrentFrameIndex
,
g_nRTVDescriptorSize
);
CD3DX12_CPU_DESCRIPTOR_HANDLE
dsvHandle
(
g_pIDSVHeap
->
GetCPUDescriptorHandleForHeapStart
());
D3D12_CPU_DESCRIPTOR_HANDLE
stRTVHandle
=
g_pIRTVHeap
->
GetCPUDescriptorHandleForHeapStart
();
stRTVHandle
.
ptr
+=
(
pThdPms
->
nCurrentFrameIndex
*
g_nRTVDescriptorSize
);
D3D12_CPU_DESCRIPTOR_HANDLE
dsvHandle
=
g_pIDSVHeap
->
GetCPUDescriptorHandleForHeapStart
();
//设置渲染目标
pThdPms
->
pICmdList
->
OMSetRenderTargets
(
1
,
&
stRTVHandle
,
FALSE
,
&
dsvHandle
);
pThdPms
->
pICmdList
->
RSSetViewports
(
1
,
&
g_stViewPort
);
...
...
@@ -1182,11 +1405,10 @@ UINT __stdcall RenderThread(void* pParam)
ID3D12DescriptorHeap
*
ppHeapsSphere
[]
=
{
pISRVCBVHp
.
Get
(),
pISampleHp
.
Get
()
};
pThdPms
->
pICmdList
->
SetDescriptorHeaps
(
_countof
(
ppHeapsSphere
),
ppHeapsSphere
);
CD3DX12_GPU_DESCRIPTOR_HANDLE
stGPUCBVHandleSphere
(
pISRVCBVHp
->
GetGPUDescriptorHandleForHeapStart
()
);
D3D12_GPU_DESCRIPTOR_HANDLE
stGPUCBVHandleSphere
=
pISRVCBVHp
->
GetGPUDescriptorHandleForHeapStart
(
);
//设置CBV
pThdPms
->
pICmdList
->
SetGraphicsRootDescriptorTable
(
0
,
stGPUCBVHandleSphere
);
stGPUCBVHandleSphere
.
Offset
(
1
,
pThdPms
->
pID3D12Device4
->
GetDescriptorHandleIncrementSize
(
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
));
stGPUCBVHandleSphere
.
ptr
+=
pThdPms
->
pID3D12Device4
->
GetDescriptorHandleIncrementSize
(
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
);
//设置SRV
pThdPms
->
pICmdList
->
SetGraphicsRootDescriptorTable
(
1
,
stGPUCBVHandleSphere
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录