Merge pull request #119226 from dsnopek/openxr-foveation-subsampled-fixes
OpenXR: Fix composition layers with Vulkan subsampled images
This commit is contained in:
@@ -153,7 +153,7 @@ void *OpenXRFBFoveationExtension::set_system_properties_and_get_next_pointer(voi
|
||||
|
||||
void *OpenXRFBFoveationExtension::set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) {
|
||||
void *next = p_next_pointer;
|
||||
if (is_enabled()) {
|
||||
if (is_enabled() && foveation_level > 0) {
|
||||
swapchain_create_info_foveation_fb.next = next;
|
||||
next = &swapchain_create_info_foveation_fb;
|
||||
|
||||
@@ -247,7 +247,7 @@ void OpenXRFBFoveationExtension::set_foveation_with_subsampled_images_enabled(bo
|
||||
}
|
||||
|
||||
bool OpenXRFBFoveationExtension::is_foveation_with_subsampled_images_enabled() const {
|
||||
return is_enabled() && meta_vulkan_swapchain_create_info_ext && foveation_with_subsampled_images_enabled;
|
||||
return is_enabled() && foveation_level > 0 && meta_vulkan_swapchain_create_info_ext && foveation_with_subsampled_images_enabled;
|
||||
}
|
||||
|
||||
void OpenXRFBFoveationExtension::set_foveation_with_subsampled_images_active(bool p_active) {
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
Vector<OpenXRAPI::OpenXRSwapChainInfo> OpenXRAPI::OpenXRSwapChainInfo::free_queue;
|
||||
|
||||
bool OpenXRAPI::OpenXRSwapChainInfo::create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size) {
|
||||
bool OpenXRAPI::OpenXRSwapChainInfo::create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, bool p_use_next_extensions) {
|
||||
OpenXRAPI *openxr_api = OpenXRAPI::get_singleton();
|
||||
ERR_FAIL_NULL_V(openxr_api, false);
|
||||
|
||||
@@ -102,10 +102,12 @@ bool OpenXRAPI::OpenXRSwapChainInfo::create(XrSwapchainCreateFlags p_create_flag
|
||||
XrResult result;
|
||||
|
||||
void *next_pointer = nullptr;
|
||||
for (OpenXRExtensionWrapper *wrapper : OpenXRAPI::get_registered_extension_wrappers()) {
|
||||
void *np = wrapper->set_swapchain_create_info_and_get_next_pointer(next_pointer);
|
||||
if (np != nullptr) {
|
||||
next_pointer = np;
|
||||
if (p_use_next_extensions) {
|
||||
for (OpenXRExtensionWrapper *wrapper : OpenXRAPI::get_registered_extension_wrappers()) {
|
||||
void *np = wrapper->set_swapchain_create_info_and_get_next_pointer(next_pointer);
|
||||
if (np != nullptr) {
|
||||
next_pointer = np;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1315,7 +1317,7 @@ bool OpenXRAPI::create_main_swapchains(const Size2i &p_size) {
|
||||
|
||||
// We start with our color swapchain...
|
||||
if (color_swapchain_format != 0) {
|
||||
if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_COLOR].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, color_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size())) {
|
||||
if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_COLOR].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, color_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size(), true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1327,7 +1329,7 @@ bool OpenXRAPI::create_main_swapchains(const Size2i &p_size) {
|
||||
// - we support our depth layer extension
|
||||
// Note: Application Space Warp and Frame Synthesis use a separate lower resolution depth buffer.
|
||||
if (depth_swapchain_format != 0 && submit_depth_buffer && OpenXRCompositionLayerDepthExtension::get_singleton()->is_available()) {
|
||||
if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_DEPTH].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, depth_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size())) {
|
||||
if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_DEPTH].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, depth_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size(), true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ public:
|
||||
_FORCE_INLINE_ XrSwapchain get_swapchain() const { return swapchain; }
|
||||
_FORCE_INLINE_ bool is_image_acquired() const { return image_acquired; }
|
||||
|
||||
bool create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size);
|
||||
bool create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, bool p_next_extensions = false);
|
||||
void queue_free();
|
||||
static void free_queued();
|
||||
void free();
|
||||
|
||||
Reference in New Issue
Block a user