From 861f644f196002931dbe1bcd025d5c20e36e23e1 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 23 Mar 2026 12:49:44 -0400 Subject: [PATCH] app_server & BWindowScreen: Do away with AS_GET_FRAME_BUFFER_CONFIG. It can't work if the framebuffer is mapped per-application. Instead, use the accelerant hook to get the framebuffer. The BScreen methods this disables were deprecated and marked private already, so no Haiku applications should be affected. (If really necessary they could be reimplemented with BWindowScreen.) Remove first _GetCardInfo in BWindowScreen; we invoke it later, closer to where the buffer is actually used. Tested with ParticlesII (which uses BWindowScreen) on VESA with the new user-only-mapping accelerant. Change-Id: I405bcfa8cb1eb2d0c346fafbc6233bef15196134 Reviewed-on: https://review.haiku-os.org/c/haiku/+/10572 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- headers/private/app/ServerProtocol.h | 1 - headers/private/interface/PrivateScreen.h | 5 --- src/kits/game/WindowScreen.cpp | 24 +++++------- src/kits/interface/PrivateScreen.cpp | 39 ------------------- src/kits/interface/Screen.cpp | 8 +--- src/servers/app/ProfileMessageSupport.cpp | 1 - src/servers/app/ServerApp.cpp | 21 ---------- src/servers/app/drawing/BitmapHWInterface.cpp | 7 ---- src/servers/app/drawing/BitmapHWInterface.h | 2 - src/servers/app/drawing/HWInterface.h | 2 - .../interface/local/AccelerantHWInterface.cpp | 8 ---- .../interface/local/AccelerantHWInterface.h | 2 - .../interface/remote/RemoteHWInterface.cpp | 8 ---- .../interface/remote/RemoteHWInterface.h | 2 - .../interface/virtual/DWindowHWInterface.cpp | 14 ------- .../interface/virtual/DWindowHWInterface.h | 2 - .../interface/virtual/ViewHWInterface.cpp | 14 ------- .../interface/virtual/ViewHWInterface.h | 2 - 18 files changed, 11 insertions(+), 151 deletions(-) diff --git a/headers/private/app/ServerProtocol.h b/headers/private/app/ServerProtocol.h index 848a68fbd7..b9fc05b207 100644 --- a/headers/private/app/ServerProtocol.h +++ b/headers/private/app/ServerProtocol.h @@ -170,7 +170,6 @@ enum { AS_GET_RETRACE_SEMAPHORE, AS_GET_ACCELERANT_INFO, AS_GET_MONITOR_INFO, - AS_GET_FRAME_BUFFER_CONFIG, AS_SET_DPMS, AS_GET_DPMS_STATE, diff --git a/headers/private/interface/PrivateScreen.h b/headers/private/interface/PrivateScreen.h index 580e732754..614a2fe711 100644 --- a/headers/private/interface/PrivateScreen.h +++ b/headers/private/interface/PrivateScreen.h @@ -85,9 +85,6 @@ public: status_t GetBrightness(float*); status_t SetBrightness(float); - void* BaseAddress(); - uint32 BytesPerRow(); - private: friend class BObjectList; @@ -98,8 +95,6 @@ private: bool _Release(); sem_id _RetraceSemaphore(); - status_t _GetFrameBufferConfig( - frame_buffer_config& config); static BPrivateScreen* _Get(int32 id, bool check); static bool _IsValid(int32 id); diff --git a/src/kits/game/WindowScreen.cpp b/src/kits/game/WindowScreen.cpp index 7ba130ab8e..0cf407ed18 100644 --- a/src/kits/game/WindowScreen.cpp +++ b/src/kits/game/WindowScreen.cpp @@ -41,6 +41,8 @@ using BPrivate::AppServerLink; // Acceleration hooks pointers +static get_frame_buffer_config sGetFrameBufferConfigHook; + static fill_rectangle sFillRectHook; static screen_to_screen_blit sBlitRectHook; static screen_to_screen_transparent_blit sTransparentBlitHook; @@ -610,10 +612,6 @@ BWindowScreen::_InitData(uint32 space, uint32 attributes) if (status < B_OK) throw status; - status = _GetCardInfo(); - if (status < B_OK) - throw status; - fDebugSem = create_sem(1, "WindowScreen debug sem"); if (fDebugSem < B_OK) throw (status_t)fDebugSem; @@ -690,11 +688,12 @@ status_t BWindowScreen::_Activate() { CALLED(); - status_t status = _AssertDisplayMode(fDisplayMode); + + status_t status = _SetupAccelerantHooks(); if (status < B_OK) return status; - status = _SetupAccelerantHooks(); + status = _AssertDisplayMode(fDisplayMode); if (status < B_OK) return status; @@ -760,6 +759,8 @@ BWindowScreen::_SetupAccelerantHooks() _ResetAccelerantHooks(); if (status == B_OK) { + sGetFrameBufferConfigHook = (get_frame_buffer_config) + fGetAccelerantHook(B_GET_FRAME_BUFFER_CONFIG, NULL); sWaitIdleHook = fWaitEngineIdle = (wait_engine_idle) fGetAccelerantHook(B_WAIT_ENGINE_IDLE, NULL); sReleaseEngineHook @@ -792,6 +793,7 @@ BWindowScreen::_ResetAccelerantHooks() if (fWaitEngineIdle) fWaitEngineIdle(); + sGetFrameBufferConfigHook = NULL; sFillRectHook = NULL; sBlitRectHook = NULL; sTransparentBlitHook = NULL; @@ -854,16 +856,8 @@ BWindowScreen::_GetCardInfo() if (mode.flags & B_PARALLEL_ACCESS) fCardInfo.flags |= B_PARALLEL_BUFFER_ACCESS; - AppServerLink link; - link.StartMessage(AS_GET_FRAME_BUFFER_CONFIG); - link.Attach(screen.ID()); - - status_t result = B_ERROR; - if (link.FlushWithReply(result) < B_OK || result < B_OK) - return result; - frame_buffer_config config; - link.Read(&config); + sGetFrameBufferConfigHook(&config); fCardInfo.frame_buffer = config.frame_buffer; fCardInfo.bytes_per_row = config.bytes_per_row; diff --git a/src/kits/interface/PrivateScreen.cpp b/src/kits/interface/PrivateScreen.cpp index 26fbe6b41b..fd41531555 100644 --- a/src/kits/interface/PrivateScreen.cpp +++ b/src/kits/interface/PrivateScreen.cpp @@ -693,28 +693,6 @@ BPrivateScreen::SetBrightness(float brightness) } -void * -BPrivateScreen::BaseAddress() -{ - frame_buffer_config config; - if (_GetFrameBufferConfig(config) != B_OK) - return NULL; - - return config.frame_buffer; -} - - -uint32 -BPrivateScreen::BytesPerRow() -{ - frame_buffer_config config; - if (_GetFrameBufferConfig(config) != B_OK) - return 0; - - return config.bytes_per_row; -} - - // #pragma mark - private methods @@ -753,23 +731,6 @@ BPrivateScreen::_RetraceSemaphore() } -status_t -BPrivateScreen::_GetFrameBufferConfig(frame_buffer_config& config) -{ - BPrivate::AppServerLink link; - link.StartMessage(AS_GET_FRAME_BUFFER_CONFIG); - link.Attach(ID()); - - status_t status = B_ERROR; - if (link.FlushWithReply(status) == B_OK && status == B_OK) { - link.Read(&config); - return B_OK; - } - - return status; -} - - BPrivateScreen::BPrivateScreen(int32 id) : fID(id), diff --git a/src/kits/interface/Screen.cpp b/src/kits/interface/Screen.cpp index 1045756341..53d4c43a93 100644 --- a/src/kits/interface/Screen.cpp +++ b/src/kits/interface/Screen.cpp @@ -372,9 +372,7 @@ BScreen::ProposeDisplayMode(display_mode* target, const display_mode* low, void* BScreen::BaseAddress() { - if (fScreen != NULL) - return fScreen->BaseAddress(); - + // deprecated return NULL; } @@ -382,8 +380,6 @@ BScreen::BaseAddress() uint32 BScreen::BytesPerRow() { - if (fScreen != NULL) - return fScreen->BytesPerRow(); - + // deprecated return 0; } diff --git a/src/servers/app/ProfileMessageSupport.cpp b/src/servers/app/ProfileMessageSupport.cpp index 663a562a33..e8b0e4c359 100644 --- a/src/servers/app/ProfileMessageSupport.cpp +++ b/src/servers/app/ProfileMessageSupport.cpp @@ -149,7 +149,6 @@ string_for_message_code(uint32 code) CODE(AS_GET_RETRACE_SEMAPHORE); CODE(AS_GET_ACCELERANT_INFO); CODE(AS_GET_MONITOR_INFO); - CODE(AS_GET_FRAME_BUFFER_CONFIG); CODE(AS_SET_DPMS); CODE(AS_GET_DPMS_STATE); diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index eaef758932..8981e3c0b2 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -3252,27 +3252,6 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; } - case AS_GET_FRAME_BUFFER_CONFIG: - { - STRACE(("ServerApp %s: get frame buffer config\n", Signature())); - - // We aren't using the screen_id for now... - int32 id; - link.Read(&id); - - frame_buffer_config config; - // TODO: I wonder if there should be a "desktop" lock... - status_t status = fDesktop->HWInterface()->GetFrameBufferConfig(config); - if (status == B_OK) { - fLink.StartMessage(B_OK); - fLink.Attach(config); - } else - fLink.StartMessage(status); - - fLink.Flush(); - break; - } - case AS_GET_RETRACE_SEMAPHORE: { STRACE(("ServerApp %s: get retrace semaphore\n", Signature())); diff --git a/src/servers/app/drawing/BitmapHWInterface.cpp b/src/servers/app/drawing/BitmapHWInterface.cpp index d3c8e4d7d8..0f6abb3997 100644 --- a/src/servers/app/drawing/BitmapHWInterface.cpp +++ b/src/servers/app/drawing/BitmapHWInterface.cpp @@ -101,13 +101,6 @@ BitmapHWInterface::GetDeviceInfo(accelerant_device_info* info) } -status_t -BitmapHWInterface::GetFrameBufferConfig(frame_buffer_config& config) -{ - return B_UNSUPPORTED; -} - - status_t BitmapHWInterface::GetModeList(display_mode** modes, uint32 *count) { diff --git a/src/servers/app/drawing/BitmapHWInterface.h b/src/servers/app/drawing/BitmapHWInterface.h index 1b38de49f4..9a5186f6dc 100644 --- a/src/servers/app/drawing/BitmapHWInterface.h +++ b/src/servers/app/drawing/BitmapHWInterface.h @@ -32,8 +32,6 @@ public: virtual void GetMode(display_mode* mode); virtual status_t GetDeviceInfo(accelerant_device_info* info); - virtual status_t GetFrameBufferConfig( - frame_buffer_config& config); virtual status_t GetModeList(display_mode** _modeList, uint32* _count); diff --git a/src/servers/app/drawing/HWInterface.h b/src/servers/app/drawing/HWInterface.h index c6ecf3afed..06f3f4c06f 100644 --- a/src/servers/app/drawing/HWInterface.h +++ b/src/servers/app/drawing/HWInterface.h @@ -81,8 +81,6 @@ public: virtual void GetMode(display_mode* mode) = 0; virtual status_t GetDeviceInfo(accelerant_device_info* info) = 0; - virtual status_t GetFrameBufferConfig( - frame_buffer_config& config) = 0; virtual status_t GetModeList(display_mode** _modeList, uint32* _count) = 0; virtual status_t GetPixelClockLimits(display_mode* mode, diff --git a/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp b/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp index edf1bfff92..5ac893e733 100644 --- a/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp +++ b/src/servers/app/drawing/interface/local/AccelerantHWInterface.cpp @@ -731,14 +731,6 @@ AccelerantHWInterface::GetDeviceInfo(accelerant_device_info* info) } -status_t -AccelerantHWInterface::GetFrameBufferConfig(frame_buffer_config& config) -{ - config = fFrameBufferConfig; - return B_OK; -} - - status_t AccelerantHWInterface::GetModeList(display_mode** _modes, uint32* _count) { diff --git a/src/servers/app/drawing/interface/local/AccelerantHWInterface.h b/src/servers/app/drawing/interface/local/AccelerantHWInterface.h index 85167c19c7..7717b03f8e 100644 --- a/src/servers/app/drawing/interface/local/AccelerantHWInterface.h +++ b/src/servers/app/drawing/interface/local/AccelerantHWInterface.h @@ -34,8 +34,6 @@ public: virtual void GetMode(display_mode* mode); virtual status_t GetDeviceInfo(accelerant_device_info* info); - virtual status_t GetFrameBufferConfig( - frame_buffer_config& config); virtual status_t GetModeList(display_mode** _modeList, uint32* _count); diff --git a/src/servers/app/drawing/interface/remote/RemoteHWInterface.cpp b/src/servers/app/drawing/interface/remote/RemoteHWInterface.cpp index 910a946a12..6d2d03f713 100644 --- a/src/servers/app/drawing/interface/remote/RemoteHWInterface.cpp +++ b/src/servers/app/drawing/interface/remote/RemoteHWInterface.cpp @@ -423,14 +423,6 @@ RemoteHWInterface::GetDeviceInfo(accelerant_device_info* info) } -status_t -RemoteHWInterface::GetFrameBufferConfig(frame_buffer_config& config) -{ - // We don't actually have a frame buffer. - return B_UNSUPPORTED; -} - - status_t RemoteHWInterface::GetModeList(display_mode** _modes, uint32* _count) { diff --git a/src/servers/app/drawing/interface/remote/RemoteHWInterface.h b/src/servers/app/drawing/interface/remote/RemoteHWInterface.h index 6dedb5f7e4..7babbfecb1 100644 --- a/src/servers/app/drawing/interface/remote/RemoteHWInterface.h +++ b/src/servers/app/drawing/interface/remote/RemoteHWInterface.h @@ -40,8 +40,6 @@ virtual void GetMode(display_mode* mode); virtual status_t GetPreferredMode(display_mode* mode); virtual status_t GetDeviceInfo(accelerant_device_info* info); -virtual status_t GetFrameBufferConfig( - frame_buffer_config& config); virtual status_t GetModeList(display_mode** _modeList, uint32* _count); diff --git a/src/servers/app/drawing/interface/virtual/DWindowHWInterface.cpp b/src/servers/app/drawing/interface/virtual/DWindowHWInterface.cpp index 5f5c8e71c5..9baee53338 100644 --- a/src/servers/app/drawing/interface/virtual/DWindowHWInterface.cpp +++ b/src/servers/app/drawing/interface/virtual/DWindowHWInterface.cpp @@ -756,20 +756,6 @@ DWindowHWInterface::GetDeviceInfo(accelerant_device_info* info) } -status_t -DWindowHWInterface::GetFrameBufferConfig(frame_buffer_config& config) -{ - if (!fFrontBuffer.IsSet()) - return B_ERROR; - - config.frame_buffer = fFrontBuffer->Bits(); - config.frame_buffer_dma = NULL; - config.bytes_per_row = fFrontBuffer->BytesPerRow(); - - return B_OK; -} - - status_t DWindowHWInterface::GetModeList(display_mode** _modes, uint32* _count) { diff --git a/src/servers/app/drawing/interface/virtual/DWindowHWInterface.h b/src/servers/app/drawing/interface/virtual/DWindowHWInterface.h index 1ab0060ef1..440831e56b 100644 --- a/src/servers/app/drawing/interface/virtual/DWindowHWInterface.h +++ b/src/servers/app/drawing/interface/virtual/DWindowHWInterface.h @@ -35,8 +35,6 @@ public: virtual void GetMode(display_mode* mode); virtual status_t GetDeviceInfo(accelerant_device_info* info); - virtual status_t GetFrameBufferConfig( - frame_buffer_config& config); virtual status_t GetModeList(display_mode** _modeList, uint32* _count); diff --git a/src/servers/app/drawing/interface/virtual/ViewHWInterface.cpp b/src/servers/app/drawing/interface/virtual/ViewHWInterface.cpp index 8b5bb0de12..34ac293d59 100644 --- a/src/servers/app/drawing/interface/virtual/ViewHWInterface.cpp +++ b/src/servers/app/drawing/interface/virtual/ViewHWInterface.cpp @@ -609,20 +609,6 @@ ViewHWInterface::GetDeviceInfo(accelerant_device_info* info) } -status_t -ViewHWInterface::GetFrameBufferConfig(frame_buffer_config& config) -{ - if (!fFrontBuffer.IsSet()) - return B_ERROR; - - config.frame_buffer = fFrontBuffer->Bits(); - config.frame_buffer_dma = NULL; - config.bytes_per_row = fFrontBuffer->BytesPerRow(); - - return B_OK; -} - - status_t ViewHWInterface::GetModeList(display_mode** _modes, uint32* _count) { diff --git a/src/servers/app/drawing/interface/virtual/ViewHWInterface.h b/src/servers/app/drawing/interface/virtual/ViewHWInterface.h index cf2f473ffc..14a22824ff 100644 --- a/src/servers/app/drawing/interface/virtual/ViewHWInterface.h +++ b/src/servers/app/drawing/interface/virtual/ViewHWInterface.h @@ -30,8 +30,6 @@ public: virtual void GetMode(display_mode* mode); virtual status_t GetDeviceInfo(accelerant_device_info* info); - virtual status_t GetFrameBufferConfig( - frame_buffer_config& config); virtual status_t GetModeList(display_mode** _modeList, uint32* _count);