You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.1 KiB
48 lines
1.1 KiB
#include "intelglmallocworkaround.h"
|
|
#include "mach_override.h"
|
|
|
|
// memdbgon -must- be the last include file in a .cpp file.
|
|
#include "tier0/memdbgon.h"
|
|
|
|
IntelGLMallocWorkaround* IntelGLMallocWorkaround::s_pWorkaround = NULL;
|
|
|
|
void *IntelGLMallocWorkaround::ZeroingAlloc(size_t size)
|
|
{
|
|
// We call into this pointer that resumes the original malloc.
|
|
void *memory = s_pWorkaround->m_pfnMallocReentry(size);
|
|
if (size < 96)
|
|
{
|
|
// Since the Intel driver has an issue with a small allocation
|
|
// that's left uninitialized, we use memset to ensure it's zero-initialized.
|
|
memset(memory, 0, size);
|
|
}
|
|
|
|
return memory;
|
|
}
|
|
|
|
IntelGLMallocWorkaround* IntelGLMallocWorkaround::Get()
|
|
{
|
|
if (!s_pWorkaround)
|
|
{
|
|
s_pWorkaround = new IntelGLMallocWorkaround();
|
|
}
|
|
|
|
return s_pWorkaround;
|
|
}
|
|
|
|
bool IntelGLMallocWorkaround::Enable()
|
|
{
|
|
if ( m_pfnMallocReentry != NULL )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
mach_error_t error = mach_override_ptr( (void*)&malloc, (const void*)&ZeroingAlloc, (void**)&m_pfnMallocReentry );
|
|
if ( error == err_cannot_override )
|
|
{
|
|
m_pfnMallocReentry = NULL;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|