summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/present/fxaa.cpp
blob: 9425c42fad069af3522ffc4c807a66a4d2005d36 (plain) (blame)
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
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#include "video_core/host_shaders/fxaa_frag.h"
#include "video_core/host_shaders/fxaa_vert.h"
#include "video_core/renderer_opengl/gl_shader_manager.h"
#include "video_core/renderer_opengl/gl_shader_util.h"
#include "video_core/renderer_opengl/present/fxaa.h"
#include "video_core/renderer_opengl/present/util.h"

namespace OpenGL {

FXAA::FXAA(u32 width, u32 height) {
    vert_shader = CreateProgram(HostShaders::FXAA_VERT, GL_VERTEX_SHADER);
    frag_shader = CreateProgram(HostShaders::FXAA_FRAG, GL_FRAGMENT_SHADER);

    sampler = CreateBilinearSampler();

    framebuffer.Create();

    texture.Create(GL_TEXTURE_2D);
    glTextureStorage2D(texture.handle, 1, GL_RGBA16F, width, height);
    glNamedFramebufferTexture(framebuffer.handle, GL_COLOR_ATTACHMENT0, texture.handle, 0);
}

FXAA::~FXAA() = default;

GLuint FXAA::Draw(ProgramManager& program_manager, GLuint input_texture) {
    glFrontFace(GL_CCW);

    program_manager.BindPresentPrograms(vert_shader.handle, frag_shader.handle);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer.handle);
    glBindTextureUnit(0, input_texture);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glFrontFace(GL_CW);

    return texture.handle;
}

} // namespace OpenGL