// Copyright 2013 Dolphin Emulator Project
// Licensed under GPLv2
// Refer to the license.txt file included.

#pragma once

#include "Common/Common.h"

#include "VideoCommon/CommandProcessor.h"

class PointerWrap;
namespace MMIO { class Mapping; }

namespace SWCommandProcessor
{
	using UCPStatusReg = CommandProcessor::UCPStatusReg;
	using UCPCtrlReg = CommandProcessor::UCPCtrlReg;
	using UCPClearReg = CommandProcessor::UCPClearReg;

	struct CPReg
	{
		UCPStatusReg status;    // 0x00
		UCPCtrlReg ctrl;        // 0x02
		UCPClearReg clear;      // 0x04
		u32 unk0;               // 0x08
		u16 unk1;               // 0x0c
		u16 token;              // 0x0e
		u16 bboxleft;           // 0x10
		u16 bboxtop;            // 0x12
		u16 bboxright;          // 0x14
		u16 bboxbottom;         // 0x16
		u32 unk2;               // 0x18
		u32 unk3;               // 0x1c
		u32 fifobase;           // 0x20
		u32 fifoend;            // 0x24
		u32 hiwatermark;        // 0x28
		u32 lowatermark;        // 0x2c
		u32 rwdistance;         // 0x30
		u32 writeptr;           // 0x34
		u32 readptr;            // 0x38
		u32 breakpt;            // 0x3c
	};

	// Init
	void Init();
	void Shutdown();
	void DoState(PointerWrap &p);

	void RegisterMMIO(MMIO::Mapping* mmio, u32 base);

	bool RunBuffer();
	void RunGpu();

	// for CGPFIFO
	void GatherPipeBursted();
	void UpdateInterrupts(u64 userdata);
	void UpdateInterruptsFromVideoBackend(u64 userdata);

	void SetRendering(bool enabled);

} // end of namespace SWCommandProcessor
