diff options
author | Dario <dariosamo@gmail.com> | 2023-12-19 14:57:56 -0300 |
---|---|---|
committer | Dario <dariosamo@gmail.com> | 2024-02-12 10:02:18 -0300 |
commit | 73eff10c76c201a083193c044de1836217b4d72b (patch) | |
tree | 30c75b2d6c8c3bd9adaefb7b3c615ab13dfbe4db /modules | |
parent | f317cc713aa4dbcee2efa10db764473a56680be7 (diff) | |
download | redot-engine-73eff10c76c201a083193c044de1836217b4d72b.tar.gz |
Finish splitting functionality of the Vulkan and D3D12 backends into RenderingDeviceDriver.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/glslang/register_types.cpp | 14 | ||||
-rw-r--r-- | modules/lightmapper_rd/lightmapper_rd.cpp | 54 | ||||
-rw-r--r-- | modules/openxr/extensions/platform/openxr_vulkan_extension.cpp | 20 | ||||
-rw-r--r-- | modules/openxr/extensions/platform/openxr_vulkan_extension.h | 16 | ||||
-rw-r--r-- | modules/openxr/openxr_platform_inc.h | 2 |
5 files changed, 77 insertions, 29 deletions
diff --git a/modules/glslang/register_types.cpp b/modules/glslang/register_types.cpp index d7e5ddd32c..09ad1d6777 100644 --- a/modules/glslang/register_types.cpp +++ b/modules/glslang/register_types.cpp @@ -39,7 +39,7 @@ #include <glslang/SPIRV/GlslangToSpv.h> static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage, const String &p_source_code, RenderingDevice::ShaderLanguage p_language, String *r_error, const RenderingDevice *p_render_device) { - const RD::Capabilities *capabilities = p_render_device->get_device_capabilities(); + const RDD::Capabilities &capabilities = p_render_device->get_device_capabilities(); Vector<uint8_t> ret; ERR_FAIL_COND_V(p_language == RenderingDevice::SHADER_LANGUAGE_HLSL, ret); @@ -57,17 +57,17 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage glslang::EShTargetClientVersion ClientVersion = glslang::EShTargetVulkan_1_2; glslang::EShTargetLanguageVersion TargetVersion = glslang::EShTargetSpv_1_5; - if (capabilities->device_family == RenderingDevice::DeviceFamily::DEVICE_VULKAN) { - if (capabilities->version_major == 1 && capabilities->version_minor == 0) { + if (capabilities.device_family == RDD::DEVICE_VULKAN) { + if (capabilities.version_major == 1 && capabilities.version_minor == 0) { ClientVersion = glslang::EShTargetVulkan_1_0; TargetVersion = glslang::EShTargetSpv_1_0; - } else if (capabilities->version_major == 1 && capabilities->version_minor == 1) { + } else if (capabilities.version_major == 1 && capabilities.version_minor == 1) { ClientVersion = glslang::EShTargetVulkan_1_1; TargetVersion = glslang::EShTargetSpv_1_3; } else { // use defaults } - } else if (capabilities->device_family == RenderingDevice::DeviceFamily::DEVICE_DIRECTX) { + } else if (capabilities.device_family == RDD::DEVICE_DIRECTX) { // NIR-DXIL is Vulkan 1.1-conformant. ClientVersion = glslang::EShTargetVulkan_1_1; // The SPIR-V part of Mesa supports 1.6, but: @@ -186,9 +186,9 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage } static String _get_cache_key_function_glsl(const RenderingDevice *p_render_device) { - const RD::Capabilities *capabilities = p_render_device->get_device_capabilities(); + const RenderingDeviceDriver::Capabilities &capabilities = p_render_device->get_device_capabilities(); String version; - version = "SpirVGen=" + itos(glslang::GetSpirvGeneratorVersion()) + ", major=" + itos(capabilities->version_major) + ", minor=" + itos(capabilities->version_minor) + " , subgroup_size=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_SIZE)) + " , subgroup_ops=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_OPERATIONS)) + " , subgroup_in_shaders=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_IN_SHADERS)) + " , debug=" + itos(Engine::get_singleton()->is_generate_spirv_debug_info_enabled()); + version = "SpirVGen=" + itos(glslang::GetSpirvGeneratorVersion()) + ", major=" + itos(capabilities.version_major) + ", minor=" + itos(capabilities.version_minor) + " , subgroup_size=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_SIZE)) + " , subgroup_ops=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_OPERATIONS)) + " , subgroup_in_shaders=" + itos(p_render_device->limit_get(RD::LIMIT_SUBGROUP_IN_SHADERS)) + " , debug=" + itos(Engine::get_singleton()->is_generate_spirv_debug_info_enabled()); return version; } diff --git a/modules/lightmapper_rd/lightmapper_rd.cpp b/modules/lightmapper_rd/lightmapper_rd.cpp index 9ee281ad99..5d22cb1301 100644 --- a/modules/lightmapper_rd/lightmapper_rd.cpp +++ b/modules/lightmapper_rd/lightmapper_rd.cpp @@ -41,6 +41,10 @@ #include "editor/editor_settings.h" #include "servers/rendering/rendering_device_binds.h" +#if defined(VULKAN_ENABLED) +#include "drivers/vulkan/rendering_context_driver_vulkan.h" +#endif + //uncomment this if you want to see textures from all the process saved //#define DEBUG_TEXTURES @@ -1017,7 +1021,35 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d } #endif - RenderingDevice *rd = RenderingDevice::get_singleton()->create_local_device(); + // Attempt to create a local device by requesting it from rendering server first. + // If that fails because the current renderer is not implemented on top of RD, we fall back to creating + // a local rendering device manually depending on the current platform. + Error err; + RenderingContextDriver *rcd = nullptr; + RenderingDevice *rd = RenderingServer::get_singleton()->create_local_rendering_device(); + if (rd == nullptr) { +#if defined(RD_ENABLED) +#if defined(VULKAN_ENABLED) + rcd = memnew(RenderingContextDriverVulkan); + rd = memnew(RenderingDevice); +#endif +#endif + if (rcd != nullptr && rd != nullptr) { + err = rcd->initialize(); + if (err == OK) { + err = rd->initialize(rcd); + } + + if (err != OK) { + memdelete(rd); + memdelete(rcd); + rd = nullptr; + rcd = nullptr; + } + } + } + + ERR_FAIL_NULL_V(rd, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES); RID albedo_array_tex; RID emission_array_tex; @@ -1187,7 +1219,7 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d //shaders Ref<RDShaderFile> raster_shader; raster_shader.instantiate(); - Error err = raster_shader->parse_versions_from_text(lm_raster_shader_glsl); + err = raster_shader->parse_versions_from_text(lm_raster_shader_glsl); if (err != OK) { raster_shader->print_errors("raster_shader"); @@ -1195,6 +1227,10 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d FREE_BUFFERS memdelete(rd); + + if (rcd != nullptr) { + memdelete(rcd); + } } ERR_FAIL_COND_V(err != OK, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES); @@ -1367,6 +1403,11 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d FREE_BUFFERS FREE_RASTER_RESOURCES memdelete(rd); + + if (rcd != nullptr) { + memdelete(rcd); + } + compute_shader->print_errors("compute_shader"); } ERR_FAIL_COND_V(err != OK, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES); @@ -1789,6 +1830,11 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d FREE_RASTER_RESOURCES FREE_COMPUTE_RESOURCES memdelete(rd); + + if (rcd != nullptr) { + memdelete(rcd); + } + blendseams_shader->print_errors("blendseams_shader"); } ERR_FAIL_COND_V(err != OK, BAKE_ERROR_LIGHTMAP_CANT_PRE_BAKE_MESHES); @@ -1964,6 +2010,10 @@ LightmapperRD::BakeError LightmapperRD::bake(BakeQuality p_quality, bool p_use_d memdelete(rd); + if (rcd != nullptr) { + memdelete(rcd); + } + return BAKE_OK; } diff --git a/modules/openxr/extensions/platform/openxr_vulkan_extension.cpp b/modules/openxr/extensions/platform/openxr_vulkan_extension.cpp index a2f2577959..f5e7fc192c 100644 --- a/modules/openxr/extensions/platform/openxr_vulkan_extension.cpp +++ b/modules/openxr/extensions/platform/openxr_vulkan_extension.cpp @@ -38,14 +38,6 @@ #include "servers/rendering/rendering_server_globals.h" #include "servers/rendering_server.h" -OpenXRVulkanExtension::OpenXRVulkanExtension() { - VulkanContext::set_vulkan_hooks(this); -} - -OpenXRVulkanExtension::~OpenXRVulkanExtension() { - VulkanContext::set_vulkan_hooks(nullptr); -} - HashMap<String, bool *> OpenXRVulkanExtension::get_requested_extensions() { HashMap<String, bool *> request_extensions; @@ -178,10 +170,6 @@ bool OpenXRVulkanExtension::get_physical_device(VkPhysicalDevice *r_device) { bool OpenXRVulkanExtension::create_vulkan_device(const VkDeviceCreateInfo *p_device_create_info, VkDevice *r_device) { ERR_FAIL_NULL_V(OpenXRAPI::get_singleton(), false); - // the first entry in our queue list should be the one we need to remember... - vulkan_queue_family_index = p_device_create_info->pQueueCreateInfos[0].queueFamilyIndex; - vulkan_queue_index = 0; // ?? - XrVulkanDeviceCreateInfoKHR create_info = { XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR, // type nullptr, // next @@ -209,9 +197,17 @@ bool OpenXRVulkanExtension::create_vulkan_device(const VkDeviceCreateInfo *p_dev return true; } +void OpenXRVulkanExtension::set_direct_queue_family_and_index(uint32_t p_queue_family_index, uint32_t p_queue_index) { + vulkan_queue_family_index = p_queue_family_index; + vulkan_queue_index = p_queue_index; +} + XrGraphicsBindingVulkanKHR OpenXRVulkanExtension::graphics_binding_vulkan; void *OpenXRVulkanExtension::set_session_create_and_get_next_pointer(void *p_next_pointer) { + DEV_ASSERT(vulkan_queue_family_index < UINT32_MAX && "Direct queue family index was not specified yet."); + DEV_ASSERT(vulkan_queue_index < UINT32_MAX && "Direct queue index was not specified yet."); + graphics_binding_vulkan.type = XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR; graphics_binding_vulkan.next = p_next_pointer; graphics_binding_vulkan.instance = vulkan_instance; diff --git a/modules/openxr/extensions/platform/openxr_vulkan_extension.h b/modules/openxr/extensions/platform/openxr_vulkan_extension.h index 2d0973bb6b..a3f86a9968 100644 --- a/modules/openxr/extensions/platform/openxr_vulkan_extension.h +++ b/modules/openxr/extensions/platform/openxr_vulkan_extension.h @@ -36,23 +36,25 @@ #include "../openxr_extension_wrapper.h" #include "core/templates/vector.h" +#include "drivers/vulkan/vulkan_hooks.h" // Always include this as late as possible. #include "../../openxr_platform_inc.h" class OpenXRVulkanExtension : public OpenXRGraphicsExtensionWrapper, VulkanHooks { public: - OpenXRVulkanExtension(); - virtual ~OpenXRVulkanExtension() override; + OpenXRVulkanExtension() = default; + virtual ~OpenXRVulkanExtension() override = default; virtual HashMap<String, bool *> get_requested_extensions() override; virtual void on_instance_created(const XrInstance p_instance) override; virtual void *set_session_create_and_get_next_pointer(void *p_next_pointer) override; - virtual bool create_vulkan_instance(const VkInstanceCreateInfo *p_vulkan_create_info, VkInstance *r_instance) override; - virtual bool get_physical_device(VkPhysicalDevice *r_device) override; - virtual bool create_vulkan_device(const VkDeviceCreateInfo *p_device_create_info, VkDevice *r_device) override; + virtual bool create_vulkan_instance(const VkInstanceCreateInfo *p_vulkan_create_info, VkInstance *r_instance) override final; + virtual bool get_physical_device(VkPhysicalDevice *r_device) override final; + virtual bool create_vulkan_device(const VkDeviceCreateInfo *p_device_create_info, VkDevice *r_device) override final; + virtual void set_direct_queue_family_and_index(uint32_t p_queue_family_index, uint32_t p_queue_index) override final; virtual void get_usable_swapchain_formats(Vector<int64_t> &p_usable_swap_chains) override; virtual void get_usable_depth_formats(Vector<int64_t> &p_usable_swap_chains) override; @@ -76,8 +78,8 @@ private: VkInstance vulkan_instance = nullptr; VkPhysicalDevice vulkan_physical_device = nullptr; VkDevice vulkan_device = nullptr; - uint32_t vulkan_queue_family_index = 0; - uint32_t vulkan_queue_index = 0; + uint32_t vulkan_queue_family_index = UINT32_MAX; + uint32_t vulkan_queue_index = UINT32_MAX; EXT_PROTO_XRRESULT_FUNC3(xrGetVulkanGraphicsRequirements2KHR, (XrInstance), p_instance, (XrSystemId), p_system_id, (XrGraphicsRequirementsVulkanKHR *), p_graphics_requirements) EXT_PROTO_XRRESULT_FUNC4(xrCreateVulkanInstanceKHR, (XrInstance), p_instance, (const XrVulkanInstanceCreateInfoKHR *), p_create_info, (VkInstance *), r_vulkan_instance, (VkResult *), r_vulkan_result) diff --git a/modules/openxr/openxr_platform_inc.h b/modules/openxr/openxr_platform_inc.h index 6288d1e380..957a87cbb2 100644 --- a/modules/openxr/openxr_platform_inc.h +++ b/modules/openxr/openxr_platform_inc.h @@ -36,7 +36,7 @@ #ifdef VULKAN_ENABLED #define XR_USE_GRAPHICS_API_VULKAN -#include "drivers/vulkan/vulkan_context.h" +#include "drivers/vulkan/rendering_context_driver_vulkan.h" #endif // VULKAN_ENABLED #if defined(GLES3_ENABLED) && !defined(MACOS_ENABLED) |