include/mgba/feature/video-logger.h (view raw)
1/* Copyright (c) 2013-2017 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef VIDEO_LOGGER_H
7#define VIDEO_LOGGER_H
8
9#include <mgba-util/common.h>
10
11CXX_GUARD_START
12
13#include <mgba-util/circle-buffer.h>
14
15#define mVL_MAX_CHANNELS 32
16
17enum mVideoLoggerDirtyType {
18 DIRTY_DUMMY = 0,
19 DIRTY_FLUSH,
20 DIRTY_SCANLINE,
21 DIRTY_REGISTER,
22 DIRTY_OAM,
23 DIRTY_PALETTE,
24 DIRTY_VRAM,
25 DIRTY_FRAME,
26 DIRTY_RANGE,
27 DIRTY_BUFFER,
28};
29
30enum mVideoLoggerEvent {
31 LOGGER_EVENT_NONE = 0,
32 LOGGER_EVENT_INIT,
33 LOGGER_EVENT_DEINIT,
34 LOGGER_EVENT_RESET,
35 LOGGER_EVENT_GET_PIXELS,
36};
37
38enum mVideoLoggerInjectionPoint {
39 LOGGER_INJECTION_IMMEDIATE = 0,
40 LOGGER_INJECTION_FIRST_SCANLINE,
41};
42
43struct mVideoLoggerDirtyInfo {
44 enum mVideoLoggerDirtyType type;
45 uint32_t address;
46 uint32_t value;
47 uint32_t value2;
48};
49
50struct VFile;
51struct mVideoLogger {
52 bool (*writeData)(struct mVideoLogger* logger, const void* data, size_t length);
53 bool (*readData)(struct mVideoLogger* logger, void* data, size_t length, bool block);
54 void (*postEvent)(struct mVideoLogger* logger, enum mVideoLoggerEvent event);
55 void* dataContext;
56
57 bool block;
58 void (*init)(struct mVideoLogger*);
59 void (*deinit)(struct mVideoLogger*);
60 void (*reset)(struct mVideoLogger*);
61
62 void (*lock)(struct mVideoLogger*);
63 void (*unlock)(struct mVideoLogger*);
64 void (*wait)(struct mVideoLogger*);
65 void (*wake)(struct mVideoLogger*, int y);
66 void* context;
67
68 bool (*parsePacket)(struct mVideoLogger* logger, const struct mVideoLoggerDirtyInfo* packet);
69 void (*handleEvent)(struct mVideoLogger* logger, enum mVideoLoggerEvent event);
70 uint16_t* (*vramBlock)(struct mVideoLogger* logger, uint32_t address);
71
72 size_t vramSize;
73 size_t oamSize;
74 size_t paletteSize;
75
76 uint32_t* vramDirtyBitmap;
77 uint32_t* oamDirtyBitmap;
78
79 uint16_t* vram;
80 uint16_t* oam;
81 uint16_t* palette;
82
83 const void* pixelBuffer;
84 size_t pixelStride;
85};
86
87void mVideoLoggerRendererCreate(struct mVideoLogger* logger, bool readonly);
88void mVideoLoggerRendererInit(struct mVideoLogger* logger);
89void mVideoLoggerRendererDeinit(struct mVideoLogger* logger);
90void mVideoLoggerRendererReset(struct mVideoLogger* logger);
91
92void mVideoLoggerRendererWriteVideoRegister(struct mVideoLogger* logger, uint32_t address, uint16_t value);
93void mVideoLoggerRendererWriteVRAM(struct mVideoLogger* logger, uint32_t address);
94void mVideoLoggerRendererWritePalette(struct mVideoLogger* logger, uint32_t address, uint16_t value);
95void mVideoLoggerRendererWriteOAM(struct mVideoLogger* logger, uint32_t address, uint16_t value);
96
97void mVideoLoggerWriteBuffer(struct mVideoLogger* logger, uint32_t bufferId, uint32_t offset, uint32_t length, const void* data);
98
99void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y);
100void mVideoLoggerRendererDrawRange(struct mVideoLogger* logger, int startX, int endX, int y);
101void mVideoLoggerRendererFlush(struct mVideoLogger* logger);
102void mVideoLoggerRendererFinishFrame(struct mVideoLogger* logger);
103
104bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block);
105bool mVideoLoggerRendererRunInjected(struct mVideoLogger* logger);
106
107struct mVideoLogContext;
108void mVideoLoggerAttachChannel(struct mVideoLogger* logger, struct mVideoLogContext* context, size_t channelId);
109
110struct mCore;
111struct mVideoLogContext* mVideoLogContextCreate(struct mCore* core);
112
113void mVideoLogContextSetCompression(struct mVideoLogContext*, bool enable);
114void mVideoLogContextSetOutput(struct mVideoLogContext*, struct VFile*);
115void mVideoLogContextWriteHeader(struct mVideoLogContext*, struct mCore* core);
116
117bool mVideoLogContextLoad(struct mVideoLogContext*, struct VFile*);
118void mVideoLogContextDestroy(struct mCore* core, struct mVideoLogContext*);
119
120void mVideoLogContextRewind(struct mVideoLogContext*, struct mCore*);
121void* mVideoLogContextInitialState(struct mVideoLogContext*, size_t* size);
122
123int mVideoLoggerAddChannel(struct mVideoLogContext*);
124
125void mVideoLoggerInjectionPoint(struct mVideoLogger* logger, enum mVideoLoggerInjectionPoint);
126void mVideoLoggerIgnoreAfterInjection(struct mVideoLogger* logger, uint32_t mask);
127void mVideoLoggerInjectVideoRegister(struct mVideoLogger* logger, uint32_t address, uint16_t value);
128void mVideoLoggerInjectPalette(struct mVideoLogger* logger, uint32_t address, uint16_t value);
129void mVideoLoggerInjectOAM(struct mVideoLogger* logger, uint32_t address, uint16_t value);
130
131struct mCore* mVideoLogCoreFind(struct VFile*);
132
133CXX_GUARD_END
134
135#endif