Files
Aerofoil/PortabilityLayer/DisplayDeviceManager.cpp

109 lines
2.5 KiB
C++
Raw Normal View History

2019-12-21 18:40:17 -05:00
#include "DisplayDeviceManager.h"
#include "HostDisplayDriver.h"
2019-12-27 18:05:32 -05:00
#include "IGpDisplayDriver.h"
2019-12-26 12:58:58 -05:00
#include "PLQDraw.h"
2019-12-21 18:40:17 -05:00
#include "MemoryManager.h"
#include "QDStandardPalette.h"
namespace PortabilityLayer
{
class DisplayDeviceManagerImpl final : public DisplayDeviceManager
{
public:
DisplayDeviceManagerImpl();
void Init() override;
void Shutdown() override;
2019-12-27 18:05:32 -05:00
GpPixelFormat_t GetPixelFormat() const override;
void SyncPalette(IGpDisplayDriver *displayDriver) override;
2019-12-21 18:40:17 -05:00
void IncrementTickCount(uint32_t count) override;
uint32_t GetTickCount() override;
static DisplayDeviceManagerImpl *GetInstance();
private:
uint32_t m_tickCount;
2019-12-27 18:05:32 -05:00
GpPixelFormat_t m_pixelFormat;
bool m_paletteIsDirty;
PortabilityLayer::RGBAColor *m_palette;
uint8_t m_paletteStorage[256 * sizeof(PortabilityLayer::RGBAColor) + GP_SYSTEM_MEMORY_ALIGNMENT];
2019-12-21 18:40:17 -05:00
static DisplayDeviceManagerImpl ms_instance;
};
DisplayDeviceManagerImpl::DisplayDeviceManagerImpl()
2019-12-27 18:05:32 -05:00
: m_tickCount(1)
, m_paletteIsDirty(true)
, m_pixelFormat(GpPixelFormats::k8BitStandard)
2019-12-21 18:40:17 -05:00
{
2019-12-27 18:05:32 -05:00
uint8_t *paletteStorage = m_paletteStorage;
while (reinterpret_cast<intptr_t>(paletteStorage) % GP_SYSTEM_MEMORY_ALIGNMENT != 0)
2019-12-27 18:05:32 -05:00
paletteStorage++;
m_palette = reinterpret_cast<PortabilityLayer::RGBAColor*>(paletteStorage);
for (size_t i = 0; i < 256; i++)
{
PortabilityLayer::RGBAColor &color = m_palette[i];
color.r = color.g = color.b = i;
color.a = 255;
}
2019-12-21 18:40:17 -05:00
}
void DisplayDeviceManagerImpl::Init()
{
2019-12-27 18:05:32 -05:00
HostDisplayDriver::GetInstance()->GetDisplayResolution(nullptr, nullptr, &m_pixelFormat);
2019-12-21 18:40:17 -05:00
2019-12-27 18:05:32 -05:00
const PortabilityLayer::RGBAColor *spColors = StandardPalette::GetInstance()->GetColors();
for (size_t i = 0; i < 256; i++)
m_palette[i] = spColors[i];
2019-12-21 18:40:17 -05:00
2019-12-27 18:05:32 -05:00
m_paletteIsDirty = true;
2019-12-21 18:40:17 -05:00
}
void DisplayDeviceManagerImpl::Shutdown()
{
}
2019-12-27 18:05:32 -05:00
GpPixelFormat_t DisplayDeviceManagerImpl::GetPixelFormat() const
{
2019-12-29 22:12:11 -05:00
return m_pixelFormat;
2019-12-27 18:05:32 -05:00
}
void DisplayDeviceManagerImpl::SyncPalette(IGpDisplayDriver *displayDriver)
2019-12-21 18:40:17 -05:00
{
2019-12-27 18:05:32 -05:00
if (m_paletteIsDirty)
{
displayDriver->UpdatePalette(m_palette);
m_paletteIsDirty = false;
}
2019-12-21 18:40:17 -05:00
}
void DisplayDeviceManagerImpl::IncrementTickCount(uint32_t count)
{
m_tickCount += count;
}
uint32_t DisplayDeviceManagerImpl::GetTickCount()
{
return m_tickCount;
}
DisplayDeviceManagerImpl *DisplayDeviceManagerImpl::GetInstance()
{
return &ms_instance;
}
DisplayDeviceManagerImpl DisplayDeviceManagerImpl::ms_instance;
2019-12-21 18:40:17 -05:00
DisplayDeviceManager *DisplayDeviceManager::GetInstance()
{
return DisplayDeviceManagerImpl::GetInstance();
}
}