Skip to content

Commit 0fa9ef2

Browse files
committed
remove adhoc method for vision os xr
1 parent 69e2842 commit 0fa9ef2

19 files changed

+77
-73
lines changed

drivers/metal/metal_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,6 @@ struct MDSubpass {
239239
LocalVector<RDD::AttachmentReference> color_references;
240240
RDD::AttachmentReference depth_stencil_reference;
241241
LocalVector<RDD::AttachmentReference> resolve_references;
242-
id<MTLRasterizationRateMap> rasterization_rate_map = nil;
243242

244243
MTLFmtCaps getRequiredFmtCapsForAttachmentAt(uint32_t p_index) const;
245244
};
@@ -918,6 +917,7 @@ class API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) MDFrameBuffer {
918917

919918
public:
920919
Size2i size;
920+
id<MTLRasterizationRateMap> rasterization_rate_map = nil;
921921
MDFrameBuffer(Vector<MTL::Texture> p_textures, Size2i p_size) :
922922
textures(p_textures), size(p_size) {}
923923
MDFrameBuffer() {}

drivers/metal/metal_objects.mm

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -766,21 +766,9 @@
766766
}
767767
}
768768

769-
#ifdef VISIONOS_ENABLED
770-
// If the subpass has a rasterization rate map, it means we're rendering in Immersive mode with foveation enabled.
771-
// In that case, the renderTarget size should be the screen logical viewport, which is bigger than the actual render
772-
// area (physical texture size). Not setting renderTargetWidth/renderTargetHeight is enough to render the full
773-
// screen Immersive scene.
774-
if (subpass.rasterization_rate_map != nil) {
775-
desc.rasterizationRateMap = subpass.rasterization_rate_map;
776-
} else {
777-
desc.renderTargetWidth = MAX((NSUInteger)MIN(render.render_area.position.x + render.render_area.size.width, fb.size.width), 1u);
778-
desc.renderTargetHeight = MAX((NSUInteger)MIN(render.render_area.position.y + render.render_area.size.height, fb.size.height), 1u);
779-
}
780-
#else
769+
desc.rasterizationRateMap = fb.rasterization_rate_map;
781770
desc.renderTargetWidth = MAX((NSUInteger)MIN(render.render_area.position.x + render.render_area.size.width, fb.size.width), 1u);
782771
desc.renderTargetHeight = MAX((NSUInteger)MIN(render.render_area.position.y + render.render_area.size.height, fb.size.height), 1u);
783-
#endif
784772

785773
if (attachmentCount == 0) {
786774
// If there are no attachments, delay the creation of the encoder,

drivers/metal/rendering_device_driver_metal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,7 @@ class API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) RenderingDeviceDriverMet
415415
virtual const MultiviewCapabilities &get_multiview_capabilities() override final;
416416
virtual const FragmentShadingRateCapabilities &get_fragment_shading_rate_capabilities() override final;
417417
virtual const FragmentDensityMapCapabilities &get_fragment_density_map_capabilities() override final;
418+
virtual bool is_rasterization_rate_map_supported() override final;
418419
virtual String get_api_name() const override final { return "Metal"; }
419420
virtual String get_api_version() const override final;
420421
virtual String get_pipeline_cache_uuid() const override final;

drivers/metal/rendering_device_driver_metal.mm

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
/**************************************************************************/
5050

5151
#import "rendering_device_driver_metal.h"
52+
#include "core/string/print_string.h"
53+
#include "core/variant/variant.h"
54+
#include <Foundation/NSObjCRuntime.h>
55+
#include <cstdint>
5256

5357
#import "pixel_formats.h"
5458
#import "rendering_context_driver_metal.h"
@@ -1074,11 +1078,20 @@ static const API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) MTLSamplerBorderC
10741078

10751079
Vector<MTL::Texture> textures;
10761080
textures.resize(p_attachments.size());
1081+
id<MTLRasterizationRateMap> rasterization_rate_map = nil;
10771082

