Skip to content

Commit ce9f13e

Browse files
BastiaanOlijhuisedenanhai
authored andcommitted
Resolve depth buffer in pass if supported by driver
1 parent 0ffd1ba commit ce9f13e

File tree

10 files changed

+115
-20
lines changed

10 files changed

+115
-20
lines changed

drivers/vulkan/rendering_device_driver_vulkan.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ Error RenderingDeviceDriverVulkan::_initialize_device_extensions() {
533533
_register_requested_device_extension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, false);
534534
_register_requested_device_extension(VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME, false);
535535
_register_requested_device_extension(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, false);
536+
_register_requested_device_extension(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, false);
536537

537538
// We don't actually use this extension, but some runtime components on some platforms
538539
// can and will fill the validation layers with useless info otherwise if not enabled.
@@ -743,6 +744,9 @@ Error RenderingDeviceDriverVulkan::_check_device_capabilities() {
743744
device_capabilities.version_major = VK_API_VERSION_MAJOR(physical_device_properties.apiVersion);
744745
device_capabilities.version_minor = VK_API_VERSION_MINOR(physical_device_properties.apiVersion);
745746

747+
// Cache extension availability we query often.
748+
framebuffer_depth_resolve = enabled_device_extension_names.has(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME);
749+
746750
// References:
747751
// https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_multiview.html
748752
// https://www.khronos.org/blog/vulkan-subgroup-tutorial
@@ -4575,12 +4579,32 @@ RDD::RenderPassID RenderingDeviceDriverVulkan::render_pass_create(VectorView<Att
45754579
VkFragmentShadingRateAttachmentInfoKHR *vk_fsr_info = ALLOCA_SINGLE(VkFragmentShadingRateAttachmentInfoKHR);
45764580
*vk_fsr_info = {};
45774581
vk_fsr_info->sType = VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR;
4582+
vk_fsr_info->pNext = vk_subpasses[i].pNext;
45784583
vk_fsr_info->pFragmentShadingRateAttachment = vk_subpass_fsr_attachment;
45794584
vk_fsr_info->shadingRateAttachmentTexelSize.width = p_subpasses[i].fragment_shading_rate_texel_size.x;
45804585
vk_fsr_info->shadingRateAttachmentTexelSize.height = p_subpasses[i].fragment_shading_rate_texel_size.y;
45814586

45824587
vk_subpasses[i].pNext = vk_fsr_info;
45834588
}
4589+
4590+
// Depth resolve.
4591+
if (framebuffer_depth_resolve && p_subpasses[i].depth_resolve_reference.attachment != AttachmentReference::UNUSED) {
4592+
VkAttachmentReference2KHR *vk_subpass_depth_resolve_attachment = ALLOCA_SINGLE(VkAttachmentReference2KHR);
4593+
*vk_subpass_depth_resolve_attachment = {};
4594+
vk_subpass_depth_resolve_attachment->sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
4595+
vk_subpass_depth_resolve_attachment->attachment = p_subpasses[i].depth_resolve_reference.attachment;
4596+
vk_subpass_depth_resolve_attachment->layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
4597+
4598+
VkSubpassDescriptionDepthStencilResolveKHR *vk_depth_resolve_info = ALLOCA_SINGLE(VkSubpassDescriptionDepthStencilResolveKHR);
4599+
*vk_depth_resolve_info = {};
4600+
vk_depth_resolve_info->sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE;
4601+
vk_depth_resolve_info->pNext = vk_subpasses[i].pNext;
4602+
vk_depth_resolve_info->depthResolveMode = VK_RESOLVE_MODE_MAX_BIT_KHR;
4603+
vk_depth_resolve_info->stencilResolveMode = VK_RESOLVE_MODE_NONE_KHR; // we don't resolve our stencil (for now)
4604+
vk_depth_resolve_info->pDepthStencilResolveAttachment = vk_subpass_depth_resolve_attachment;
4605+
4606+
vk_subpasses[i].pNext = vk_depth_resolve_info;
4607+
}
45844608
}
45854609

