mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
ogl driverdetails: add flag to disable hacked and pinned memory
pinned memory is broken for index buffers hacked buffer crashes the amd driver
This commit is contained in:
parent
d83dffe442
commit
15df7b3445
@ -27,12 +27,15 @@ namespace DriverDetails
|
||||
// This is a list of all known bugs for each vendor
|
||||
// We use this to check if the device and driver has a issue
|
||||
BugInfo m_known_bugs[] = {
|
||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_NODYNUBOACCESS, 14.0, -1.0, true},
|
||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENCENTROID, 14.0, -1.0, true},
|
||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENINFOLOG, -1.0, -1.0, true},
|
||||
{VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENUBO, 900, 916, true},
|
||||
{VENDOR_MESA, DRIVER_R600, BUG_BROKENUBO, 900, 913, true},
|
||||
{VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true},
|
||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_NODYNUBOACCESS, 14.0, -1.0, true},
|
||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENCENTROID, 14.0, -1.0, true},
|
||||
{VENDOR_QUALCOMM, DRIVER_QUALCOMM_3XX, BUG_BROKENINFOLOG, -1.0, -1.0, true},
|
||||
{VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENUBO, 900, 916, true},
|
||||
{VENDOR_MESA, DRIVER_R600, BUG_BROKENUBO, 900, 913, true},
|
||||
{VENDOR_MESA, DRIVER_I965, BUG_BROKENUBO, 900, 920, true},
|
||||
{VENDOR_ATI, DRIVER_ATI, BUG_BROKENHACKEDBUFFER, -1.0, -1.0, true},
|
||||
{VENDOR_MESA, DRIVER_NOUVEAU, BUG_BROKENHACKEDBUFFER, -1.0, -1.0, true},
|
||||
{VENDOR_ATI, DRIVER_ATI, BUG_BROKENPINNEDMEMORY, -1.0, -1.0, true}
|
||||
};
|
||||
|
||||
std::map<Bug, BugInfo> m_bugs;
|
||||
|
@ -83,6 +83,22 @@ namespace DriverDetails
|
||||
// Nouveau stored the offset as u16 which isn't enough for all cases with range until 9.1.6
|
||||
// I965 has broken data fetches from uniform buffers which results in a dithering until 9.2.0
|
||||
BUG_BROKENUBO,
|
||||
// Bug: The hacked buffer upload method isn't working
|
||||
// This isn't a bug as the hacked buffer itself isn't used to work.
|
||||
// I'm still surprised that it works on so many drivers.
|
||||
// Affected devices: - amd close sourced driver
|
||||
// - nouveau
|
||||
// - maybe also some others
|
||||
// This hack is evil. It's like free(pointer); *pointer = data;
|
||||
BUG_BROKENHACKEDBUFFER,
|
||||
// Bug: The pinned memory extension isn't working for index buffers
|
||||
// Affected devices: AMD as they are the only vendor providing this extension
|
||||
// Started Version: ?
|
||||
// Ended Version: -1
|
||||
// Pinned memory is disabled for index buffer as the amd driver (the only one with pinned memory support) seems
|
||||
// to be broken. We just get flickering/black rendering when using pinned memory here -- degasus - 2013/08/20
|
||||
// Please see issue #6105 on google code. Let's hope buffer storage solves this issues.
|
||||
BUG_BROKENPINNEDMEMORY,
|
||||
};
|
||||
|
||||
// Initializes our internal vendor, device family, and driver version
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "StreamBuffer.h"
|
||||
#include "MemoryUtil.h"
|
||||
#include "Render.h"
|
||||
#include "DriverDetails.h"
|
||||
|
||||
namespace OGL
|
||||
{
|
||||
@ -27,9 +28,9 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType)
|
||||
m_uploadtype = BUFFERDATA;
|
||||
else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA))
|
||||
m_uploadtype = BUFFERSUBDATA;
|
||||
else if(g_ogl_config.bSupportsGLSync && g_Config.bHackedBufferUpload && (m_uploadtype & MAP_AND_RISK))
|
||||
else if(g_ogl_config.bSupportsGLSync && g_Config.bHackedBufferUpload && !DriverDetails::HasBug(DriverDetails::BUG_BROKENHACKEDBUFFER) && (m_uploadtype & MAP_AND_RISK))
|
||||
m_uploadtype = MAP_AND_RISK;
|
||||
else if(g_ogl_config.bSupportsGLSync && g_ogl_config.bSupportsGLPinnedMemory && (m_uploadtype & PINNED_MEMORY))
|
||||
else if(g_ogl_config.bSupportsGLSync && g_ogl_config.bSupportsGLPinnedMemory && (!DriverDetails::HasBug(DriverDetails::BUG_BROKENPINNEDMEMORY) || type != GL_ELEMENT_ARRAY_BUFFER) && (m_uploadtype & PINNED_MEMORY))
|
||||
m_uploadtype = PINNED_MEMORY;
|
||||
else if(nvidia && (m_uploadtype & BUFFERSUBDATA))
|
||||
m_uploadtype = BUFFERSUBDATA;
|
||||
|
@ -62,10 +62,7 @@ void VertexManager::CreateDeviceObjects()
|
||||
s_vertexBuffer = new StreamBuffer(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE);
|
||||
m_vertex_buffers = s_vertexBuffer->getBuffer();
|
||||
|
||||
// Pinned memory is disabled for index buffer as the amd driver (the only one with pinned memory support) seems
|
||||
// to be broken. We just get flickering/black rendering when using pinned memory here -- degasus - 2013/08/20
|
||||
// Please see issue #6105 on google code. Let's hope buffer storage solves this issues.
|
||||
s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE, (StreamType)(DETECT_MASK & ~PINNED_MEMORY));
|
||||
s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE);
|
||||
m_index_buffers = s_indexBuffer->getBuffer();
|
||||
|
||||
m_CurrentVertexFmt = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user