From 21d87cd45a4011c448eaadfe72ded184110c5739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Tue, 10 Oct 2023 18:16:26 +0200 Subject: [PATCH] app_server: recursive scan in /dev/graphics/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * /dev/graphics/virtio_gpu/0 is a valid entry * app_server doesn't set the initial mode if it's identical; use 0x0 as initial resolution. Change-Id: Ica0323e6c5d78b39f05499edc93fa9c949b97dc8 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7037 Tested-by: Commit checker robot Reviewed-by: Jérôme Duval --- .../interface/local/AccelerantHWInterface.cpp | 66 ++++++++++++------- .../interface/local/AccelerantHWInterface.h | 2 + 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp b/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp index 442df1b2e1..dd1c8391f8 100644 --- a/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp +++ b/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp @@ -34,7 +34,9 @@ #include #include +#include #include +#include #include #include #include @@ -164,8 +166,8 @@ AccelerantHWInterface::AccelerantHWInterface() fBlitParams(new (nothrow) blit_params[kDefaultParamsCount]), fBlitParamsCount(kDefaultParamsCount) { - fDisplayMode.virtual_width = 640; - fDisplayMode.virtual_height = 480; + fDisplayMode.virtual_width = 0; + fDisplayMode.virtual_height = 0; fDisplayMode.space = B_RGB32; // NOTE: I have no clue what I'm doing here. @@ -217,6 +219,42 @@ AccelerantHWInterface::Initialize() } +/*! Proceeds with a recursive scan, avoiding vesa and framebuffer devices. + + + \return Whether a device path matching the \a deviceNumber is found. +*/ +bool +AccelerantHWInterface::_RecursiveScan(const char* directory, int deviceNumber, int &count, + char *_path) +{ + ATRACE(("_RecursiveScan directory: %s\n", directory)); + + BEntry entry; + BDirectory dir(directory); + while (dir.GetNextEntry(&entry) == B_OK) { + BPath path; + entry.GetPath(&path); + if (!strcmp(path.Path(), "/dev/graphics/vesa") + || !strcmp(path.Path(), "/dev/graphics/framebuffer")) { + continue; + } + + if (entry.IsDirectory()) { + if (_RecursiveScan(path.Path(), deviceNumber, count, _path)) + return true; + } else { + if (count == deviceNumber) { + strlcpy(_path, path.Path(), PATH_MAX); + return true; + } + count++; + } + } + return false; +} + + /*! Opens a graphics device for read-write access. The \a deviceNumber is relative to the number of graphics devices that can @@ -237,31 +275,13 @@ AccelerantHWInterface::_OpenGraphicsDevice(int deviceNumber) int device = -1; int count = 0; if (!use_fail_safe_video_mode()) { - DIR *directory = opendir("/dev/graphics"); - if (!directory) - return B_ENTRY_NOT_FOUND; - - struct dirent *entry; char path[PATH_MAX]; - while ((entry = readdir(directory)) != NULL) { - if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..") - || !strcmp(entry->d_name, "vesa") || !strcmp(entry->d_name, "framebuffer")) - continue; - - if (count == deviceNumber) { - sprintf(path, "/dev/graphics/%s", entry->d_name); - device = open(path, B_READ_WRITE); - break; - } - - count++; - } - - closedir(directory); + if (_RecursiveScan("/dev/graphics/", deviceNumber, count, path)) + device = open(path, B_READ_WRITE); } // Open VESA or Framebuffer driver if we were not able to get a better one. - if (count < deviceNumber) { + if (device == -1 && count < deviceNumber) { device = open("/dev/graphics/vesa", B_READ_WRITE); if (device > 0) { // store the device, so that we can access the planar blitter diff --git a/src/servers/app/drawing/interface/local/AccelerantHWInterface.h b/src/servers/app/drawing/interface/local/AccelerantHWInterface.h index 305849d456..334a3f0894 100644 --- a/src/servers/app/drawing/interface/local/AccelerantHWInterface.h +++ b/src/servers/app/drawing/interface/local/AccelerantHWInterface.h @@ -107,6 +107,8 @@ protected: private: int _OpenGraphicsDevice(int deviceNumber); + bool _RecursiveScan(const char* directory, int deviceNumber, + int& count, char* _path); status_t _OpenAccelerant(int device); status_t _SetupDefaultHooks(); void _UpdateHooksAfterModeChange();