diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-02-12 23:29:32 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-02-12 23:29:32 +0100 |
commit | 3be3d5099cc75a2db544b3a0964a430c3eb00909 (patch) | |
tree | c9741446ca06cfddf7a0861749565d0932ce243a /servers/rendering/rendering_device.h | |
parent | c66f87daa796f4ddea70156f5fec582db6c525f6 (diff) | |
parent | 73eff10c76c201a083193c044de1836217b4d72b (diff) | |
download | redot-engine-3be3d5099cc75a2db544b3a0964a430c3eb00909.tar.gz |
Merge pull request #87340 from DarioSamo/rd_common_context
Finish splitting functionality of the `RenderingDevice` backends into `RenderingDeviceDriver`.
Diffstat (limited to 'servers/rendering/rendering_device.h')
-rw-r--r-- | servers/rendering/rendering_device.h | 126 |
1 files changed, 63 insertions, 63 deletions
diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 2ccef66308..f4b7683d6e 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -64,36 +64,11 @@ class RenderingDevice : public RenderingDeviceCommons { _THREAD_SAFE_CLASS_ public: - enum DeviceFamily { - DEVICE_UNKNOWN, - DEVICE_OPENGL, - DEVICE_VULKAN, - DEVICE_DIRECTX, - }; - enum ShaderLanguage { SHADER_LANGUAGE_GLSL, SHADER_LANGUAGE_HLSL }; - enum SubgroupOperations { - SUBGROUP_BASIC_BIT = 1, - SUBGROUP_VOTE_BIT = 2, - SUBGROUP_ARITHMETIC_BIT = 4, - SUBGROUP_BALLOT_BIT = 8, - SUBGROUP_SHUFFLE_BIT = 16, - SUBGROUP_SHUFFLE_RELATIVE_BIT = 32, - SUBGROUP_CLUSTERED_BIT = 64, - SUBGROUP_QUAD_BIT = 128, - }; - - struct Capabilities { - // main device info - DeviceFamily device_family = DEVICE_UNKNOWN; - uint32_t version_major = 1; - uint32_t version_minor = 0; - }; - typedef int64_t DrawListID; typedef int64_t ComputeListID; @@ -110,9 +85,9 @@ private: static RenderingDevice *singleton; - Capabilities device_capabilities; - - RenderingDeviceDriver *driver = nullptr; // Owned by the context. + RenderingContextDriver *context = nullptr; + RenderingDeviceDriver *driver = nullptr; + RenderingContextDriver::Device device; protected: static void _bind_methods(); @@ -188,8 +163,8 @@ private: enum StagingRequiredAction { STAGING_REQUIRED_ACTION_NONE, - STAGING_REQUIRED_ACTION_FLUSH_CURRENT, - STAGING_REQUIRED_ACTION_FLUSH_OLDER + STAGING_REQUIRED_ACTION_FLUSH_AND_STALL_ALL, + STAGING_REQUIRED_ACTION_STALL_PREVIOUS }; Error _staging_buffer_allocate(uint32_t p_amount, uint32_t p_required_align, uint32_t &r_alloc_offset, uint32_t &r_alloc_size, StagingRequiredAction &r_required_action, bool p_can_segment = true); @@ -819,12 +794,11 @@ private: Error _texture_copy_bind_compat_84976(RID p_from_texture, RID p_to_texture, const Vector3 &p_from, const Vector3 &p_to, const Vector3 &p_size, uint32_t p_src_mipmap, uint32_t p_dst_mipmap, uint32_t p_src_layer, uint32_t p_dst_layer, BitField<BarrierMask> p_post_barrier); Error _texture_clear_bind_compat_84976(RID p_texture, const Color &p_color, uint32_t p_base_mipmap, uint32_t p_mipmaps, uint32_t p_base_layer, uint32_t p_layers, BitField<BarrierMask> p_post_barrier); Error _texture_resolve_multisample_bind_compat_84976(RID p_from_texture, RID p_to_texture, BitField<BarrierMask> p_post_barrier); + FramebufferFormatID _screen_get_framebuffer_format_bind_compat_87340() const; #endif public: - ApiContextRD *get_context() const { return context; } - - const Capabilities *get_device_capabilities() const { return &device_capabilities; }; + const RDD::Capabilities &get_device_capabilities() const { return driver->get_capabilities(); } bool has_feature(const Features p_feature) const; @@ -996,10 +970,10 @@ private: RID_Owner<RenderPipeline> render_pipeline_owner; - bool pipelines_cache_enabled = false; - size_t pipelines_cache_size = 0; - String pipelines_cache_file_path; - WorkerThreadPool::TaskID pipelines_cache_save_task = WorkerThreadPool::INVALID_TASK_ID; + bool pipeline_cache_enabled = false; + size_t pipeline_cache_size = 0; + String pipeline_cache_file_path; + WorkerThreadPool::TaskID pipeline_cache_save_task = WorkerThreadPool::INVALID_TASK_ID; Vector<uint8_t> _load_pipeline_cache(); void _update_pipeline_cache(bool p_closing = false); @@ -1024,13 +998,22 @@ public: RID compute_pipeline_create(RID p_shader, const Vector<PipelineSpecializationConstant> &p_specialization_constants = Vector<PipelineSpecializationConstant>()); bool compute_pipeline_is_valid(RID p_pipeline); +private: /****************/ /**** SCREEN ****/ /****************/ + HashMap<DisplayServer::WindowID, RDD::SwapChainID> screen_swap_chains; + HashMap<DisplayServer::WindowID, RDD::FramebufferID> screen_framebuffers; - int screen_get_width(DisplayServer::WindowID p_screen = 0) const; - int screen_get_height(DisplayServer::WindowID p_screen = 0) const; - FramebufferFormatID screen_get_framebuffer_format() const; + uint32_t _get_swap_chain_desired_count() const; + +public: + Error screen_create(DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID); + Error screen_prepare_for_drawing(DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID); + int screen_get_width(DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID) const; + int screen_get_height(DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID) const; + FramebufferFormatID screen_get_framebuffer_format(DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID) const; + Error screen_free(DisplayServer::WindowID p_screen = DisplayServer::MAIN_WINDOW_ID); /*************************/ /**** DRAW LISTS (II) ****/ @@ -1101,7 +1084,6 @@ private: DrawList *draw_list = nullptr; uint32_t draw_list_subpass_count = 0; - uint32_t draw_list_count = 0; RDD::RenderPassID draw_list_render_pass; RDD::FramebufferID draw_list_vkframebuffer; #ifdef DEBUG_ENABLED @@ -1215,6 +1197,15 @@ private: RenderingDeviceGraph draw_graph; /**************************/ + /**** QUEUE MANAGEMENT ****/ + /**************************/ + + RDD::CommandQueueFamilyID main_queue_family; + RDD::CommandQueueFamilyID present_queue_family; + RDD::CommandQueueID main_queue; + RDD::CommandQueueID present_queue; + + /**************************/ /**** FRAME MANAGEMENT ****/ /**************************/ @@ -1232,7 +1223,6 @@ private: // nature of the GPU. They will get deleted // when the frame is cycled. -private: struct Frame { // List in usage order, from last to free to first to free. List<Buffer> buffers_to_dispose_of; @@ -1245,13 +1235,30 @@ private: List<ComputePipeline> compute_pipelines_to_dispose_of; RDD::CommandPoolID command_pool; + + // Used at the beginning of every frame for set-up. // Used for filling up newly created buffers with data provided on creation. // Primarily intended to be accessed by worker threads. - // Ideally this cmd buffer should use an async transfer queue. - RDD::CommandBufferID setup_command_buffer; // Used at the beginning of every frame for set-up. - // The main cmd buffer for drawing and compute. + // Ideally this command buffer should use an async transfer queue. + RDD::CommandBufferID setup_command_buffer; + + // The main command buffer for drawing and compute. // Primarily intended to be used by the main thread to do most stuff. - RDD::CommandBufferID draw_command_buffer; // Used at the beginning of every frame for set-up. + RDD::CommandBufferID draw_command_buffer; + + // Signaled by the setup submission. Draw must wait on this semaphore. + RDD::SemaphoreID setup_semaphore; + + // Signaled by the draw submission. Present must wait on this semaphore. + RDD::SemaphoreID draw_semaphore; + + // Signaled by the draw submission. Must wait on this fence before beginning + // command recording for the frame. + RDD::FenceID draw_fence; + bool draw_fence_signaled = false; + + // Swap chains prepared for drawing during the frame that must be presented. + LocalVector<RDD::SwapChainID> swap_chains_to_present; struct Timestamp { String description; @@ -1272,37 +1279,32 @@ private: uint32_t max_timestamp_query_elements = 0; - TightLocalVector<Frame> frames; // Frames available, for main device they are cycled (usually 3), for local devices only 1. - int frame = 0; // Current frame. - int frame_count = 0; // Total amount of frames. + int frame = 0; + TightLocalVector<Frame> frames; uint64_t frames_drawn = 0; - RID local_device; - bool local_device_processing = false; void _free_pending_resources(int p_frame); - ApiContextRD *context = nullptr; - uint64_t texture_memory = 0; uint64_t buffer_memory = 0; void _free_internal(RID p_id); - void _flush(bool p_current_frame); - - bool screen_prepared = false; + void _begin_frame(); + void _end_frame(); + void _execute_frame(bool p_signal_for_present); + void _present_frame(); + void _stall_for_previous_frames(); + void _flush_and_stall_for_all_frames(); template <class T> void _free_rids(T &p_owner, const char *p_type); - void _finalize_command_buffers(bool p_postpare); - void _begin_frame(); - #ifdef DEV_ENABLED HashMap<RID, String> resource_names; #endif public: - void initialize(ApiContextRD *p_context, bool p_local_device = false); + Error initialize(RenderingContextDriver *p_context, DisplayServer::WindowID p_main_window = DisplayServer::INVALID_WINDOW_ID); void finalize(); void free(RID p_id); @@ -1324,9 +1326,6 @@ public: uint64_t limit_get(Limit p_limit) const; - //methods below not exposed, used by RenderingDeviceRD - void prepare_screen_for_drawing(); - void swap_buffers(); uint32_t get_frame_delay() const; @@ -1352,6 +1351,7 @@ public: String get_device_vendor_name() const; String get_device_name() const; DeviceType get_device_type() const; + String get_device_api_name() const; String get_device_api_version() const; String get_device_pipeline_cache_uuid() const; |