Added fatal error codes and callback. Fixed shutdown. Added helloworld example.

This commit is contained in:
bkaradzic 2012-04-14 20:36:17 -07:00
parent dee3fe5266
commit 911ce4d775
6 changed files with 210 additions and 40 deletions

View file

@ -0,0 +1,29 @@
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include <bgfx.h>
#include <conio.h>
int main(int _argc, const char** _argv)
{
bgfx::init(true);
bgfx::reset(1280, 720);
bgfx::setDebug(BGFX_DEBUG_TEXT);
while (!_kbhit() )
{
bgfx::dbgTextClear();
bgfx::dbgTextPrintf(0, 0, 0x4f, "Hello world!");
bgfx::dbgTextPrintf(0, 5, 0x6f, "BGFX initialization and debug text.");
bgfx::frame();
}
bgfx::shutdown();
return 0;
}

View file

@ -133,6 +133,15 @@ namespace bgfx
#define BGFX_INVALID_HANDLE { bgfx::invalidHandle } #define BGFX_INVALID_HANDLE { bgfx::invalidHandle }
struct Fatal
{
enum Enum
{
D3D9_UnableToCreateInterface = 1,
D3D9_UnableToCreateDevice
};
};
struct Attrib struct Attrib
{ {
enum Enum enum Enum
@ -224,6 +233,7 @@ namespace bgfx
}; };
}; };
typedef void (*fatalFn)(Fatal::Enum _code, const char* _str);
typedef void* (*reallocFn)(void* _ptr, size_t _size); typedef void* (*reallocFn)(void* _ptr, size_t _size);
typedef void (*freeFn)(void* _ptr); typedef void (*freeFn)(void* _ptr);
@ -241,7 +251,7 @@ namespace bgfx
}; };
/// ///
void init(bool _createRenderThread = true, reallocFn _realloc = NULL, freeFn _free = NULL); void init(bool _createRenderThread = true, fatalFn _fatal = NULL, reallocFn _realloc = NULL, freeFn _free = NULL);
/// ///
void shutdown(); void shutdown();

View file

