mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
Switch to using bitfields in the streambuffer class so we can exclude buggy streambuffer types. This disables pinned memory on ATI for GL_ELEMENT_ARRAY_BUFFER because it seems to be buggy. This fixes ATI for me.
This commit is contained in:
@ -287,15 +287,6 @@ Renderer::Renderer()
|
|||||||
ERROR_LOG(VIDEO, "buggy driver detected. Disable UBO");
|
ERROR_LOG(VIDEO, "buggy driver detected. Disable UBO");
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
if(g_Config.backend_info.bSupportsGLPinnedMemory) {
|
|
||||||
// some fglrx versions have a broken pinned memory implementation, so disable it on non-windows plattforms.
|
|
||||||
// everywhere else it isn't supported at all :-(
|
|
||||||
g_Config.backend_info.bSupportsGLPinnedMemory = false;
|
|
||||||
ERROR_LOG(VIDEO, "some fglrx versions have broken pinned memory support, so it's disabled for fglrx");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
UpdateActiveConfig();
|
UpdateActiveConfig();
|
||||||
OSD::AddMessage(StringFromFormat("Missing Extensions: %s%s%s%s%s%s",
|
OSD::AddMessage(StringFromFormat("Missing Extensions: %s%s%s%s%s%s",
|
||||||
g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ",
|
g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ",
|
||||||
|
@ -33,17 +33,17 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType)
|
|||||||
|
|
||||||
bool nvidia = !strcmp((const char*)glGetString(GL_VENDOR), "NVIDIA Corporation");
|
bool nvidia = !strcmp((const char*)glGetString(GL_VENDOR), "NVIDIA Corporation");
|
||||||
|
|
||||||
if(m_uploadtype == STREAM_DETECT)
|
if(m_uploadtype & STREAM_DETECT)
|
||||||
{
|
{
|
||||||
if(!g_Config.backend_info.bSupportsGLBaseVertex)
|
if(!g_Config.backend_info.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA))
|
||||||
m_uploadtype = BUFFERSUBDATA;
|
m_uploadtype = BUFFERSUBDATA;
|
||||||
else if(g_Config.backend_info.bSupportsGLSync && g_Config.bHackedBufferUpload)
|
else if(g_Config.backend_info.bSupportsGLSync && g_Config.bHackedBufferUpload && (m_uploadtype & MAP_AND_RISK))
|
||||||
m_uploadtype = MAP_AND_RISK;
|
m_uploadtype = MAP_AND_RISK;
|
||||||
else if(g_Config.backend_info.bSupportsGLSync && g_Config.backend_info.bSupportsGLPinnedMemory)
|
else if(g_Config.backend_info.bSupportsGLSync && g_Config.backend_info.bSupportsGLPinnedMemory && (m_uploadtype & PINNED_MEMORY))
|
||||||
m_uploadtype = PINNED_MEMORY;
|
m_uploadtype = PINNED_MEMORY;
|
||||||
else if(nvidia)
|
else if(nvidia && (m_uploadtype & BUFFERSUBDATA))
|
||||||
m_uploadtype = BUFFERSUBDATA;
|
m_uploadtype = BUFFERSUBDATA;
|
||||||
else if(g_Config.backend_info.bSupportsGLSync)
|
else if(g_Config.backend_info.bSupportsGLSync && (m_uploadtype & MAP_AND_SYNC))
|
||||||
m_uploadtype = MAP_AND_SYNC;
|
m_uploadtype = MAP_AND_SYNC;
|
||||||
else
|
else
|
||||||
m_uploadtype = MAP_AND_ORPHAN;
|
m_uploadtype = MAP_AND_ORPHAN;
|
||||||
@ -124,6 +124,7 @@ void StreamBuffer::Alloc ( size_t size, u32 stride )
|
|||||||
m_iterator_aligned = 0;
|
m_iterator_aligned = 0;
|
||||||
break;
|
break;
|
||||||
case STREAM_DETECT:
|
case STREAM_DETECT:
|
||||||
|
case DETECT_MASK: // Just to shutup warnings
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_iterator = m_iterator_aligned;
|
m_iterator = m_iterator_aligned;
|
||||||
@ -151,6 +152,7 @@ size_t StreamBuffer::Upload ( u8* data, size_t size )
|
|||||||
glBufferSubData(m_buffertype, m_iterator, size, data);
|
glBufferSubData(m_buffertype, m_iterator, size, data);
|
||||||
break;
|
break;
|
||||||
case STREAM_DETECT:
|
case STREAM_DETECT:
|
||||||
|
case DETECT_MASK: // Just to shutup warnings
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
size_t ret = m_iterator;
|
size_t ret = m_iterator;
|
||||||
@ -204,6 +206,7 @@ void StreamBuffer::Init()
|
|||||||
ERROR_LOG(VIDEO, "buffer allocation failed");
|
ERROR_LOG(VIDEO, "buffer allocation failed");
|
||||||
|
|
||||||
case STREAM_DETECT:
|
case STREAM_DETECT:
|
||||||
|
case DETECT_MASK: // Just to shutup warnings
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,6 +233,7 @@ void StreamBuffer::Shutdown()
|
|||||||
FreeAlignedMemory(pointer);
|
FreeAlignedMemory(pointer);
|
||||||
break;
|
break;
|
||||||
case STREAM_DETECT:
|
case STREAM_DETECT:
|
||||||
|
case DETECT_MASK: // Just to shutup warnings
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,18 +32,19 @@
|
|||||||
namespace OGL
|
namespace OGL
|
||||||
{
|
{
|
||||||
enum StreamType {
|
enum StreamType {
|
||||||
STREAM_DETECT,
|
DETECT_MASK = 0x1F,
|
||||||
MAP_AND_ORPHAN,
|
STREAM_DETECT = (1 << 0),
|
||||||
MAP_AND_SYNC,
|
MAP_AND_ORPHAN = (1 << 1),
|
||||||
MAP_AND_RISK,
|
MAP_AND_SYNC = (1 << 2),
|
||||||
PINNED_MEMORY,
|
MAP_AND_RISK = (1 << 3),
|
||||||
BUFFERSUBDATA
|
PINNED_MEMORY = (1 << 4),
|
||||||
|
BUFFERSUBDATA = (1 << 5)
|
||||||
};
|
};
|
||||||
|
|
||||||
class StreamBuffer {
|
class StreamBuffer {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StreamBuffer(u32 type, size_t size, StreamType uploadType = STREAM_DETECT);
|
StreamBuffer(u32 type, size_t size, StreamType uploadType = DETECT_MASK);
|
||||||
~StreamBuffer();
|
~StreamBuffer();
|
||||||
|
|
||||||
void Alloc(size_t size, u32 stride = 0);
|
void Alloc(size_t size, u32 stride = 0);
|
||||||
|
@ -72,7 +72,7 @@ void VertexManager::CreateDeviceObjects()
|
|||||||
{
|
{
|
||||||
s_vertexBuffer = new StreamBuffer(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE);
|
s_vertexBuffer = new StreamBuffer(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE);
|
||||||
m_vertex_buffers = s_vertexBuffer->getBuffer();
|
m_vertex_buffers = s_vertexBuffer->getBuffer();
|
||||||
s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE);
|
s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE, (StreamType)(DETECT_MASK & ~PINNED_MEMORY));
|
||||||
m_index_buffers = s_indexBuffer->getBuffer();
|
m_index_buffers = s_indexBuffer->getBuffer();
|
||||||
|
|
||||||
m_CurrentVertexFmt = NULL;
|
m_CurrentVertexFmt = NULL;
|
||||||
|
Reference in New Issue
Block a user