Ver Fonte

Added NaCl GLES initialization code.

bkaradzic há 13 anos atrás
pai
commit
0ca52a9894
5 ficheiros alterados com 179 adições e 101 exclusões
  1. 5 10
      src/bgfx.cpp
  2. 2 10
      src/bgfx_p.h
  3. 20 17
      src/renderer_d3d9.cpp
  4. 145 63
      src/renderer_gl.cpp
  5. 7 1
      src/renderer_gl.h

+ 5 - 10
src/bgfx.cpp

@@ -289,8 +289,8 @@ namespace bgfx
 		const float texelWidthHalf = texelWidth*0.5f;
 		const float texelHeight = 1.0f/24.0f;
 		const float texelHeightHalf = texelHeight*0.5f;
-		const float utop = (_mem.m_small ? 0.0f : 8.0f)*texelHeight - texelHeightHalf;
-		const float ubottom = (_mem.m_small ? 8.0f : 24.0f)*texelHeight - texelHeightHalf;
+		const float utop = (_mem.m_small ? 0.0f : 8.0f)*texelHeight + texelHeightHalf;
+		const float ubottom = (_mem.m_small ? 8.0f : 24.0f)*texelHeight + texelHeightHalf;
 		const float fontHeight = (_mem.m_small ? 8.0f : 16.0f);
 
 		setup();
