diff --git a/src/CRE/gl_rend_state.cpp b/src/CRE/gl_rend_state.cpp index 4d754d74..8aadd091 100644 --- a/src/CRE/gl_rend_state.cpp +++ b/src/CRE/gl_rend_state.cpp @@ -232,6 +232,7 @@ struct gl_rend_state { void enable_scissor_test(); void enable_stencil_test(); void end_event(); + void finish(); void generate_mipmap(GLenum target); void generate_texture_mipmap(GLuint texture); void get(); @@ -507,6 +508,10 @@ void p_gl_rend_state::end_event() { ptr.end_event(); } +void p_gl_rend_state::finish() { + ptr.finish(); +} + void p_gl_rend_state::generate_mipmap(GLenum target) { ptr.generate_mipmap(target); } @@ -618,10 +623,6 @@ void p_gl_rend_state::set_viewport(GLint x, GLint y, GLsizei width, GLsizei heig ptr.set_viewport(x, y, width, height); } -void p_gl_rend_state::update() { - ptr.update(); -} - void p_gl_rend_state::use_program(GLuint program) { ptr.use_program(program); } @@ -1031,6 +1032,29 @@ inline void gl_rend_state::end_event() { glPopDebugGroup(); } +inline void gl_rend_state::finish() { + bind_vertex_array(0); + update_vertex_array(); + + bind_array_buffer(0); + bind_element_array_buffer(0); + bind_uniform_buffer(0); + bind_shader_storage_buffer(0); + + set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + set_depth_mask(GL_TRUE); + set_stencil_mask(GL_TRUE); + + update_blend(); + update_color_mask(); + update_depth_test(); + update_depth_mask(); + update_primitive_restart(); + update_scissor_test(); + update_stencil_test(); + update_stencil_mask(); +} + inline void gl_rend_state::generate_mipmap(GLenum target) { update_curr_active_texture(); glGenerateMipmap(target); diff --git a/src/CRE/gl_rend_state.hpp b/src/CRE/gl_rend_state.hpp index f3659a26..764ad00c 100644 --- a/src/CRE/gl_rend_state.hpp +++ b/src/CRE/gl_rend_state.hpp @@ -83,6 +83,7 @@ struct p_gl_rend_state { void enable_scissor_test(); void enable_stencil_test(); void end_event(); + void finish(); void generate_mipmap(GLenum target); void generate_texture_mipmap(GLuint texture); void get(); @@ -113,7 +114,6 @@ struct p_gl_rend_state { void tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); void set_viewport(GLint x, GLint y, GLsizei width, GLsizei height); - void update(); void use_program(GLuint program); template diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index fa7898f0..5e4a3cac 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -302,14 +302,14 @@ namespace mdl { morph_vertex_buffer = 0; morph_vertex_buffer_offset = 0; - gl_state.bind_vertex_array(vertex_array); + gl_state.bind_vertex_array(vertex_array, true); for (int32_t i = 0; i < 16; i++) if (vertex_attrib_array[i]) { glDisableVertexAttribArray(i); vertex_attrib_array[i] = false; } - gl_state.bind_array_buffer(0); - gl_state.bind_element_array_buffer(0); + gl_state.bind_array_buffer(0, true); + gl_state.bind_element_array_buffer(0, true); gl_state.bind_vertex_array(0); } @@ -419,7 +419,7 @@ namespace mdl { if (!vertex_array->vertex_array) { glGenVertexArrays(1, &vertex_array->vertex_array); - gl_state.bind_vertex_array(vertex_array->vertex_array); + gl_state.bind_vertex_array(vertex_array->vertex_array, true); glVertexAttrib4f( POSITION_INDEX, 0.0f, 0.0f, 0.0f, 1.0f); glVertexAttrib4f( BONE_WEIGHT_INDEX, 0.0f, 0.0f, 0.0f, 0.0f); glVertexAttrib4f( NORMAL_INDEX, 0.0f, 0.0f, 0.0f, 1.0f); @@ -453,7 +453,7 @@ namespace mdl { vertex_attrib_buffer_binding, sizeof(vertex_attrib_buffer_binding)); if (!new_vertex_array) - gl_state.bind_vertex_array(vertex_array->vertex_array); + gl_state.bind_vertex_array(vertex_array->vertex_array, true); gl_state.bind_array_buffer(vertex_buffer, true); if (index_buffer) gl_state.bind_element_array_buffer(index_buffer, true); @@ -2074,12 +2074,12 @@ namespace mdl { for (DispManager::etc_vertex_array& i : etc_vertex_array_cache) if (i.alive_time > 0 && --i.alive_time <= 0) { - gl_state.bind_vertex_array(i.vertex_array); + gl_state.bind_vertex_array(i.vertex_array, true); glDisableVertexAttribArray(POSITION_INDEX); glDisableVertexAttribArray( NORMAL_INDEX); - gl_state.bind_array_buffer(0); + gl_state.bind_array_buffer(0, true); if (i.indexed) - gl_state.bind_element_array_buffer(0); + gl_state.bind_element_array_buffer(0, true); gl_state.bind_vertex_array(0); } } diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index dfbd4af5..2076e103 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -323,7 +323,7 @@ namespace rndr { for (int32_t i = RND_PASSID_SHADOW; i <= RND_PASSID_CLEAR; i++) RenderManager::render_single_pass(rend_data_ctx, (RenderPassID)i); rend_data_ctx.state.end_event(); - rend_data_ctx.state.update(); + rend_data_ctx.state.finish(); } { @@ -333,7 +333,7 @@ namespace rndr { for (int32_t i = RND_PASSID_PRE_SPRITE; i <= RND_PASSID_3D; i++) RenderManager::render_single_pass(rend_data_ctx, (RenderPassID)i); rend_data_ctx.state.end_event(); - rend_data_ctx.state.update(); + rend_data_ctx.state.finish(); } { @@ -343,7 +343,7 @@ namespace rndr { for (int32_t i = RND_PASSID_SHOW_VECTOR; i <= RND_PASSID_12; i++) RenderManager::render_single_pass(rend_data_ctx, (RenderPassID)i); rend_data_ctx.state.end_event(); - rend_data_ctx.state.update(); + rend_data_ctx.state.finish(); } rctx_ptr->disp_manager->check_vertex_arrays(); diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index 352730a6..3635976f 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -694,13 +694,13 @@ namespace spr { } SpriteManager::RenderData::~RenderData() { - ebo.Destroy(); - vbo.Destroy(); - if (vao[0]) { glDeleteVertexArrays(3, vao); vao[0] = 0; } + + ebo.Destroy(); + vbo.Destroy(); } template diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index fbdd47a6..e2bc9723 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -1553,7 +1553,7 @@ static void render_context_disp(render_context* rctx) { pre_rend_data_ctx.state.set_depth_mask(GL_FALSE); pre_rend_data_ctx.state.set_viewport(0, 0, internal_3d_res.x, internal_3d_res.y); - pre_rend_data_ctx.state.update(); + pre_rend_data_ctx.state.finish(); rctx->disp(); @@ -1622,7 +1622,7 @@ static void render_context_disp(render_context* rctx) { #endif } #endif - post_rend_data_ctx.state.update(); + post_rend_data_ctx.state.finish(); if (draw_imgui) render_context_imgui(rctx);