Skip to content

Commit 8c7c96e

Browse files
committed
Merge pull request #108636 from clayjohn/MSAA-depth-mobile
Add depth resolve to the mobile renderer
2 parents e721af5 + a8efa55 commit 8c7c96e

File tree

8 files changed

+131
-27
lines changed

8 files changed

+131
-27
lines changed

servers/rendering/renderer_rd/effects/resolve.cpp

Lines changed: 53 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,43 @@
3434

3535
using namespace RendererRD;
3636

37-
Resolve::Resolve() {
38-
Vector<String> resolve_modes;
39-
resolve_modes.push_back("\n#define MODE_RESOLVE_GI\n");
40-
resolve_modes.push_back("\n#define MODE_RESOLVE_GI\n#define VOXEL_GI_RESOLVE\n");
41-
resolve_modes.push_back("\n#define MODE_RESOLVE_DEPTH\n");
37+
Resolve::Resolve(bool p_prefer_raster_effects) {
38+
prefer_raster_effects = p_prefer_raster_effects;
4239

43-
resolve.shader.initialize(resolve_modes);
40+
if (prefer_raster_effects) {
41+
Vector<String> resolve_modes;
42+
resolve_modes.push_back("");
4443

45-
resolve.shader_version = resolve.shader.version_create();
44+
resolve_raster.shader.initialize(resolve_modes);
45+
resolve_raster.shader_version = resolve_raster.shader.version_create();
46+
resolve_raster.pipeline.setup(resolve_raster.shader.version_get_shader(resolve_raster.shader_version, 0), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0);
47+
} else {
48+
Vector<String> resolve_modes;
49+
resolve_modes.push_back("\n#define MODE_RESOLVE_GI\n");
50+
resolve_modes.push_back("\n#define MODE_RESOLVE_GI\n#define VOXEL_GI_RESOLVE\n");
51+
resolve_modes.push_back("\n#define MODE_RESOLVE_DEPTH\n");
4652

47-
for (int i = 0; i < RESOLVE_MODE_MAX; i++) {
48-
resolve.pipelines[i] = RD::get_singleton()->compute_pipeline_create(resolve.shader.version_get_shader(resolve.shader_version, i));
53+
resolve.shader.initialize(resolve_modes);
54+
55+
resolve.shader_version = resolve.shader.version_create();
56+
57+
for (int i = 0; i < RESOLVE_MODE_MAX; i++) {
58+
resolve.pipelines[i] = RD::get_singleton()->compute_pipeline_create(resolve.shader.version_get_shader(resolve.shader_version, i));
59+
}
4960
}
5061
}
5162

5263
Resolve::~Resolve() {
53-
resolve.shader.version_free(resolve.shader_version);
64+
if (prefer_raster_effects) {
65+
resolve_raster.shader.version_free(resolve_raster.shader_version);
66+
} else {
67+
resolve.shader.version_free(resolve.shader_version);
68+
}
5469
}
5570

5671
void Resolve::resolve_gi(RID p_source_depth, RID p_source_normal_roughness, RID p_source_voxel_gi, RID p_dest_depth, RID p_dest_normal_roughness, RID p_dest_voxel_gi, Vector2i p_screen_size, int p_samples) {
72+
ERR_FAIL_COND_MSG(prefer_raster_effects, "Can't use the compute shader resolve with the mobile renderer.");
73+
5774
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
5875
ERR_FAIL_NULL(uniform_set_cache);
5976
MaterialStorage *material_storage = MaterialStorage::get_singleton();
@@ -96,6 +113,8 @@ void Resolve::resolve_gi(RID p_source_depth, RID p_source_normal_roughness, RID
96113
}
97114

98115
void Resolve::resolve_depth(RID p_source_depth, RID p_dest_depth, Vector2i p_screen_size, int p_samples) {
116+
ERR_FAIL_COND_MSG(prefer_raster_effects, "Can't use the compute shader resolve with the mobile renderer.");
117+
99118
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
100119
ERR_FAIL_NULL(uniform_set_cache);
101120
MaterialStorage *material_storage = MaterialStorage::get_singleton();
@@ -127,3 +146,27 @@ void Resolve::resolve_depth(RID p_source_depth, RID p_dest_depth, Vector2i p_scr
127146

128147
RD::get_singleton()->compute_list_end();
129148
}
149+
150+
void Resolve::resolve_depth_raster(RID p_source_rd_texture, RID p_dest_framebuffer, int p_samples) {
151+
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
152+
UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton();
153+
154+
memset(&resolve_raster.push_constant, 0, sizeof(ResolvePushConstant));
155+
resolve_raster.push_constant.samples = p_samples;
156+
157+
RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED);
158+
159+
RD::Uniform u_source_rd_texture(RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE, 0, Vector<RID>({ default_sampler, p_source_rd_texture }));
160+
161+
RID shader = resolve_raster.shader.version_get_shader(resolve_raster.shader_version, 0);
162+
ERR_FAIL_COND(shader.is_null());
163+
164+
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer);
165+
RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, resolve_raster.pipeline.get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer)));
166+
RD::get_singleton()->draw_list_bind_uniform_set(draw_list, uniform_set_cache->get_cache(shader, 0, u_source_rd_texture), 0);
167+
168+
RD::get_singleton()->draw_list_set_push_constant(draw_list, &resolve_raster.push_constant, sizeof(ResolvePushConstant));
169+
170+
RD::get_singleton()->draw_list_draw(draw_list, false, 1u, 3u);
171+
RD::get_singleton()->draw_list_end();
172+
}