@ -5,6 +5,11 @@
#include "bgfx_p.h" #include "bgfx_p.h"
BX_NO_INLINE void bgfxFatalStub(bgfx::Fatal::Enum _code, const char* _str)
{
BX_TRACE("0x%08x: %s", _code, _str);
}
BX_NO_INLINE void* bgfxReallocStub(void* _ptr, size_t _size) BX_NO_INLINE void* bgfxReallocStub(void* _ptr, size_t _size)
{ {
void* ptr = ::realloc(_ptr, _size); void* ptr = ::realloc(_ptr, _size);
@ -15,10 +20,14 @@ BX_NO_INLINE void* bgfxReallocStub(void* _ptr, size_t _size)
BX_NO_INLINE void bgfxFreeStub(void* _ptr) BX_NO_INLINE void bgfxFreeStub(void* _ptr)
{ {
// BX_TRACE("free %p", _ptr); // BX_TRACE("free %p", _ptr);
::free(_ptr); ::free(_ptr);
} }
#if BX_PLATFORM_WINDOWS
HWND g_bgfxHwnd = NULL;
#endif // BX_PLATFORM_WINDOWS
namespace bgfx namespace bgfx
{ {
#define BGFX_MAIN_THREAD_MAGIC 0x78666762 #define BGFX_MAIN_THREAD_MAGIC 0x78666762
@ -31,6 +40,7 @@ namespace bgfx
# define BGFX_RENDER_THREAD() # define BGFX_RENDER_THREAD()
#endif // BGFX_CONFIG_MULTITHREADED #endif // BGFX_CONFIG_MULTITHREADED
fatalFn g_fatal = bgfxFatalStub;
reallocFn g_realloc = bgfxReallocStub; reallocFn g_realloc = bgfxReallocStub;
freeFn g_free = bgfxFreeStub; freeFn g_free = bgfxFreeStub;
@ -285,7 +295,7 @@ namespace bgfx
setup(); setup();
for (;xx < _mem.m_width && yy < _mem.m_height;) for (;yy < _mem.m_height;)
{ {
FontVertex* vertex = (FontVertex*)m_vb->data; FontVertex* vertex = (FontVertex*)m_vb->data;
uint16_t* indices = (uint16_t*)m_ib->data; uint16_t* indices = (uint16_t*)m_ib->data;
@ -444,8 +454,13 @@ namespace bgfx
radixSort(m_sortKeys, s_ctx.m_tempKeys, m_sortValues, s_ctx.m_tempValues, m_num); radixSort(m_sortKeys, s_ctx.m_tempKeys, m_sortValues, s_ctx.m_tempValues, m_num);
} }
void init(bool _createRenderThread, reallocFn _realloc, freeFn _free) void init(bool _createRenderThread, fatalFn _fatal, reallocFn _realloc, freeFn _free)
{ {
if (NULL != _fatal)
{
g_fatal = _fatal;
}
if (NULL != _realloc if (NULL != _realloc
&& NULL != _free) && NULL != _free)
{ {
@ -609,15 +624,20 @@ namespace bgfx
{ {
BX_TRACE("init"); BX_TRACE("init");
m_submit->create();
m_render->create();
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
m_window.init(); m_window.init();
#endif // BX_PLATFORM_WINDOWS #endif // BX_PLATFORM_WINDOWS
#if BGFX_CONFIG_MULTITHREADED #if BGFX_CONFIG_MULTITHREADED
m_renderThread = NULL;
if (_createRenderThread) if (_createRenderThread)
{ {
# if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 # if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
CreateThread(NULL, 16<<10, renderThread, NULL, 0, NULL); m_renderThread = CreateThread(NULL, 16<<10, renderThread, NULL, 0, NULL);
# endif // BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360 # endif // BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
} }
#endif // BGFX_CONFIG_MULTITHREADED #endif // BGFX_CONFIG_MULTITHREADED
@ -650,6 +670,19 @@ namespace bgfx
getCommandBuffer(CommandBuffer::RendererShutdown); getCommandBuffer(CommandBuffer::RendererShutdown);
frame(); frame();
m_initialized = false; m_initialized = false;
#if BGFX_CONFIG_MULTITHREADED
if (NULL != m_renderThread)
{
# if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
WaitForSingleObject(m_renderThread, INFINITE);
m_renderThread = NULL;
# endif // BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
}
#endif // BGFX_CONFIG_MULTITHREADED
m_submit->destroy();
m_render->destroy();
} }
const Memory* alloc(uint32_t _size) const Memory* alloc(uint32_t _size)

View file

@ -12,7 +12,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <alloca.h>
extern void dbgPrintf(const char* _format, ...); extern void dbgPrintf(const char* _format, ...);
extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format, ...); extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format, ...);
@ -35,6 +34,14 @@ extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format
} while(0) } while(0)
#endif // 0 #endif // 0
#define BGFX_FATAL(_condition, _err, _str) \
do { \
if (!(_condition) ) \
{ \
g_fatal(_err, _str); \
} \
} while(0)
#define BX_NAMESPACE 1 #define BX_NAMESPACE 1
#include <bx/bx.h> #include <bx/bx.h>
#include <bx/countof.h> #include <bx/countof.h>
@ -47,18 +54,18 @@ extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
# include <windows.h> # include <windows.h>
extern HWND bgfxHwnd; extern HWND g_bgfxHwnd;
#elif BX_PLATFORM_XBOX360 #elif BX_PLATFORM_XBOX360
# include <xtl.h> # include <xtl.h>
#endif // BX_PLATFORM_WINDOWS #endif // BX_PLATFORM_WINDOWS
#ifndef MAKEFOURCC #ifndef MAKEFOURCC
# define MAKEFOURCC(_a, _b, _c, _d) (0 \ # define MAKEFOURCC(_a, _b, _c, _d) (0 \
| ( (uint32_t)(_a) \ | ( (uint32_t)(_a) \
| ( (uint32_t)(_b) << 8) \ | ( (uint32_t)(_b) << 8) \
| ( (uint32_t)(_c) << 16) \ | ( (uint32_t)(_c) << 16) \
| ( (uint32_t)(_d) << 24) \ | ( (uint32_t)(_d) << 24) \
) ) ) )
#endif // MAKEFOURCC #endif // MAKEFOURCC
#include "dds.h" #include "dds.h"
@ -193,6 +200,7 @@ namespace std
namespace bgfx namespace bgfx
{ {
extern const uint32_t g_constantTypeSize[ConstantType::Count]; extern const uint32_t g_constantTypeSize[ConstantType::Count];
extern fatalFn g_fatal;
extern reallocFn g_realloc; extern reallocFn g_realloc;
extern freeFn g_free; extern freeFn g_free;
extern void free(Memory* _mem); extern void free(Memory* _mem);
@ -258,8 +266,14 @@ namespace bgfx
struct TextVideoMem struct TextVideoMem
{ {
TextVideoMem() TextVideoMem()
: m_mem(NULL)
, m_size(0)
, m_width(0)
, m_height(0)
, m_small(false)
{ {
resize(); resize();
clear();
} }
~TextVideoMem() ~TextVideoMem()
@ -269,19 +283,32 @@ namespace bgfx
void resize(bool _small = false, uint16_t _width = BGFX_DEFAULT_WIDTH, uint16_t _height = BGFX_DEFAULT_HEIGHT) void resize(bool _small = false, uint16_t _width = BGFX_DEFAULT_WIDTH, uint16_t _height = BGFX_DEFAULT_HEIGHT)
{ {
m_small = _small; uint32_t width = uint32_max(1, _width/8);
m_width = uint32_max(1, _width/8); uint32_t height = uint32_max(1, _height/(_small ? 8 : 16) );
m_height = uint32_max(1, _height/(_small ? 8 : 16) );
m_size = m_width * m_height * 2;
m_mem = (uint8_t*)g_realloc(m_mem, m_size); if (NULL == m_mem
|| m_width != width
|| m_height != height
|| m_small != _small)
{
m_small = _small;
m_width = width;
m_height = height;
m_size = m_width * m_height * 2;
clear(); m_mem = (uint8_t*)g_realloc(m_mem, m_size);
}
} }
void clear() void clear(uint8_t _attr = 0)
{ {
memset(m_mem, 0, m_size); uint8_t* mem = m_mem;
for (uint32_t ii = 0, num = m_size/2; ii < num; ++ii)
{
mem[0] = 0;
mem[1] = _attr;
mem += 2;
}
} }
void printfVargs(uint16_t _x, uint16_t _y, uint8_t _attr, const char* _format, va_list _argList) void printfVargs(uint16_t _x, uint16_t _y, uint8_t _attr, const char* _format, va_list _argList)
@ -320,6 +347,12 @@ namespace bgfx
struct TextVideoMemBlitter struct TextVideoMemBlitter
{ {
void init(); void init();
void blit(const TextVideoMem* _mem)
{
blit(*_mem);
}
void blit(const TextVideoMem& _mem); void blit(const TextVideoMem& _mem);
void setup(); void setup();
void render(uint32_t _numIndices); void render(uint32_t _numIndices);
@ -924,13 +957,23 @@ namespace bgfx
Frame() Frame()
{ {
m_constantBuffer = ConstantBuffer::create(BGFX_CONFIG_MAX_CONSTANT_BUFFER_SIZE);
reset();
} }
~Frame() ~Frame()
{
}
void create()
{
m_constantBuffer = ConstantBuffer::create(BGFX_CONFIG_MAX_CONSTANT_BUFFER_SIZE);
reset();
m_textVideoMem = new TextVideoMem;
}
void destroy()
{ {
ConstantBuffer::destroy(m_constantBuffer); ConstantBuffer::destroy(m_constantBuffer);
delete m_textVideoMem;
} }
void reset() void reset()
@ -1257,6 +1300,7 @@ namespace bgfx
TextureHandle m_freeTextureHandle[BGFX_CONFIG_MAX_TEXTURES]; TextureHandle m_freeTextureHandle[BGFX_CONFIG_MAX_TEXTURES];
RenderTargetHandle m_freeRenderTargetHandle[BGFX_CONFIG_MAX_RENDER_TARGETS]; RenderTargetHandle m_freeRenderTargetHandle[BGFX_CONFIG_MAX_RENDER_TARGETS];
UniformHandle m_freeUniformHandle[BGFX_CONFIG_MAX_UNIFORMS]; UniformHandle m_freeUniformHandle[BGFX_CONFIG_MAX_UNIFORMS];
TextVideoMem* m_textVideoMem;
int64_t m_waitSubmit; int64_t m_waitSubmit;
int64_t m_waitRender; int64_t m_waitRender;
@ -1373,6 +1417,10 @@ namespace bgfx
void frame() void frame()
{ {
#if BX_PLATFORM_WINDOWS
m_window.update();
#endif // BX_PLATFORM_WINDOWS
// wait for render thread to finish // wait for render thread to finish
renderSemWait(); renderSemWait();
@ -1410,10 +1458,13 @@ namespace bgfx
void dbgTextClear(uint8_t _attr, bool _small) void dbgTextClear(uint8_t _attr, bool _small)
{ {
m_submit->m_textVideoMem->resize(_small, m_resolution.m_width, m_resolution.m_height);
m_submit->m_textVideoMem->clear(_attr);
} }
void dbgTextPrintfVargs(uint16_t _x, uint16_t _y, uint8_t _attr, const char* _format, va_list _argList) void dbgTextPrintfVargs(uint16_t _x, uint16_t _y, uint8_t _attr, const char* _format, va_list _argList)
{ {
m_submit->m_textVideoMem->printfVargs(_x, _y, _attr, _format, _argList);
} }
IndexBufferHandle createIndexBuffer(const Memory* _mem) IndexBufferHandle createIndexBuffer(const Memory* _mem)
@ -1902,6 +1953,8 @@ namespace bgfx
m_submit = temp; m_submit = temp;
m_frames++; m_frames++;
m_submit->reset(); m_submit->reset();
m_submit->m_textVideoMem->resize(m_render->m_textVideoMem->m_small, m_resolution.m_width, m_resolution.m_height);
} }
void flip(); void flip();
@ -2330,6 +2383,13 @@ namespace bgfx
Semaphore m_renderSem; Semaphore m_renderSem;
Semaphore m_gameSem; Semaphore m_gameSem;
# if BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
HANDLE m_renderThread;
# else
void* m_renderThread;
# endif // BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360
#else #else
void gameSemPost() void gameSemPost()
{ {
@ -2384,14 +2444,15 @@ namespace bgfx
{ {
Window() Window()
: m_frame(true) : m_frame(true)
, m_update(false)
{ {
} }
void init() void init()
{ {
if (NULL == bgfxHwnd) if (NULL == g_bgfxHwnd)
{ {
bgfxHwnd = CreateWindow( "EDIT" g_bgfxHwnd = CreateWindow( "EDIT"
, NULL , NULL
, WS_OVERLAPPEDWINDOW|WS_VISIBLE , WS_OVERLAPPEDWINDOW|WS_VISIBLE
, 0 , 0
@ -2403,21 +2464,35 @@ namespace bgfx
, 0 , 0
, 0 , 0
); );
m_update = true;
}
}
void update()
{
if (m_update)
{
MSG msg;
msg.message = WM_NULL;
PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
TranslateMessage( &msg );
DispatchMessage( &msg );
} }
} }
void adjust(uint32_t _width, uint32_t _height, bool _windowFrame) void adjust(uint32_t _width, uint32_t _height, bool _windowFrame)
{ {
ShowWindow(bgfxHwnd, SW_SHOWNORMAL); ShowWindow(g_bgfxHwnd, SW_SHOWNORMAL);
RECT rect; RECT rect;
RECT newrect = {0, 0, (LONG)_width, (LONG)_height}; RECT newrect = {0, 0, (LONG)_width, (LONG)_height};
DWORD style = WS_POPUP|WS_SYSMENU; DWORD style = WS_POPUP|WS_SYSMENU;
if (m_frame) if (m_frame)
{ {
GetWindowRect(bgfxHwnd, &m_rect); GetWindowRect(g_bgfxHwnd, &m_rect);
m_style = GetWindowLong(bgfxHwnd, GWL_STYLE); m_style = GetWindowLong(g_bgfxHwnd, GWL_STYLE);
} }
if (_windowFrame) if (_windowFrame)
@ -2431,7 +2506,7 @@ namespace bgfx
rect = m_rect; rect = m_rect;
style = m_style; style = m_style;
#else #else
HMONITOR monitor = MonitorFromWindow(bgfxHwnd, MONITOR_DEFAULTTONEAREST); HMONITOR monitor = MonitorFromWindow(g_bgfxHwnd, MONITOR_DEFAULTTONEAREST);
MONITORINFO mi; MONITORINFO mi;
mi.cbSize = sizeof(mi); mi.cbSize = sizeof(mi);
GetMonitorInfo(monitor, &mi); GetMonitorInfo(monitor, &mi);
@ -2440,9 +2515,9 @@ namespace bgfx
#endif // !defined(__MINGW__) #endif // !defined(__MINGW__)
} }
SetWindowLong(bgfxHwnd, GWL_STYLE, style); SetWindowLong(g_bgfxHwnd, GWL_STYLE, style);
AdjustWindowRect(&newrect, style, FALSE); AdjustWindowRect(&newrect, style, FALSE);
UpdateWindow(bgfxHwnd); UpdateWindow(g_bgfxHwnd);
if (rect.left == -32000 if (rect.left == -32000
|| rect.top == -32000) || rect.top == -32000)
@ -2451,7 +2526,7 @@ namespace bgfx
rect.top = 0; rect.top = 0;
} }
SetWindowPos(bgfxHwnd SetWindowPos(g_bgfxHwnd
, HWND_TOP , HWND_TOP
, rect.left , rect.left
, rect.top , rect.top
@ -2460,7 +2535,7 @@ namespace bgfx
, SWP_SHOWWINDOW , SWP_SHOWWINDOW
); );
ShowWindow(bgfxHwnd, SW_RESTORE); ShowWindow(g_bgfxHwnd, SW_RESTORE);
m_frame = _windowFrame; m_frame = _windowFrame;
} }
@ -2468,6 +2543,7 @@ namespace bgfx
RECT m_rect; RECT m_rect;
DWORD m_style; DWORD m_style;
bool m_frame; bool m_frame;
bool m_update;
}; };
Window m_window; Window m_window;

View file

@ -124,11 +124,11 @@ namespace bgfx
m_params.FullScreen_RefreshRateInHz = 0; m_params.FullScreen_RefreshRateInHz = 0;
m_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; m_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
m_params.SwapEffect = D3DSWAPEFFECT_DISCARD; m_params.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_params.hDeviceWindow = bgfxHwnd; m_params.hDeviceWindow = g_bgfxHwnd;
m_params.Windowed = true; m_params.Windowed = true;
RECT rect; RECT rect;
GetWindowRect(bgfxHwnd, &rect); GetWindowRect(g_bgfxHwnd, &rect);
m_params.BackBufferWidth = rect.right-rect.left; m_params.BackBufferWidth = rect.right-rect.left;
m_params.BackBufferHeight = rect.bottom-rect.top; m_params.BackBufferHeight = rect.bottom-rect.top;
@ -149,6 +149,8 @@ namespace bgfx
m_d3d9 = direct3DCreate9(D3D_SDK_VERSION); m_d3d9 = direct3DCreate9(D3D_SDK_VERSION);
#endif // defined(D3D_DISABLE_9EX) #endif // defined(D3D_DISABLE_9EX)
BGFX_FATAL(m_d3d9, bgfx::Fatal::D3D9_UnableToCreateInterface, "Unable to create Direct3D.");
uint32_t behaviorFlags[] = uint32_t behaviorFlags[] =
{ {
D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE, D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE,
@ -161,7 +163,7 @@ namespace bgfx
#if BGFX_CONFIG_RENDERER_DIRECT3D_EX #if BGFX_CONFIG_RENDERER_DIRECT3D_EX
DX_CHECK(m_d3d9->CreateDeviceEx(D3DADAPTER_DEFAULT DX_CHECK(m_d3d9->CreateDeviceEx(D3DADAPTER_DEFAULT
, D3DDEVTYPE_HAL , D3DDEVTYPE_HAL
, bgfxHwnd , g_bgfxHwnd
, behaviorFlags[ii] , behaviorFlags[ii]
, &m_params , &m_params
, NULL , NULL
@ -170,7 +172,7 @@ namespace bgfx
#else #else
DX_CHECK(m_d3d9->CreateDevice(D3DADAPTER_DEFAULT DX_CHECK(m_d3d9->CreateDevice(D3DADAPTER_DEFAULT
, D3DDEVTYPE_HAL , D3DDEVTYPE_HAL
, bgfxHwnd , g_bgfxHwnd
, behaviorFlags[ii] , behaviorFlags[ii]
, &m_params , &m_params
, &m_device , &m_device
@ -178,6 +180,8 @@ namespace bgfx
#endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX #endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX
} }
BGFX_FATAL(m_device, bgfx::Fatal::D3D9_UnableToCreateDevice, "Unable to create Direct3D9 device.");
m_fmtNULL = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_NULL) ); m_fmtNULL = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_NULL) );
m_fmtDF16 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF16) ); m_fmtDF16 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF16) );
m_fmtDF24 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF24) ); m_fmtDF24 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF24) );
@ -224,12 +228,16 @@ namespace bgfx
void shutdown() void shutdown()
{ {
preReset();
DX_RELEASE(m_device, 0); DX_RELEASE(m_device, 0);
DX_RELEASE(m_d3d9, 0); DX_RELEASE(m_d3d9, 0);
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
FreeLibrary(m_d3d9dll); FreeLibrary(m_d3d9dll);
#endif // BX_PLATFORM_WINDOWS #endif // BX_PLATFORM_WINDOWS
m_initialized = false;
} }
void updateResolution(const Resolution& _resolution) void updateResolution(const Resolution& _resolution)
@ -241,6 +249,7 @@ namespace bgfx
m_flags = _resolution.m_flags; m_flags = _resolution.m_flags;
m_textVideoMem.resize(false, _resolution.m_width, _resolution.m_height); m_textVideoMem.resize(false, _resolution.m_width, _resolution.m_height);
m_textVideoMem.clear();
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
D3DDEVICE_CREATION_PARAMETERS dcp; D3DDEVICE_CREATION_PARAMETERS dcp;
@ -439,11 +448,11 @@ namespace bgfx
) ); ) );
RECT rc; RECT rc;
GetClientRect(bgfxHwnd, &rc); GetClientRect(g_bgfxHwnd, &rc);
POINT point; POINT point;
point.x = rc.left; point.x = rc.left;
point.y = rc.top; point.y = rc.top;
ClientToScreen(bgfxHwnd, &point); ClientToScreen(g_bgfxHwnd, &point);
uint8_t* data = (uint8_t*)rect.pBits; uint8_t* data = (uint8_t*)rect.pBits;
uint32_t bpp = rect.Pitch/dm.Width; uint32_t bpp = rect.Pitch/dm.Width;
saveTga( (const char*)_mem->data, m_params.BackBufferWidth, m_params.BackBufferHeight, rect.Pitch, &data[point.y*rect.Pitch+point.x*bpp]); saveTga( (const char*)_mem->data, m_params.BackBufferWidth, m_params.BackBufferHeight, rect.Pitch, &data[point.y*rect.Pitch+point.x*bpp]);
@ -1825,7 +1834,7 @@ namespace bgfx
if (m_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) ) if (m_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
{ {
PIX_BEGINEVENT(D3DCOLOR_RGBA(0x40, 0x40, 0x40, 0xff), "debug"); PIX_BEGINEVENT(D3DCOLOR_RGBA(0x40, 0x40, 0x40, 0xff), "debugstats");
TextVideoMem& tvm = s_renderCtx.m_textVideoMem; TextVideoMem& tvm = s_renderCtx.m_textVideoMem;
@ -1857,6 +1866,14 @@ namespace bgfx
PIX_ENDEVENT(); PIX_ENDEVENT();
} }
else if (m_render->m_debug & BGFX_DEBUG_TEXT)
{
PIX_BEGINEVENT(D3DCOLOR_RGBA(0x40, 0x40, 0x40, 0xff), "debugtext");
g_textVideoMemBlitter.blit(m_render->m_textVideoMem);
PIX_ENDEVENT();
}
s_renderCtx.m_device->EndScene(); s_renderCtx.m_device->EndScene();
} }

View file

@ -31,6 +31,7 @@ namespace bgfx
|| m_resolution.m_flags != _resolution.m_flags) || m_resolution.m_flags != _resolution.m_flags)
{ {
m_textVideoMem.resize(false, _resolution.m_width, _resolution.m_height); m_textVideoMem.resize(false, _resolution.m_width, _resolution.m_height);
m_textVideoMem.clear();
m_resolution = _resolution; m_resolution = _resolution;
#if BX_PLATFORM_NACL #if BX_PLATFORM_NACL
@ -1722,6 +1723,10 @@ namespace bgfx
g_textVideoMemBlitter.blit(tvm); g_textVideoMemBlitter.blit(tvm);
} }
else if (m_render->m_debug & BGFX_DEBUG_TEXT)
{
g_textVideoMemBlitter.blit(m_render->m_textVideoMem);
}
GL_CHECK(glFlush() ); GL_CHECK(glFlush() );
} }