all repos — mgba @ 031049cd067d98cfc1172c15ac448f09300bdfa3

mGBA Game Boy Advance Emulator

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