summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoSoftware/Src/PixelEngine.h
blob: a49fa1dbed8b9fee313d063806911bf497b53c56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// Copyright (C) 2003-2009 Dolphin Project.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License 2.0 for more details.

// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/

// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _PIXELENGINE_H
#define _PIXELENGINE_H

#include "Common.h"
#include "pluginspecs_video.h"
#include "VideoCommon.h"
class PointerWrap;

namespace PixelEngine
{
    // internal hardware addresses
    enum
    {
	    PE_ZCONF         = 0x000, // Z Config
	    PE_ALPHACONF     = 0x002, // Alpha Config
	    PE_DSTALPHACONF  = 0x004, // Destination Alpha Config
	    PE_ALPHAMODE     = 0x006, // Alpha Mode Config
	    PE_ALPHAREAD     = 0x008, // Alpha Read
	    PE_CTRL_REGISTER = 0x00a, // Control
	    PE_TOKEN_REG     = 0x00e, // Token
	    PE_BBOX_LEFT	 = 0x010, // Flip Left
	    PE_BBOX_RIGHT	 = 0x012, // Flip Right
	    PE_BBOX_TOP		 = 0x014, // Flip Top
	    PE_BBOX_BOTTOM	 = 0x016, // Flip Bottom
    };

    union UPEZConfReg
    {
	    u16 Hex;
	    struct 
	    {
		    u16 ZCompEnable	    : 1; // Z Comparator Enable
		    u16 Function		: 3;
		    u16 ZUpdEnable		: 1;
		    u16				    : 11;
	    };
    };

    union UPEAlphaConfReg
    {
	    u16 Hex;
	    struct 
	    {
		    u16 BMMath			: 1; // GX_BM_BLEND || GX_BM_SUBSTRACT
		    u16 BMLogic		    : 1; // GX_BM_LOGIC
		    u16 Dither			: 1;
		    u16 ColorUpdEnable	: 1;
		    u16 AlphaUpdEnable	: 1;
		    u16 DstFactor		: 3;
		    u16 SrcFactor		: 3;
		    u16 Substract		: 1; // Additive mode by default
		    u16 BlendOperator	: 4;
	    };
    };

    union UPEDstAlphaConfReg
    {
	    u16 Hex;
	    struct 
	    {
		    u16 DstAlpha		: 8;
		    u16 Enable			: 1;
		    u16				    : 7;
	    };
    };

    union UPEAlphaModeConfReg
    {
	    u16 Hex;
	    struct 
	    {
		    u16 Threshold		: 8;
		    u16 CompareMode	    : 8;
	    };
    };

    union UPEAlphaReadReg
    {
	    u16 Hex;
	    struct 
	    {
		    u16 ReadMode	: 3;
		    u16				: 13;
	    };
    };

     union UPECtrlReg
    {
	    struct 
	    {
		    u16 PETokenEnable	:	1;
		    u16 PEFinishEnable	:	1;
		    u16 PEToken		:	1; // write only
		    u16 PEFinish		:	1; // write only
		    u16				:	12;
	    };
	    u16 Hex;
	    UPECtrlReg() {Hex = 0; }
	    UPECtrlReg(u16 _hex) {Hex = _hex; }
    };

    struct PEReg
    {
        UPEZConfReg zconf;
        UPEAlphaConfReg alphaConf;
        UPEDstAlphaConfReg dstAlpha;
        UPEAlphaModeConfReg alphaMode;
        UPEAlphaReadReg alphaRead;
        UPECtrlReg ctrl;
        u16 unk0;
        u16 token;
        u16 boxLeft;
        u16 boxRight;
        u16 boxTop;
        u16 boxBottom;
    };

    extern PEReg pereg;

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

    // Read
    void Read16(u16& _uReturnValue, const u32 _iAddress);

    // Write
    void Write16(const u16 _iValue, const u32 _iAddress);
    void Write32(const u32 _iValue, const u32 _iAddress);

    // gfx plugin support
    void SetToken(const u16 _token, const int _bSetTokenAcknowledge);
    void SetFinish(void);
    bool AllowIdleSkipping();    

} // end of namespace PixelEngine

#endif