Fixed crash when decompressing DDS texture.

This commit is contained in:
bkaradzic 2013-07-13 23:11:02 -07:00
parent 1e458f4332
commit d30a5240d7
2 changed files with 25 additions and 29 deletions

View file

@ -10,51 +10,43 @@
# include <Cocoa/Cocoa.h>
# include <bx/os.h>
static void* NSGLGetProcAddress (const char* name) {
static void* dylib =
bx::dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL");
return dylib ? bx::dlsym(dylib, name) : NULL;
}
namespace bgfx
{
# define GL_IMPORT(_optional, _proto, _func) _proto _func
# include "glimports.h"
# include "glimports.h"
# undef GL_IMPORT
static void* s_opengl = NULL;
void GlContext::create(uint32_t _width, uint32_t _height)
{
s_opengl = bx::dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL");
BX_CHECK(NULL != s_opengl, "OpenGL dynamic library is not found!");
NSWindow* nsWindow = (NSWindow*)g_bgfxNSWindow;
NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = {
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, // NSOpenGLProfileVersion3_2Core,
NSOpenGLPFAColorSize , 24,
NSOpenGLPFAAlphaSize , 8,
NSOpenGLPFADepthSize , 24,
NSOpenGLPFAStencilSize , 8,
NSOpenGLPFADoubleBuffer ,
NSOpenGLPFAAccelerated ,
NSOpenGLPFANoRecovery ,
0
NSOpenGLPFAColorSize, 24,
NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFADepthSize, 24,
NSOpenGLPFAStencilSize, 8,
NSOpenGLPFADoubleBuffer, true,
NSOpenGLPFAAccelerated, true,
NSOpenGLPFANoRecovery, true,
0, 0,
};
NSOpenGLPixelFormat* pixelFormat =
[[NSOpenGLPixelFormat alloc]
initWithAttributes:pixelFormatAttributes];
NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes];
NSRect glViewRect = [[nsWindow contentView] bounds];
NSOpenGLView* glView =
[[NSOpenGLView alloc]
initWithFrame:glViewRect
pixelFormat:pixelFormat];
NSOpenGLView* glView = [[NSOpenGLView alloc] initWithFrame:glViewRect pixelFormat:pixelFormat];
[pixelFormat release];
[nsWindow setContentView:glView];
NSOpenGLContext* glContext = [glView openGLContext];
[glContext makeCurrentContext];
m_view = glView;
@ -69,6 +61,8 @@ namespace bgfx
m_view = 0;
m_context = 0;
[glView release];
bx::dlclose(s_opengl);
}
void GlContext::resize(uint32_t _width, uint32_t _height, bool _vsync)
@ -86,7 +80,7 @@ namespace bgfx
{
# define GL_IMPORT(_optional, _proto, _func) \
{ \
_func = (_proto)NSGLGetProcAddress(#_func); \
_func = (_proto)bx::dlsym(s_opengl, #_func); \
BGFX_FATAL(_optional || NULL != _func, Fatal::UnableToInitialize, "Failed to create OpenGL context. NSGLGetProcAddress(\"%s\")", #_func); \
}
# include "glimports.h"

View file

@ -1380,6 +1380,7 @@ namespace bgfx
{
uint8_t textureFormat = dds.m_type;
bool decompress = TextureFormat::Unknown > textureFormat;
uint32_t bpp = tfi.m_bpp;
if (decompress)
{
@ -1388,6 +1389,7 @@ namespace bgfx
internalFmt = tfi.m_internalFmt;
m_fmt = tfi.m_fmt;
m_type = tfi.m_type;
bpp = tfi.m_bpp;
}
bool swizzle = GL_RGBA == m_fmt;
@ -1402,7 +1404,7 @@ namespace bgfx
}
#endif // BGFX_CONFIG_RENDERER_OPENGL
uint8_t* bits = (uint8_t*)g_realloc(NULL, dds.m_width*dds.m_height*tfi.m_bpp/8);
uint8_t* bits = (uint8_t*)g_realloc(NULL, dds.m_width*dds.m_height*bpp/8);
for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side)
{