From 64cc6922e8654e3e5d39f80db834934a7cf93082 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 23 Jan 2025 17:02:02 -0800 Subject: [PATCH] Add a way to retrieve the GL_RENDERER and GL_VENDOR strings This is only supported if the backend is OpenGL. FIXES=[385367277] --- filament/backend/include/backend/DriverEnums.h | 7 +++++++ .../include/private/backend/DriverAPI.inc | 1 + filament/backend/src/metal/MetalDriver.mm | 4 ++++ filament/backend/src/noop/NoopDriver.cpp | 9 +++++++++ filament/backend/src/opengl/OpenGLDriver.cpp | 10 ++++++++++ filament/backend/src/vulkan/VulkanDriver.cpp | 4 ++++ filament/include/filament/Engine.h | 15 +++++++++++++++ filament/src/Engine.cpp | 8 ++++++++ filament/src/details/Engine.h | 17 +++++++++++++---- 9 files changed, 71 insertions(+), 4 deletions(-) diff --git a/filament/backend/include/backend/DriverEnums.h b/filament/backend/include/backend/DriverEnums.h index 726665e396a..63ce2067884 100644 --- a/filament/backend/include/backend/DriverEnums.h +++ b/filament/backend/include/backend/DriverEnums.h @@ -1312,6 +1312,13 @@ enum class Workaround : uint16_t { using StereoscopicType = backend::Platform::StereoscopicType; +enum class BackendString : uint8_t { + // OpenGL backend only. Return the GL_VENDOR string. + VENDOR, + // OpenGL backend only. Return the GL_RENDERER string. + RENDERER +}; + } // namespace filament::backend template<> struct utils::EnableBitMaskOperators diff --git a/filament/backend/include/private/backend/DriverAPI.inc b/filament/backend/include/private/backend/DriverAPI.inc index 6b951da975c..029210a4e10 100644 --- a/filament/backend/include/private/backend/DriverAPI.inc +++ b/filament/backend/include/private/backend/DriverAPI.inc @@ -357,6 +357,7 @@ DECL_DRIVER_API_SYNCHRONOUS_N(void, setupExternalImage, void*, image) DECL_DRIVER_API_SYNCHRONOUS_N(backend::TimerQueryResult, getTimerQueryValue, backend::TimerQueryHandle, query, uint64_t*, elapsedTime) DECL_DRIVER_API_SYNCHRONOUS_N(bool, isWorkaroundNeeded, backend::Workaround, workaround) DECL_DRIVER_API_SYNCHRONOUS_0(backend::FeatureLevel, getFeatureLevel) +DECL_DRIVER_API_SYNCHRONOUS_N(char const*, getString, backend::BackendString, stringName) /* * Updating driver objects diff --git a/filament/backend/src/metal/MetalDriver.mm b/filament/backend/src/metal/MetalDriver.mm index 46f285213ac..1c84c1154bc 100644 --- a/filament/backend/src/metal/MetalDriver.mm +++ b/filament/backend/src/metal/MetalDriver.mm @@ -1132,6 +1132,10 @@ return FeatureLevel::FEATURE_LEVEL_2; } +char const* MetalDriver::getString(backend::BackendString) { + return nullptr; +} + math::float2 MetalDriver::getClipSpaceParams() { // virtual and physical z-coordinate of clip-space is in [-w, 0] // Note: this is actually never used (see: surface_main.vs), but it's a backend API so we diff --git a/filament/backend/src/noop/NoopDriver.cpp b/filament/backend/src/noop/NoopDriver.cpp index af3ad70fbb6..a4e70d14aac 100644 --- a/filament/backend/src/noop/NoopDriver.cpp +++ b/filament/backend/src/noop/NoopDriver.cpp @@ -14,9 +14,14 @@ * limitations under the License. */ +#include +#include + #include "noop/NoopDriver.h" #include "CommandStreamDispatcher.h" +#include + namespace filament::backend { Driver* NoopDriver::create() { @@ -217,6 +222,10 @@ FeatureLevel NoopDriver::getFeatureLevel() { return FeatureLevel::FEATURE_LEVEL_1; } +char const* NoopDriver::getString(backend::BackendString) { + return nullptr; +} + math::float2 NoopDriver::getClipSpaceParams() { return math::float2{ 1.0f, 0.0f }; } diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index 736fa0d6769..0bcdf634f16 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -2363,6 +2363,16 @@ FeatureLevel OpenGLDriver::getFeatureLevel() { return mContext.getFeatureLevel(); } +char const* OpenGLDriver::getString(BackendString stringName) { + switch (stringName) { + case BackendString::VENDOR: + return mContext.state.vendor; + case BackendString::RENDERER: + return mContext.state.renderer; + } + return nullptr; +} + math::float2 OpenGLDriver::getClipSpaceParams() { return mContext.ext.EXT_clip_control ? // z-coordinate of virtual and physical clip-space is in [-w, 0] diff --git a/filament/backend/src/vulkan/VulkanDriver.cpp b/filament/backend/src/vulkan/VulkanDriver.cpp index 3443b1dfdaa..e5a4ad03c1e 100644 --- a/filament/backend/src/vulkan/VulkanDriver.cpp +++ b/filament/backend/src/vulkan/VulkanDriver.cpp @@ -1089,6 +1089,10 @@ FeatureLevel VulkanDriver::getFeatureLevel() { return FeatureLevel::FEATURE_LEVEL_3; } +char const* VulkanDriver::getString(backend::BackendString) { + return nullptr; +} + math::float2 VulkanDriver::getClipSpaceParams() { // virtual and physical z-coordinate of clip-space is in [-w, 0] // Note: this is actually never used (see: surface_main.vs), but it's a backend API, so we diff --git a/filament/include/filament/Engine.h b/filament/include/filament/Engine.h index 5092e16c385..9e3c5818f65 100644 --- a/filament/include/filament/Engine.h +++ b/filament/include/filament/Engine.h @@ -638,6 +638,21 @@ class UTILS_PUBLIC Engine { */ static void destroy(Engine* UTILS_NULLABLE engine); + + /** + * This is only available with the OpenGL backend. + * @see getBackend + * @return GL_VENDOR string or nullptr if the backend is not OpenGL. + */ + char const* UTILS_NULLABLE getVendorString() const noexcept; + + /** + * This is only available with the OpenGL backend. + * @see getBackend + * @return GL_RENDERER string or nullptr if the backend is not OpenGL. + */ + char const* UTILS_NULLABLE getRendererString() const noexcept; + /** * Query the feature level supported by the selected backend. * diff --git a/filament/src/Engine.cpp b/filament/src/Engine.cpp index 455067739ce..a98104a213d 100644 --- a/filament/src/Engine.cpp +++ b/filament/src/Engine.cpp @@ -76,6 +76,14 @@ void Engine::destroy(Engine** pEngine) { } } +char const* Engine::getVendorString() const noexcept { + return downcast(this)->getVendorString(); +} + +char const* Engine::getRendererString() const noexcept { + return downcast(this)->getRendererString(); +} + // ----------------------------------------------------------------------------------------------- // Resource management // ----------------------------------------------------------------------------------------------- diff --git a/filament/src/details/Engine.h b/filament/src/details/Engine.h index 28376a5b6be..79e44f06186 100644 --- a/filament/src/details/Engine.h +++ b/filament/src/details/Engine.h @@ -61,6 +61,8 @@ #include #include +#include + #include #include #include @@ -114,12 +116,11 @@ class ResourceAllocator; */ class FEngine : public Engine { public: - - inline void* operator new(std::size_t const size) noexcept { + void* operator new(std::size_t const size) noexcept { return utils::aligned_alloc(size, alignof(FEngine)); } - inline void operator delete(void* p) noexcept { + void operator delete(void* p) noexcept { utils::aligned_free(p); } @@ -140,6 +141,14 @@ class FEngine : public Engine { ~FEngine() noexcept; + char const* getVendorString() const noexcept { + return getDriver().getString(backend::BackendString::VENDOR); + } + + char const* getRendererString() const noexcept { + return getDriver().getString(backend::BackendString::RENDERER); + } + backend::ShaderModel getShaderModel() const noexcept { return getDriver().getShaderModel(); } DriverApi& getDriverApi() noexcept { @@ -490,7 +499,7 @@ class FEngine : public Engine { backend::Handle getOneTextureArray() const { return mDummyOneTextureArray; } backend::Handle getZeroTextureArray() const { return mDummyZeroTextureArray; } - static constexpr const size_t MiB = 1024u * 1024u; + static constexpr size_t MiB = 1024u * 1024u; size_t getMinCommandBufferSize() const noexcept { return mConfig.minCommandBufferSizeMB * MiB; } size_t getCommandBufferSize() const noexcept { return mConfig.commandBufferSizeMB * MiB; } size_t getPerFrameCommandsSize() const noexcept { return mConfig.perFrameCommandsSizeMB * MiB; }