45864610
VkSubpassDependency2KHR *vk_subpass_dependencies = ALLOCA_ARRAY(VkSubpassDependency2KHR, p_subpass_dependencies.size());
@@ -5923,6 +5947,8 @@ bool RenderingDeviceDriverVulkan::has_feature(Features p_feature) {
59235947
#endif
59245948
case SUPPORTS_VULKAN_MEMORY_MODEL:
59255949
return vulkan_memory_model_support && vulkan_memory_model_device_scope_support;
5950+
case SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE:
5951+
return framebuffer_depth_resolve;
59265952
default:
59275953
return false;
59285954
}

drivers/vulkan/rendering_device_driver_vulkan.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ class RenderingDeviceDriverVulkan : public RenderingDeviceDriver {
137137
bool vulkan_memory_model_device_scope_support = false;
138138
bool pipeline_cache_control_support = false;
139139
bool device_fault_support = false;
140+
bool framebuffer_depth_resolve = false;
140141
#if defined(VK_TRACK_DEVICE_MEMORY)
141142
bool device_memory_report_support = false;
142143
#endif

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ RID RendererSceneRenderImplementation::RenderForwardMobile::RenderBufferDataForw
194194
return RID();
195195
}
196196

197-
RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(FramebufferConfigType p_config_type) {
197+
RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(FramebufferConfigType p_config_type, bool p_resolve_depth) {
198198
ERR_FAIL_NULL_V(render_buffers, RID());
199199

200200
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
@@ -230,17 +230,22 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
230230

231231
Vector<RID> textures;
232232
int color_buffer_id = 0;
233-
textures.push_back(use_msaa ? render_buffers->get_color_msaa() : render_buffers->get_internal_texture()); // 0 - color buffer
234-
textures.push_back(use_msaa ? render_buffers->get_depth_msaa() : render_buffers->get_depth_texture()); // 1 - depth buffer
233+
int depth_buffer_id = 1;
234+
textures.push_back(use_msaa ? render_buffers->get_color_msaa() : render_buffers->get_internal_texture()); // 0 - color buffer.
235+
textures.push_back(use_msaa ? render_buffers->get_depth_msaa() : render_buffers->get_depth_texture()); // 1 - depth buffer.
235236
if (vrs_texture.is_valid()) {
236-
textures.push_back(vrs_texture); // 2 - vrs texture
237+
textures.push_back(vrs_texture); // 2 - vrs texture.
237238
}
238239
if (use_msaa) {
239240
color_buffer_id = textures.size();
240-
textures.push_back(render_buffers->get_internal_texture()); // color buffer for resolve
241+
textures.push_back(render_buffers->get_internal_texture()); // Color buffer for resolve.
242+
}
243+
if (use_msaa && p_resolve_depth) {
244+
depth_buffer_id = textures.size();
245+
textures.push_back(render_buffers->get_depth_texture()); // Depth buffer for resolve.
241246
}
242247

243-
// Now define our subpasses
248+
// Now define our subpasses.
244249
Vector<RD::FramebufferPass> passes;
245250

246251
switch (p_config_type) {
@@ -250,8 +255,13 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
250255
pass.depth_attachment = 1;
251256

252257
if (use_msaa) {
253-
// Add resolve
258+
// Add color resolve.
254259
pass.resolve_attachments.push_back(color_buffer_id);
260+
261+
if (p_resolve_depth) {
262+
// Add depth resolve.
263+
pass.depth_resolve_attachment = depth_buffer_id;
264+
}
255265
}
256266
passes.push_back(pass);
257267

@@ -262,21 +272,26 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
262272
Size2i target_size = render_buffers->get_target_size();
263273
Size2i internal_size = render_buffers->get_internal_size();
264274

265-
// can't do our blit pass if resolutions don't match, this should already have been checked.
275+
// Can't do our blit pass if resolutions don't match, this should already have been checked.
266276
ERR_FAIL_COND_V(target_size != internal_size, RID());
267277

268278
RD::FramebufferPass pass;
269279
pass.color_attachments.push_back(0);
270280
pass.depth_attachment = 1;
271281

272282
if (use_msaa) {
273-
// add resolve
283+
// Add color resolve.
274284
pass.resolve_attachments.push_back(color_buffer_id);
285+
286+
if (p_resolve_depth) {
287+
// Add depth resolve.
288+
pass.depth_resolve_attachment = depth_buffer_id;
289+
}
275290
}
276291

277292
passes.push_back(pass);
278293

279-
// - add blit to 2D pass
294+
// Add blit to 2D pass.
280295
RID render_target = render_buffers->get_render_target();
281296
ERR_FAIL_COND_V(render_target.is_null(), RID());
282297
RID target_buffer;
@@ -289,7 +304,7 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
289304
ERR_FAIL_COND_V(target_buffer.is_null(), RID());
290305

291306
int target_buffer_id = textures.size();
292-
textures.push_back(target_buffer); // target buffer
307+
textures.push_back(target_buffer); // Target buffer.
293308

294309
RD::FramebufferPass blit_pass;
295310
blit_pass.input_attachments.push_back(color_buffer_id); // Read from our (resolved) color buffer
@@ -814,9 +829,13 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
814829

815830
RENDER_TIMESTAMP("Setup 3D Scene");
816831

832+
bool has_depth_texture_override = false;
833+
bool supports_depth_resolve = RenderingDevice::get_singleton()->has_feature(RD::SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE);
834+
817835
RID render_target = rb->get_render_target();
818836
if (render_target.is_valid()) {
819-
p_render_data->scene_data->calculate_motion_vectors = RendererRD::TextureStorage::get_singleton()->render_target_get_override_velocity(render_target).is_valid();
837+
p_render_data->scene_data->calculate_motion_vectors = texture_storage->render_target_get_override_velocity(render_target).is_valid();
838+
has_depth_texture_override = texture_storage->render_target_get_override_depth(render_target).is_valid();
820839
} else {
821840
p_render_data->scene_data->calculate_motion_vectors = false;
822841
}
@@ -841,6 +860,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
841860

842861
RS::ViewportMSAA msaa = rb->get_msaa_3d();
843862
bool use_msaa = msaa != RS::VIEWPORT_MSAA_DISABLED;
863+
bool resolve_depth_buffer = (use_msaa && has_depth_texture_override); // We'll check more conditions later.
844864

845865
bool ce_has_post_opaque = _has_compositor_effect(RS::COMPOSITOR_EFFECT_CALLBACK_TYPE_POST_OPAQUE, p_render_data);
846866
bool ce_has_pre_transparent = _has_compositor_effect(RS::COMPOSITOR_EFFECT_CALLBACK_TYPE_PRE_TRANSPARENT, p_render_data);
@@ -943,6 +963,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
943963
if (use_msaa && p_render_data->environment.is_valid() && RSG::camera_attributes->camera_attributes_uses_dof(p_render_data->camera_attributes)) {
944964
// Need to resolve depth texture for DOF when using MSAA.
945965
scene_state.used_depth_texture = true;
966+
resolve_depth_buffer = true;
946967
}
947968

948969
if (scene_state.used_screen_texture || scene_state.used_depth_texture) {
@@ -951,13 +972,17 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
951972
using_subpass_post_process = false;
952973
}
953974

975+
if (use_msaa && (global_surface_data.depth_texture_used || scene_state.used_depth_texture)) {
976+
resolve_depth_buffer = true;
977+
}
978+
954979
if (using_subpass_post_process) {
955980
// We can do all in one go.
956-
framebuffer = rb_data->get_color_fbs(RenderBufferDataForwardMobile::FB_CONFIG_RENDER_AND_POST_PASS);
981+
framebuffer = rb_data->get_color_fbs(RenderBufferDataForwardMobile::FB_CONFIG_RENDER_AND_POST_PASS, resolve_depth_buffer && supports_depth_resolve);
957982
global_pipeline_data_required.use_subpass_post_pass = true;
958983
} else {
959984
// We separate things out.
960-
framebuffer = rb_data->get_color_fbs(RenderBufferDataForwardMobile::FB_CONFIG_RENDER_PASS);
985+
framebuffer = rb_data->get_color_fbs(RenderBufferDataForwardMobile::FB_CONFIG_RENDER_PASS, resolve_depth_buffer && supports_depth_resolve);
961986
global_pipeline_data_required.use_separate_post_pass = true;
962987
}
963988
samplers = rb->get_samplers();
@@ -1247,8 +1272,6 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12471272
RD::get_singleton()->draw_command_end_label(); // Render Transparent Subpass
12481273
}
12491274

1250-
// note if we are using MSAA we should get an automatic resolve through our subpass configuration.
1251-
12521275
// blit to tonemap
12531276
if (rb_data.is_valid() && using_subpass_post_process) {
12541277
_post_process_subpass(p_render_data->render_buffers->get_internal_texture(), framebuffer, p_render_data);
@@ -1257,6 +1280,13 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12571280
RD::get_singleton()->draw_command_end_label(); // Render 3D Pass / Render Reflection Probe Pass
12581281

12591282
RD::get_singleton()->draw_list_end();
1283+
1284+
// note, if MSAA is used we should get an automatic resolve of the color buffer here.
1285+
1286+
if (use_msaa && has_depth_texture_override && !supports_depth_resolve) {
1287+
// We don't have a fallback for this, See PR #111322
1288+
WARN_PRINT_ONCE("MSAA Depth buffer resolve is not supported on this platform.");
1289+
}
12601290
} else {
12611291
// We're done with our subpasses so end our container pass
12621292
// note, if MSAA is used we should get an automatic resolve of the color buffer here.
@@ -1279,12 +1309,17 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12791309
}
12801310
}
12811311

1312+
if (use_msaa && has_depth_texture_override && !supports_depth_resolve) {
1313+
// We don't have a fallback for this, See PR #111322
1314+
WARN_PRINT_ONCE("MSAA Depth buffer resolve is not supported on this platform.");
1315+
}
1316+
12821317
if (scene_state.used_depth_texture || global_surface_data.depth_texture_used) {
12831318
_render_buffers_ensure_depth_texture(p_render_data);
12841319

12851320
if (scene_state.used_depth_texture) {
12861321
// Copy depth texture to backbuffer so we can read from it.
1287-
_render_buffers_copy_depth_texture(p_render_data, use_msaa);
1322+
_render_buffers_copy_depth_texture(p_render_data, use_msaa && !supports_depth_resolve); // Note, once fallback for has_depth_texture_override works, we also don't need to do our resolve here.
12881323
}
12891324
}
12901325

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class RenderForwardMobile : public RendererSceneRenderRD {
8585
FB_CONFIG_MAX
8686
};
8787

88-
RID get_color_fbs(FramebufferConfigType p_config_type);
88+
RID get_color_fbs(FramebufferConfigType p_config_type, bool p_resolve_depth = false);
8989
virtual void free_data() override;
9090
virtual void configure(RenderSceneBuffersRD *p_render_buffers) override;
9191

servers/rendering/renderer_rd/framebuffer_cache_rd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class FramebufferCacheRD : public Object {
5858

5959
static _FORCE_INLINE_ uint32_t _hash_pass(const RD::FramebufferPass &p, uint32_t h) {
6060
h = hash_murmur3_one_32(p.depth_attachment, h);
61+
h = hash_murmur3_one_32(p.depth_resolve_attachment, h);
6162

6263
h = hash_murmur3_one_32(p.color_attachments.size(), h);
6364
for (int i = 0; i < p.color_attachments.size(); i++) {
@@ -82,6 +83,10 @@ class FramebufferCacheRD : public Object {
8283
return false;
8384
}
8485

86+
if (a.depth_resolve_attachment != b.depth_resolve_attachment) {
87+
return false;
88+
}
89+
8590
if (a.color_attachments.size() != b.color_attachments.size()) {
8691
return false;
8792
}

servers/rendering/renderer_rd/storage_rd/render_scene_buffers_rd.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,11 @@ uint32_t RenderSceneBuffersRD::get_color_usage_bits(bool p_resolve, bool p_msaa,
733733
}
734734

735735
RD::DataFormat RenderSceneBuffersRD::get_depth_format(bool p_resolve, bool p_msaa, bool p_storage) {
736-
if (p_resolve) {
736+
// TODO Our rendering engine does not support just having a depth attachment, it always assumed we combine with stencil.
737+
// We thus can't configure our depth resolve with RD::DATA_FORMAT_R32_SFLOAT.
738+
// We should add support for TEXTURE_USAGE_DEPTH_ATTACHMENT_BIT or add a TEXTURE_USAGE_DEPTH_RESOLVE_ATTACHMENT_BIT
739+
740+
if (p_resolve && !RenderingDevice::get_singleton()->has_feature(RD::SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE)) {
737741
return RD::DATA_FORMAT_R32_SFLOAT;
738742
} else {
739743
const RenderingDeviceCommons::DataFormat preferred_formats[2] = {
@@ -752,7 +756,13 @@ uint32_t RenderSceneBuffersRD::get_depth_usage_bits(bool p_resolve, bool p_msaa,
752756
if (p_msaa) {
753757
usage_bits |= RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT;
754758
} else if (p_resolve) {
755-
usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT | (p_storage ? RD::TEXTURE_USAGE_STORAGE_BIT : 0);
759+
usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT;
760+
if (p_storage) {
761+
usage_bits |= RD::TEXTURE_USAGE_STORAGE_BIT;
762+
} else if (RenderingDevice::get_singleton()->has_feature(RD::SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE)) {
763+
// We're able to resolve depth in (sub)passes and we make use of this in our mobile renderer.
764+
usage_bits |= RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
765+
}
756766
} else {
757767
usage_bits |= RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
758768
}

servers/rendering/rendering_device.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2642,6 +2642,21 @@ RDD::RenderPassID RenderingDevice::_render_pass_create(RenderingDeviceDriver *p_
26422642
ERR_FAIL_COND_V_MSG(texture_samples != p_attachments[attachment].samples, RDD::RenderPassID(), "Invalid framebuffer depth format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), if an attachment is marked as multisample, all of them should be multisample and use the same number of samples including the depth.");
26432643
}
26442644

2645+
if (pass->depth_resolve_attachment != ATTACHMENT_UNUSED) {
2646+
attachment = pass->depth_resolve_attachment;
2647+
2648+
// As our fallbacks are handled outside of our pass, we should never be setting up a render pass with a depth resolve attachment when not supported.
2649+
ERR_FAIL_COND_V_MSG(!p_driver->has_feature(SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE), RDD::RenderPassID(), "Invalid framebuffer depth format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), a depth resolve attachment was supplied when driver doesn't support this feature.");
2650+
2651+
ERR_FAIL_INDEX_V_MSG(attachment, p_attachments.size(), RDD::RenderPassID(), "Invalid framebuffer depth resolve format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), depth resolve attachment.");
2652+
ERR_FAIL_COND_V_MSG(!(p_attachments[attachment].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT), RDD::RenderPassID(), "Invalid framebuffer depth resolve format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), it's marked as depth, but it's not a depth resolve attachment.");
2653+
ERR_FAIL_COND_V_MSG(attachment_last_pass[attachment] == i, RDD::RenderPassID(), "Invalid framebuffer depth resolve format attachment(" + itos(attachment) + "), in pass (" + itos(i) + "), it already was used for something else before in this pass.");
2654+
2655+
subpass.depth_resolve_reference.attachment = attachment_remap[attachment];
2656+
subpass.depth_resolve_reference.layout = RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
2657+
attachment_last_pass[attachment] = i;
2658+
}
2659+
26452660
} else {
26462661
subpass.depth_stencil_reference.attachment = RDD::AttachmentReference::UNUSED;
26472662
subpass.depth_stencil_reference.layout = RDD::TEXTURE_LAYOUT_UNDEFINED;

servers/rendering/rendering_device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ class RenderingDevice : public RenderingDeviceCommons {
476476
Vector<int32_t> resolve_attachments;
477477
Vector<int32_t> preserve_attachments;
478478
int32_t depth_attachment = ATTACHMENT_UNUSED;
479+
int32_t depth_resolve_attachment = ATTACHMENT_UNUSED;
479480
};
480481

481482
typedef int64_t FramebufferFormatID;

servers/rendering/rendering_device_commons.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,7 @@ class RenderingDeviceCommons : public Object {
956956
SUPPORTS_BUFFER_DEVICE_ADDRESS,
957957
SUPPORTS_IMAGE_ATOMIC_32_BIT,
958958
SUPPORTS_VULKAN_MEMORY_MODEL,
959+
SUPPORTS_FRAMEBUFFER_DEPTH_RESOLVE,
959960
};
960961

961962
enum SubgroupOperations {

servers/rendering/rendering_device_driver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@ class RenderingDeviceDriver : public RenderingDeviceCommons {
599599
LocalVector<AttachmentReference> input_references;
600600
LocalVector<AttachmentReference> color_references;
601601
AttachmentReference depth_stencil_reference;
602+
AttachmentReference depth_resolve_reference;
602603
LocalVector<AttachmentReference> resolve_references;
603604
LocalVector<uint32_t> preserve_attachments;
604605
AttachmentReference fragment_shading_rate_reference;

0 commit comments

Comments
 (0)