10781083
for (uint32_t i = 0; i < p_attachments.size(); i += 1) {
10791084
MDAttachment const &a = pass->attachments[i];
1080-
id<MTLTexture> tex = rid::get(p_attachments[i]);
1081-
if (tex == nil) {
1085+
id attacment = rid::get(p_attachments[i]);
1086+
id<MTLTexture> tex = nil;
1087+
bool is_rasterization_rate_map = false;
1088+
if ([attacment conformsToProtocol:@protocol(MTLRasterizationRateMap)]) {
1089+
rasterization_rate_map = attacment;
1090+
is_rasterization_rate_map = true;
1091+
} else if ([attacment conformsToProtocol:@protocol(MTLTexture)]) {
1092+
tex = attacment;
1093+
}
1094+
if (tex == nil && !is_rasterization_rate_map) {
10821095
#if DEV_ENABLED
10831096
WARN_PRINT("Invalid texture for attachment " + itos(i));
10841097
#endif
@@ -1094,6 +1107,7 @@ static const API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) MTLSamplerBorderC
10941107
}
10951108

10961109
MDFrameBuffer *fb = new MDFrameBuffer(textures, Size2i(p_width, p_height));
1110+
fb->rasterization_rate_map = rasterization_rate_map;
10971111
return FramebufferID(fb);
10981112
}
10991113

@@ -1833,7 +1847,6 @@ bool isArrayTexture(MTLTextureType p_type) {
18331847
subpass.color_references = p_subpasses[i].color_references;
18341848
subpass.depth_stencil_reference = p_subpasses[i].depth_stencil_reference;
18351849
subpass.resolve_references = p_subpasses[i].resolve_references;
1836-
subpass.rasterization_rate_map = (__bridge id<MTLRasterizationRateMap>)p_subpasses[i].rasterization_rate_map;
18371850
}
18381851