@@ -313,7 +313,7 @@ namespace bgfx
 					uint8_t attr = line[1];
 
 					if (0 != (ch|attr)
-						&& (' ' != ch || 0 != (attr&0xf0) ) )
+					&& (' ' != ch || 0 != (attr&0xf0) ) )
 					{
 						uint32_t fg = palette[attr&0xf];
 						uint32_t bg = palette[(attr>>4)&0xf];
@@ -492,11 +492,8 @@ namespace bgfx
 
 	void renderFrame()
 	{
-		if (s_ctx.m_initialized)
-		{
-			BGFX_RENDER_THREAD();
-			s_ctx.renderFrame();
-		}
+		BGFX_RENDER_THREAD();
+		s_ctx.renderFrame();
 	}
 
 	static const uint32_t s_attribTypeSize[AttribType::Count] =
@@ -649,7 +646,6 @@ namespace bgfx
 		memset(m_seqMask, 0, sizeof(m_seqMask) );
 
 		gameSemPost();
-		m_initialized = true;
 
 		getCommandBuffer(CommandBuffer::RendererInit);
 
@@ -669,7 +665,6 @@ namespace bgfx
 
 		getCommandBuffer(CommandBuffer::RendererShutdown);
 		frame();
-		m_initialized = false;
 
 #if BGFX_CONFIG_MULTITHREADED
 		if (NULL != m_renderThread)

+ 2 - 10
src/bgfx_p.h

@@ -56,6 +56,7 @@ extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format
 #	include <windows.h>
 extern HWND g_bgfxHwnd;
 #elif BX_PLATFORM_XBOX360
+#	include <alloca.h>
 #	include <xtl.h>
 #endif // BX_PLATFORM_WINDOWS
 
@@ -1402,7 +1403,6 @@ namespace bgfx
 			, m_uniformHandle(BGFX_CONFIG_MAX_UNIFORMS)
 			, m_frames(0)
 			, m_debug(BGFX_DEBUG_NONE)
-			, m_initialized(false)
 			, m_rendererInitialized(false)
 		{
 		}
@@ -1962,14 +1962,7 @@ namespace bgfx
 		// render thread
 		void renderFrame()
 		{
-#if BX_PLATFORM_NACL
-// on NaCl swap buffers generates callback and this is handled inside callback
-#else
-			if (m_rendererInitialized)
-			{
-				flip();
-			}
-#endif // BX_PLATFORM_
+			flip();
 
 			gameSemWait();
 			
@@ -2549,7 +2542,6 @@ namespace bgfx
 		Window m_window;
 #endif // BX_PLATFORM_WINDOWS
 
-		bool m_initialized;
 		bool m_rendererInitialized;
 	};
 

+ 20 - 17
src/renderer_d3d9.cpp

@@ -337,34 +337,37 @@ namespace bgfx
 
 		void flip()
 		{
+			if (NULL != m_device)
+			{
 #if BGFX_CONFIG_RENDERER_DIRECT3D_EX
-			DX_CHECK(m_device->WaitForVBlank(0) );
+				DX_CHECK(m_device->WaitForVBlank(0) );
 #endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX
 
-			HRESULT hr;
-			hr = m_device->Present(NULL, NULL, NULL, NULL);
+				HRESULT hr;
+				hr = m_device->Present(NULL, NULL, NULL, NULL);
 
 #if BX_PLATFORM_WINDOWS
-			if (isLost(hr) )
-			{
-				do
+				if (isLost(hr) )
 				{
-					do 
+					do
 					{
+						do 
+						{
+							hr = m_device->TestCooperativeLevel();
+						}
+						while (D3DERR_DEVICENOTRESET != hr);
+
+						reset();
 						hr = m_device->TestCooperativeLevel();
 					}
-					while (D3DERR_DEVICENOTRESET != hr);
-
-					reset();
-					hr = m_device->TestCooperativeLevel();
+					while (FAILED(hr) );
+				}
+				else if (FAILED(hr) )
+				{
+					BX_TRACE("Present failed with err 0x%08x.", hr);
 				}
-				while (FAILED(hr) );
-			}
-			else if (FAILED(hr) )
-			{
-				BX_TRACE("Present failed with err 0x%08x.", hr);
-			}
 #endif // BX_PLATFORM_
+			}
 		}
 
 		void preReset()

+ 145 - 63
src/renderer_gl.cpp

@@ -16,10 +16,33 @@
 
 namespace bgfx
 {
+	typedef void (*PostSwapBuffersFn)(uint32_t _width, uint32_t _height);
+
+#if BX_PLATFORM_NACL
+	void naclSwapCompleteCb(void* _data, int32_t _result);
+
+	PP_CompletionCallback naclSwapComplete = 
+	{
+		naclSwapCompleteCb,
+		NULL,
+		PP_COMPLETIONCALLBACK_FLAG_NONE
+	};
+#endif // BX_PLATFORM_NACL
+
 	struct RendererContext
 	{
 		RendererContext()
 			: m_dxtSupport(false)
+			, m_postSwapBuffers(NULL)
+#if BX_PLATFORM_NACL
+			, m_context(0)
+			, m_instance(0)
+			, m_instInterface(NULL)
+			, m_graphicsInterface(NULL)
+#elif BX_PLATFORM_WINDOWS
+			, m_hdc(NULL)
+			, m_hglrc(NULL)
+#endif // BX_PLATFORM_
 		{
 			memset(&m_resolution, 0, sizeof(m_resolution) );
 		}
@@ -35,12 +58,99 @@ namespace bgfx
 
 				m_resolution = _resolution;
 #if BX_PLATFORM_NACL
-				extern void naclSetRenderContextSize(uint32_t _width, uint32_t _height);
-				naclSetRenderContextSize(_resolution.m_width, _resolution.m_height);
+				setRenderContextSize(_resolution.m_width, _resolution.m_height);
 #endif // BX_PLATFORM_NACL
 			}
 		}
 
+		void setRenderContextSize(uint32_t _width, uint32_t _height)
+		{
+			BX_TRACE("1");
+			if (_width != 0
+			||  _height != 0)
+			{
+#if BX_PLATFORM_NACL
+				if (0 == m_context)
+				{
+					BX_TRACE("create context");
+
+					int32_t attribs[] =
+					{
+						PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8,
+						PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 24,
+						PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 8,
+						PP_GRAPHICS3DATTRIB_SAMPLES, 0,
+						PP_GRAPHICS3DATTRIB_SAMPLE_BUFFERS, 0,
+						PP_GRAPHICS3DATTRIB_WIDTH, _width,
+						PP_GRAPHICS3DATTRIB_HEIGHT, _height,
+						PP_GRAPHICS3DATTRIB_NONE
+					};
+
+					m_context = m_graphicsInterface->Create(m_instance, 0, attribs);
+					m_instInterface->BindGraphics(m_instance, m_context);
+					glSetCurrentContextPPAPI(m_context);
+					m_graphicsInterface->SwapBuffers(m_context, naclSwapComplete);
+				}
+				else
+				{
+					m_graphicsInterface->ResizeBuffers(m_context, _width, _height);
+				}
+
+#elif BX_PLATFORM_WINDOWS
+				if (NULL == m_hdc)
+				{
+					PIXELFORMATDESCRIPTOR pfd =
+					{
+						sizeof(PIXELFORMATDESCRIPTOR),
+						1,
+						PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
+						PFD_TYPE_RGBA,
+						32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+						16, 0, 0,
+						PFD_MAIN_PLANE,
+						0, 0, 0, 0
+					};
+
+					m_hdc = GetDC(g_bgfxHwnd);
+
+					int pixelFormat = ChoosePixelFormat(m_hdc, &pfd);
+					BX_CHECK(0 != pixelFormat, "ChoosePixelFormat failed!");
+
+					int result;
+					result = SetPixelFormat(m_hdc, pixelFormat, &pfd);
+					BX_CHECK(0 != result, "SetPixelFormat failed!");
+
+					m_hglrc = wglCreateContext(m_hdc);
+					BX_CHECK(NULL != g_hglrc, "wglCreateContext failed!");
+
+					result = wglMakeCurrent(m_hdc, m_hglrc);
+					BX_CHECK(0 != result, "wglMakeCurrent failed!");
+				}
+#endif // BX_PLATFORM_
+			}
+		}
+
+		void flip()
+		{
+#if BX_PLATFORM_NACL
+			glSetCurrentContextPPAPI(m_context);
+			m_graphicsInterface->SwapBuffers(m_context, naclSwapComplete);
+#elif BX_PLATFORM_WINDOWS
+			wglMakeCurrent(m_hdc, m_hglrc);
+			SwapBuffers(m_hdc);
+#endif // BX_PLATFORM_
+
+			if (NULL != m_postSwapBuffers)
+			{
+				m_postSwapBuffers(m_resolution.m_width, m_resolution.m_height);
+			}
+		}
+
+		void init()
+		{
+			setRenderContextSize(BGFX_DEFAULT_WIDTH, BGFX_DEFAULT_HEIGHT);
+		}
+
 		IndexBuffer m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
 		VertexBuffer m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
 		Shader m_vertexShaders[BGFX_CONFIG_MAX_VERTEX_SHADERS];
@@ -56,10 +166,38 @@ namespace bgfx
 
 		Resolution m_resolution;
 		bool m_dxtSupport;
+
+		PostSwapBuffersFn m_postSwapBuffers;
+
+#if BX_PLATFORM_NACL
+		PP_Resource m_context;
+		PP_Instance m_instance;
+		const PPB_Instance* m_instInterface;
+		const PPB_Graphics3D* m_graphicsInterface;
+#elif BX_PLATFORM_WINDOWS
+		HDC m_hdc;
+		HGLRC m_hglrc;
+#endif // BX_PLATFORM_NACL
 	};
 
 	RendererContext s_renderCtx;
 
