/**************************************************************************/ /* rendering_device_driver.h */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /**************************************************************************/ /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ #ifndef RENDERING_DEVICE_DRIVER_H #define RENDERING_DEVICE_DRIVER_H // *********************************************************************************** // RenderingDeviceDriver - Design principles // ----------------------------------------- // - Very little validation is done, and normally only in dev or debug builds. // - Error reporting is generally simple: returning an id of 0 or a false boolean. // - Certain enums/constants/structs follow Vulkan values/layout. That makes things easier for RDDVulkan (it asserts compatibility). // - We allocate as little as possible in functions expected to be quick (a counterexample is loading/saving shaders) and use alloca() whenever suitable. // - We try to back opaque ids with the native ones or memory addresses. // - When using bookkeeping structures because the actual API id of a resource is not enough, we use a PagedAllocator. // - Every struct has default initializers. // - Using VectorView to take array-like arguments. Vector<uint8_t> is an exception (an indiom for "BLOB"). // - If a driver needs some higher-level information (the kind of info RenderingDevice keeps), it shall store a copy of what it needs. // There's no backwards communication from the driver to query data from RenderingDevice. // *********************************************************************************** #include "core/object/object.h" #include "core/variant/type_info.h" #include "servers/display_server.h" #include "servers/rendering/rendering_context_driver.h" #include "servers/rendering/rendering_device_commons.h" #include <algorithm> // This may one day be used in Godot for interoperability between C arrays, Vector and LocalVector. // (See https://github.com/godotengine/godot-proposals/issues/5144.) template <typename T> class VectorView { … }; // These utilities help drivers avoid allocations. #define ALLOCA(m_size) … #define ALLOCA_ARRAY(m_type, m_count) … #define ALLOCA_SINGLE(m_type) … // This helps forwarding certain arrays to the API with confidence. #define ARRAYS_COMPATIBLE(m_type_a, m_type_b) … // This is used when you also need to ensure structured types are compatible field-by-field. // TODO: The fieldwise check is unimplemented, but still this one is useful, as a strong annotation about the needs. #define ARRAYS_COMPATIBLE_FIELDWISE(m_type_a, m_type_b) … // Another utility, to make it easy to compare members of different enums, which is not fine with some compilers. #define ENUM_MEMBERS_EQUAL(m_a, m_b) … // This helps using a single paged allocator for many resource types. template <typename... RESOURCE_TYPES> struct VersatileResourceTemplate { … }; class RenderingDeviceDriver : public RenderingDeviceCommons { … }; RDD; #endif // RENDERING_DEVICE_DRIVER_H