diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 778267c3f3..69a8ca10f6 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -381,6 +381,7 @@ void GLGSRender::on_init_thread() LOG_NOTICE(RSX, "%s", (const char*)glGetString(GL_VENDOR)); glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); + glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &m_min_texbuffer_alignment); m_vao.create(); for (gl::texture &tex : m_gl_attrib_buffers) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index ce22766993..1c64d0b3c6 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -36,6 +36,8 @@ private: u32 m_begin_time = 0; u32 m_draw_time = 0; u32 m_vertex_upload_time = 0; + + GLint m_min_texbuffer_alignment = 256; public: gl::fbo draw_fbo; diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.h b/rpcs3/Emu/RSX/GL/gl_helpers.h index c24e9487ac..0f8ada9369 100644 --- a/rpcs3/Emu/RSX/GL/gl_helpers.h +++ b/rpcs3/Emu/RSX/GL/gl_helpers.h @@ -645,9 +645,10 @@ namespace gl m_mapped_bytes_available = max_size; } - std::pair alloc_from_reserve(u32 size) + std::pair alloc_from_reserve(u32 size, u32 alignment = 16) { - size = (size + 15) & ~15; + alignment -= 1; + size = (size + alignment) & ~alignment; if (m_mapped_bytes_available < size || !m_mapped_base) { @@ -669,7 +670,7 @@ namespace gl m_mapped_reserve_offset += size; m_mapped_bytes_available -= size; - EXPECTS((offset & 15) == 0); + EXPECTS((offset & alignment) == 0); return std::make_pair(ptr, offset); } diff --git a/rpcs3/Emu/RSX/GL/vertex_buffer.cpp b/rpcs3/Emu/RSX/GL/vertex_buffer.cpp index 903745553d..41e6f83b44 100644 --- a/rpcs3/Emu/RSX/GL/vertex_buffer.cpp +++ b/rpcs3/Emu/RSX/GL/vertex_buffer.cpp @@ -253,7 +253,7 @@ u32 GLGSRender::set_vertex_buffer() auto &texture = m_gl_attrib_buffers[index]; u8 *src = reinterpret_cast(inline_vertex_array.data()); - auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size); + auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size, m_min_texbuffer_alignment); u8 *dst = static_cast(mapping.first); src += offsets[index]; @@ -337,7 +337,7 @@ u32 GLGSRender::set_vertex_buffer() if (draw_command == rsx::draw_command::array) { - auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size); + auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size, m_min_texbuffer_alignment); gsl::byte *dst = static_cast(mapping.first); buffer_offset = mapping.second; @@ -354,7 +354,7 @@ u32 GLGSRender::set_vertex_buffer() if (draw_command == rsx::draw_command::indexed) { data_size = (max_index + 1) * element_size; - auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size); + auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size, m_min_texbuffer_alignment); gsl::byte *dst = static_cast(mapping.first); buffer_offset = mapping.second; @@ -385,7 +385,7 @@ u32 GLGSRender::set_vertex_buffer() auto &texture = m_gl_attrib_buffers[index]; - auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size); + auto mapping = m_attrib_ring_buffer->alloc_from_reserve(data_size, m_min_texbuffer_alignment); u8 *dst = static_cast(mapping.first); memcpy(dst, vertex_data.data(), data_size);