aboutsummaryrefslogtreecommitdiff
path: root/src/GPU_OpenGL.h
blob: 68462a9a99b442b5f322e540f05c1a1e6c7f16e2 (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
/*
    Copyright 2016-2023 melonDS team

    This file is part of melonDS.

    melonDS 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, either version 3 of the License, or (at your option)
    any later version.

    melonDS 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 for more details.

    You should have received a copy of the GNU General Public License along
    with melonDS. If not, see http://www.gnu.org/licenses/.
*/

#pragma once

#include "OpenGLSupport.h"

#include <array>
#include <memory>

namespace melonDS
{
class GPU;
struct RenderSettings;

class GLCompositor
{
public:
    static std::unique_ptr<GLCompositor> New(melonDS::GPU& gpu) noexcept;
    GLCompositor(const GLCompositor&) = delete;
    GLCompositor& operator=(const GLCompositor&) = delete;
    ~GLCompositor();

    void Reset();

    void SetRenderSettings(const RenderSettings& settings) noexcept;

    void Stop();
    void RenderFrame();
    void BindOutputTexture(int buf);
private:
    GLCompositor(std::array<GLuint, 3> CompShader, melonDS::GPU& gpu) noexcept;
    melonDS::GPU& GPU;
    int Scale;
    int ScreenH, ScreenW;

    std::array<GLuint, 3> CompShader;
    GLuint CompScaleLoc;
    GLuint Comp3DXPosLoc;

    GLuint CompVertexBufferID;
    GLuint CompVertexArrayID;

    struct CompVertex
    {
        float Position[2];
        float Texcoord[2];
    };
    CompVertex CompVertices[2 * 3*2];

    GLuint CompScreenInputTex;
    GLuint CompScreenOutputTex[2];
    GLuint CompScreenOutputFB[2];
};

}