diff --git a/extern/lib/glad.lib b/extern/lib/glad.lib index 182713f7..482e4f74 100644 Binary files a/extern/lib/glad.lib and b/extern/lib/glad.lib differ diff --git a/extern/lib/glad.pdb b/extern/lib/glad.pdb index 3cd067e4..1e695827 100644 Binary files a/extern/lib/glad.pdb and b/extern/lib/glad.pdb differ diff --git a/extern/lib/gladd.lib b/extern/lib/gladd.lib index f13d2d64..6c17643f 100644 Binary files a/extern/lib/gladd.lib and b/extern/lib/gladd.lib differ diff --git a/extern/lib/gladd.pdb b/extern/lib/gladd.pdb index 2fa49d88..6db4e7f9 100644 Binary files a/extern/lib/gladd.pdb and b/extern/lib/gladd.pdb differ diff --git a/extern/src/glad/glad.h b/extern/src/glad/glad.h index c9b772d2..f99d4e62 100644 --- a/extern/src/glad/glad.h +++ b/extern/src/glad/glad.h @@ -1,13 +1,15 @@ /* - OpenGL loader generated by glad 0.1.36 on Wed Apr 23 10:45:44 2025. + OpenGL loader generated by glad 0.1.36 on Mon May 25 02:55:23 2026. Language/Generator: C/C++ Specification: gl APIs: gl=4.6 Profile: core Extensions: + GL_ARB_debug_output, GL_ARB_texture_compression_bptc, + GL_EXT_debug_marker, GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, GL_EXT_texture_filter_anisotropic, @@ -21,9 +23,9 @@ Reproducible: False Commandline: - --profile="core" --api="gl=4.6" --generator="c" --spec="gl" --no-loader --extensions="GL_ARB_texture_compression_bptc,GL_EXT_texture_compression_rgtc,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_NV_DX_interop,WGL_NV_DX_interop2" + --profile="core" --api="gl=4.6" --generator="c" --spec="gl" --no-loader --extensions="GL_ARB_debug_output,GL_ARB_texture_compression_bptc,GL_EXT_debug_marker,GL_EXT_texture_compression_rgtc,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_NV_DX_interop,WGL_NV_DX_interop2" Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D4.6&extensions=GL_ARB_texture_compression_bptc&extensions=GL_EXT_texture_compression_rgtc&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=WGL_ARB_extensions_string&extensions=WGL_EXT_extensions_string&extensions=WGL_NV_DX_interop&extensions=WGL_NV_DX_interop2 + https://glad.dav1d.de/#profile=core&language=c&specification=gl&api=gl%3D4.6&extensions=GL_ARB_debug_output&extensions=GL_ARB_texture_compression_bptc&extensions=GL_EXT_debug_marker&extensions=GL_EXT_texture_compression_rgtc&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=WGL_ARB_extensions_string&extensions=WGL_EXT_extensions_string&extensions=WGL_NV_DX_interop&extensions=WGL_NV_DX_interop2 */ @@ -3690,6 +3692,28 @@ typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat uni GLAPI PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp; #define glPolygonOffsetClamp glad_glPolygonOffsetClamp #endif +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 #define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E @@ -3704,10 +3728,39 @@ GLAPI PFNGLPOLYGONOFFSETCLAMPPROC glad_glPolygonOffsetClamp; #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +GLAPI int GLAD_GL_ARB_debug_output; +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI PFNGLDEBUGMESSAGECONTROLARBPROC glad_glDebugMessageControlARB; +#define glDebugMessageControlARB glad_glDebugMessageControlARB +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI PFNGLDEBUGMESSAGEINSERTARBPROC glad_glDebugMessageInsertARB; +#define glDebugMessageInsertARB glad_glDebugMessageInsertARB +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC)(GLDEBUGPROCARB callback, const void *userParam); +GLAPI PFNGLDEBUGMESSAGECALLBACKARBPROC glad_glDebugMessageCallbackARB; +#define glDebugMessageCallbackARB glad_glDebugMessageCallbackARB +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI PFNGLGETDEBUGMESSAGELOGARBPROC glad_glGetDebugMessageLogARB; +#define glGetDebugMessageLogARB glad_glGetDebugMessageLogARB +#endif #ifndef GL_ARB_texture_compression_bptc #define GL_ARB_texture_compression_bptc 1 GLAPI int GLAD_GL_ARB_texture_compression_bptc; #endif +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +GLAPI int GLAD_GL_EXT_debug_marker; +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC)(GLsizei length, const GLchar *marker); +GLAPI PFNGLINSERTEVENTMARKEREXTPROC glad_glInsertEventMarkerEXT; +#define glInsertEventMarkerEXT glad_glInsertEventMarkerEXT +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC)(GLsizei length, const GLchar *marker); +GLAPI PFNGLPUSHGROUPMARKEREXTPROC glad_glPushGroupMarkerEXT; +#define glPushGroupMarkerEXT glad_glPushGroupMarkerEXT +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC)(void); +GLAPI PFNGLPOPGROUPMARKEREXTPROC glad_glPopGroupMarkerEXT; +#define glPopGroupMarkerEXT glad_glPopGroupMarkerEXT +#endif #ifndef GL_EXT_texture_compression_rgtc #define GL_EXT_texture_compression_rgtc 1 GLAPI int GLAD_GL_EXT_texture_compression_rgtc; diff --git a/extern/src/glad/glad_wgl.h b/extern/src/glad/glad_wgl.h index 80e81926..e690891f 100644 --- a/extern/src/glad/glad_wgl.h +++ b/extern/src/glad/glad_wgl.h @@ -1,13 +1,15 @@ /* - WGL loader generated by glad 0.1.36 on Wed Apr 23 10:45:44 2025. + WGL loader generated by glad 0.1.36 on Mon May 25 02:55:23 2026. Language/Generator: C/C++ Specification: wgl APIs: wgl=1.0 Profile: - Extensions: + GL_ARB_debug_output, GL_ARB_texture_compression_bptc, + GL_EXT_debug_marker, GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, GL_EXT_texture_filter_anisotropic, @@ -21,9 +23,9 @@ Reproducible: False Commandline: - --api="wgl=1.0" --generator="c" --spec="wgl" --no-loader --extensions="GL_ARB_texture_compression_bptc,GL_EXT_texture_compression_rgtc,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_NV_DX_interop,WGL_NV_DX_interop2" + --api="wgl=1.0" --generator="c" --spec="wgl" --no-loader --extensions="GL_ARB_debug_output,GL_ARB_texture_compression_bptc,GL_EXT_debug_marker,GL_EXT_texture_compression_rgtc,GL_EXT_texture_compression_s3tc,GL_EXT_texture_filter_anisotropic,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_NV_DX_interop,WGL_NV_DX_interop2" Online: - https://glad.dav1d.de/#language=c&specification=wgl&api=wgl%3D1.0&extensions=GL_ARB_texture_compression_bptc&extensions=GL_EXT_texture_compression_rgtc&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=WGL_ARB_extensions_string&extensions=WGL_EXT_extensions_string&extensions=WGL_NV_DX_interop&extensions=WGL_NV_DX_interop2 + https://glad.dav1d.de/#language=c&specification=wgl&api=wgl%3D1.0&extensions=GL_ARB_debug_output&extensions=GL_ARB_texture_compression_bptc&extensions=GL_EXT_debug_marker&extensions=GL_EXT_texture_compression_rgtc&extensions=GL_EXT_texture_compression_s3tc&extensions=GL_EXT_texture_filter_anisotropic&extensions=WGL_ARB_extensions_string&extensions=WGL_EXT_extensions_string&extensions=WGL_NV_DX_interop&extensions=WGL_NV_DX_interop2 */ diff --git a/src/CRE/gl_rend_state.cpp b/src/CRE/gl_rend_state.cpp index bacaf54a..31b6de81 100644 --- a/src/CRE/gl_rend_state.cpp +++ b/src/CRE/gl_rend_state.cpp @@ -720,6 +720,8 @@ inline void gl_rend_state::active_texture(int32_t index) { inline void gl_rend_state::begin_event(const char* message, int32_t length) { if (GLAD_GL_VERSION_4_3) glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, (GLsizei)length, message); + else if (GLAD_GL_EXT_debug_marker) + glPushGroupMarkerEXT((GLsizei)length, message); } inline void gl_rend_state::begin_query(GLenum target, GLuint id) { @@ -1122,6 +1124,8 @@ inline void gl_rend_state::enable_stencil_test() { inline void gl_rend_state::end_event() { if (GLAD_GL_VERSION_4_3) glPopDebugGroup(); + else if (GLAD_GL_EXT_debug_marker) + glPopGroupMarkerEXT(); } inline void gl_rend_state::end_query(GLenum target) { @@ -1217,14 +1221,16 @@ void gl_rend_state::get() { glGetInteger64i_v(GL_UNIFORM_BUFFER_SIZE, i, (GLint64*)&uniform_buffer_sizes[i]); } - shader_storage_buffer_start_index = 14; - shader_storage_buffer_end_index = -1; + if (GLAD_GL_VERSION_4_3) { + shader_storage_buffer_start_index = 14; + shader_storage_buffer_end_index = -1; - glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING, (GLint*)&shader_storage_buffer_binding); - for (GLuint i = 0; i < 14; i++) { - glGetIntegeri_v(GL_SHADER_STORAGE_BUFFER_BINDING, i, (GLint*)&shader_storage_buffer_bindings[i]); - glGetInteger64i_v(GL_SHADER_STORAGE_BUFFER_START, i, (GLint64*)&shader_storage_buffer_offsets[i]); - glGetInteger64i_v(GL_SHADER_STORAGE_BUFFER_SIZE, i, (GLint64*)&shader_storage_buffer_sizes[i]); + glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING, (GLint*)&shader_storage_buffer_binding); + for (GLuint i = 0; i < 14; i++) { + glGetIntegeri_v(GL_SHADER_STORAGE_BUFFER_BINDING, i, (GLint*)&shader_storage_buffer_bindings[i]); + glGetInteger64i_v(GL_SHADER_STORAGE_BUFFER_START, i, (GLint64*)&shader_storage_buffer_offsets[i]); + glGetInteger64i_v(GL_SHADER_STORAGE_BUFFER_SIZE, i, (GLint64*)&shader_storage_buffer_sizes[i]); + } } glGetBooleanv(GL_COLOR_WRITEMASK, color_mask); @@ -1869,7 +1875,7 @@ inline void gl_rend_state::update_uniform_buffer() { } inline void gl_rend_state::update_shader_storage_buffer() { - if (update_flags & GL_REND_STATE_UPDATE_SHADER_STORAGE_BUFFER) { + if (GLAD_GL_VERSION_4_3 && (update_flags & GL_REND_STATE_UPDATE_SHADER_STORAGE_BUFFER)) { for (int32_t index = shader_storage_buffer_start_index; index <= shader_storage_buffer_end_index; index++) { if (curr_shader_storage_buffer_bindings[index] == shader_storage_buffer_bindings[index] diff --git a/src/CRE/gl_state.cpp b/src/CRE/gl_state.cpp index 24d08e57..548bde48 100644 --- a/src/CRE/gl_state.cpp +++ b/src/CRE/gl_state.cpp @@ -109,7 +109,8 @@ void gl_state_struct::get() { glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint*)&element_array_buffer_binding); glGetIntegerv(GL_UNIFORM_BUFFER_BINDING, (GLint*)&uniform_buffer_binding); - glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING, (GLint*)&shader_storage_buffer_binding); + if (GLAD_GL_VERSION_4_3) + glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING, (GLint*)&shader_storage_buffer_binding); } void* gl_state_struct::map_array_buffer(GLuint buffer) { diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index de660e91..79bc6fa1 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -2772,18 +2772,18 @@ namespace mdl { return false; std::vector* textures = get_objset_gen_textures_vec(obj_info.set_id); - VertexBuffer* obj_vert_buffer = get_object_vertex_buffer(obj_info); - IndexBuffer* ObjIB = get_object_index_buffer(obj_info); + VertexBuffer* vbhn_array = get_object_vertex_buffer(obj_info); + IndexBuffer* ibhn_array = get_object_index_buffer(obj_info); ::obj* obj_morph = 0; - VertexBuffer* obj_morph_vert_buffer = 0; + VertexBuffer* morph_vbhn_array = 0; if (morph.object.set_id != -1) { obj_morph = get_object_header(morph.object); - obj_morph_vert_buffer = get_object_vertex_buffer(morph.object); + morph_vbhn_array = get_object_vertex_buffer(morph.object); } - return entry_obj(obj, mat, obj_vert_buffer, ObjIB, - textures, blend_color, bone_mat, obj_morph, obj_morph_vert_buffer, + return entry_obj(obj, mat, vbhn_array, ibhn_array, + textures, blend_color, bone_mat, obj_morph, morph_vbhn_array, instances_count, instances_mat, func, func_data, enable_bone_mat); } diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index aef9e0a9..0b70e03e 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -1382,13 +1382,6 @@ bool create_mesh_index_buffer(IndexBuffer& ibhn, obj_mesh& mesh) { return true; } -#if SHARED_OBJECT_BUFFER -// Added -inline void create_mesh_index_buffer(IndexBuffer& ibhn, obj_mesh& mesh, GLuint in_ib) { - //ibhn.create(in_ib, size); -} -#endif - // 0x140458280 bool create_mesh_vertex_buffer(VertexBuffer& vbhn, obj_mesh& mesh, GL::BufferUsage usage) { if (!mesh.num_vertex || !mesh.vertex_array) @@ -1923,7 +1916,7 @@ inline int32_t get_mesh_index_modern(uint32_t hash, const char* mesh_name) { return -1; } -// 0x140459E10 +// 0x140459E10 inline VertexBuffer* get_mesh_vertex_buffer(object_info obj_id, const char* mesh_name) { int32_t mesh_index = get_mesh_index(obj_id, mesh_name); if (mesh_index == -1) diff --git a/src/CRE/object.hpp b/src/CRE/object.hpp index 4d3fa8e5..acaca7f5 100644 --- a/src/CRE/object.hpp +++ b/src/CRE/object.hpp @@ -91,9 +91,6 @@ extern void objset_info_storage_free(); extern bool check_objset_ready(uint32_t objset_index); extern bool create_mesh_index_buffer(IndexBuffer& ibhn, obj_mesh& mesh); -#if SHARED_OBJECT_BUFFER -extern void create_mesh_index_buffer(IndexBuffer& ibhn, obj_mesh& mesh, GLuint in_ib); // Added -#endif extern bool create_mesh_vertex_buffer(VertexBuffer& vbhn, obj_mesh& mesh, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC); #if SHARED_OBJECT_BUFFER diff --git a/src/CRE/ogl_buffer_object.cpp b/src/CRE/ogl_buffer_object.cpp index 2ee6b86d..c2fa9caf 100644 --- a/src/CRE/ogl_buffer_object.cpp +++ b/src/CRE/ogl_buffer_object.cpp @@ -189,14 +189,14 @@ GLenum VertexBuffer::get_target() const { } // 0x1404616F0 -GLuint create_index_buffer(uint32_t size, const void* data) { +GLuint create_index_buffer(uint32_t size, const void* buf) { GLuint ib = 0; glGenBuffers(1, &ib); gl_state.bind_element_array_buffer(ib); if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, size, data, 0); + glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, size, buf, 0); else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buf, GL_STATIC_DRAW); gl_state.bind_element_array_buffer(0); if (glGetError()) { @@ -233,17 +233,17 @@ void free_index_buffer(GLuint ib) { } // 0x1404617B0 -GLuint create_vertex_buffer(uint32_t size, const void* data, GL::BufferUsage usage) { +GLuint create_vertex_buffer(uint32_t size, const void* buf, GL::BufferUsage usage) { GLuint vb = 0; glGenBuffers(1, &vb); gl_state.bind_array_buffer(vb); if (GLAD_GL_VERSION_4_4 && usage != GL::BUFFER_USAGE_STREAM) { GLbitfield flags = usage == GL::BUFFER_USAGE_DYNAMIC ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0; - glBufferStorage(GL_ARRAY_BUFFER, size, data, flags); + glBufferStorage(GL_ARRAY_BUFFER, size, buf, flags); } else - glBufferData(GL_ARRAY_BUFFER, size, data, BufferUsageToGLenum(usage)); + glBufferData(GL_ARRAY_BUFFER, size, buf, GL::BufferUsageToGLenum(usage)); gl_state.bind_array_buffer(0); if (glGetError()) { diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 2dc48bad..61890b72 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -34,6 +34,9 @@ static const GLuint MORPH_TEXCOORD0_INDEX = 13; static const GLuint MORPH_TEXCOORD1_INDEX = 14; static const GLuint BONE_INDEX_INDEX = 15; +uint32_t render_context::max_uniform_block_size = 0; +uint32_t render_context::max_storage_block_size = 0; + draw_state_stats::draw_state_stats() : sub_mesh_count(), sub_mesh_no_mat_count(), sub_mesh_cheap_count(), field_C(), field_10(), draw_count(), draw_triangle_count(), field_1C() { @@ -948,11 +951,11 @@ void render_context::shared_storage_buffer::destroy() { } size_t render_context::shared_storage_buffer::fill_data(const void* data, size_t size, size_t buffer_size) { - size_t offset = align_val(this->offset, sv_min_storage_buffer_alignment); - if (offset != this->offset) - memset((void*)((size_t)this->data + this->offset), 0, offset - this->offset); + size_t offset = this->offset; memcpy((void*)((size_t)this->data + offset), data, size); - this->offset = offset + size; + this->offset = align_val(offset + size, sv_min_storage_buffer_alignment); + if (this->offset != offset) + memset((void*)((size_t)this->data + (offset + size)), 0, this->offset - (offset + size)); end = max_def(end, offset + buffer_size); return offset; } @@ -982,11 +985,11 @@ void render_context::shared_uniform_buffer::destroy() { } size_t render_context::shared_uniform_buffer::fill_data(const void* data, size_t size, size_t buffer_size) { - size_t offset = align_val(this->offset, sv_min_uniform_buffer_alignment); - if (offset != this->offset) - memset((void*)((size_t)this->data + this->offset), 0, offset - this->offset); + size_t offset = this->offset; memcpy((void*)((size_t)this->data + offset), data, size); - this->offset = offset + size; + this->offset = align_val(offset + size, sv_min_uniform_buffer_alignment); + if (this->offset != offset) + memset((void*)((size_t)this->data + (offset + size)), 0, this->offset - (offset + size)); end = max_def(end, offset + buffer_size); return offset; } @@ -1254,9 +1257,10 @@ sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_wi glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f); - max_uniform_block_size = min_def((uint32_t)sv_max_uniform_buffer_size, 64u * 1024); + if (!max_uniform_block_size) + max_uniform_block_size = min_def((uint32_t)sv_max_uniform_buffer_size, 64u * 1024); - if (GLAD_GL_VERSION_4_3) + if (GLAD_GL_VERSION_4_3 && !max_storage_block_size) max_storage_block_size = min_def((uint32_t)sv_max_storage_buffer_size, 1024u * 1024); } diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 9be63fb4..9c6dbee7 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -613,9 +613,6 @@ struct render_context { int32_t screen_width; int32_t screen_height; - uint32_t max_uniform_block_size = 0; - uint32_t max_storage_block_size = 0; - std::vector shared_storage_buffers; std::unordered_map shared_storage_buffer_entries; std::vector shared_uniform_buffers; @@ -623,6 +620,9 @@ struct render_context { std::vector texture_skinning_buffers; std::unordered_map texture_skinning_buffer_entries; + static uint32_t max_uniform_block_size; + static uint32_t max_storage_block_size; + render_context(); ~render_context(); diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index ca61085c..1e60abda 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -1949,11 +1949,11 @@ void RobCloth::set_data(const obj_skin_ex_node_cloth* cldata, return; for (int32_t i = 0; i < 2; i++) { - if (!mesh[i].num_vertex || !mesh[i].vertex_array || !ib[i].ib) + if (!mesh[i].num_vertex || !mesh[i].vertex_array || !ib[i].get_glib()) continue; - VertexBuffer* vbhn_array = &vb[i]; - IndexBuffer* ibhn_array = &ib[i]; + VertexBuffer* vbhn = &vb[i]; + IndexBuffer* ibhn = &ib[i]; obj_mesh* mesh = &this->mesh[i]; for (int32_t j = 0; j < mesh->num_submesh; j++) { @@ -1961,9 +1961,9 @@ void RobCloth::set_data(const obj_skin_ex_node_cloth* cldata, for (int32_t k = 0; k < (mesh->attrib.m.soft_body ? 2 : 1); k++) { extern render_context* rctx_ptr; rctx_ptr->disp_manager->add_vertex_array(mesh, &mesh->submesh_array[j], material, - vbhn_array->get_glvb(), vbhn_array->get_glvb_offset(), ibhn_array->ib, 0, 0); + vbhn->get_glvb(), vbhn->get_glvb_offset(), ibhn->get_glib(), 0, 0); - vbhn_array->flip(); + vbhn->flip(); } } } @@ -4324,6 +4324,7 @@ static void make_direction_matrix(mat4& mat, const vec3& v0, const vec3& v1) { mat4_set(&axis, -s, c, &mat); } +// 0x14021CF00 static void modify_cloth_object(obj_mesh* mesh, VertexBuffer* vb, CLOTH_VERTEX* vtxarg, float_t sgn, int32_t num_idx, uint16_t* idxtbl, bool do_ura) { if (!mesh || !vb || (mesh->vertex_format diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index 0370f2e2..8ed06cea 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -473,6 +473,11 @@ int32_t app_main(const app_init_struct& ais) { glDebugMessageCallback(render_debug_output, 0); glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE); } + else if (GLAD_GL_ARB_debug_output) { + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); + glDebugMessageCallbackARB(render_debug_output, 0); + glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE); + } #endif const char* vendor_string = (const char*)glGetString(GL_VENDOR); @@ -692,7 +697,7 @@ static bool app_init(const app_init_struct& ais) { window = glfwCreateWindow(width, height, application_name, maximized ? monitor : 0, 0); #ifdef USE_OPENGL else { - int32_t minor = 6; + int32_t minor = ais.max_minor_ver; window = 0; while (!window && minor >= 1) { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); diff --git a/src/ReDIVA/app.hpp b/src/ReDIVA/app.hpp index 5389995b..7902db8e 100644 --- a/src/ReDIVA/app.hpp +++ b/src/ReDIVA/app.hpp @@ -30,20 +30,22 @@ enum render_scale { struct app_init_struct { vec2i res; int32_t scale_index; + int32_t max_minor_ver; bool vulkan; const wchar_t* config_path; - inline app_init_struct() : scale_index(), vulkan(), config_path() { + inline app_init_struct() : scale_index(), max_minor_ver(), vulkan(), config_path() { } - inline app_init_struct(bool vulkan, const wchar_t* config_path = 0) - : scale_index(), vulkan(vulkan), config_path(config_path) { + inline app_init_struct(int32_t max_minor_ver, bool vulkan, const wchar_t* config_path = 0) + : scale_index(), max_minor_ver(max_minor_ver), vulkan(vulkan), config_path(config_path) { } - inline app_init_struct(vec2i res, int32_t scale_index, bool vulkan, const wchar_t* config_path = 0) - : res(res), scale_index(scale_index), vulkan(vulkan), config_path(config_path) { + inline app_init_struct(vec2i res, int32_t scale_index, + int32_t max_minor_ver, bool vulkan, const wchar_t* config_path = 0) + : res(res), scale_index(scale_index), max_minor_ver(max_minor_ver), vulkan(vulkan), config_path(config_path) { } }; diff --git a/src/ReDIVA/main.cpp b/src/ReDIVA/main.cpp index 0c42f675..ca69831e 100644 --- a/src/ReDIVA/main.cpp +++ b/src/ReDIVA/main.cpp @@ -212,11 +212,14 @@ int32_t wmain(int32_t argc, wchar_t** argv) { return 0; } + int32_t max_minor_ver = 2; bool vulkan = false; const wchar_t* config_path = 0; if (argc >= 2) for (int32_t i = 1; i < argc; i++) { - if (!wcscmp(argv[i], L"--vulkan")) + if (!wcscmp(argv[i], L"--max-minor-ver") && i + 1 < argc) + max_minor_ver = _wtoi(argv[++i]); + else if (!wcscmp(argv[i], L"--vulkan")) vulkan = true; else if (!wcscmp(argv[i], L"--config") && i + 1 < argc) config_path = argv[++i]; @@ -239,7 +242,7 @@ int32_t wmain(int32_t argc, wchar_t** argv) { __cpuidex(cpuidex_data, 7, 0); cpu_caps_avx2 = !!(cpuidex_data[1] & (1 << 5)); - app_main({ vulkan, config_path }); + app_main({ max_minor_ver, vulkan, config_path }); timeEndPeriod(1); return 0;