Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Engine/gapi/abstractgraphicsapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,7 @@ namespace Tempest {
struct Swapchain:NoCopy {
virtual ~Swapchain()=default;
virtual void reset()=0;
virtual void setPreferredFrameRateRange(uint32_t, uint32_t, uint32_t) {}
virtual uint32_t currentBackBufferIndex()=0;
virtual NonUniqResId syncId() const;
virtual uint32_t imageCount() const=0;
Expand Down
3 changes: 3 additions & 0 deletions Engine/gapi/metal/mtswapchain.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ class MtSwapchain : public AbstractGraphicsApi::Swapchain {
~MtSwapchain();

void reset() override;
#ifdef __IOS__
void setPreferredFrameRateRange(uint32_t minimum, uint32_t maximum, uint32_t preferred) override;
#endif
uint32_t currentBackBufferIndex() override;
uint32_t imageCount() const override;
uint32_t w() const override;
Expand Down
6 changes: 6 additions & 0 deletions Engine/gapi/metal/mtswapchain.mm
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,12 @@ static CGRect windowRect(UIWindow* wnd) {
return currentImg;
}

#ifdef __IOS__
void MtSwapchain::setPreferredFrameRateRange(uint32_t minimum, uint32_t maximum, uint32_t preferred) {
SystemApi::setPreferredFrameRateRange(reinterpret_cast<SystemApi::Window*>(pimpl->wnd),minimum,maximum,preferred);
}
#endif

void MtSwapchain::present() {
auto pool = NsPtr<NS::AutoreleasePool>::init();

Expand Down
8 changes: 8 additions & 0 deletions Engine/graphics/swapchain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ void Swapchain::reset() {
implReset();
}

void Swapchain::setPreferredFrameRate(uint32_t fps) {
setPreferredFrameRateRange(fps,fps,fps);
}

void Swapchain::setPreferredFrameRateRange(uint32_t minimum, uint32_t maximum, uint32_t preferred) {
impl.handler->setPreferredFrameRateRange(minimum,maximum,preferred);
}

uint32_t Swapchain::imageCount() const {
return impl.handler->imageCount();
}
Expand Down
9 changes: 9 additions & 0 deletions Engine/graphics/swapchain.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,15 @@ class Swapchain final {

void reset();

// Requests a display callback rate, not a guaranteed rendering rate.
// Zero restores the system default. Ignored on unsupported platforms.
void setPreferredFrameRate(uint32_t fps);

// Rates are limited to the screen's maximum; minimum and preferred are
// clamped to the resulting range. Zero minimum means 1, zero preferred
// leaves the choice to the system, and zero maximum restores the default.
void setPreferredFrameRateRange(uint32_t minimum, uint32_t maximum, uint32_t preferred = 0);

uint32_t currentImage() const;
uint32_t imageCount() const;
Attachment& operator[](size_t id);
Expand Down
1 change: 1 addition & 0 deletions Engine/system/api/iosapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class iOSApi final: SystemApi {
Rect implWindowClientRect(SystemApi::Window *w) override;
bool implSetAsFullscreen(SystemApi::Window *w, bool fullScreen) override;
bool implIsFullscreen(SystemApi::Window *w) override;
void implSetPreferredFrameRateRange(SystemApi::Window *w, uint32_t minimum, uint32_t maximum, uint32_t preferred) override;

void implSetCursorPosition(SystemApi::Window *w, int x, int y) override;
void implShowCursor(SystemApi::Window *w, CursorShape cursor) override;
Expand Down
15 changes: 15 additions & 0 deletions Engine/system/api/iosapi.mm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#ifdef __IOS__

#import <UIKit/UIKit.h>
#include <algorithm>
#include <string>
#include <thread>
#include <TargetConditionals.h>
Expand Down Expand Up @@ -617,4 +618,18 @@ static void appleMain(void*) {

}

void iOSApi::implSetPreferredFrameRateRange(Window* w, uint32_t minimum, uint32_t maximum, uint32_t preferred) {
auto wx = reinterpret_cast<TempestWindow*>(w);
if(maximum==0) {
wx->displayLink.preferredFrameRateRange = CAFrameRateRangeDefault;
return;
}

maximum = std::min(maximum,uint32_t(wx.screen.maximumFramesPerSecond));
minimum = std::clamp(minimum,1u,maximum);
if(preferred!=0)
preferred = std::clamp(preferred,minimum,maximum);
wx->displayLink.preferredFrameRateRange = CAFrameRateRangeMake(minimum,maximum,preferred);
}

#endif
7 changes: 7 additions & 0 deletions Engine/system/systemapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ SystemApi::Data SystemApi::m;
SystemApi::SystemApi() {
}

void SystemApi::implSetPreferredFrameRateRange(Window*, uint32_t, uint32_t, uint32_t) {
}

void SystemApi::setPreferredFrameRateRange(Window *w, uint32_t minimum, uint32_t maximum, uint32_t preferred) {
return inst().implSetPreferredFrameRateRange(w,minimum,maximum,preferred);
}

float SystemApi::implUiScale(Window* w) {
// default to 1.0, on platforms without hidpi implementation
return 1;
Expand Down
3 changes: 3 additions & 0 deletions Engine/system/systemapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class SystemApi {
static void destroyWindow(Window* w);
static void exit();

static void setPreferredFrameRateRange(SystemApi::Window *w, uint32_t minimum, uint32_t maximum, uint32_t preferred);

static Rect windowClientRect(SystemApi::Window *w);

static bool setAsFullscreen(SystemApi::Window *w, bool fullScreen);
Expand Down Expand Up @@ -80,6 +82,7 @@ class SystemApi {
virtual void implShowCursor(SystemApi::Window *w, CursorShape show) = 0;

virtual float implUiScale(SystemApi::Window* w);
virtual void implSetPreferredFrameRateRange(SystemApi::Window *w, uint32_t minimum, uint32_t maximum, uint32_t preferred);

virtual bool implIsRunning() = 0;
virtual int implExec(AppCallBack& cb) = 0;
Expand Down
Loading