@@ -53,15 +53,12 @@ struct __declspec(uuid("4F2FCBC8-D459-4325-A4D8-4EE63F5C4571")) device_data_s
53
53
format _back_buffer_format;
54
54
uint16_t _back_buffer_samples;
55
55
resource _back_buffer_resolved = { 0 };
56
- resource_view _back_buffer_resolved_srv = { 0 };
57
56
std::vector<resource_view> _back_buffer_targets;
58
57
59
58
void free_buffer_resources (device* device) {
60
59
if (_hasBackBuffer) {
61
60
device->destroy_resource (_back_buffer_resolved);
62
61
_back_buffer_resolved = {};
63
- device->destroy_resource_view (_back_buffer_resolved_srv);
64
- _back_buffer_resolved_srv = {};
65
62
66
63
for (const auto view : _back_buffer_targets)
67
64
device->destroy_resource_view (view);
@@ -117,22 +114,21 @@ struct __declspec(uuid("4F2FCBC8-D459-4325-A4D8-4EE63F5C4571")) device_data_s
117
114
}
118
115
119
116
if (!device->create_resource (
120
- resource_desc (_width, _height, 1 , 1 , format_to_typeless (_back_buffer_format), 1 , memory_heap::gpu_only, resource_usage::shader_resource | resource_usage::render_target | resource_usage::copy_dest | resource_usage::resolve_dest),
121
- nullptr , back_buffer_desc.texture .samples == 1 ? resource_usage::copy_dest : resource_usage::resolve_dest, &_back_buffer_resolved) ||
122
- !device->create_resource_view (
123
- _back_buffer_resolved,
124
- resource_usage::shader_resource,
125
- resource_view_desc (_back_buffer_format),
126
- &_back_buffer_resolved_srv) ||
117
+ resource_desc (_width, _height, 1 , 1 , format_to_typeless (_back_buffer_format), 1 , memory_heap::gpu_only, resource_usage::shader_resource | resource_usage::render_target),
118
+ nullptr , resource_usage::shader_resource | resource_usage::render_target, &_back_buffer_resolved) ||
127
119
!device->create_resource_view (
128
120
_back_buffer_resolved,
129
121
resource_usage::render_target,
130
- resource_view_desc (format_to_default_typed (_back_buffer_format, 0 )),
122
+ resource_view_desc (
123
+ resource_view_type::texture_2d,
124
+ format_to_default_typed (_back_buffer_format, 0 ), 0 , 1 , 0 , 1 ),
131
125
&_back_buffer_targets.emplace_back ()) ||
132
126
!device->create_resource_view (
133
127
_back_buffer_resolved,
134
128
resource_usage::render_target,
135
- resource_view_desc (format_to_default_typed (_back_buffer_format, 1 )),
129
+ resource_view_desc (
130
+ resource_view_type::texture_2d,
131
+ format_to_default_typed (_back_buffer_format, 1 ), 0 , 1 , 0 , 1 ),
136
132
&_back_buffer_targets.emplace_back ()))
137
133
{
138
134
free_buffer_resources (device);
@@ -144,14 +140,14 @@ struct __declspec(uuid("4F2FCBC8-D459-4325-A4D8-4EE63F5C4571")) device_data_s
144
140
back_buffer_resource,
145
141
resource_usage::render_target,
146
142
resource_view_desc (
147
- back_buffer_desc. texture . samples > 1 ? resource_view_type::texture_2d_multisample : resource_view_type::texture_2d,
143
+ resource_view_type::texture_2d,
148
144
format_to_default_typed (back_buffer_desc.texture .format , 0 ), 0 , 1 , 0 , 1 ),
149
145
&_back_buffer_targets.emplace_back ()) ||
150
146
!device->create_resource_view (
151
147
back_buffer_resource,
152
148
resource_usage::render_target,
153
149
resource_view_desc (
154
- back_buffer_desc. texture . samples > 1 ? resource_view_type::texture_2d_multisample : resource_view_type::texture_2d,
150
+ resource_view_type::texture_2d,
155
151
format_to_default_typed (back_buffer_desc.texture .format , 1 ), 0 , 1 , 0 , 1 ),
156
152
&_back_buffer_targets.emplace_back ()))
157
153
{
@@ -269,15 +265,26 @@ struct __declspec(uuid("4F2FCBC8-D459-4325-A4D8-4EE63F5C4571")) device_data_s
269
265
{
270
266
if (back_buffer_data._back_buffer_samples == 1 )
271
267
{
272
- if (old_back_buffer_resource_usage != resource_usage::copy_source) command_list->barrier (back_buffer_resource, old_back_buffer_resource_usage, resource_usage::copy_source);
268
+ const resource resources[2 ] = { back_buffer_resource, back_buffer_data._back_buffer_resolved };
269
+ const resource_usage state_old[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
270
+ const resource_usage state_new[2 ] = { resource_usage::copy_source, resource_usage::copy_dest };
271
+ const resource_usage state_final[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
272
+
273
+ command_list->barrier (2 , resources, state_old, state_new);
273
274
command_list->copy_texture_region (back_buffer_resource, 0 , nullptr , back_buffer_data._back_buffer_resolved , 0 , nullptr );
274
- if (old_back_buffer_resource_usage != resource_usage::copy_source) command_list->barrier (back_buffer_data._back_buffer_resolved , resource_usage::copy_dest, old_back_buffer_resource_usage);
275
+ command_list->barrier (2 , resources, state_new, state_final);
276
+
275
277
}
276
278
else
277
279
{
278
- if (old_back_buffer_resource_usage != resource_usage::resolve_source) command_list->barrier (back_buffer_resource, old_back_buffer_resource_usage, resource_usage::resolve_source);
280
+ const resource resources[2 ] = { back_buffer_resource, back_buffer_data._back_buffer_resolved };
281
+ const resource_usage state_old[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
282
+ const resource_usage state_new[2 ] = { resource_usage::resolve_source, resource_usage::resolve_dest };
283
+ const resource_usage state_final[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
284
+
285
+ command_list->barrier (2 , resources, state_old, state_new);
279
286
command_list->resolve_texture_region (back_buffer_resource, 0 , nullptr , back_buffer_data._back_buffer_resolved , 0 , 0 , 0 , 0 , back_buffer_data._back_buffer_format );
280
- if (old_back_buffer_resource_usage != resource_usage::resolve_source) command_list->barrier (back_buffer_data. _back_buffer_resolved , resource_usage::resolve_dest, old_back_buffer_resource_usage );
287
+ command_list->barrier (2 , resources, state_new, state_final );
281
288
}
282
289
}
283
290
@@ -288,13 +295,16 @@ struct __declspec(uuid("4F2FCBC8-D459-4325-A4D8-4EE63F5C4571")) device_data_s
288
295
289
296
auto old_depth_buffer_resource_usage = device->get_resource_desc (depth_buffer_resource).usage ;
290
297
291
- command_list->barrier (depth_buffer_data._depth_texture , resource_usage::shader_resource, resource_usage::copy_dest);
292
- if (old_depth_buffer_resource_usage != resource_usage::copy_source) command_list->barrier (depth_buffer_resource, old_depth_buffer_resource_usage, resource_usage::copy_source);
298
+ const resource resources[2 ] = { depth_buffer_resource, depth_buffer_data._depth_texture };
299
+ const resource_usage state_old[2 ] = { old_depth_buffer_resource_usage, resource_usage::shader_resource };
300
+ const resource_usage state_new[2 ] = { resource_usage::copy_source, resource_usage::copy_dest };
301
+ const resource_usage state_final[2 ] = { old_depth_buffer_resource_usage, resource_usage::shader_resource };
302
+
303
+ command_list->barrier (2 , resources, state_old, state_new);
293
304
294
305
command_list->copy_resource (depth_buffer_resource, depth_buffer_data._depth_texture );
295
306
296
- if (old_depth_buffer_resource_usage != resource_usage::copy_source)command_list->barrier (depth_buffer_resource, resource_usage::copy_source, old_depth_buffer_resource_usage);
297
- command_list->barrier (depth_buffer_data._depth_texture , resource_usage::copy_dest, resource_usage::shader_resource);
307
+ command_list->barrier (2 , resources, state_new, state_final);
298
308
}
299
309
300
310
if (back_buffer_data._back_buffer_resolved != 0 )
@@ -311,14 +321,31 @@ struct __declspec(uuid("4F2FCBC8-D459-4325-A4D8-4EE63F5C4571")) device_data_s
311
321
// Stretch main render target back into MSAA back buffer if MSAA is active or copy when format conversion is required
312
322
if (back_buffer_data._back_buffer_resolved != 0 )
313
323
{
314
- const resource resources[2 ] = { back_buffer_resource, back_buffer_data._back_buffer_resolved };
315
- const resource_usage state_old[2 ] = { old_back_buffer_resource_usage, resource_usage::render_target };
316
- const resource_usage state_new[2 ] = { resource_usage::copy_dest, resource_usage::copy_source };
317
- const resource_usage state_final[2 ] = { old_back_buffer_resource_usage, resource_usage::resolve_dest };
324
+ if (back_buffer_data._back_buffer_samples == 1 )
325
+ {
326
+ const resource resources[2 ] = { back_buffer_resource, back_buffer_data._back_buffer_resolved };
327
+ const resource_usage state_old[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
328
+ const resource_usage state_new[2 ] = { resource_usage::copy_dest, resource_usage::copy_source };
329
+ const resource_usage state_final[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
330
+
331
+ command_list->barrier (2 , resources, state_old, state_new);
332
+ command_list->copy_texture_region (back_buffer_data._back_buffer_resolved , 0 , nullptr , back_buffer_resource, 0 , nullptr );
333
+ command_list->barrier (2 , resources, state_new, state_final);
334
+ }
335
+ else
336
+ {
337
+ const resource resources[2 ] = { back_buffer_resource, back_buffer_data._back_buffer_resolved };
338
+ const resource_usage state_old[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
339
+ const resource_usage state_new[2 ] = { resource_usage::resolve_dest, resource_usage::resolve_dest };
340
+ const resource_usage state_final[2 ] = { old_back_buffer_resource_usage, resource_usage::shader_resource | resource_usage::render_target };
318
341
319
- command_list->barrier (2 , resources, state_old, state_new);
320
- command_list->copy_texture_region (back_buffer_data._back_buffer_resolved , 0 , nullptr , back_buffer_resource, 0 , nullptr );
321
- command_list->barrier (2 , resources, state_new, state_final);
342
+ float color[4 ] = { 1 .0f ,1 .0f ,0 .0f ,1 .0f };
343
+ command_list->clear_render_target_view (back_buffer_data._back_buffer_targets [0 ], color);
344
+
345
+ command_list->barrier (2 , resources, state_old, state_new);
346
+ command_list->resolve_texture_region (back_buffer_data._back_buffer_resolved , 0 , nullptr , back_buffer_resource, 0 , 0 , 0 , 0 , back_buffer_data._back_buffer_desc .texture .format );
347
+ command_list->barrier (2 , resources, state_new, state_final);
348
+ }
322
349
}
323
350
324
351
return true ;
0 commit comments