فهرست منبع

Fixed crash when decompressing DDS texture.

bkaradzic 12 سال پیش
والد
کامیت
d30a5240d7
2فایلهای تغییر یافته به همراه25 افزوده شده و 29 حذف شده
  1. 22 28
      src/glcontext_nsgl.mm
  2. 3 1
      src/renderer_gl.cpp

+ 22 - 28
src/glcontext_nsgl.mm

@@ -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"

+ 3 - 1
src/renderer_gl.cpp

@@ -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)
 				{