mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-13 06:38:31 +09:00
The benchmark tree had nothing that exercised a driver: SanityBench times std::vector, and the Buffer/Program benches call into MobileGL_s directly, so neither can say what a backend costs against the native driver. This adds a headless EGL client that can, and shapes its cases from measured traces rather than guesses. DriverBench dlopens exactly one EGL provider - the system libEGL.so.1, or a libMobileGL.so with MOBILEGL_BACKEND_TYPE selecting Espryt or Magma - so the same binary measures all three stacks with no LD_LIBRARY_PATH shadowing, which matters because MobileGL's own loader has to keep finding the real driver underneath. It renders into its own renderbuffer FBO on a 64x64 pbuffer and paces frames with glFinish, so it needs no window and no compositor. The six mc_* cases replay the per-frame call mix of 30-second render-distance-32 captures of three Minecraft versions, at the rates those captures measured: vanilla 1.21.1 issues 5495 glDrawElements per frame, each preceded by its own glBindVertexArray and glUniform3fv; Fabric+Sodium collapses the same scene into 132 glMultiDrawElementsBaseVertex; the 26.2 snapshot issues 3401 glDrawElementsBaseVertex, each preceded by glBindBufferRange + glBindBuffer. The texture case wraps every 16x16 atlas upload in the four glPixelStorei and two glTexParameteri calls Blaze3D re-sets around it, because that wrapper is a large part of what an upload costs a translation layer. One bench frame therefore costs what one real frame of that version costs, and ns_per_op is directly comparable across renderers. run_driver_bench.sh pins __EGL_VENDOR_LIBRARY_FILENAMES and VK_ICD_FILENAMES. Without that, eglGetDisplay(EGL_DEFAULT_DISPLAY) on this glvnd system resolves to Mesa llvmpipe and the "native" numbers silently describe a software rasteriser - the first run of this bench reported 11 us per draw before the pin, versus 250 ns on the real GPU. Verified against the NVIDIA 610.43.03 driver, Espryt and Magma on a GTX 1660 SUPER; the CMake target builds and runs from a clean configure.
45 lines
1.1 KiB
CMake
45 lines
1.1 KiB
CMake
cmake_minimum_required(VERSION 3.14)
|
|
project(MobileGLBenchmark)
|
|
|
|
message(STATUS "Generating build files for MobileGL Benchmark...")
|
|
|
|
set(CMAKE_CXX_STANDARD 23)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# Enable downloading dependencies
|
|
set(BENCHMARK_DOWNLOAD_DEPENDENCIES ON CACHE BOOL "Allow downloading benchmark dependencies")
|
|
set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable GTest tests")
|
|
set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable testing")
|
|
|
|
set(LINK_LIBRARIES
|
|
MobileGL_s
|
|
)
|
|
|
|
include(FetchContent)
|
|
FetchContent_Declare(
|
|
benchmark
|
|
GIT_REPOSITORY https://github.com/google/benchmark.git
|
|
GIT_TAG v1.9.4
|
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
|
)
|
|
FetchContent_MakeAvailable(benchmark)
|
|
|
|
enable_testing()
|
|
|
|
set(MGL_ROOT ${CMAKE_CURRENT_LIST_DIR}/../..)
|
|
|
|
add_executable(SanityBench
|
|
SanityBench.cpp
|
|
)
|
|
|
|
target_link_libraries(
|
|
SanityBench PRIVATE
|
|
benchmark::benchmark
|
|
)
|
|
|
|
add_test(NAME SanityBench COMMAND SanityBench --benchmark_counters_tabular=true)
|
|
set_tests_properties(SanityBench PROPERTIES LABELS benchmark)
|
|
|
|
add_subdirectory(Program)
|
|
add_subdirectory(Buffer)
|
|
add_subdirectory(Driver) |