summaryrefslogtreecommitdiff
path: root/include/JSystem/JFramework/JFWDisplay.h
blob: 4d06b074dcdf35272b2279cc8459fa1b57d141d5 (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
#ifndef JFWDISPLAY_H
#define JFWDISPLAY_H

#include "JSystem/JSupport/JSUList.h"
#include "JSystem/JUtility/JUTDirectPrint.h"
#include "JSystem/JUtility/JUTFader.h"
#include "JSystem/JUtility/JUTXfb.h"
#include "dolphin/os/OSAlarm.h"
#include "dolphin/types.h"

typedef struct _GXColor GXColor;
typedef struct _GXRenderModeObj GXRenderModeObj;
class JKRHeap;

typedef void (*JFWDisplayUnkFunc)(void);

extern u8 JFWAutoAbortGfx;

class JFWAlarm : public OSAlarm {
public:
    JFWAlarm() /* : mLink(this) */ {}
    ~JFWAlarm() {}
    void createAlarm() { OSCreateAlarm(this); }
    void cancelAlarm() { OSCancelAlarm(this); }
    //void removeLink() { sList.remove(&mLink); }
    //void appendLink() { sList.append(&mLink); }
    OSThread* getThread() const { return mThread; }
    void setThread(OSThread* thread) { mThread = thread; }

    static JSUList<JFWAlarm> sList;

public:
    /* 0x30 */ OSThread* mThread;
};

class JFWDisplay {
public:
    enum EDrawDone {
        /* 0x0 */ Sync = 0,
        /* 0x1 */ Async = 1,
    };

    void ctor_subroutine(const GXRenderModeObj*, bool enableAlpha);
    JFWDisplay(const GXRenderModeObj*, JKRHeap*, JUTXfb::EXfbNumber, bool);
    static JFWDisplay* createManager(JKRHeap*, JUTXfb::EXfbNumber, bool);
    void prepareCopyDisp();
    void drawendXfb_single();
    void exchangeXfb_double();
    void exchangeXfb_triple();
    void copyXfb_triple();
    void preGX();
    void endGX();
    void waitBlanking(int);
    void threadSleep(s64);
    void clearEfb_init();
    void clearEfb(int param_0, int param_1, int param_2, int param_3, GXColor color);
    void clearEfb();
    void clearEfb(GXColor color);
    void calcCombinationRatio();

    virtual void beginRender();
    virtual void endRender();
    virtual void endFrame();
    virtual ~JFWDisplay();

    static JFWDisplay* getManager() { return sManager; }

    BOOL startFadeOut(int fadeTime) {
        if (mpFader != NULL) {
            return mpFader->startFadeOut(fadeTime);
        }
        return 1;
    }

    BOOL startFadeIn(int fadeTime) {
        if (mpFader != NULL) {
            return mpFader->startFadeIn(fadeTime);
        }
        return 1;
    }

    void setTickRate(u32 rate) {
        mTickRate = rate;
        mFrameRate = 0;
    }

    void setDrawDoneMethod(EDrawDone drawDone) { mDrawDoneMethod = drawDone; }
    void setFader(JUTFader* fader) { mpFader = fader; }
    JUTFader * getFader() { return mpFader; }
    void setClearColor(JUtility::TColor color) { mClearColor = color; }

    u16 getFrameRate() const { return mFrameRate; }
    void setFrameRate(u16 framerate) {
        mFrameRate = framerate;
        mTickRate = 0;
    }

    void getEfbHeight() const {}
    void getEfbWidth() const {}
    void getXfbManager() const {}

    static JFWDisplay* sManager;

private:
    /* 0x04 */ JUTFader* mpFader;
    /* 0x08 */ const GXRenderModeObj* mpRenderMode;
    /* 0x0C */ JUtility::TColor mClearColor;
    /* 0x10 */ u32 mZClear;
    /* 0x14 */ JUTXfb* mXfbManager;
    /* 0x18 */ u16 mGamma;
    /* 0x1C */ EDrawDone mDrawDoneMethod;
    /* 0x20 */ u16 mFrameRate;
    /* 0x24 */ u32 mTickRate;
    /* 0x28 */ bool mEnableAlpha;
    /* 0x2A */ u16 mClamp;
    /* 0x2C */ f32 mCombinationRatio;
    /* 0x30 */ u32 field_0x30;
    /* 0x34 */ u32 field_0x34;
    /* 0x38 */ u32 field_0x38;
    /* 0x3C */ s16 field_0x3C;
    /* 0x3E */ u8 field_0x3E;
};

inline void JUTChangeFrameBuffer(void* buffer, u16 height, u16 width) {
    JUTDirectPrint::getManager()->changeFrameBuffer(buffer, width, height);
}

static void JFWDrawDoneAlarm();
static void JFWGXDrawDoneAutoAbort();
static void JFWGXAbortAlarmHandler(OSAlarm* p_alarm, OSContext* p_ctx);
static void waitForTick(u32 p1, u16 p2);
static void diagnoseGpHang();

#endif /* JFWDISPLAY_H */