mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-03-06 14:27:44 +00:00
OpenGLDevice: Fix PBO and non-PBO path for SW renderer
This commit is contained in:
parent
3c47f9b1b1
commit
0e0beec1f4
|
@ -255,9 +255,6 @@ ALWAYS_INLINE void CopyOutRow16<GPUTexture::Format::BGRA8, u32>(const u16* src_p
|
||||||
template<GPUTexture::Format display_format>
|
template<GPUTexture::Format display_format>
|
||||||
void GPU_SW::CopyOut15Bit(u32 src_x, u32 src_y, u32 width, u32 height, u32 field, bool interlaced, bool interleaved)
|
void GPU_SW::CopyOut15Bit(u32 src_x, u32 src_y, u32 width, u32 height, u32 field, bool interlaced, bool interleaved)
|
||||||
{
|
{
|
||||||
u8* dst_ptr;
|
|
||||||
u32 dst_stride;
|
|
||||||
|
|
||||||
using OutputPixelType =
|
using OutputPixelType =
|
||||||
std::conditional_t<display_format == GPUTexture::Format::RGBA8 || display_format == GPUTexture::Format::BGRA8, u32,
|
std::conditional_t<display_format == GPUTexture::Format::RGBA8 || display_format == GPUTexture::Format::BGRA8, u32,
|
||||||
u16>;
|
u16>;
|
||||||
|
@ -266,16 +263,11 @@ void GPU_SW::CopyOut15Bit(u32 src_x, u32 src_y, u32 width, u32 height, u32 field
|
||||||
if (!texture)
|
if (!texture)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!interlaced)
|
u32 dst_stride = GPU_MAX_DISPLAY_WIDTH * sizeof(OutputPixelType);
|
||||||
{
|
u8* dst_ptr = m_display_texture_buffer.data() + (interlaced ? (field != 0 ? dst_stride : 0) : 0);
|
||||||
if (!texture->Map(reinterpret_cast<void**>(&dst_ptr), &dst_stride, 0, 0, width, height))
|
|
||||||
return;
|
const bool mapped =
|
||||||
}
|
(!interlaced && texture->Map(reinterpret_cast<void**>(&dst_ptr), &dst_stride, 0, 0, width, height));
|
||||||
else
|
|
||||||
{
|
|
||||||
dst_stride = GPU_MAX_DISPLAY_WIDTH * sizeof(OutputPixelType);
|
|
||||||
dst_ptr = m_display_texture_buffer.data() + (field != 0 ? dst_stride : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const u32 output_stride = dst_stride;
|
const u32 output_stride = dst_stride;
|
||||||
const u8 interlaced_shift = BoolToUInt8(interlaced);
|
const u8 interlaced_shift = BoolToUInt8(interlaced);
|
||||||
|
@ -315,7 +307,7 @@ void GPU_SW::CopyOut15Bit(u32 src_x, u32 src_y, u32 width, u32 height, u32 field
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!interlaced)
|
if (mapped)
|
||||||
texture->Unmap();
|
texture->Unmap();
|
||||||
else
|
else
|
||||||
texture->Update(0, 0, width, height, m_display_texture_buffer.data(), output_stride);
|
texture->Update(0, 0, width, height, m_display_texture_buffer.data(), output_stride);
|
||||||
|
@ -349,9 +341,6 @@ template<GPUTexture::Format display_format>
|
||||||
void GPU_SW::CopyOut24Bit(u32 src_x, u32 src_y, u32 skip_x, u32 width, u32 height, u32 field, bool interlaced,
|
void GPU_SW::CopyOut24Bit(u32 src_x, u32 src_y, u32 skip_x, u32 width, u32 height, u32 field, bool interlaced,
|
||||||
bool interleaved)
|
bool interleaved)
|
||||||
{
|
{
|
||||||
u8* dst_ptr;
|
|
||||||
u32 dst_stride;
|
|
||||||
|
|
||||||
using OutputPixelType =
|
using OutputPixelType =
|
||||||
std::conditional_t<display_format == GPUTexture::Format::RGBA8 || display_format == GPUTexture::Format::BGRA8, u32,
|
std::conditional_t<display_format == GPUTexture::Format::RGBA8 || display_format == GPUTexture::Format::BGRA8, u32,
|
||||||
u16>;
|
u16>;
|
||||||
|
@ -360,16 +349,10 @@ void GPU_SW::CopyOut24Bit(u32 src_x, u32 src_y, u32 skip_x, u32 width, u32 heigh
|
||||||
if (!texture)
|
if (!texture)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!interlaced)
|
u32 dst_stride = Common::AlignUpPow2<u32>(width * sizeof(OutputPixelType), 4);
|
||||||
{
|
u8* dst_ptr = m_display_texture_buffer.data() + (interlaced ? (field != 0 ? dst_stride : 0) : 0);
|
||||||
if (!texture->Map(reinterpret_cast<void**>(&dst_ptr), &dst_stride, 0, 0, width, height))
|
const bool mapped =
|
||||||
return;
|
(!interlaced && texture->Map(reinterpret_cast<void**>(&dst_ptr), &dst_stride, 0, 0, width, height));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dst_stride = Common::AlignUpPow2<u32>(width * sizeof(OutputPixelType), 4);
|
|
||||||
dst_ptr = m_display_texture_buffer.data() + (field != 0 ? dst_stride : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const u32 output_stride = dst_stride;
|
const u32 output_stride = dst_stride;
|
||||||
const u8 interlaced_shift = BoolToUInt8(interlaced);
|
const u8 interlaced_shift = BoolToUInt8(interlaced);
|
||||||
|
@ -473,7 +456,7 @@ void GPU_SW::CopyOut24Bit(u32 src_x, u32 src_y, u32 skip_x, u32 width, u32 heigh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!interlaced)
|
if (mapped)
|
||||||
texture->Unmap();
|
texture->Unmap();
|
||||||
else
|
else
|
||||||
texture->Update(0, 0, width, height, m_display_texture_buffer.data(), output_stride);
|
texture->Update(0, 0, width, height, m_display_texture_buffer.data(), output_stride);
|
||||||
|
|
|
@ -395,7 +395,7 @@ bool OpenGLDevice::CheckFeatures(bool* buggy_pbo)
|
||||||
const bool is_shitty_mobile_driver = (vendor_id_powervr || vendor_id_qualcomm || vendor_id_arm);
|
const bool is_shitty_mobile_driver = (vendor_id_powervr || vendor_id_qualcomm || vendor_id_arm);
|
||||||
const bool is_buggy_pbo =
|
const bool is_buggy_pbo =
|
||||||
(!GLAD_GL_VERSION_4_4 && !GLAD_GL_ARB_buffer_storage && !GLAD_GL_EXT_buffer_storage) || is_shitty_mobile_driver;
|
(!GLAD_GL_VERSION_4_4 && !GLAD_GL_ARB_buffer_storage && !GLAD_GL_EXT_buffer_storage) || is_shitty_mobile_driver;
|
||||||
*buggy_pbo = true;// is_buggy_pbo;
|
*buggy_pbo = is_buggy_pbo;
|
||||||
if (is_buggy_pbo && !is_shitty_mobile_driver)
|
if (is_buggy_pbo && !is_shitty_mobile_driver)
|
||||||
Log_WarningPrint("Not using PBOs for texture uploads because buffer_storage is unavailable.");
|
Log_WarningPrint("Not using PBOs for texture uploads because buffer_storage is unavailable.");
|
||||||
|
|
||||||
|
|
|
@ -205,7 +205,7 @@ bool OpenGLTexture::Update(u32 x, u32 y, u32 width, u32 height, const void* data
|
||||||
{
|
{
|
||||||
GL_INS("Not using PBO for map size %u", map_size);
|
GL_INS("Not using PBO for map size %u", map_size);
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / GetPixelSize());
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / GetPixelSize());
|
||||||
glTextureSubImage2D(target, layer, x, y, width, height, gl_format, gl_type, data);
|
glTexSubImage2D(target, layer, x, y, width, height, gl_format, gl_type, data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -215,8 +215,8 @@ bool OpenGLTexture::Update(u32 x, u32 y, u32 width, u32 height, const void* data
|
||||||
sb->Bind();
|
sb->Bind();
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, preferred_pitch / GetPixelSize());
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, preferred_pitch / GetPixelSize());
|
||||||
glTextureSubImage2D(GL_TEXTURE_2D, layer, x, y, width, height, gl_format, gl_type,
|
glTexSubImage2D(GL_TEXTURE_2D, layer, x, y, width, height, gl_format, gl_type,
|
||||||
reinterpret_cast<void*>(static_cast<uintptr_t>(map.buffer_offset)));
|
reinterpret_cast<void*>(static_cast<uintptr_t>(map.buffer_offset)));
|
||||||
|
|
||||||
sb->Unbind();
|
sb->Unbind();
|
||||||
}
|
}
|
||||||
|
@ -261,7 +261,7 @@ void OpenGLTexture::Unmap()
|
||||||
sb->Unmap(upload_size);
|
sb->Unmap(upload_size);
|
||||||
sb->Bind();
|
sb->Bind();
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, m_map_width);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / GetPixelSize());
|
||||||
|
|
||||||
OpenGLDevice::BindUpdateTextureUnit();
|
OpenGLDevice::BindUpdateTextureUnit();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue