@@ -13,7 +13,6 @@ void cg::renderer::dx12_renderer::init()
13
13
{
14
14
model = std::make_shared<cg::world::model>();
15
15
model->load_obj (settings->model_path );
16
-
17
16
camera = std::make_shared<cg::world::camera>();
18
17
camera->set_height (static_cast <float >(settings->height ));
19
18
camera->set_width (static_cast <float >(settings->width ));
@@ -73,7 +72,7 @@ ComPtr<IDXGIFactory4> cg::renderer::dx12_renderer::get_dxgi_factory()
73
72
UINT dxgi_factory_flags = 0 ;
74
73
#ifdef _DEBUG
75
74
ComPtr<ID3D12Debug> debug_controller;
76
- if (SUCCEEDED (D3D12GetDebugInterface ( IID_PPV_ARGS (&debug_controller) )))
75
+ if (SUCCEEDED (IID_PPV_ARGS (&debug_controller)))
77
76
{
78
77
debug_controller->EnableDebugLayer ();
79
78
dxgi_factory_flags |= DXGI_CREATE_FACTORY_DEBUG;
@@ -105,7 +104,7 @@ void cg::renderer::dx12_renderer::create_direct_command_queue()
105
104
queue_desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
106
105
queue_desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
107
106
THROW_IF_FAILED (device->CreateCommandQueue (&queue_desc,
108
- IID_PPV_ARGS (&command_queue)));
107
+ IID_PPV_ARGS (&command_queue)));
109
108
}
110
109
111
110
void cg::renderer::dx12_renderer::create_swap_chain (ComPtr<IDXGIFactory4>& dxgi_factory)
@@ -126,31 +125,29 @@ void cg::renderer::dx12_renderer::create_swap_chain(ComPtr<IDXGIFactory4>& dxgi_
126
125
&swap_chain_desc,
127
126
nullptr ,
128
127
nullptr ,
129
- &temp_swap_chain
130
- ));
128
+ &temp_swap_chain));
131
129
dxgi_factory->MakeWindowAssociation (
132
130
cg::utils::window::get_hwnd (),
133
- DXGI_MWA_NO_ALT_ENTER
134
- );
131
+ DXGI_MWA_NO_ALT_ENTER);
135
132
temp_swap_chain.As (&swap_chain);
136
133
frame_index = swap_chain->GetCurrentBackBufferIndex ();
137
134
}
138
135
139
136
void cg::renderer::dx12_renderer::create_render_target_views ()
140
137
{
141
138
rtv_heap.create_heap (device, D3D12_DESCRIPTOR_HEAP_TYPE_RTV, frame_number);
142
- for (UINT i =0 ; i< frame_number; i++){
139
+ for (UINT i = 0 ; i < frame_number; i++) {
143
140
THROW_IF_FAILED (swap_chain->GetBuffer (
144
141
i,
145
142
IID_PPV_ARGS (&render_targets[i])));
146
- device->CreateRenderTargetView (
147
- render_targets[i].Get (),
148
- nullptr ,
149
- rtv_heap.get_cpu_descriptor_handle (i)
150
- );
151
143
std::wstring name (L" Render target " );
152
144
name += std::to_wstring (i);
153
145
render_targets[i]->SetName (name.c_str ());
146
+
147
+ device->CreateRenderTargetView (
148
+ render_targets[i].Get (),
149
+ nullptr ,
150
+ rtv_heap.get_cpu_descriptor_handle (i));
154
151
}
155
152
}
156
153
@@ -160,7 +157,7 @@ void cg::renderer::dx12_renderer::create_depth_buffer()
160
157
161
158
void cg::renderer::dx12_renderer::create_command_allocators ()
162
159
{
163
- for (auto & command_allocator : command_allocators){
160
+ for (auto & command_allocator: command_allocators) {
164
161
THROW_IF_FAILED (device->CreateCommandAllocator (
165
162
D3D12_COMMAND_LIST_TYPE_DIRECT,
166
163
IID_PPV_ARGS (&command_allocator)));
@@ -173,8 +170,7 @@ void cg::renderer::dx12_renderer::create_command_list()
173
170
0 , D3D12_COMMAND_LIST_TYPE_DIRECT,
174
171
command_allocators[0 ].Get (),
175
172
pipeline_state.Get (),
176
- IID_PPV_ARGS (&command_list)
177
- ));
173
+ IID_PPV_ARGS (&command_list)));
178
174
}
179
175
180
176
@@ -205,30 +201,32 @@ void cg::renderer::dx12_renderer::create_root_signature(const D3D12_STATIC_SAMPL
205
201
206
202
D3D12_FEATURE_DATA_ROOT_SIGNATURE rs_feature_data{};
207
203
rs_feature_data.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
208
- if (FAILED (device->CheckFeatureSupport (
204
+ if (FAILED (device->CheckFeatureSupport (
209
205
D3D12_FEATURE_ROOT_SIGNATURE,
210
206
&rs_feature_data,
211
- sizeof (rs_feature_data)))){
207
+ sizeof (rs_feature_data)))) {
212
208
rs_feature_data.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_0;
213
209
}
214
210
215
- CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC rs_desc;
216
- rs_desc.Init_1_1 (
211
+ D3D12_ROOT_SIGNATURE_FLAGS rf_flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
212
+
213
+ CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC rs_desccriptor;
214
+ rs_desccriptor.Init_1_1 (
217
215
_countof (root_parameters),
218
216
root_parameters,
219
217
num_sampler_descriptors,
220
218
sampler_descriptors,
221
- D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
222
- ) ;
223
- ComPtr<ID3DBlob> signature, error;
224
-
225
- HRESULT result = D3DX12SerializeVersionedRootSignature (&rs_desc ,
226
- rs_feature_data.HighestVersion ,
227
- &signature,
228
- &error);
229
- if (FAILED (result)) {
230
- OutputDebugStringA ((char *) error->GetBufferPointer ());
231
- THROW_IF_FAILED (result );
219
+ rf_flags);
220
+ ComPtr<ID3DBlob> signature ;
221
+ ComPtr<ID3DBlob> error;
222
+
223
+ HRESULT res = D3DX12SerializeVersionedRootSignature (&rs_desccriptor ,
224
+ rs_feature_data.HighestVersion ,
225
+ &signature,
226
+ &error);
227
+ if (FAILED (res)) {
228
+ OutputDebugStringA ((char *) error->GetBufferPointer ());
229
+ THROW_IF_FAILED (res );
232
230
}
233
231
234
232
THROW_IF_FAILED (device->CreateRootSignature (0 ,
@@ -241,17 +239,18 @@ std::filesystem::path cg::renderer::dx12_renderer::get_shader_path(const std::st
241
239
{
242
240
WCHAR buffer[MAX_PATH];
243
241
GetModuleFileName (nullptr , buffer, MAX_PATH);
244
- return std::filesystem::path (buffer).parent_path () / shader_name;
242
+ auto shader_path = std::filesystem::path (buffer).parent_path () / shader_name
243
+ return shader_path;
245
244
}
246
245
247
246
ComPtr<ID3DBlob> cg::renderer::dx12_renderer::compile_shader (const std::filesystem::path& shader_path, const std::string& entrypoint, const std::string& target)
248
247
{
249
248
ComPtr<ID3DBlob> shader, error;
250
249
UINT compile_flags = 0 ;
251
- #ifdef _DEBUG
250
+ #ifdef _DEBUG
252
251
compile_flags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
253
- #endif
254
- HRESULT result = D3DCompileFromFile (
252
+ #endif
253
+ HRESULT res = D3DCompileFromFile (
255
254
shader_path.wstring ().c_str (),
256
255
nullptr ,
257
256
nullptr ,
@@ -261,21 +260,21 @@ ComPtr<ID3DBlob> cg::renderer::dx12_renderer::compile_shader(const std::filesyst
261
260
0 ,
262
261
&shader,
263
262
&error);
264
- if (FAILED (result)) {
263
+ if (FAILED (res)) {
265
264
OutputDebugStringA ((char *) error->GetBufferPointer ());
266
- THROW_IF_FAILED (result );
265
+ THROW_IF_FAILED (res );
267
266
}
268
267
return shader;
269
268
}
270
269
271
270
void cg::renderer::dx12_renderer::create_pso (const std::string& shader_name)
272
271
{
273
- ComPtr<ID3DBlob> vertex_shader = compile_shader (
272
+ auto vertex_shader = compile_shader (
274
273
get_shader_path (shader_name), " VSMain" , " vs_5_0" );
275
- ComPtr<ID3DBlob> pixel_shader = compile_shader (
274
+ auto pixel_shader = compile_shader (
276
275
get_shader_path (shader_name), " PSMain" , " ps_5_0" );
277
276
278
- D3D12_INPUT_ELEMENT_DESC input_descriptors [] = {
277
+ D3D12_INPUT_ELEMENT_DESC input_descs [] = {
279
278
{" POSITION" , 0 , DXGI_FORMAT_R32G32B32_FLOAT,
280
279
0 , 0 , D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
281
280
{" NORMAL" , 0 , DXGI_FORMAT_R32G32B32_FLOAT,
@@ -291,7 +290,7 @@ void cg::renderer::dx12_renderer::create_pso(const std::string& shader_name)
291
290
};
292
291
293
292
D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc{};
294
- pso_desc.InputLayout = {input_descriptors, _countof (input_descriptors )};
293
+ pso_desc.InputLayout = {input_descriptors, _countof (input_descs )};
295
294
pso_desc.pRootSignature = root_signature.Get ();
296
295
pso_desc.VS = CD3DX12_SHADER_BYTECODE (vertex_shader.Get ());
297
296
pso_desc.PS = CD3DX12_SHADER_BYTECODE (pixel_shader.Get ());
@@ -318,9 +317,8 @@ void cg::renderer::dx12_renderer::create_resource_on_upload_heap(ComPtr<ID3D12Re
318
317
&CD3DX12_RESOURCE_DESC::Buffer (size),
319
318
D3D12_RESOURCE_STATE_GENERIC_READ,
320
319
nullptr ,
321
- IID_PPV_ARGS (&resource)
322
- ));
323
- if (!name.empty ()){
320
+ IID_PPV_ARGS (&resource)));
321
+ if (!name.empty ()) {
324
322
resource->SetName (name.c_str ());
325
323
}
326
324
}
@@ -335,8 +333,7 @@ void cg::renderer::dx12_renderer::copy_data(const void* buffer_data, UINT buffer
335
333
CD3DX12_RANGE read_range (0 , 0 );
336
334
THROW_IF_FAILED (
337
335
destination_resource->Map (0 , &read_range,
338
- reinterpret_cast <void **>(&buffer_data_begin))
339
- );
336
+ reinterpret_cast <void **>(&buffer_data_begin)));
340
337
memcpy (buffer_data_begin, buffer_data, buffer_size);
341
338
destination_resource->Unmap (0 , 0 );
342
339
}
@@ -383,19 +380,12 @@ void cg::renderer::dx12_renderer::load_assets()
383
380
create_command_allocators ();
384
381
create_command_list ();
385
382
386
- cbv_srv_heap.create_heap (
387
- device,
388
- D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
389
- 1 ,
390
- D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE
391
- );
392
-
393
- size_t num_shapes = model->get_vertex_buffers ().size ();
394
- vertex_buffers.resize (num_shapes);
395
- vertex_buffer_views.resize (num_shapes);
396
- index_buffers.resize (num_shapes);
397
- index_buffer_views.resize (num_shapes);
398
- for (size_t i = 0 ; i < num_shapes; i++){
383
+ vertex_buffers.resize (model.get_vertex_buffers ().size ());
384
+ vertex_buffers_views.resize (model.get_vertex_buffers ().size ());
385
+
386
+ index_buffers.resize (model.get_index_buffers ().size ());
387
+ index_buffer_views.resize (model.get_index_buffers ().size ());
388
+ for (size_t i = 0 ; i < model.get_index_buffers ().size (); i++) {
399
389
// Vertex buffer
400
390
auto vertex_buffer_data = model->get_vertex_buffers ()[i];
401
391
const UINT vertex_buffer_size = static_cast <UINT>(
@@ -418,8 +408,7 @@ void cg::renderer::dx12_renderer::load_assets()
418
408
// Index buffer
419
409
auto index_buffer_data = model->get_index_buffers ()[i];
420
410
const UINT index_buffer_size = static_cast <UINT>(
421
- index_buffer_data->get_size_in_bytes ()
422
- );
411
+ index_buffer_data->get_size_in_bytes ());
423
412
424
413
std::wstring index_buffer_name (L" Index buffer " );
425
414
index_buffer_name += std::to_wstring (i);
@@ -441,23 +430,23 @@ void cg::renderer::dx12_renderer::load_assets()
441
430
// Constant buffer
442
431
std::wstring const_buffer_name (L" Constant buffer" );
443
432
create_resource_on_upload_heap (constant_buffer,
444
- 64 * 1024 ,
433
+ 64 * 1024 ,
445
434
const_buffer_name);
446
435
copy_data (&cb, sizeof (cb), constant_buffer);
447
436
CD3DX12_RANGE read_range (0 , 0 );
448
437
THROW_IF_FAILED (constant_buffer->Map (0 , &read_range,
449
438
reinterpret_cast <void **>(
450
- &constant_buffer_data_begin
451
- )));
439
+ &constant_buffer_data_begin)));
452
440
441
+ cbv_srv_heap.create_heap (device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1 , D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE);
453
442
create_constant_buffer_view (constant_buffer,
454
443
cbv_srv_heap.get_cpu_descriptor_handle (0 ));
455
444
456
445
THROW_IF_FAILED (command_list->Close ());
457
446
458
447
THROW_IF_FAILED (device->CreateFence (0 , D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS (&fence)));
459
448
fence_event = CreateEvent (nullptr , FALSE , FALSE , nullptr );
460
- if (fence_event == nullptr )
449
+ if (fence_event == nullptr )
461
450
{
462
451
THROW_IF_FAILED (HRESULT_FROM_WIN32 (GetLastError ()));
463
452
}
@@ -489,35 +478,31 @@ void cg::renderer::dx12_renderer::populate_command_list()
489
478
CD3DX12_RESOURCE_BARRIER::Transition (
490
479
render_targets[frame_index].Get (),
491
480
D3D12_RESOURCE_STATE_PRESENT,
492
- D3D12_RESOURCE_STATE_RENDER_TARGET
493
- )
494
- };
481
+ D3D12_RESOURCE_STATE_RENDER_TARGET)};
495
482
command_list->ResourceBarrier (_countof (begin_barriers), begin_barriers);
496
483
497
484
// Drawing
498
485
command_list->OMSetRenderTargets (
499
- 1 , &rtv_heap.get_cpu_descriptor_handle (frame_index),
486
+ 1 , &rtv_heap.get_cpu_descriptor_handle (frame_index),
500
487
FALSE , nullptr );
501
488
const float clear_color[] = {0 .f , 0 .f , 0 .f , 1 .f };
502
489
command_list->ClearRenderTargetView (
503
490
rtv_heap.get_cpu_descriptor_handle (frame_index),
504
491
clear_color, 0 , nullptr );
505
492
506
- for (size_t s= 0 ; s< model->get_vertex_buffers ().size (); s++){
493
+ for (size_t s = 0 ; s < model->get_vertex_buffers ().size (); s++) {
507
494
command_list->IASetVertexBuffers (0 , 1 , &vertex_buffer_views[s]);
508
495
command_list->IASetIndexBuffer (&index_buffer_views[s]);
509
496
command_list->DrawIndexedInstanced (
510
497
static_cast <UINT>(model->get_index_buffers ()[s]->get_number_of_elements ()),
511
- 1 ,0 , 0 , 0 );
498
+ 1 , 0 , 0 , 0 );
512
499
}
513
500
514
501
D3D12_RESOURCE_BARRIER end_barriers[] = {
515
502
CD3DX12_RESOURCE_BARRIER::Transition (
516
503
render_targets[frame_index].Get (),
517
504
D3D12_RESOURCE_STATE_RENDER_TARGET,
518
- D3D12_RESOURCE_STATE_PRESENT
519
- )
520
- };
505
+ D3D12_RESOURCE_STATE_PRESENT)};
521
506
command_list->ResourceBarrier (_countof (end_barriers), end_barriers);
522
507
523
508
THROW_IF_FAILED (command_list->Close ());
@@ -559,7 +544,8 @@ void cg::renderer::descriptor_heap::create_heap(ComPtr<ID3D12Device>& device, D3
559
544
THROW_IF_FAILED (device->CreateDescriptorHeap (
560
545
&heap_desc,
561
546
IID_PPV_ARGS (&heap)));
562
- descriptor_size = device->GetDescriptorHandleIncrementSize (type);}
547
+ descriptor_size = device->GetDescriptorHandleIncrementSize (type);
548
+ }
563
549
564
550
D3D12_CPU_DESCRIPTOR_HANDLE cg::renderer::descriptor_heap::get_cpu_descriptor_handle (UINT index) const
565
551
{
0 commit comments