mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-15 10:19:35 -06:00
Fix rendering on Adreno and Mali. This adds a new DriverDetails bug to know if the bufferstreaming is broken. Thanks degasus for fixing this.
This commit is contained in:
@ -198,11 +198,28 @@ void ProgramShaderCache::UploadConstants()
|
|||||||
if(PixelShaderManager::dirty || VertexShaderManager::dirty)
|
if(PixelShaderManager::dirty || VertexShaderManager::dirty)
|
||||||
{
|
{
|
||||||
s_buffer->Alloc(s_ubo_buffer_size);
|
s_buffer->Alloc(s_ubo_buffer_size);
|
||||||
|
if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM))
|
||||||
|
{
|
||||||
|
// This is just a hack to support our BUFFERDATA upload method
|
||||||
|
// as it's broken to uploaded in a splited way
|
||||||
|
static u8 *tmpbuffer = new u8[s_ubo_buffer_size];
|
||||||
|
memcpy(tmpbuffer, &PixelShaderManager::constants, sizeof(PixelShaderConstants));
|
||||||
|
memcpy(tmpbuffer+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants));
|
||||||
|
size_t offset = s_buffer->Upload(tmpbuffer, s_ubo_buffer_size);
|
||||||
|
glBindBufferRange(GL_UNIFORM_BUFFER, 1,
|
||||||
|
s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
|
||||||
|
glBindBufferRange(GL_UNIFORM_BUFFER, 2,
|
||||||
|
s_buffer->getBuffer(), offset+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align));
|
size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align));
|
||||||
glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
|
glBindBufferRange(GL_UNIFORM_BUFFER, 1,
|
||||||
|
s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
|
||||||
offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align));
|
offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align));
|
||||||
glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants));
|
glBindBufferRange(GL_UNIFORM_BUFFER, 2,
|
||||||
|
s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants));
|
||||||
|
}
|
||||||
|
|
||||||
PixelShaderManager::dirty = false;
|
PixelShaderManager::dirty = false;
|
||||||
VertexShaderManager::dirty = false;
|
VertexShaderManager::dirty = false;
|
||||||
|
@ -34,8 +34,7 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA)
|
if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA)
|
||||||
&& !DriverDetails::HasBug(DriverDetails::BUG_ISPOWERVR)
|
|| DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM))
|
||||||
&& !DriverDetails::HasBug(DriverDetails::BUG_ISTEGRA))
|
|
||||||
m_uploadtype = BUFFERDATA;
|
m_uploadtype = BUFFERDATA;
|
||||||
else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA))
|
else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA))
|
||||||
m_uploadtype = BUFFERSUBDATA;
|
m_uploadtype = BUFFERSUBDATA;
|
||||||
|
@ -32,6 +32,8 @@ namespace DriverDetails
|
|||||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENINFOLOG, -1.0, -1.0, true},
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENINFOLOG, -1.0, -1.0, true},
|
||||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_ANNIHILATEDUBOS, 41.0, 46.0, true},
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_ANNIHILATEDUBOS, 41.0, 46.0, true},
|
||||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENSWAP, -1.0, -1.0, true},
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENSWAP, -1.0, -1.0, true},
|
||||||
|
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true},
|
||||||
|
{VENDOR_ARM, DRIVER_ARM_T6XX, BUG_BROKENBUFFERSTREAM, -1.0, -1.0, true},
|
||||||
{VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENUBO, 900, 916, true},
|
{VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENUBO, 900, 916, true},
|
||||||
{VENDOR_MESA, DRIVER_R600, BUG_BROKENUBO, 900, 913, true},
|
{VENDOR_MESA, DRIVER_R600, BUG_BROKENUBO, 900, 913, true},
|
||||||
{VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true},
|
{VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true},
|
||||||
|
@ -129,6 +129,14 @@ namespace DriverDetails
|
|||||||
// PowerVR 5 hardware limitations don't allow it to support OpenGL ES 3
|
// PowerVR 5 hardware limitations don't allow it to support OpenGL ES 3
|
||||||
// This is fixed in PowerVR6
|
// This is fixed in PowerVR6
|
||||||
BUG_ISPOWERVR,
|
BUG_ISPOWERVR,
|
||||||
|
// Bug: glBufferSubData/glMapBufferRange stalls + OOM
|
||||||
|
// Affected devices: Adreno a3xx/Mali-t6xx
|
||||||
|
// Started Version: -1
|
||||||
|
// Ended Version: -1
|
||||||
|
// Both Adreno and Mali have issues when you call glBufferSubData or glMapBufferRange
|
||||||
|
// The driver stalls in each instance no matter what you do
|
||||||
|
// Apparently Mali and Adreno share code in this regard since it was wrote by the same person.
|
||||||
|
BUG_BROKENBUFFERSTREAM,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Initializes our internal vendor, device family, and driver version
|
// Initializes our internal vendor, device family, and driver version
|
||||||
|
Reference in New Issue
Block a user