servers/rendering/renderer_rd/effects/resolve.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,16 @@
3030

3131
#pragma once
3232

33+
#include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
3334
#include "servers/rendering/renderer_rd/shaders/effects/resolve.glsl.gen.h"
35+
#include "servers/rendering/renderer_rd/shaders/effects/resolve_raster.glsl.gen.h"
3436

3537
namespace RendererRD {
3638

3739
class Resolve {
3840
private:
41+
bool prefer_raster_effects;
42+
3943
struct ResolvePushConstant {
4044
int32_t screen_size[2];
4145
int32_t samples;
@@ -56,12 +60,20 @@ class Resolve {
5660
RID pipelines[RESOLVE_MODE_MAX]; //3 quality levels
5761
} resolve;
5862

63+
struct ResolveRasterShader {
64+
ResolvePushConstant push_constant;
65+
ResolveRasterShaderRD shader;
66+
RID shader_version;
67+
PipelineCacheRD pipeline;
68+
} resolve_raster;
69+
5970
public:
60-
Resolve();
71+
Resolve(bool p_prefer_raster_effects);
6172
~Resolve();
6273

6374
void resolve_gi(RID p_source_depth, RID p_source_normal_roughness, RID p_source_voxel_gi, RID p_dest_depth, RID p_dest_normal_roughness, RID p_dest_voxel_gi, Vector2i p_screen_size, int p_samples);
6475
void resolve_depth(RID p_source_depth, RID p_dest_depth, Vector2i p_screen_size, int p_samples);
76+
void resolve_depth_raster(RID p_source_rd_texture, RID p_dest_framebuffer, int p_samples);
6577
};
6678

6779
} // namespace RendererRD

servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5044,7 +5044,6 @@ RenderForwardClustered::RenderForwardClustered() {
50445044
_update_shader_quality_settings();
50455045
_update_global_pipeline_data_requirements_from_project();
50465046

5047-
resolve_effects = memnew(RendererRD::Resolve());
50485047
taa = memnew(RendererRD::TAA);
50495048
fsr2_effect = memnew(RendererRD::FSR2Effect);
50505049
ss_effects = memnew(RendererRD::SSEffects);
@@ -5082,11 +5081,6 @@ RenderForwardClustered::~RenderForwardClustered() {
50825081
}
50835082
#endif
50845083

5085-
if (resolve_effects != nullptr) {
5086-
memdelete(resolve_effects);
5087-
resolve_effects = nullptr;
5088-
}
5089-
50905084
RD::get_singleton()->free(shadow_sampler);
50915085
RSG::light_storage->directional_shadow_atlas_set_size(0);
50925086

servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#include "servers/rendering/renderer_rd/effects/metal_fx.h"
3838
#endif
3939
#include "servers/rendering/renderer_rd/effects/motion_vectors_store.h"
40-
#include "servers/rendering/renderer_rd/effects/resolve.h"
4140
#include "servers/rendering/renderer_rd/effects/ss_effects.h"
4241
#include "servers/rendering/renderer_rd/effects/taa.h"
4342
#include "servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h"
@@ -716,7 +715,6 @@ class RenderForwardClustered : public RendererSceneRenderRD {
716715

717716
/* Effects */
718717

719-
RendererRD::Resolve *resolve_effects = nullptr;
720718
RendererRD::TAA *taa = nullptr;
721719
RendererRD::FSR2Effect *fsr2_effect = nullptr;
722720
RendererRD::SSEffects *ss_effects = nullptr;

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,6 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
233233
if (use_msaa) {
234234
color_buffer_id = textures.size();
235235
textures.push_back(render_buffers->get_internal_texture()); // color buffer for resolve
236-
237-
// TODO add support for resolving depth buffer!!!
238236
}
239237

240238
// Now define our subpasses
@@ -1252,7 +1250,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12521250
RD::get_singleton()->draw_list_end();
12531251
} else {
12541252
// We're done with our subpasses so end our container pass
1255-
// note, if MSAA is used we should get an automatic resolve here
1253+
// note, if MSAA is used we should get an automatic resolve of the color buffer here.
12561254

12571255
RD::get_singleton()->draw_list_end();
12581256

@@ -1276,8 +1274,8 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12761274
_render_buffers_ensure_depth_texture(p_render_data);
12771275

12781276
if (scene_state.used_depth_texture) {
1279-
// Copy depth texture to backbuffer so we can read from it
1280-
_render_buffers_copy_depth_texture(p_render_data);
1277+
// Copy depth texture to backbuffer so we can read from it.
1278+
_render_buffers_copy_depth_texture(p_render_data, use_msaa);
12811279
}
12821280
}
12831281

servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ void RendererSceneRenderRD::_render_buffers_ensure_depth_texture(const RenderDat
412412
rb->create_texture(RB_SCOPE_BUFFERS, RB_TEX_BACK_DEPTH, RD::DATA_FORMAT_R32_SFLOAT, usage_bits, RD::TEXTURE_SAMPLES_1);
413413
}
414414

415-
void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataRD *p_render_data) {
415+
void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataRD *p_render_data, bool p_use_msaa) {
416416
Ref<RenderSceneBuffersRD> rb = p_render_data->render_buffers;
417417
ERR_FAIL_COND(rb.is_null());
418418

@@ -433,7 +433,13 @@ void RendererSceneRenderRD::_render_buffers_copy_depth_texture(const RenderDataR
433433
copy_effects->copy_to_rect(depth_texture, depth_back_texture, Rect2i(0, 0, size.x, size.y));
434434
} else {
435435
RID depth_back_fb = FramebufferCacheRD::get_singleton()->get_cache(depth_back_texture);
436-
copy_effects->copy_to_fb_rect(depth_texture, depth_back_fb, Rect2i(0, 0, size.x, size.y));
436+
if (p_use_msaa) {
437+
static const int texture_multisamples[RS::VIEWPORT_MSAA_MAX] = { 1, 2, 4, 8 };
438+
439+
resolve_effects->resolve_depth_raster(rb->get_depth_msaa(v), depth_back_fb, texture_multisamples[rb->get_msaa_3d()]);
440+
} else {
441+
copy_effects->copy_to_fb_rect(depth_texture, depth_back_fb, Rect2i(0, 0, size.x, size.y));
442+
}
437443
}
438444
}
439445

@@ -1716,6 +1722,7 @@ void RendererSceneRenderRD::init() {
17161722
#ifdef METAL_ENABLED
17171723
mfx_spatial = memnew(RendererRD::MFXSpatialEffect);
17181724
#endif
1725+
resolve_effects = memnew(RendererRD::Resolve(!can_use_storage));
17191726
}
17201727

17211728
RendererSceneRenderRD::~RendererSceneRenderRD() {
@@ -1753,6 +1760,10 @@ RendererSceneRenderRD::~RendererSceneRenderRD() {
17531760
}
17541761
#endif
17551762

1763+
if (resolve_effects) {
1764+
memdelete(resolve_effects);
1765+
}
1766+
17561767
if (sky.sky_scene_state.uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(sky.sky_scene_state.uniform_set)) {
17571768
RD::get_singleton()->free(sky.sky_scene_state.uniform_set);
17581769
}

servers/rendering/renderer_rd/renderer_scene_render_rd.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#ifdef METAL_ENABLED
4040
#include "servers/rendering/renderer_rd/effects/metal_fx.h"
4141
#endif
42+
#include "servers/rendering/renderer_rd/effects/resolve.h"
4243
#include "servers/rendering/renderer_rd/effects/smaa.h"
4344
#include "servers/rendering/renderer_rd/effects/tone_mapper.h"
4445
#include "servers/rendering/renderer_rd/effects/vrs.h"
@@ -66,6 +67,7 @@ class RendererSceneRenderRD : public RendererSceneRender, public RenderingShader
6667
RendererRD::ToneMapper *tone_mapper = nullptr;
6768
RendererRD::FSR *fsr = nullptr;
6869
RendererRD::VRS *vrs = nullptr;
70+
RendererRD::Resolve *resolve_effects = nullptr;
6971
#ifdef METAL_ENABLED
7072
RendererRD::MFXSpatialEffect *mfx_spatial = nullptr;
7173
#endif
@@ -108,7 +110,7 @@ class RendererSceneRenderRD : public RendererSceneRender, public RenderingShader
108110
void _render_buffers_ensure_screen_texture(const RenderDataRD *p_render_data);
109111
void _render_buffers_copy_screen_texture(const RenderDataRD *p_render_data);
110112
void _render_buffers_ensure_depth_texture(const RenderDataRD *p_render_data);
111-
void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data);
113+
void _render_buffers_copy_depth_texture(const RenderDataRD *p_render_data, bool p_use_msaa = false);
112114
void _render_buffers_post_process_and_tonemap(const RenderDataRD *p_render_data);
113115
void _post_process_subpass(RID p_source_texture, RID p_framebuffer, const RenderDataRD *p_render_data);
114116
void _disable_clear_request(const RenderDataRD *p_render_data);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/* clang-format off */
2+
#[vertex]
3+
4+
#version 450
5+
6+
#VERSION_DEFINES
7+
8+
layout(location = 0) out vec2 uv_interp;
9+
/* clang-format on */
10+
11+
void main() {
12+
vec2 base_arr[3] = vec2[](vec2(-1.0, -1.0), vec2(-1.0, 3.0), vec2(3.0, -1.0));
13+
gl_Position = vec4(base_arr[gl_VertexIndex], 0.0, 1.0);
14+
uv_interp = clamp(gl_Position.xy, vec2(0.0, 0.0), vec2(1.0, 1.0)) * 2.0; // saturate(x) * 2.0
15+
}
16+
17+
/* clang-format off */
18+
#[fragment]
19+
20+
#version 450
21+
22+
#VERSION_DEFINES
23+
24+
layout(location = 0) in vec2 uv_interp;
25+
26+
layout(set = 0, binding = 0) uniform sampler2DMS source_depth;
27+
28+
layout(push_constant, std430) uniform Params {
29+
ivec2 pad;
30+
int sample_count;
31+
int pad2;
32+
}
33+
params;
34+
35+
layout (location = 0) out float out_depth;
36+
37+
void main() {
38+
ivec2 pos = ivec2(gl_FragCoord.xy);
39+
40+
float depth_avg = 0.0;
41+
for (int i = 0; i < params.sample_count; i++) {
42+
depth_avg += texelFetch(source_depth, pos, i).r;
43+
}
44+
depth_avg /= float(params.sample_count);
45+
out_depth = depth_avg;
46+
}

0 commit comments

Comments
 (0)