18391852
static const MTLLoadAction LOAD_ACTIONS[] = {
@@ -2780,6 +2793,13 @@ bool isArrayTexture(MTLTextureType p_type) {
27802793
return fdm_capabilities;
27812794
}
27822795

2796+
bool RenderingDeviceDriverMetal::is_rasterization_rate_map_supported() {
2797+
// Seems impossible to use layers more than one.
2798+
// This feature is introduced in the process of adding visionOS support, used when rendering stereo contents.
2799+
return [device supportsRasterizationRateMapWithLayerCount:1] &&
2800+
[device supportsRasterizationRateMapWithLayerCount:2];
2801+
}
2802+
27832803
String RenderingDeviceDriverMetal::get_api_version() const {
27842804
return vformat("%d.%d", capabilities.version_major, capabilities.version_minor);
27852805
}

modules/visionos_xr/visionos_xr_interface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ class VisionOSXRInterface : public XRInterface {
134134
virtual Transform3D get_camera_transform() override;
135135
virtual Transform3D get_transform_for_view(uint32_t p_view, const Transform3D &p_cam_transform) override;
136136
virtual Projection get_projection_for_view(uint32_t p_view, double p_aspect, double p_z_near, double p_z_far) override;
137-
virtual Rect2i get_viewport_for_view(uint32_t p_view) override;
137+
virtual Rect2i get_render_region() override;
138138

139139
virtual void process() override;
140140
virtual void pre_render() override;

modules/visionos_xr/visionos_xr_interface.mm

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
2929
/**************************************************************************/
3030

31+
#include <Metal/Metal.h>
3132
#ifdef VISIONOS_ENABLED
3233

3334
#include "visionos_xr_interface.h"
@@ -288,18 +289,17 @@
288289
return eye_projection;
289290
}
290291

291-
Rect2i VisionOSXRInterface::get_viewport_for_view(uint32_t p_view) {
292+
Rect2i VisionOSXRInterface::get_render_region() {
292293
_THREAD_SAFE_METHOD_
293294

294295
Rect2 viewport_rect;
295296
if (!initialized) {
296297
return viewport_rect;
297298
}
298299

299-
ERR_FAIL_COND_V(p_view > get_view_count(), viewport_rect);
300300
ERR_FAIL_NULL_V_MSG(current_drawable, viewport_rect, "Current drawable is nil, probably pre_render() has not been called");
301301

302-
cp_view_t view = cp_drawable_get_view(current_drawable, p_view);
302+
cp_view_t view = cp_drawable_get_view(current_drawable, 0);
303303
cp_view_texture_map_t view_texture_map = cp_view_get_view_texture_map(view);
304304
MTLViewport viewport = cp_view_texture_map_get_viewport(view_texture_map);
305305
viewport_rect = MTL::rect_from_mtl_viewport(viewport);
@@ -498,9 +498,19 @@
498498
size_t count = cp_drawable_get_rasterization_rate_map_count(current_drawable);
499499
ERR_FAIL_COND_V_MSG(count == 0, RID(), "No rasterizationRateMaps found");
500500
id<MTLRasterizationRateMap> rasterization_rate_map = cp_drawable_get_rasterization_rate_map(current_drawable, 0);
501+
MTLSize logical_size = rasterization_rate_map.screenSize;
501502

502503
RD::Texture texture;
503504
texture.driver_id = RDD::TextureID((__bridge void *)rasterization_rate_map);
505+
texture.type = RDD::TEXTURE_TYPE_2D_ARRAY;
506+
texture.usage_flags = RDD::TEXTURE_USAGE_VRS_ATTACHMENT_BIT;
507+
texture.format = RDD::DATA_FORMAT_R8_UINT;
508+
texture.samples = RDD::TEXTURE_SAMPLES_1;
509+
texture.width = logical_size.width;
510+
texture.height = logical_size.height;
511+
texture.depth = 1;
512+
texture.mipmaps = 1;
513+
texture.layers = rasterization_rate_map.layerCount;
504514
ERR_FAIL_COND_V(!texture.driver_id, RID());
505515

506516
current_rasterization_rate_map = texture;

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "servers/rendering/renderer_rd/uniform_set_cache_rd.h"
3939
#include "servers/rendering/rendering_device.h"
4040
#include "servers/rendering/rendering_server_default.h"
41+
#include "servers/xr/xr_interface.h"
4142

4243
#define PRELOAD_PIPELINES_ON_SURFACE_CACHE_CONSTRUCTION 1
4344

@@ -211,24 +212,16 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
211212
uint32_t view_count = render_buffers->get_view_count();
212213

213214
RID vrs_texture;
214-
void *rasterization_rate_map = nullptr;
215215
#ifndef XR_DISABLED
216216
RS::ViewportVRSMode vrs_mode = render_buffers->get_vrs_mode();
217217
if (vrs_mode == RS::VIEWPORT_VRS_XR) {
218218
Ref<XRInterface> xr_interface = XRServer::get_singleton()->get_primary_interface();
219219
if (xr_interface.is_valid()) {
220-
if (RD::get_singleton()->vrs_get_method() == RD::VRS_METHOD_FRAGMENT_DENSITY_MAP && xr_interface->get_vrs_texture_format() == XRInterface::XR_VRS_TEXTURE_FORMAT_FRAGMENT_DENSITY_MAP) {
220+
bool use_vrs_fragment_density_map = RD::get_singleton()->vrs_get_method() == RD::VRS_METHOD_FRAGMENT_DENSITY_MAP && xr_interface->get_vrs_texture_format() == XRInterface::XR_VRS_TEXTURE_FORMAT_FRAGMENT_DENSITY_MAP;
221+
bool use_vrs_rasterization_rate_map = RD::get_singleton()->vrs_get_method() == RD::VRS_METHOD_RASTERIZATION_RATE_MAP && xr_interface->get_vrs_texture_format() == XRInterface::XR_VRS_TEXTURE_FORMAT_RASTERIZATION_RATE_MAP;
222+
if (use_vrs_fragment_density_map || use_vrs_rasterization_rate_map) {
221223
vrs_texture = xr_interface->get_vrs_texture();
222224
}
223-
#ifdef VISIONOS_ENABLED
224-
if (xr_interface->get_vrs_texture_format() == XRInterface::XR_VRS_TEXTURE_FORMAT_RASTERIZATION_RATE_MAP) {
225-
RID rasterization_rate_map_rid = xr_interface->get_vrs_texture();
226-
RD::Texture *texture = RenderingDevice::get_singleton()->texture_owner.get_or_null(rasterization_rate_map_rid);
227-
if (texture) {
228-
rasterization_rate_map = (void *)texture->driver_id.id;
229-
}
230-
}
231-
#endif
232225
}
233226
}
234227
#endif // XR_DISABLED
@@ -256,7 +249,6 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
256249
RD::FramebufferPass pass;
257250
pass.color_attachments.push_back(0);
258251
pass.depth_attachment = 1;
259-
pass.rasterization_rate_map = rasterization_rate_map;
260252

261253
if (use_msaa) {
262254
// Add resolve
@@ -277,7 +269,6 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
277269
RD::FramebufferPass pass;
278270
pass.color_attachments.push_back(0);
279271
pass.depth_attachment = 1;
280-
pass.rasterization_rate_map = rasterization_rate_map;
281272

282273
if (use_msaa) {
283274
// add resolve
@@ -304,8 +295,6 @@ RID RenderForwardMobile::RenderBufferDataForwardMobile::get_color_fbs(Framebuffe
304295
RD::FramebufferPass blit_pass;
305296
blit_pass.input_attachments.push_back(color_buffer_id); // Read from our (resolved) color buffer
306297
blit_pass.color_attachments.push_back(target_buffer_id); // Write into our target buffer
307-
// this doesn't need VRS nor rasterization_rate_map
308-
blit_pass.rasterization_rate_map = nullptr;
309298
passes.push_back(blit_pass);
310299

311300
return FramebufferCacheRD::get_singleton()->get_cache_multipass(textures, passes, view_count);
@@ -1209,11 +1198,6 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
12091198
}
12101199

12111200
RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(framebuffer, load_color ? RD::DRAW_CLEAR_DEPTH : (RD::DRAW_CLEAR_COLOR_0 | RD::DRAW_CLEAR_DEPTH), c, 0.0f, 0, p_render_data->render_region, breadcrumb);
1212-
if (p_render_data->xr_viewports.size() == 2) {
1213-
RD::get_singleton()->draw_list_set_viewports(draw_list, p_render_data->xr_viewports);
1214-
RD::get_singleton()->draw_list_set_empty_scissor(draw_list);
1215-
}
1216-
12171201
RD::FramebufferFormatID fb_format = RD::get_singleton()->framebuffer_get_format(framebuffer);
12181202

12191203
if (copy_canvas) {

servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,8 +1416,6 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render
14161416
render_data.transparent_bg = texture_storage->render_target_get_transparent(rb->get_render_target());
14171417
render_data.render_region = texture_storage->render_target_get_render_region(rb->get_render_target());
14181418
}
1419-
1420-
render_data.xr_viewports = p_camera_data->xr_viewports;
14211419
}
14221420

14231421
PagedArray<RID> empty;

servers/rendering/renderer_rd/storage_rd/render_data_rd.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,4 @@ class RenderDataRD : public RenderData {
9494
const RendererSceneRender::RenderSDFGIUpdateData *sdfgi_update_data = nullptr;
9595

9696
uint32_t voxel_gi_count = 0;
97-
98-
// For visionOS immersive rendering. It should have one rect for each view. It should be empty when XR is disabled.
99-
LocalVector<Rect2i> xr_viewports;
10097
};

servers/rendering/renderer_scene_cull.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2664,7 +2664,6 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
26642664
// We can support multiple views here each with their own camera
26652665
Transform3D transforms[RendererSceneRender::MAX_RENDER_VIEWS];
26662666
Projection projections[RendererSceneRender::MAX_RENDER_VIEWS];
2667-
Vector<Rect2i> viewports;
26682667

26692668
uint32_t view_count = p_xr_interface->get_view_count();
26702669
ERR_FAIL_COND_MSG(view_count == 0 || view_count > RendererSceneRender::MAX_RENDER_VIEWS, "Requested view count is not supported");
@@ -2678,10 +2677,6 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
26782677
for (uint32_t v = 0; v < view_count; v++) {
26792678
transforms[v] = p_xr_interface->get_transform_for_view(v, world_origin);
26802679
projections[v] = p_xr_interface->get_projection_for_view(v, aspect, camera->znear, camera->zfar);
2681-
Rect2 viewport = p_xr_interface->get_viewport_for_view(v);
2682-
if (viewport != Rect2()) {
2683-
viewports.push_back(p_xr_interface->get_viewport_for_view(v));
2684-
}
26852680
}
26862681

26872682
// If requested, we move the views to be rendered as if the HMD is at the XROrigin.
@@ -2695,7 +2690,7 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
26952690
if (view_count == 1) {
26962691
camera_data.set_camera(transforms[0], projections[0], false, false, camera->vaspect, jitter, p_jitter_phase_count, camera->visible_layers);
26972692
} else if (view_count == 2) {
2698-
camera_data.set_multiview_camera(view_count, transforms, projections, viewports, false, false, camera->vaspect);
2693+
camera_data.set_multiview_camera(view_count, transforms, projections, false, false, camera->vaspect);
26992694
}
27002695
#endif // XR_DISABLED
27012696
}

0 commit comments

Comments
 (0)