diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 864efee8..4e0ee611 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -2289,7 +2289,7 @@ void EffectFogRing::draw() { rctx->draw_state->set_fog_height(true); RenderTexture& rt = rctx->render_manager->get_render_texture(8); rt.Bind(); - glViewport(0, 0, + gl_state_set_viewport(0, 0, rt.color_texture->get_width_align_mip_level(), rt.color_texture->get_height_align_mip_level()); glClearColor(density_offset, density_offset, density_offset, 1.0f); @@ -3140,13 +3140,12 @@ void EffectRipple::draw() { rt[(counter + 1) % 3]->Bind(); - GLint v43[4]; - glGetIntegerv(GL_VIEWPORT, v43); + gl_state_rect viewport_rect = gl_state_get_viewport(); int32_t width = rt[0]->GetWidth(); int32_t height = rt[0]->GetHeight(); - glViewport(1, 1, width - 2, height - 2); + gl_state_set_viewport(1, 1, width - 2, height - 2); draw_pass_set_camera(); glClear(GL_DEPTH_BUFFER_BIT); @@ -3167,7 +3166,7 @@ void EffectRipple::draw() { sub_1403B6ED0(rt[(counter + 2) % 3], rt[(counter + 1) % 3], rt[counter % 3], params); - glViewport(v43[0], v43[1], v43[2], v43[3]); + gl_state_set_viewport(viewport_rect); sub_1403584A0(rt[(counter + 2) % 3]); @@ -6575,9 +6574,8 @@ static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, ripple_emit_par int32_t width = a2->width; int32_t height = a2->height; - GLint v43[4]; - glGetIntegerv(GL_VIEWPORT, v43); - glViewport(1, 1, width - 2, height - 2); + gl_state_rect viewport_rect = gl_state_get_viewport(); + gl_state_set_viewport(1, 1, width - 2, height - 2); ripple_scene_shader_data ripple_scene = {}; ripple_scene.g_transform = { @@ -6602,5 +6600,5 @@ static void sub_1403B6F60(texture* a1, texture* a2, texture* a3, ripple_emit_par gl_state_active_bind_texture_2d(0, 0); gl_state_bind_vertex_array(0); - glViewport(v43[0], v43[1], v43[2], v43[3]); + gl_state_set_viewport(viewport_rect); } diff --git a/src/CRE/gl_state.cpp b/src/CRE/gl_state.cpp index 37e7f97d..2c815a5f 100644 --- a/src/CRE/gl_state.cpp +++ b/src/CRE/gl_state.cpp @@ -335,9 +335,11 @@ void gl_state_get() { glGetBooleanv(GL_MULTISAMPLE, &gl_state.multisample); glGetBooleanv(GL_PRIMITIVE_RESTART, &gl_state.primitive_restart); glGetIntegerv(GL_PRIMITIVE_RESTART_INDEX, (GLint*)&gl_state.primitive_restart_index); + glGetIntegerv(GL_SCISSOR_BOX, (GLint*)&gl_state.scissor_box); glGetBooleanv(GL_SCISSOR_TEST, &gl_state.scissor_test); glGetBooleanv(GL_STENCIL_TEST, &gl_state.stencil_test); glGetIntegerv(GL_STENCIL_WRITEMASK, (GLint*)&gl_state.stencil_mask); + glGetIntegerv(GL_VIEWPORT, (GLint*)&gl_state.viewport); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); gl_state.polygon_front_face_mode = GL_FILL; @@ -361,6 +363,28 @@ GLuint gl_state_get_program() { return gl_state.program; } +gl_state_rect gl_state_get_scissor() { + return gl_state.scissor_box; +} + +void gl_state_get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { + x = gl_state.scissor_box.x; + y = gl_state.scissor_box.y; + width = gl_state.scissor_box.width; + height = gl_state.scissor_box.height; +} + +gl_state_rect gl_state_get_viewport() { + return gl_state.viewport; +} + +void gl_state_get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height) { + x = gl_state.viewport.x; + y = gl_state.viewport.y; + width = gl_state.viewport.width; + height = gl_state.viewport.height; +} + void gl_state_set_blend_func(GLenum src, GLenum dst, bool force) { if (force || gl_state.blend_src_rgb != src || gl_state.blend_dst_rgb != dst || gl_state.blend_src_alpha != GL_ONE || gl_state.blend_dst_alpha != GL_ONE_MINUS_SRC_ALPHA) { @@ -473,6 +497,25 @@ void gl_state_set_primitive_restart_index(GLuint index, bool force) { } } +void gl_state_set_scissor(const gl_state_rect& rect, bool force) { + if (force || gl_state.scissor_box.x != rect.x || gl_state.scissor_box.y != rect.y + || gl_state.scissor_box.width != rect.width || gl_state.scissor_box.height != rect.height) { + glScissor(rect.x, rect.y, rect.width, rect.height); + gl_state.scissor_box = rect; + } +} + +void gl_state_set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { + if (force || gl_state.scissor_box.x != x || gl_state.scissor_box.y != y + || gl_state.scissor_box.width != width || gl_state.scissor_box.height != height) { + glScissor(x, y, width, height); + gl_state.scissor_box.x = x; + gl_state.scissor_box.y = y; + gl_state.scissor_box.width = width; + gl_state.scissor_box.height = height; + } +} + void gl_state_set_stencil_mask(GLuint mask, bool force) { if (force || gl_state.stencil_mask != mask) { glStencilMask(mask); @@ -480,6 +523,25 @@ void gl_state_set_stencil_mask(GLuint mask, bool force) { } } +void gl_state_set_viewport(const gl_state_rect& rect, bool force) { + if (force || gl_state.viewport.x != rect.x || gl_state.viewport.y != rect.y + || gl_state.viewport.width != rect.width || gl_state.viewport.height != rect.height) { + glScissor(rect.x, rect.y, rect.width, rect.height); + gl_state.viewport = rect; + } +} + +void gl_state_set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force) { + if (force || gl_state.viewport.x != x || gl_state.viewport.y != y + || gl_state.viewport.width != width || gl_state.viewport.height != height) { + glViewport(x, y, width, height); + gl_state.viewport.x = x; + gl_state.viewport.y = y; + gl_state.viewport.width = width; + gl_state.viewport.height = height; + } +} + void gl_state_use_program(GLuint program, bool force) { if (force || gl_state.program != program) { glUseProgram(program); diff --git a/src/CRE/gl_state.hpp b/src/CRE/gl_state.hpp index 9a0103d5..12c48b8e 100644 --- a/src/CRE/gl_state.hpp +++ b/src/CRE/gl_state.hpp @@ -8,6 +8,13 @@ #include "../KKdLib/default.hpp" #include +struct gl_state_rect { + GLint x; + GLint y; + GLsizei width; + GLsizei height; +}; + struct gl_state_struct { GLint program; GLenum active_texture; @@ -46,9 +53,11 @@ struct gl_state_struct { GLboolean multisample; GLboolean primitive_restart; GLuint primitive_restart_index; + gl_state_rect scissor_box; GLboolean scissor_test; GLboolean stencil_test; GLuint stencil_mask; + gl_state_rect viewport; }; extern gl_state_struct gl_state; @@ -98,6 +107,10 @@ extern void gl_state_get(); extern void gl_state_get_all_gl_errors(); extern GLenum gl_state_get_error(); extern GLuint gl_state_get_program(); +extern gl_state_rect gl_state_get_scissor(); +extern void gl_state_get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height); +extern gl_state_rect gl_state_get_viewport(); +extern void gl_state_get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height); extern void gl_state_set_blend_func(GLenum src, GLenum dst, bool force = false); extern void gl_state_set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, GLenum src_alpha, GLenum dst_alpha, bool force = false); @@ -111,7 +124,11 @@ extern void gl_state_set_depth_func(GLenum func, bool force = false); extern void gl_state_set_depth_mask(GLboolean flag, bool force = false); extern void gl_state_set_polygon_mode(GLenum face, GLenum mode, bool force = false); extern void gl_state_set_primitive_restart_index(GLuint index, bool force = false); +extern void gl_state_set_scissor(const gl_state_rect& rect, bool force = false); +extern void gl_state_set_scissor(GLint x, GLint y, GLsizei width, GLsizei height, bool force = false); extern void gl_state_set_stencil_mask(GLuint mask, bool force = false); +extern void gl_state_set_viewport(const gl_state_rect& rect, bool force = false); +extern void gl_state_set_viewport(GLint x, GLint y, GLsizei width, GLsizei height, bool force = false); extern void gl_state_use_program(GLuint program, bool force = false); template diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index e19eabcc..22d37895 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -164,7 +164,7 @@ namespace rndr { else uniform_value[U_REDUCE] = 0; - glViewport(0, 0, t->width, t->height); + gl_state_set_viewport(0, 0, t->width, t->height); gl_state_active_bind_texture_2d(0, taa_tex[2]->glid); gl_state_bind_sampler(0, rctx->render_samplers[0]); shaders_ft.set(SHADER_FT_REDUCE); @@ -179,7 +179,7 @@ namespace rndr { frame_texture_reset_capture(); rctx->screen_buffer.Bind(); - glViewport(0, 0, rctx->sprite_width, rctx->sprite_height); + gl_state_set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height); if (ssaa) { gl_state_active_bind_texture_2d(0, taa_tex[2]->glid); gl_state_bind_sampler(0, rctx->render_samplers[0]); @@ -236,7 +236,7 @@ namespace rndr { } else rend_texture[0].Bind(); - glViewport(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); } void Render::calc_exposure_chara_data(camera* cam) { @@ -1323,7 +1323,7 @@ namespace rndr { rend_texture[i].Bind(); gl_state_active_bind_texture_2d(0, rend_texture[i - 1].GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[0]); - glViewport(0, 0, render_width[i], render_height[i]); + gl_state_set_viewport(0, 0, render_width[i], render_height[i]); draw_quad( render_post_width[i - 1], render_post_height[i - 1], render_post_width_scale, render_post_height_scale, @@ -1334,7 +1334,7 @@ namespace rndr { shaders_ft.set(SHADER_FT_REDUCE); int32_t downsample = max_def(downsample_count - 2, 0); - glViewport(0, 0, reduce_width[0], reduce_height[0]); + gl_state_set_viewport(0, 0, reduce_width[0], reduce_height[0]); reduce_texture[0].Bind(); gl_state_active_bind_texture_2d(0, rend_texture[downsample].GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[0]); @@ -1360,7 +1360,7 @@ namespace rndr { shaders_ft.set(SHADER_FT_REDUCE); } - glViewport(0, 0, reduce_width[i], reduce_height[i]); + gl_state_set_viewport(0, 0, reduce_width[i], reduce_height[i]); draw_quad(reduce_width[i - 1], reduce_height[i - 1], 1.0f, 1.0f, 0.0f, 0.0f, scale, 1.0f, 1.0f, 1.0f, 1.0f); gl_state_active_bind_texture_2d(0, reduce_tex[i]->glid); @@ -1624,7 +1624,7 @@ namespace rndr { rctx->tone_map_ubo.WriteMemory(shader_data); - glViewport(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); taa_buffer[2].Bind(); shaders_ft.set(SHADER_FT_TONEMAP); rctx->tone_map_ubo.Bind(1); @@ -1744,7 +1744,7 @@ namespace rndr { exposure_measure.g_spot_coefficients[i * 8 + j] = chara_data->spot_coefficients[j]; rctx->exposure_measure_ubo.WriteMemory(exposure_measure); - glViewport(0, 0, 32, 1); + gl_state_set_viewport(0, 0, 32, 1); downsample_texture.Bind(); uniform_value[U_EXPOSURE] = 1; @@ -1766,7 +1766,7 @@ namespace rndr { exposure_history_counter = (exposure_history_counter + 1) % 32; } - glViewport(0, 0, 1, 1); + gl_state_set_viewport(0, 0, 1, 1); exposure_texture.Bind(); uniform_value[U_EXPOSURE] = 2; shaders_ft.set(SHADER_FT_EXPOSURE); @@ -1829,7 +1829,7 @@ namespace rndr { gl_state_active_bind_texture_2d(0, j.type == FRAME_TEXTURE_PRE_PP ? pre_pp_tex : post_pp_tex); gl_state_bind_sampler(0, rctx_ptr->render_samplers[0]); - glViewport(0, 0, dst_tex->width, dst_tex->height); + gl_state_set_viewport(0, 0, dst_tex->width, dst_tex->height); uniform_value[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); draw_quad(dst_tex->width, dst_tex->height, @@ -1933,7 +1933,7 @@ namespace rndr { rctx_ptr->lens_ghost_vbo.UnmapMemory(); - glViewport(0, 0, render_width[0], render_height[0]); + gl_state_set_viewport(0, 0, render_width[0], render_height[0]); rend_texture[0].Bind(); gl_state_enable_blend(); gl_state_set_blend_func(GL_ONE, GL_ONE); @@ -1984,7 +1984,7 @@ namespace rndr { downsample_texture.Bind(); for (int32_t i = 1; i < 4; i++) { - glViewport(0, 0, reduce_width[i], reduce_height[i]); + gl_state_set_viewport(0, 0, reduce_width[i], reduce_height[i]); gl_state_active_bind_texture_2d(0, reduce_tex[i]->glid); gl_state_bind_sampler(0, rctx->render_samplers[2]); draw_quad(reduce_width[i], reduce_height[i], @@ -1993,7 +1993,7 @@ namespace rndr { } for (int32_t i = 1; i < 4; i++) { - glViewport(0, 0, reduce_width[i], reduce_height[i]); + gl_state_set_viewport(0, 0, reduce_width[i], reduce_height[i]); gl_state_active_bind_texture_2d(0, reduce_tex[i]->glid); gl_state_bind_sampler(0, rctx->render_samplers[2]); draw_quad(reduce_width[i], reduce_height[i], @@ -2004,7 +2004,7 @@ namespace rndr { uniform_value[U_GAUSS] = 1; shaders_ft.set(SHADER_FT_GAUSS); - glViewport(0, 0, reduce_width[0], reduce_height[0]); + gl_state_set_viewport(0, 0, reduce_width[0], reduce_height[0]); gl_state_active_bind_texture_2d(0, reduce_tex[0]->glid); gl_state_bind_sampler(0, rctx->render_samplers[2]); draw_quad(reduce_width[0], reduce_height[0], @@ -2014,7 +2014,7 @@ namespace rndr { uniform_value[U_REDUCE] = 7; shaders_ft.set(SHADER_FT_REDUCE); - glViewport(0, 0, reduce_width[0], reduce_height[0]); + gl_state_set_viewport(0, 0, reduce_width[0], reduce_height[0]); reduce_texture[0].Bind(); gl_state_active_bind_texture_2d(0, downsample_texture.GetColorTex()); gl_state_active_bind_texture_2d(1, reduce_tex[1]->glid); diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 9699d32c..7714288a 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -127,7 +127,7 @@ bool light_proj::set() { static const GLfloat depth_clear = 1.0f; shadow_texture[0].Bind(); - glViewport(0, 0, 2048, 512); + gl_state_set_viewport(0, 0, 2048, 512); gl_state_enable_depth_test(); gl_state_set_depth_mask(GL_TRUE); glClearBufferfv(GL_COLOR, 0, (float_t*)&color_clear); diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index b6aa652b..53a5fc6b 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -478,7 +478,7 @@ namespace rndr { //} //else { // sss->textures[0].Bind(); - // glViewport(0, 0, 640, 360); + // gl_state_set_viewport(0, 0, 640, 360); //} glClearColor(sss->param.x, sss->param.y, sss->param.z, 0.0f); @@ -530,7 +530,7 @@ namespace rndr { if (!sss->npr_contour) { sss->textures[0].Bind(); - glViewport(0, 0, 640, 360); + gl_state_set_viewport(0, 0, 640, 360); filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; @@ -641,7 +641,7 @@ namespace rndr { || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSPARENT) || rctx->disp_manager->get_obj_count(mdl::OBJ_TYPE_REFRACT_TRANSLUCENT)) { texture* refr_tex = refract_texture.color_texture; - glViewport(0, 0, refr_tex->width, refr_tex->height); + gl_state_set_viewport(0, 0, refr_tex->width, refr_tex->height); draw_pass_set_camera(); @@ -1021,7 +1021,7 @@ namespace rndr { gl_state_begin_event("pass_sprite"); rndr::Render* rend = render; - glViewport(0, 0, width, height); + gl_state_set_viewport(0, 0, width, height); if (multisample && multisample_framebuffer) { gl_state_bind_framebuffer(multisample_framebuffer); @@ -1120,7 +1120,7 @@ void image_filter_scale(RenderTexture* dst, texture* src, const vec4& scale) { render_context* rctx = rctx_ptr; gl_state_begin_event("`anonymous-namespace'::Impl::apply_no_filter_sub"); - glViewport(0, 0, dst->color_texture->width, dst->color_texture->height); + gl_state_set_viewport(0, 0, dst->color_texture->width, dst->color_texture->height); dst->Bind(); @@ -1204,7 +1204,7 @@ static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, i shad->curr_render_textures[0]->Bind(); shad->curr_render_textures[0]->SetViewport(); texture* tex = shad->curr_render_textures[0]->color_texture; - glScissor(0, 0, tex->width, tex->height); + gl_state_set_scissor(0, 0, tex->width, tex->height); gl_state_enable_depth_test(); gl_state_enable_scissor_test(); glClearColor(1.0, 1.0, 1.0, 1.0); @@ -1212,7 +1212,7 @@ static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, int32_t index, i glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); else if (shad->separate) glClear(GL_COLOR_BUFFER_BIT); - glScissor(1, 1, tex->width - 2, tex->height - 2); + gl_state_set_scissor(1, 1, tex->width - 2, tex->height - 2); float_t shadow_range = shad->get_shadow_range(); float_t offset; @@ -1313,7 +1313,7 @@ static void draw_pass_shadow_filter(RenderTexture* a1, RenderTexture* a2, rctx->filter_scene_ubo.Bind(0); rctx->esm_filter_batch_ubo.Bind(1); - glViewport(0, 0, v7->width, v7->height); + gl_state_set_viewport(0, 0, v7->width, v7->height); a2->Bind(); esm_filter_batch.g_params = { 1.0f / (float_t)v7->width, 0.0f, far_texel_offset, far_texel_offset }; @@ -1370,7 +1370,7 @@ static void draw_pass_shadow_esm_filter(RenderTexture* dst, RenderTexture* buf, rctx->filter_scene_ubo.Bind(0); rctx->esm_filter_batch_ubo.Bind(1); - glViewport(0, 0, dst_tex->width, dst_tex->height); + gl_state_set_viewport(0, 0, dst_tex->width, dst_tex->height); buf->Bind(); esm_filter_batch.g_params = { 1.0f / (float_t)src_tex->width, @@ -1437,7 +1437,7 @@ static void draw_pass_sss_contour(render_context* rctx, rndr::Render* rend) { gl_state_enable_depth_test(); gl_state_set_depth_func(GL_ALWAYS); gl_state_set_depth_mask(GL_TRUE); - glViewport(0, 0, rend->render_width[0], rend->render_height[0]); + gl_state_set_viewport(0, 0, rend->render_width[0], rend->render_height[0]); gl_state_active_bind_texture_2d(0, rend->rend_texture[0].GetColorTex()); gl_state_bind_sampler(0, rctx->render_samplers[1]); gl_state_active_bind_texture_2d(1, rend->rend_texture[0].GetDepthTex()); @@ -1548,7 +1548,7 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* sss) { gl_state_active_texture(0); if (sss->npr_contour) { sss->textures[0].Bind(); - glViewport(0, 0, 640, 360); + gl_state_set_viewport(0, 0, 640, 360); rndr::Render* rend = &rctx->render; uniform_value[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); @@ -1558,7 +1558,7 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* sss) { 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); } sss->textures[2].Bind(); - glViewport(0, 0, 320, 180); + gl_state_set_viewport(0, 0, 320, 180); uniform_value[U_SSS_FILTER] = 0; shaders_ft.set(SHADER_FT_SSS_FILT); gl_state_bind_texture_2d(sss->textures[0].GetColorTex()); @@ -1577,7 +1577,7 @@ static void draw_pass_sss_filter(render_context* rctx, sss_data* sss) { rctx->sss_filter_gaussian_coef_ubo.WriteMemory(shader_data); sss->textures[1].Bind(); - glViewport(0, 0, 320, 180); + gl_state_set_viewport(0, 0, 320, 180); uniform_value[U_SSS_FILTER] = 3; shaders_ft.set(SHADER_FT_SSS_FILT); gl_state_bind_texture_2d(sss->textures[2].GetColorTex()); diff --git a/src/CRE/render_texture.cpp b/src/CRE/render_texture.cpp index cf5231a1..06b6bced 100644 --- a/src/CRE/render_texture.cpp +++ b/src/CRE/render_texture.cpp @@ -4,7 +4,6 @@ */ #include "render_texture.hpp" -#include "gl_state.hpp" #include "render_context.hpp" #include "texture.hpp" diff --git a/src/CRE/render_texture.hpp b/src/CRE/render_texture.hpp index 96581c83..0ce9af25 100644 --- a/src/CRE/render_texture.hpp +++ b/src/CRE/render_texture.hpp @@ -6,6 +6,7 @@ #pragma once #include "shared.hpp" +#include "gl_state.hpp" #include "texture.hpp" struct RenderTexture { @@ -46,7 +47,7 @@ struct RenderTexture { }; inline void SetViewport() { - glViewport(0, 0, GetWidth(), GetHeight()); + gl_state_set_viewport(0, 0, GetWidth(), GetHeight()); }; }; diff --git a/src/CRE/renderer/dof.cpp b/src/CRE/renderer/dof.cpp index d5c2f4c7..5429ee22 100644 --- a/src/CRE/renderer/dof.cpp +++ b/src/CRE/renderer/dof.cpp @@ -233,7 +233,7 @@ namespace renderer { void DOF3::render_tiles(GLuint depth_texture, bool f2) { gl_state_begin_event("renderer::DOF3::render_tiles"); gl_state_bind_framebuffer(fbo[0].buffer); - glViewport(0, 0, fbo[0].width, fbo[0].height); + gl_state_set_viewport(0, 0, fbo[0].width, fbo[0].height); uniform_value[U_DOF_STAGE] = 0; shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); @@ -242,7 +242,7 @@ namespace renderer { glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); gl_state_bind_framebuffer(fbo[1].buffer); - glViewport(0, 0, fbo[1].width, fbo[1].height); + gl_state_set_viewport(0, 0, fbo[1].width, fbo[1].height); uniform_value[U_DOF_STAGE] = 1; shaders_ft.set(SHADER_FT_DOF); gl_state_active_bind_texture_2d(0, textures[0]); @@ -255,7 +255,7 @@ namespace renderer { void DOF3::downsample(GLuint color_texture, GLuint depth_texture, bool f2) { gl_state_begin_event("renderer::DOF3::downsample"); gl_state_bind_framebuffer(fbo[2].buffer); - glViewport(0, 0, fbo[2].width, fbo[2].height); + gl_state_set_viewport(0, 0, fbo[2].width, fbo[2].height); uniform_value[U_DOF_STAGE] = 2; shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); @@ -272,7 +272,7 @@ namespace renderer { void DOF3::apply_main_filter(bool f2) { gl_state_begin_event("renderer::DOF3::apply_main_filter"); gl_state_bind_framebuffer(fbo[3].buffer); - glViewport(0, 0, fbo[3].width, fbo[3].height); + gl_state_set_viewport(0, 0, fbo[3].width, fbo[3].height); uniform_value[U_DOF_STAGE] = 3; shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); @@ -290,7 +290,7 @@ namespace renderer { void DOF3::upsample(RenderTexture* rt, GLuint color_texture, GLuint depth_texture, bool f2) { gl_state_begin_event("renderer::DOF3::upsample"); rctx_ptr->render_buffer.Bind(); - glViewport(0, 0, width, height); + gl_state_set_viewport(0, 0, width, height); uniform_value[U_DOF_STAGE] = 4; shaders_ft.set(SHADER_FT_DOF); common_ubo.Bind(0); diff --git a/src/CRE/renderer/transparency.cpp b/src/CRE/renderer/transparency.cpp index b7d7a9b8..c286edba 100644 --- a/src/CRE/renderer/transparency.cpp +++ b/src/CRE/renderer/transparency.cpp @@ -65,7 +65,7 @@ namespace renderer { GL_TEXTURE_2D, 0, 0, 0, 0, fbo.textures[0], GL_TEXTURE_2D, 0, 0, 0, 0, fbo.width, fbo.height, 1); gl_state_bind_framebuffer(fbo.buffer); - glViewport(0, 0, fbo.width, fbo.height); + gl_state_set_viewport(0, 0, fbo.width, fbo.height); } void Transparency::resize(GLuint color_texture, GLuint depth_texture, int32_t width, int32_t height) { diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index b968424b..b37390d3 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -774,8 +774,7 @@ namespace spr { if (index == 2 && resolution_mode != RESOLUTION_MODE_MAX) res_window_get()->resolution_mode = resolution_mode; - GLint v43[4]; - glGetIntegerv(GL_VIEWPORT, v43); + gl_state_rect viewport_rect = gl_state_get_viewport(); for (int32_t i = 0; i < 2; i++) { auto reqlist = this->reqlist[index][i]; @@ -815,15 +814,15 @@ namespace spr { y_min = (int32_t)min.y; x_max = (int32_t)(max.x - min.x); y_max = (int32_t)(max.y - min.y); - glViewport(x_min, y_min, x_max, y_max); + gl_state_set_viewport(x_min, y_min, x_max, y_max); } else { view_projection = vp; - x_min = v43[0]; - y_min = v43[1]; - x_max = v43[2]; - y_max = v43[3]; + x_min = viewport_rect.x; + y_min = viewport_rect.y; + x_max = viewport_rect.width; + y_max = viewport_rect.height; } float_t v23 = (float_t)x_max * 0.5f; diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index 630baf23..f8faf8ec 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -306,7 +306,7 @@ int32_t app_main(const app_init_struct& ais) { #if !(BAKE_PNG || BAKE_VIDEO) glfwGetFramebufferSize(window, &width, &height); #endif - glViewport(0, 0, width, height); + gl_state_set_viewport(0, 0, width, height); gl_state_disable_blend(); gl_state_disable_depth_test(); gl_state_set_depth_mask(GL_FALSE); @@ -373,7 +373,7 @@ bool render_data::load() { #endif gl_state_get_error(); - glViewport(0, 0, width, height); + gl_state_set_viewport(0, 0, width, height); return true; } @@ -1177,7 +1177,7 @@ static void render_context_disp(render_context* rctx) { gl_state_set_stencil_mask(0x00); gl_state_set_depth_mask(GL_FALSE); - glViewport(0, 0, internal_3d_res.x, internal_3d_res.y); + gl_state_set_viewport(0, 0, internal_3d_res.x, internal_3d_res.y); cam->update(); @@ -1194,7 +1194,7 @@ static void render_context_disp(render_context* rctx) { rctx->sprite_width, rctx->sprite_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); #endif - glViewport(0, 0, rctx->screen_width, rctx->screen_height); + gl_state_set_viewport(0, 0, rctx->screen_width, rctx->screen_height); if (draw_imgui) render_context_imgui(rctx); diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 9d4f17f6..035514ee 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -6169,7 +6169,7 @@ bool x_pv_game::ctrl() { gl_state_bind_framebuffer(d3d_gl_fbo[next_idx]); gl_state_active_bind_texture_2d(0, tex->glid); - glViewport(0, 0, width, height); + gl_state_set_viewport(0, 0, width, height); uniform_value[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); glBeginQuery(GL_SAMPLES_PASSED, d3d_query[next_idx]); @@ -6202,7 +6202,7 @@ bool x_pv_game::ctrl() { GLint swizzle_aaa1[] = { GL_ALPHA, GL_ALPHA, GL_ALPHA, GL_ONE }; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle_aaa1); - glViewport(0, 0, width, height); + gl_state_set_viewport(0, 0, width, height); uniform_value[U_REDUCE] = 0; shaders_ft.set(SHADER_FT_REDUCE); glBeginQuery(GL_SAMPLES_PASSED, d3d_alpha_query[next_alpha_idx]);