mirror of https://github.com/RPCS3/rpcs3.git
gl: dynamically determine texture buffer offset alignment
fix alignment issues for gpus where align < 16 is ok
This commit is contained in:
parent
28a5d4d4f0
commit
3a63b62486
|
@ -381,6 +381,7 @@ void GLGSRender::on_init_thread()
|
||||||
LOG_NOTICE(RSX, "%s", (const char*)glGetString(GL_VENDOR));
|
LOG_NOTICE(RSX, "%s", (const char*)glGetString(GL_VENDOR));
|
||||||
|
|
||||||
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
|
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
|
||||||
|
glGetIntegerv(GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT, &m_min_texbuffer_alignment);
|
||||||
m_vao.create();
|
m_vao.create();
|
||||||
|
|
||||||
for (gl::texture &tex : m_gl_attrib_buffers)
|
for (gl::texture &tex : m_gl_attrib_buffers)
|
||||||
|
|
|
@ -36,6 +36,8 @@ private:
|
||||||
u32 m_begin_time = 0;
|
u32 m_begin_time = 0;
|
||||||
u32 m_draw_time = 0;
|
u32 m_draw_time = 0;
|
||||||
u32 m_vertex_upload_time = 0;
|
u32 m_vertex_upload_time = 0;
|
||||||
|
|
||||||
|
GLint m_min_texbuffer_alignment = 256;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
gl::fbo draw_fbo;
|
gl::fbo draw_fbo;
|
||||||
|
|
|
@ -645,9 +645,10 @@ namespace gl
|
||||||
m_mapped_bytes_available = max_size;
|
m_mapped_bytes_available = max_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<void*, u32> alloc_from_reserve(u32 size)
|
std::pair<void*, u32> 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)
|
if (m_mapped_bytes_available < size || !m_mapped_base)
|
||||||
{
|
{
|
||||||
|
@ -669,7 +670,7 @@ namespace gl
|
||||||
m_mapped_reserve_offset += size;
|
m_mapped_reserve_offset += size;
|
||||||
m_mapped_bytes_available -= size;
|
m_mapped_bytes_available -= size;
|
||||||
|
|
||||||
EXPECTS((offset & 15) == 0);
|
EXPECTS((offset & alignment) == 0);
|
||||||
return std::make_pair(ptr, offset);
|
return std::make_pair(ptr, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,7 @@ u32 GLGSRender::set_vertex_buffer()
|
||||||
auto &texture = m_gl_attrib_buffers[index];
|
auto &texture = m_gl_attrib_buffers[index];
|
||||||
|
|
||||||
u8 *src = reinterpret_cast<u8*>(inline_vertex_array.data());
|
u8 *src = reinterpret_cast<u8*>(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<u8*>(mapping.first);
|
u8 *dst = static_cast<u8*>(mapping.first);
|
||||||
|
|
||||||
src += offsets[index];
|
src += offsets[index];
|
||||||
|
@ -337,7 +337,7 @@ u32 GLGSRender::set_vertex_buffer()
|
||||||
|
|
||||||
if (draw_command == rsx::draw_command::array)
|
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<gsl::byte*>(mapping.first);
|
gsl::byte *dst = static_cast<gsl::byte*>(mapping.first);
|
||||||
buffer_offset = mapping.second;
|
buffer_offset = mapping.second;
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ u32 GLGSRender::set_vertex_buffer()
|
||||||
if (draw_command == rsx::draw_command::indexed)
|
if (draw_command == rsx::draw_command::indexed)
|
||||||
{
|
{
|
||||||
data_size = (max_index + 1) * element_size;
|
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<gsl::byte*>(mapping.first);
|
gsl::byte *dst = static_cast<gsl::byte*>(mapping.first);
|
||||||
buffer_offset = mapping.second;
|
buffer_offset = mapping.second;
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ u32 GLGSRender::set_vertex_buffer()
|
||||||
|
|
||||||
auto &texture = m_gl_attrib_buffers[index];
|
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<u8*>(mapping.first);
|
u8 *dst = static_cast<u8*>(mapping.first);
|
||||||
|
|
||||||
memcpy(dst, vertex_data.data(), data_size);
|
memcpy(dst, vertex_data.data(), data_size);
|
||||||
|
|
Loading…
Reference in New Issue