2019-03-03 16:34:23 -05:00
|
|
|
#pragma once
|
|
|
|
#include "stdafx.h"
|
2019-03-23 15:39:21 -04:00
|
|
|
#include "DebugTypes.h"
|
2020-06-18 00:58:22 -04:00
|
|
|
#include "Console.h"
|
|
|
|
#include "NotificationManager.h"
|
2019-03-03 16:34:23 -05:00
|
|
|
|
|
|
|
class Ppu;
|
2020-06-01 21:42:49 -04:00
|
|
|
struct GbPpuState;
|
2019-03-03 16:34:23 -05:00
|
|
|
|
2020-06-18 00:58:22 -04:00
|
|
|
struct ViewerRefreshConfig
|
|
|
|
{
|
|
|
|
uint16_t Scanline;
|
|
|
|
uint16_t Cycle;
|
|
|
|
CpuType Type;
|
|
|
|
};
|
|
|
|
|
2019-03-03 16:34:23 -05:00
|
|
|
class PpuTools
|
|
|
|
{
|
|
|
|
private:
|
2020-12-19 23:30:09 +03:00
|
|
|
Ppu* _ppu;
|
|
|
|
Console* _console;
|
2020-06-18 00:58:22 -04:00
|
|
|
unordered_map<uint32_t, ViewerRefreshConfig> _updateTimings;
|
2019-03-03 16:34:23 -05:00
|
|
|
|
2020-12-19 23:30:09 +03:00
|
|
|
uint8_t GetTilePixelColor(const uint8_t* ram, const uint32_t ramMask, const uint8_t bpp, const uint32_t pixelStart,
|
|
|
|
const uint8_t shift);
|
2019-03-03 16:34:23 -05:00
|
|
|
|
|
|
|
void BlendColors(uint8_t output[4], uint8_t input[4]);
|
|
|
|
|
2020-12-19 23:30:09 +03:00
|
|
|
uint32_t GetRgbPixelColor(uint8_t* cgram, uint8_t colorIndex, uint8_t palette, uint8_t bpp, bool directColorMode,
|
|
|
|
uint16_t basePaletteOffset);
|
2019-03-23 15:39:21 -04:00
|
|
|
|
2019-03-03 16:34:23 -05:00
|
|
|
public:
|
2020-12-19 23:30:09 +03:00
|
|
|
PpuTools(Console* console, Ppu* ppu);
|
2019-03-03 16:34:23 -05:00
|
|
|
|
2020-12-19 23:30:09 +03:00
|
|
|
void GetTileView(GetTileViewOptions options, uint8_t* source, uint32_t srcSize, uint8_t* cgram, uint32_t* outBuffer);
|
|
|
|
void GetTilemap(GetTilemapOptions options, PpuState state, uint8_t* vram, uint8_t* cgram, uint32_t* outBuffer);
|
|
|
|
void GetSpritePreview(GetSpritePreviewOptions options, PpuState state, uint8_t* vram, uint8_t* oamRam,
|
|
|
|
uint8_t* cgram, uint32_t* outBuffer);
|
2019-03-03 16:34:23 -05:00
|
|
|
|
2020-06-18 00:58:22 -04:00
|
|
|
void SetViewerUpdateTiming(uint32_t viewerId, uint16_t scanline, uint16_t cycle, CpuType cpuType);
|
2019-03-03 16:34:23 -05:00
|
|
|
void RemoveViewer(uint32_t viewerId);
|
2020-12-19 23:30:09 +03:00
|
|
|
|
2020-06-18 00:58:22 -04:00
|
|
|
__forceinline void UpdateViewers(uint16_t scanline, uint16_t cycle, CpuType cpuType)
|
|
|
|
{
|
2020-12-19 23:30:09 +03:00
|
|
|
if (_updateTimings.size() > 0)
|
|
|
|
{
|
|
|
|
for (auto updateTiming : _updateTimings)
|
|
|
|
{
|
2020-06-18 00:58:22 -04:00
|
|
|
ViewerRefreshConfig cfg = updateTiming.second;
|
2020-12-19 23:30:09 +03:00
|
|
|
if (cfg.Cycle == cycle && cfg.Scanline == scanline && cfg.Type == cpuType)
|
|
|
|
{
|
|
|
|
_console->GetNotificationManager()->SendNotification(ConsoleNotificationType::ViewerRefresh,
|
|
|
|
(void*)(uint64_t)updateTiming.first);
|
2020-06-18 00:58:22 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-05-18 16:10:53 -04:00
|
|
|
|
2020-06-01 21:42:49 -04:00
|
|
|
void GetGameboyTilemap(uint8_t* vram, GbPpuState& state, uint16_t offset, uint32_t* outBuffer);
|
2020-12-19 23:30:09 +03:00
|
|
|
void GetGameboySpritePreview(GetSpritePreviewOptions options, GbPpuState state, uint8_t* vram, uint8_t* oamRam,
|
|
|
|
uint32_t* outBuffer);
|
|
|
|
};
|