+#if BX_PLATFORM_NACL
+	void naclSetIntefraces(PP_Instance _instance, const PPB_Instance* _instInterface, const PPB_Graphics3D* _graphicsInterface, PostSwapBuffersFn _postSwapBuffers)
+	{
+		s_renderCtx.m_instance = _instance;
+		s_renderCtx.m_instInterface = _instInterface;
+		s_renderCtx.m_graphicsInterface = _graphicsInterface;
+		s_renderCtx.m_postSwapBuffers = _postSwapBuffers;
+		s_renderCtx.setRenderContextSize(BGFX_DEFAULT_WIDTH, BGFX_DEFAULT_HEIGHT);
+	}
+
+	void naclSwapCompleteCb(void* /*_data*/, int32_t /*_result*/)
+	{
+		renderFrame();
+	}
+#endif // BX_PLATFORM_NACL
+
 	struct Extension
 	{
 		enum Enum
@@ -775,6 +913,8 @@ namespace bgfx
 		m_depth.destroy();
 	}
 
+	static bool s_exit = false;
+
 	void ConstantBuffer::commit(bool _force)
 	{
 		reset();
@@ -855,63 +995,6 @@ namespace bgfx
 		} while (true);
 	}
 
-#if BX_PLATFORM_WINDOWS
-	HDC g_hdc;
-	HGLRC g_hglrc;
-#endif // BX_PLATFORM_WINDOWS
-
-	void initGl(uint32_t _width, uint32_t _height)
-	{
-#if BX_PLATFORM_WINDOWS
-		static PIXELFORMATDESCRIPTOR pfd =
-		{
-			sizeof(PIXELFORMATDESCRIPTOR),
-			1,
-			PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
-			PFD_TYPE_RGBA,
-			32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-			16, 0, 0,
-			PFD_MAIN_PLANE,
-			0, 0, 0, 0
-		};
-
-		g_hdc = GetDC(hwnd);
-
-		int pixelFormat = ChoosePixelFormat(g_hdc, &pfd);
-		BX_CHECK(0 != pixelFormat, "ChoosePixelFormat failed!");
-
-		int result;
-		result = SetPixelFormat(g_hdc, pixelFormat, &pfd);
-		BX_CHECK(0 != result, "SetPixelFormat failed!");
-
-		g_hglrc = wglCreateContext(g_hdc);
-		BX_CHECK(NULL != g_hglrc, "wglCreateContext failed!");
-
-		result = wglMakeCurrent(g_hdc, g_hglrc);
-		BX_CHECK(0 != result, "wglMakeCurrent failed!");
-
-		glewInit();
-#endif // BX_PLATFORM_WINDOWS
-	}
-
-	static bool s_exit = false;
-
-#if BX_PLATFORM_WINDOWS
-	DWORD WINAPI renderThread(LPVOID _arg)
-	{
-		wglMakeCurrent(g_hdc, g_hglrc);
-
-		while (!s_exit)
-		{			
-			renderFrame();
-		}
-
-		s_exit = false;
-
-		return EXIT_SUCCESS;
-	}
-#endif // BX_PLATFORM_WINDOWS
-
 	void TextVideoMemBlitter::setup()
 	{
 		uint32_t width = s_renderCtx.m_resolution.m_width;
@@ -967,10 +1050,7 @@ namespace bgfx
 
 	void Context::flip()
 	{
-#if BX_PLATFORM_WINDOWS
-		wglMakeCurrent(g_hdc, g_hglrc);
-		SwapBuffers(g_hdc);
-#endif // BX_PLATFORM_WINDOWS
+		s_renderCtx.flip();
 	}
 
 	GLint glGet(GLenum _pname)
@@ -982,6 +1062,8 @@ namespace bgfx
 
 	void Context::rendererInit()
 	{
+		s_renderCtx.init();
+
 #if BGFX_DEBUG
 		GLint numCmpFormats;
 		GL_CHECK(glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numCmpFormats) );

+ 7 - 1
src/renderer_gl.h

@@ -6,7 +6,13 @@
 #ifndef __RENDERER_GL_H__
 #define __RENDERER_GL_H__
 
-#if BX_PLATFORM_NACL || BX_PLATFORM_ANDROID
+#if BX_PLATFORM_NACL
+#	include <GLES2/gl2.h>
+#	include <ppapi/gles2/gl2ext_ppapi.h>
+#	include <ppapi/c/pp_completion_callback.h>
+#	include <ppapi/c/ppb_instance.h>
+#	include <ppapi/c/ppb_graphics_3d.h>
+#elif BX_PLATFORM_ANDROID
 #	include <GLES2/gl2.h>
 #elif BX_PLATFORM_WINDOWS
 #	include <windows.h>