mirror of https://github.com/PCSX2/pcsx2.git
gsdx-ogl: sort the texture upload code
I wanted to do a separate path for palette texture. So far, it isn't very conclusive.
This commit is contained in:
parent
46a4d2dc47
commit
68aa182b16
|
@ -334,26 +334,51 @@ void GSTextureOGL::Invalidate()
|
||||||
|
|
||||||
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
||||||
{
|
{
|
||||||
// Done in map/unmap directly
|
|
||||||
ASSERT(0);
|
|
||||||
|
|
||||||
ASSERT(m_type != GSTexture::DepthStencil && m_type != GSTexture::Offscreen);
|
ASSERT(m_type != GSTexture::DepthStencil && m_type != GSTexture::Offscreen);
|
||||||
GL_PUSH("Upload Texture %d", m_texture_id);
|
|
||||||
|
// Default upload path for the texture is the Map/Unmap
|
||||||
|
// This path is mostly used for palette. But also for texture that could
|
||||||
|
// overflow the pbo buffer
|
||||||
|
// Data upload is rather small typically 64B or 1024B. So don't bother with PBO
|
||||||
|
// and directly send the data to the GL synchronously
|
||||||
|
|
||||||
m_dirty = true;
|
m_dirty = true;
|
||||||
m_clean = false;
|
m_clean = false;
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, m_int_alignment);
|
|
||||||
|
|
||||||
char* src = (char*)data;
|
|
||||||
uint32 row_byte = r.width() << m_int_shift;
|
uint32 row_byte = r.width() << m_int_shift;
|
||||||
uint32 map_size = r.height() * row_byte;
|
uint32 map_size = r.height() * row_byte;
|
||||||
char* map = PboPool::Map(map_size);
|
|
||||||
|
|
||||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||||
g_real_texture_upload_byte += map_size;
|
g_real_texture_upload_byte += map_size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, m_int_alignment);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (r.height() == 1) {
|
||||||
|
// Palette data. Transfer is small either 64B or 1024B.
|
||||||
|
// Sometimes it is faster, sometimes slower.
|
||||||
|
glTextureSubImage2D(m_texture_id, GL_TEX_LEVEL_0, r.x, r.y, r.width(), r.height(), m_int_format, m_int_type, data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GL_PUSH("Upload Texture %d", m_texture_id);
|
||||||
|
|
||||||
|
// The easy solution without PBO
|
||||||
|
#if 0
|
||||||
|
// Likely a bad texture
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch >> m_int_shift);
|
||||||
|
|
||||||
|
glTextureSubImage2D(m_texture_id, GL_TEX_LEVEL_0, r.x, r.y, r.width(), r.height(), m_int_format, m_int_type, data);
|
||||||
|
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // Restore default behavior
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// The complex solution with PBO
|
||||||
|
#if 1
|
||||||
|
char* src = (char*)data;
|
||||||
|
char* map = PboPool::Map(map_size);
|
||||||
|
|
||||||
// PERF: slow path of the texture upload. Dunno if we could do better maybe check if TC can keep row_byte == pitch
|
// PERF: slow path of the texture upload. Dunno if we could do better maybe check if TC can keep row_byte == pitch
|
||||||
// Note: row_byte != pitch
|
// Note: row_byte != pitch
|
||||||
for (int h = 0; h < r.height(); h++) {
|
for (int h = 0; h < r.height(); h++) {
|
||||||
|
@ -370,23 +395,11 @@ bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
||||||
PboPool::UnbindPbo();
|
PboPool::UnbindPbo();
|
||||||
|
|
||||||
PboPool::EndTransfer();
|
PboPool::EndTransfer();
|
||||||
|
#endif
|
||||||
|
|
||||||
GL_POP();
|
GL_POP();
|
||||||
return true;
|
|
||||||
|
|
||||||
// For reference, standard upload without pbo (Used to crash on FGLRX)
|
|
||||||
#if 0
|
|
||||||
// pitch is in byte wherease GL_UNPACK_ROW_LENGTH is in pixel
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, m_int_alignment);
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch >> m_int_shift);
|
|
||||||
|
|
||||||
glTextureSubImage2D(m_texture_id, GL_TEX_LEVEL_0, r.x, r.y, r.width(), r.height(), m_int_format, m_int_type, data);
|
|
||||||
|
|
||||||
// FIXME useful?
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // Restore default behavior
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GSTextureOGL::Map(GSMap& m, const GSVector4i* r)
|
bool GSTextureOGL::Map(GSMap& m, const GSVector4i* r)
|
||||||
|
|
Loading…
Reference in New Issue