mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	gl_state: Move initializers from constructor to class declaration
This commit is contained in:
		
							parent
							
								
									2ec5b55ee3
								
							
						
					
					
						commit
						28fece8e9b
					
				@ -80,104 +80,7 @@ void Enable(GLenum cap, GLuint index, bool& current_value, bool new_value) {
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
OpenGLState::OpenGLState() {
 | 
			
		||||
    // These all match default OpenGL values
 | 
			
		||||
    framebuffer_srgb.enabled = false;
 | 
			
		||||
 | 
			
		||||
    multisample_control.alpha_to_coverage = false;
 | 
			
		||||
    multisample_control.alpha_to_one = false;
 | 
			
		||||
 | 
			
		||||
    cull.enabled = false;
 | 
			
		||||
    cull.mode = GL_BACK;
 | 
			
		||||
    cull.front_face = GL_CCW;
 | 
			
		||||
 | 
			
		||||
    depth.test_enabled = false;
 | 
			
		||||
    depth.test_func = GL_LESS;
 | 
			
		||||
    depth.write_mask = GL_TRUE;
 | 
			
		||||
 | 
			
		||||
    primitive_restart.enabled = false;
 | 
			
		||||
    primitive_restart.index = 0;
 | 
			
		||||
 | 
			
		||||
    for (auto& item : color_mask) {
 | 
			
		||||
        item.red_enabled = GL_TRUE;
 | 
			
		||||
        item.green_enabled = GL_TRUE;
 | 
			
		||||
        item.blue_enabled = GL_TRUE;
 | 
			
		||||
        item.alpha_enabled = GL_TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const auto ResetStencil = [](auto& config) {
 | 
			
		||||
        config.test_func = GL_ALWAYS;
 | 
			
		||||
        config.test_ref = 0;
 | 
			
		||||
        config.test_mask = 0xFFFFFFFF;
 | 
			
		||||
        config.write_mask = 0xFFFFFFFF;
 | 
			
		||||
        config.action_depth_fail = GL_KEEP;
 | 
			
		||||
        config.action_depth_pass = GL_KEEP;
 | 
			
		||||
        config.action_stencil_fail = GL_KEEP;
 | 
			
		||||
    };
 | 
			
		||||
    stencil.test_enabled = false;
 | 
			
		||||
    ResetStencil(stencil.front);
 | 
			
		||||
    ResetStencil(stencil.back);
 | 
			
		||||
 | 
			
		||||
    for (auto& item : viewports) {
 | 
			
		||||
        item.x = 0;
 | 
			
		||||
        item.y = 0;
 | 
			
		||||
        item.width = 0;
 | 
			
		||||
        item.height = 0;
 | 
			
		||||
        item.depth_range_near = 0.0f;
 | 
			
		||||
        item.depth_range_far = 1.0f;
 | 
			
		||||
        item.scissor.enabled = false;
 | 
			
		||||
        item.scissor.x = 0;
 | 
			
		||||
        item.scissor.y = 0;
 | 
			
		||||
        item.scissor.width = 0;
 | 
			
		||||
        item.scissor.height = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (auto& item : blend) {
 | 
			
		||||
        item.enabled = true;
 | 
			
		||||
        item.rgb_equation = GL_FUNC_ADD;
 | 
			
		||||
        item.a_equation = GL_FUNC_ADD;
 | 
			
		||||
        item.src_rgb_func = GL_ONE;
 | 
			
		||||
        item.dst_rgb_func = GL_ZERO;
 | 
			
		||||
        item.src_a_func = GL_ONE;
 | 
			
		||||
        item.dst_a_func = GL_ZERO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    independant_blend.enabled = false;
 | 
			
		||||
 | 
			
		||||
    blend_color.red = 0.0f;
 | 
			
		||||
    blend_color.green = 0.0f;
 | 
			
		||||
    blend_color.blue = 0.0f;
 | 
			
		||||
    blend_color.alpha = 0.0f;
 | 
			
		||||
 | 
			
		||||
    logic_op.enabled = false;
 | 
			
		||||
    logic_op.operation = GL_COPY;
 | 
			
		||||
 | 
			
		||||
    draw.read_framebuffer = 0;
 | 
			
		||||
    draw.draw_framebuffer = 0;
 | 
			
		||||
    draw.vertex_array = 0;
 | 
			
		||||
    draw.shader_program = 0;
 | 
			
		||||
    draw.program_pipeline = 0;
 | 
			
		||||
 | 
			
		||||
    clip_distance = {};
 | 
			
		||||
 | 
			
		||||
    point.size = 1;
 | 
			
		||||
 | 
			
		||||
    fragment_color_clamp.enabled = false;
 | 
			
		||||
 | 
			
		||||
    depth_clamp.far_plane = false;
 | 
			
		||||
    depth_clamp.near_plane = false;
 | 
			
		||||
 | 
			
		||||
    polygon_offset.fill_enable = false;
 | 
			
		||||
    polygon_offset.line_enable = false;
 | 
			
		||||
    polygon_offset.point_enable = false;
 | 
			
		||||
    polygon_offset.factor = 0.0f;
 | 
			
		||||
    polygon_offset.units = 0.0f;
 | 
			
		||||
    polygon_offset.clamp = 0.0f;
 | 
			
		||||
 | 
			
		||||
    alpha_test.enabled = false;
 | 
			
		||||
    alpha_test.func = GL_ALWAYS;
 | 
			
		||||
    alpha_test.ref = 0.0f;
 | 
			
		||||
}
 | 
			
		||||
OpenGLState::OpenGLState() = default;
 | 
			
		||||
 | 
			
		||||
void OpenGLState::SetDefaultViewports() {
 | 
			
		||||
    for (auto& item : viewports) {
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
#include <glad/glad.h>
 | 
			
		||||
#include "video_core/engines/maxwell_3d.h"
 | 
			
		||||
 | 
			
		||||
@ -36,137 +37,137 @@ constexpr TextureUnit ProcTexDiffLUT{9};
 | 
			
		||||
class OpenGLState {
 | 
			
		||||
public:
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled; // GL_FRAMEBUFFER_SRGB
 | 
			
		||||
        bool enabled = false; // GL_FRAMEBUFFER_SRGB
 | 
			
		||||
    } framebuffer_srgb;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool alpha_to_coverage; // GL_ALPHA_TO_COVERAGE
 | 
			
		||||
        bool alpha_to_one;      // GL_ALPHA_TO_ONE
 | 
			
		||||
        bool alpha_to_coverage = false; // GL_ALPHA_TO_COVERAGE
 | 
			
		||||
        bool alpha_to_one = false;      // GL_ALPHA_TO_ONE
 | 
			
		||||
    } multisample_control;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled; // GL_CLAMP_FRAGMENT_COLOR_ARB
 | 
			
		||||
        bool enabled = false; // GL_CLAMP_FRAGMENT_COLOR_ARB
 | 
			
		||||
    } fragment_color_clamp;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool far_plane;
 | 
			
		||||
        bool near_plane;
 | 
			
		||||
        bool far_plane = false;
 | 
			
		||||
        bool near_plane = false;
 | 
			
		||||
    } depth_clamp; // GL_DEPTH_CLAMP
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled;      // GL_CULL_FACE
 | 
			
		||||
        GLenum mode;       // GL_CULL_FACE_MODE
 | 
			
		||||
        GLenum front_face; // GL_FRONT_FACE
 | 
			
		||||
        bool enabled = false;       // GL_CULL_FACE
 | 
			
		||||
        GLenum mode = GL_BACK;      // GL_CULL_FACE_MODE
 | 
			
		||||
        GLenum front_face = GL_CCW; // GL_FRONT_FACE
 | 
			
		||||
    } cull;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool test_enabled;    // GL_DEPTH_TEST
 | 
			
		||||
        GLenum test_func;     // GL_DEPTH_FUNC
 | 
			
		||||
        GLboolean write_mask; // GL_DEPTH_WRITEMASK
 | 
			
		||||
        bool test_enabled = false;      // GL_DEPTH_TEST
 | 
			
		||||
        GLboolean write_mask = GL_TRUE; // GL_DEPTH_WRITEMASK
 | 
			
		||||
        GLenum test_func = GL_LESS;     // GL_DEPTH_FUNC
 | 
			
		||||
    } depth;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled;
 | 
			
		||||
        GLuint index;
 | 
			
		||||
        bool enabled = false;
 | 
			
		||||
        GLuint index = 0;
 | 
			
		||||
    } primitive_restart; // GL_PRIMITIVE_RESTART
 | 
			
		||||
 | 
			
		||||
    struct ColorMask {
 | 
			
		||||
        GLboolean red_enabled;
 | 
			
		||||
        GLboolean green_enabled;
 | 
			
		||||
        GLboolean blue_enabled;
 | 
			
		||||
        GLboolean alpha_enabled;
 | 
			
		||||
        GLboolean red_enabled = GL_TRUE;
 | 
			
		||||
        GLboolean green_enabled = GL_TRUE;
 | 
			
		||||
        GLboolean blue_enabled = GL_TRUE;
 | 
			
		||||
        GLboolean alpha_enabled = GL_TRUE;
 | 
			
		||||
    };
 | 
			
		||||
    std::array<ColorMask, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets>
 | 
			
		||||
        color_mask; // GL_COLOR_WRITEMASK
 | 
			
		||||
    struct {
 | 
			
		||||
        bool test_enabled; // GL_STENCIL_TEST
 | 
			
		||||
        bool test_enabled = false; // GL_STENCIL_TEST
 | 
			
		||||
        struct {
 | 
			
		||||
            GLenum test_func;           // GL_STENCIL_FUNC
 | 
			
		||||
            GLint test_ref;             // GL_STENCIL_REF
 | 
			
		||||
            GLuint test_mask;           // GL_STENCIL_VALUE_MASK
 | 
			
		||||
            GLuint write_mask;          // GL_STENCIL_WRITEMASK
 | 
			
		||||
            GLenum action_stencil_fail; // GL_STENCIL_FAIL
 | 
			
		||||
            GLenum action_depth_fail;   // GL_STENCIL_PASS_DEPTH_FAIL
 | 
			
		||||
            GLenum action_depth_pass;   // GL_STENCIL_PASS_DEPTH_PASS
 | 
			
		||||
            GLenum test_func = GL_ALWAYS;         // GL_STENCIL_FUNC
 | 
			
		||||
            GLint test_ref = 0;                   // GL_STENCIL_REF
 | 
			
		||||
            GLuint test_mask = 0xFFFFFFFF;        // GL_STENCIL_VALUE_MASK
 | 
			
		||||
            GLuint write_mask = 0xFFFFFFFF;       // GL_STENCIL_WRITEMASK
 | 
			
		||||
            GLenum action_stencil_fail = GL_KEEP; // GL_STENCIL_FAIL
 | 
			
		||||
            GLenum action_depth_fail = GL_KEEP;   // GL_STENCIL_PASS_DEPTH_FAIL
 | 
			
		||||
            GLenum action_depth_pass = GL_KEEP;   // GL_STENCIL_PASS_DEPTH_PASS
 | 
			
		||||
        } front, back;
 | 
			
		||||
    } stencil;
 | 
			
		||||
 | 
			
		||||
    struct Blend {
 | 
			
		||||
        bool enabled;        // GL_BLEND
 | 
			
		||||
        GLenum rgb_equation; // GL_BLEND_EQUATION_RGB
 | 
			
		||||
        GLenum a_equation;   // GL_BLEND_EQUATION_ALPHA
 | 
			
		||||
        GLenum src_rgb_func; // GL_BLEND_SRC_RGB
 | 
			
		||||
        GLenum dst_rgb_func; // GL_BLEND_DST_RGB
 | 
			
		||||
        GLenum src_a_func;   // GL_BLEND_SRC_ALPHA
 | 
			
		||||
        GLenum dst_a_func;   // GL_BLEND_DST_ALPHA
 | 
			
		||||
        bool enabled = true;               // GL_BLEND
 | 
			
		||||
        GLenum rgb_equation = GL_FUNC_ADD; // GL_BLEND_EQUATION_RGB
 | 
			
		||||
        GLenum a_equation = GL_FUNC_ADD;   // GL_BLEND_EQUATION_ALPHA
 | 
			
		||||
        GLenum src_rgb_func = GL_ONE;      // GL_BLEND_SRC_RGB
 | 
			
		||||
        GLenum dst_rgb_func = GL_ZERO;     // GL_BLEND_DST_RGB
 | 
			
		||||
        GLenum src_a_func = GL_ONE;        // GL_BLEND_SRC_ALPHA
 | 
			
		||||
        GLenum dst_a_func = GL_ZERO;       // GL_BLEND_DST_ALPHA
 | 
			
		||||
    };
 | 
			
		||||
    std::array<Blend, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> blend;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled;
 | 
			
		||||
        bool enabled = false;
 | 
			
		||||
    } independant_blend;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        GLclampf red;
 | 
			
		||||
        GLclampf green;
 | 
			
		||||
        GLclampf blue;
 | 
			
		||||
        GLclampf alpha;
 | 
			
		||||
        GLclampf red = 0.0f;
 | 
			
		||||
        GLclampf green = 0.0f;
 | 
			
		||||
        GLclampf blue = 0.0f;
 | 
			
		||||
        GLclampf alpha = 0.0f;
 | 
			
		||||
    } blend_color; // GL_BLEND_COLOR
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled; // GL_LOGIC_OP_MODE
 | 
			
		||||
        GLenum operation;
 | 
			
		||||
        bool enabled = false; // GL_LOGIC_OP_MODE
 | 
			
		||||
        GLenum operation = GL_COPY;
 | 
			
		||||
    } logic_op;
 | 
			
		||||
 | 
			
		||||
    std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> textures{};
 | 
			
		||||
    std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> samplers{};
 | 
			
		||||
    std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumImages> images{};
 | 
			
		||||
    std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> textures = {};
 | 
			
		||||
    std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> samplers = {};
 | 
			
		||||
    std::array<GLuint, Tegra::Engines::Maxwell3D::Regs::NumImages> images = {};
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        GLuint read_framebuffer; // GL_READ_FRAMEBUFFER_BINDING
 | 
			
		||||
        GLuint draw_framebuffer; // GL_DRAW_FRAMEBUFFER_BINDING
 | 
			
		||||
        GLuint vertex_array;     // GL_VERTEX_ARRAY_BINDING
 | 
			
		||||
        GLuint shader_program;   // GL_CURRENT_PROGRAM
 | 
			
		||||
        GLuint program_pipeline; // GL_PROGRAM_PIPELINE_BINDING
 | 
			
		||||
        GLuint read_framebuffer = 0; // GL_READ_FRAMEBUFFER_BINDING
 | 
			
		||||
        GLuint draw_framebuffer = 0; // GL_DRAW_FRAMEBUFFER_BINDING
 | 
			
		||||
        GLuint vertex_array = 0;     // GL_VERTEX_ARRAY_BINDING
 | 
			
		||||
        GLuint shader_program = 0;   // GL_CURRENT_PROGRAM
 | 
			
		||||
        GLuint program_pipeline = 0; // GL_PROGRAM_PIPELINE_BINDING
 | 
			
		||||
    } draw;
 | 
			
		||||
 | 
			
		||||
    struct viewport {
 | 
			
		||||
        GLint x;
 | 
			
		||||
        GLint y;
 | 
			
		||||
        GLint width;
 | 
			
		||||
        GLint height;
 | 
			
		||||
        GLfloat depth_range_near; // GL_DEPTH_RANGE
 | 
			
		||||
        GLfloat depth_range_far;  // GL_DEPTH_RANGE
 | 
			
		||||
    struct Viewport {
 | 
			
		||||
        GLint x = 0;
 | 
			
		||||
        GLint y = 0;
 | 
			
		||||
        GLint width = 0;
 | 
			
		||||
        GLint height = 0;
 | 
			
		||||
        GLfloat depth_range_near = 0.0f; // GL_DEPTH_RANGE
 | 
			
		||||
        GLfloat depth_range_far = 1.0f;  // GL_DEPTH_RANGE
 | 
			
		||||
        struct {
 | 
			
		||||
            bool enabled; // GL_SCISSOR_TEST
 | 
			
		||||
            GLint x;
 | 
			
		||||
            GLint y;
 | 
			
		||||
            GLsizei width;
 | 
			
		||||
            GLsizei height;
 | 
			
		||||
            bool enabled = false; // GL_SCISSOR_TEST
 | 
			
		||||
            GLint x = 0;
 | 
			
		||||
            GLint y = 0;
 | 
			
		||||
            GLsizei width = 0;
 | 
			
		||||
            GLsizei height = 0;
 | 
			
		||||
        } scissor;
 | 
			
		||||
    };
 | 
			
		||||
    std::array<viewport, Tegra::Engines::Maxwell3D::Regs::NumViewports> viewports;
 | 
			
		||||
    std::array<Viewport, Tegra::Engines::Maxwell3D::Regs::NumViewports> viewports;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        float size; // GL_POINT_SIZE
 | 
			
		||||
        float size = 1.0f; // GL_POINT_SIZE
 | 
			
		||||
    } point;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool point_enable;
 | 
			
		||||
        bool line_enable;
 | 
			
		||||
        bool fill_enable;
 | 
			
		||||
        GLfloat units;
 | 
			
		||||
        GLfloat factor;
 | 
			
		||||
        GLfloat clamp;
 | 
			
		||||
        bool point_enable = false;
 | 
			
		||||
        bool line_enable = false;
 | 
			
		||||
        bool fill_enable = false;
 | 
			
		||||
        GLfloat units = 0.0f;
 | 
			
		||||
        GLfloat factor = 0.0f;
 | 
			
		||||
        GLfloat clamp = 0.0f;
 | 
			
		||||
    } polygon_offset;
 | 
			
		||||
 | 
			
		||||
    struct {
 | 
			
		||||
        bool enabled; // GL_ALPHA_TEST
 | 
			
		||||
        GLenum func;  // GL_ALPHA_TEST_FUNC
 | 
			
		||||
        GLfloat ref;  // GL_ALPHA_TEST_REF
 | 
			
		||||
        bool enabled = false;    // GL_ALPHA_TEST
 | 
			
		||||
        GLenum func = GL_ALWAYS; // GL_ALPHA_TEST_FUNC
 | 
			
		||||
        GLfloat ref = 0.0f;      // GL_ALPHA_TEST_REF
 | 
			
		||||
    } alpha_test;
 | 
			
		||||
 | 
			
		||||
    std::array<bool, 8> clip_distance; // GL_CLIP_DISTANCE
 | 
			
		||||
    std::array<bool, 8> clip_distance = {}; // GL_CLIP_DISTANCE
 | 
			
		||||
 | 
			
		||||
    OpenGLState();
 | 
			
		||||
 | 
			
		||||
@ -253,5 +254,6 @@ private:
 | 
			
		||||
        bool color_mask;
 | 
			
		||||
    } dirty{};
 | 
			
		||||
};
 | 
			
		||||
static_assert(std::is_trivially_copyable_v<OpenGLState>);
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user