Moved x11 window creation into examples/common.

This commit is contained in:
bkaradzic 2013-01-13 15:35:06 -08:00
parent b9e9fb77cc
commit 174524dde4
5 changed files with 260 additions and 201 deletions

View file

@ -7,10 +7,94 @@
#if BX_PLATFORM_LINUX #if BX_PLATFORM_LINUX
#include "bgfxplatform.h"
#include <stdlib.h>
#include <bx/thread.h>
#include <bx/os.h>
#undef None
#include "entry.h" #include "entry.h"
#define DEFAULT_WIDTH 1280
#define DEFAULT_HEIGHT 720
extern int _main_(int _argc, char** _argv);
namespace entry namespace entry
{ {
struct MainThreadEntry
{
int m_argc;
char** m_argv;
static int32_t threadFunc(void* _userData)
{
MainThreadEntry* self = (MainThreadEntry*)_userData;
return _main_(self->m_argc, self->m_argv);
}
};
struct Context
{
int32_t run(int _argc, char** _argv)
{
m_display = XOpenDisplay(0);
XLockDisplay(m_display);
int32_t screen = DefaultScreen(m_display);
int32_t depth = DefaultDepth(m_display, screen);
Visual* visual = DefaultVisual(m_display, screen);
Window root = RootWindow(m_display, screen);
XSetWindowAttributes windowAttrs;
windowAttrs.colormap =
XCreateColormap(m_display
, root
, visual
, AllocNone
);
windowAttrs.background_pixmap = 0;
windowAttrs.border_pixel = 0;
m_window = XCreateWindow(m_display
, root
, 0, 0
, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0, depth
, InputOutput
, visual
, CWBorderPixel|CWColormap
, &windowAttrs
);
XMapRaised(m_display, m_window);
XFlush(m_display);
XUnlockDisplay(m_display);
// XResizeWindow(s_display, s_window, _width, _height);
bgfx::x11SetDisplayWindow(m_display, m_window);
MainThreadEntry mte;
mte.m_argc = _argc;
mte.m_argv = _argv;
bx::Thread thread;
thread.init(mte.threadFunc, &mte);
thread.shutdown();
return EXIT_SUCCESS;
}
Display* m_display;
Window m_window;
};
static Context s_ctx;
Event::Enum poll() Event::Enum poll()
{ {
return Event::Nop; return Event::Nop;
@ -18,11 +102,10 @@ namespace entry
} // namespace entry } // namespace entry
extern int _main_(int _argc, char** _argv);
int main(int _argc, char** _argv) int main(int _argc, char** _argv)
{ {
return _main_(_argc, _argv); using namespace entry;
return s_ctx.run(_argc, _argv);
} }
#endif // BX_PLATFORM_LINUX #endif // BX_PLATFORM_LINUX

View file

@ -1,38 +1,38 @@
/* /*
* Copyright 2011-2013 Branimir Karadzic. All rights reserved. * Copyright 2011-2013 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause * License: http://www.opensource.org/licenses/BSD-2-Clause
*/ */
#include <bx/bx.h> #include <bx/bx.h>
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
#include <bgfxplatform.h> #include <bgfxplatform.h>
#include <bx/uint32_t.h> #include <bx/uint32_t.h>
#include <bx/thread.h> #include <bx/thread.h>
#include "entry.h" #include "entry.h"
#include "dbg.h" #include "dbg.h"
#define DEFAULT_WIDTH 1280 #define DEFAULT_WIDTH 1280
#define DEFAULT_HEIGHT 720 #define DEFAULT_HEIGHT 720
extern int _main_(int _argc, char** _argv); extern int _main_(int _argc, char** _argv);
namespace entry namespace entry
{ {
struct MainThreadEntry struct MainThreadEntry
{ {
int m_argc; int m_argc;
char** m_argv; char** m_argv;
static int32_t threadFunc(void* _userData) static int32_t threadFunc(void* _userData)
{ {
MainThreadEntry* self = (MainThreadEntry*)_userData; MainThreadEntry* self = (MainThreadEntry*)_userData;
return _main_(self->m_argc, self->m_argv); return _main_(self->m_argc, self->m_argv);
} }
}; };
struct Context struct Context
{ {
Context() Context()
@ -330,23 +330,23 @@ namespace entry
}; };
static Context s_ctx; static Context s_ctx;
LRESULT CALLBACK Context::wndProc(HWND _hwnd, UINT _id, WPARAM _wparam, LPARAM _lparam) LRESULT CALLBACK Context::wndProc(HWND _hwnd, UINT _id, WPARAM _wparam, LPARAM _lparam)
{ {
return s_ctx.process(_hwnd, _id, _wparam, _lparam); return s_ctx.process(_hwnd, _id, _wparam, _lparam);
} }
Event::Enum poll() Event::Enum poll()
{ {
return Event::Nop; return Event::Nop;
} }
} // namespace entry } // namespace entry
int main(int _argc, char** _argv) int main(int _argc, char** _argv)
{ {
using namespace entry; using namespace entry;
return s_ctx.main(_argc, _argv); return s_ctx.main(_argc, _argv);
} }
#endif // BX_PLATFORM_WINDOWS #endif // BX_PLATFORM_WINDOWS

View file

@ -1,31 +1,39 @@
/* /*
* Copyright 2011-2013 Branimir Karadzic. All rights reserved. * Copyright 2011-2013 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause * License: http://www.opensource.org/licenses/BSD-2-Clause
*/ */
#ifndef __BGFXPLATFORM_H__ #ifndef __BGFXPLATFORM_H__
#define __BGFXPLATFORM_H__ #define __BGFXPLATFORM_H__
#include <bx/bx.h> #include <bx/bx.h>
#if BX_PLATFORM_NACL #if BX_PLATFORM_LINUX
# include <ppapi/c/ppb_graphics_3d.h> # include <X11/Xlib.h>
# include <ppapi/c/ppb_instance.h>
namespace bgfx
namespace bgfx {
{ void x11SetDisplayWindow(::Display* _display, ::Window _window);
typedef void (*PostSwapBuffersFn)(uint32_t _width, uint32_t _height); } // namespace bgfx
void naclSetIntefraces(PP_Instance, const PPB_Instance*, const PPB_Graphics3D*, PostSwapBuffersFn);
} // namespace bgfx #elif BX_PLATFORM_NACL
# include <ppapi/c/ppb_graphics_3d.h>
#elif BX_PLATFORM_WINDOWS # include <ppapi/c/ppb_instance.h>
# include <windows.h>
namespace bgfx
namespace bgfx {
{ typedef void (*PostSwapBuffersFn)(uint32_t _width, uint32_t _height);
void setHwnd(HWND _hwnd); void naclSetIntefraces(::PP_Instance, const ::PPB_Instance*, const ::PPB_Graphics3D*, PostSwapBuffersFn);
} // namespace bgfx } // namespace bgfx
#endif // BX_PLATFORM_ #elif BX_PLATFORM_WINDOWS
# include <windows.h>
#endif // __BGFXPLATFORM_H__
namespace bgfx
{
void setHwnd(::HWND _hwnd);
} // namespace bgfx
#endif // BX_PLATFORM_
#endif // __BGFXPLATFORM_H__

View file

@ -38,10 +38,10 @@ namespace bgfx
#endif // BGFX_CONFIG_MULTITHREADED #endif // BGFX_CONFIG_MULTITHREADED
#if BX_PLATFORM_WINDOWS #if BX_PLATFORM_WINDOWS
void setHwnd(HWND _hwnd) void setHwnd(::HWND _hwnd)
{ {
g_bgfxHwnd = _hwnd; g_bgfxHwnd = _hwnd;
} }
#endif // BX_PLATFORM_WINDOWS #endif // BX_PLATFORM_WINDOWS
struct CallbackStub : public CallbackI struct CallbackStub : public CallbackI
@ -1035,7 +1035,7 @@ namespace bgfx
return s_ctx.createTexture(mem, _flags, NULL); return s_ctx.createTexture(mem, _flags, NULL);
} }
TextureHandle createTextureCube(uint16_t _sides, uint16_t _width, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) TextureHandle createTextureCube(uint16_t _sides, uint16_t _width, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem)
{ {
BGFX_CHECK_MAIN_THREAD(); BGFX_CHECK_MAIN_THREAD();
@ -1081,52 +1081,52 @@ namespace bgfx
s_ctx.destroyTexture(_handle); s_ctx.destroyTexture(_handle);
} }
void updateTexture2D(TextureHandle _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const Memory* _mem) void updateTexture2D(TextureHandle _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const Memory* _mem)
{ {
BGFX_CHECK_MAIN_THREAD(); BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL"); BX_CHECK(NULL != _mem, "_mem can't be NULL");
if (_width == 0 if (_width == 0
|| _height == 0) || _height == 0)
{ {
release(_mem); release(_mem);
} }
else else
{ {
s_ctx.updateTexture(_handle, 0, _mip, _x, _y, 0, _width, _height, 1, _mem); s_ctx.updateTexture(_handle, 0, _mip, _x, _y, 0, _width, _height, 1, _mem);
} }
} }
void updateTexture3D(TextureHandle _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _width, uint16_t _height, uint16_t _depth, const Memory* _mem) void updateTexture3D(TextureHandle _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _width, uint16_t _height, uint16_t _depth, const Memory* _mem)
{ {
BGFX_CHECK_MAIN_THREAD(); BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL"); BX_CHECK(NULL != _mem, "_mem can't be NULL");
if (_width == 0 if (_width == 0
|| _height == 0 || _height == 0
|| _depth == 0) || _depth == 0)
{ {
release(_mem); release(_mem);
} }
else else
{ {
s_ctx.updateTexture(_handle, 0, _mip, _x, _y, _z, _width, _height, _depth, _mem); s_ctx.updateTexture(_handle, 0, _mip, _x, _y, _z, _width, _height, _depth, _mem);
} }
} }
void updateTextureCube(TextureHandle _handle, uint8_t _side, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const Memory* _mem) void updateTextureCube(TextureHandle _handle, uint8_t _side, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const Memory* _mem)
{ {
BGFX_CHECK_MAIN_THREAD(); BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL"); BX_CHECK(NULL != _mem, "_mem can't be NULL");
BX_CHECK(_side >= 0 && _side <= 5, "Invalid side %d.", _side); BX_CHECK(_side >= 0 && _side <= 5, "Invalid side %d.", _side);
if (_width == 0 if (_width == 0
|| _height == 0) || _height == 0)
{ {
release(_mem); release(_mem);
} }
else else
{ {
s_ctx.updateTexture(_handle, _side, _mip, _x, _y, 0, _width, _height, 1, _mem); s_ctx.updateTexture(_handle, _side, _mip, _x, _y, 0, _width, _height, 1, _mem);
} }
} }
RenderTargetHandle createRenderTarget(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags) RenderTargetHandle createRenderTarget(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags)
{ {

View file

@ -12,6 +12,17 @@
namespace bgfx namespace bgfx
{ {
#if BX_PLATFORM_LINUX
static ::Display* s_display;
static ::Window s_window;
void x11SetDisplayWindow(::Display* _display, ::Window _window)
{
s_display = _display;
s_window = _window;
}
#endif // BX_PLATFORM_LINUX
struct Extension struct Extension
{ {
enum Enum enum Enum
@ -196,8 +207,6 @@ namespace bgfx
, m_surface(NULL) , m_surface(NULL)
#elif BX_PLATFORM_LINUX #elif BX_PLATFORM_LINUX
, m_context(0) , m_context(0)
, m_window(0)
, m_display(NULL)
#endif // BX_PLATFORM_ #endif // BX_PLATFORM_
{ {
memset(&m_resolution, 0, sizeof(m_resolution) ); memset(&m_resolution, 0, sizeof(m_resolution) );
@ -334,15 +343,12 @@ namespace bgfx
} }
#elif BX_PLATFORM_LINUX #elif BX_PLATFORM_LINUX
if (0 == m_display) if (0 == m_context)
{ {
Display* display = XOpenDisplay(0); XLockDisplay(s_display);
BGFX_FATAL(display, Fatal::UnableToInitialize, "Failed to open X display (0).");
XLockDisplay(display);
int major, minor; int major, minor;
bool version = glXQueryVersion(display, &major, &minor); bool version = glXQueryVersion(s_display, &major, &minor);
BGFX_FATAL(version, Fatal::UnableToInitialize, "Failed to query GLX version"); BGFX_FATAL(version, Fatal::UnableToInitialize, "Failed to query GLX version");
BGFX_FATAL( (major == 1 && minor >= 3) || major > 1 BGFX_FATAL( (major == 1 && minor >= 3) || major > 1
, Fatal::UnableToInitialize , Fatal::UnableToInitialize
@ -369,14 +375,14 @@ namespace bgfx
GLXFBConfig bestConfig = NULL; GLXFBConfig bestConfig = NULL;
int numConfigs; int numConfigs;
GLXFBConfig* configs = glXChooseFBConfig(display, DefaultScreen(display), attrsGlx, &numConfigs); GLXFBConfig* configs = glXChooseFBConfig(s_display, DefaultScreen(s_display), attrsGlx, &numConfigs);
BX_TRACE("glX num configs %d", numConfigs); BX_TRACE("glX num configs %d", numConfigs);
XVisualInfo* visualInfo = 0; XVisualInfo* visualInfo = 0;
for (int ii = 0; ii < numConfigs; ++ii) for (int ii = 0; ii < numConfigs; ++ii)
{ {
visualInfo = glXGetVisualFromFBConfig(display, configs[ii]); visualInfo = glXGetVisualFromFBConfig(s_display, configs[ii]);
if (NULL != visualInfo) if (NULL != visualInfo)
{ {
BX_TRACE("---"); BX_TRACE("---");
@ -384,7 +390,7 @@ namespace bgfx
for (uint32_t attr = 6; attr < countof(attrsGlx)-1 && attrsGlx[attr] != None; attr += 2) for (uint32_t attr = 6; attr < countof(attrsGlx)-1 && attrsGlx[attr] != None; attr += 2)
{ {
int value; int value;
glXGetFBConfigAttrib(display, configs[ii], attrsGlx[attr], &value); glXGetFBConfigAttrib(s_display, configs[ii], attrsGlx[attr], &value);
BX_TRACE("glX %d/%d %2d: %4x, %8x (%8x%s)" BX_TRACE("glX %d/%d %2d: %4x, %8x (%8x%s)"
, ii , ii
, numConfigs , numConfigs
@ -418,29 +424,8 @@ namespace bgfx
XFree(configs); XFree(configs);
BGFX_FATAL(visualInfo, Fatal::UnableToInitialize, "Failed to find a suitable X11 display configuration."); BGFX_FATAL(visualInfo, Fatal::UnableToInitialize, "Failed to find a suitable X11 display configuration.");
// Generate colormaps
XSetWindowAttributes windowAttrs;
windowAttrs.colormap = XCreateColormap(display, RootWindow(display, visualInfo->screen), visualInfo->visual, AllocNone);
windowAttrs.background_pixmap = None;
windowAttrs.border_pixel = 0;
Window window = XCreateWindow(
display
, RootWindow(display, visualInfo->screen)
, 0, 0
, _width, _height, 0, visualInfo->depth
, InputOutput
, visualInfo->visual
, CWBorderPixel|CWColormap
, &windowAttrs
);
BGFX_FATAL(window, Fatal::UnableToInitialize, "Failed to create X11 window.");
XMapRaised(display, window);
XFlush(display);
BX_TRACE("Create GL 2.1 context."); BX_TRACE("Create GL 2.1 context.");
m_context = glXCreateContext(display, visualInfo, 0, GL_TRUE); m_context = glXCreateContext(s_display, visualInfo, 0, GL_TRUE);
BGFX_FATAL(NULL != m_context, Fatal::UnableToInitialize, "Failed to create GL 2.1 context."); BGFX_FATAL(NULL != m_context, Fatal::UnableToInitialize, "Failed to create GL 2.1 context.");
XFree(visualInfo); XFree(visualInfo);
@ -457,16 +442,16 @@ namespace bgfx
None, None,
}; };
GLXContext context = glXCreateContextAttribsARB(display, bestConfig, 0, true, contextAttrs); GLXContext context = glXCreateContextAttribsARB(s_display, bestConfig, 0, true, contextAttrs);
if (NULL != context) if (NULL != context)
{ {
glXDestroyContext(display, m_context); glXDestroyContext(s_display, m_context);
m_context = context; m_context = context;
} }
} }
glXMakeCurrent(display, window, m_context); glXMakeCurrent(s_display, s_window, m_context);
# define GL_IMPORT(_optional, _proto, _func) \ # define GL_IMPORT(_optional, _proto, _func) \
{ \ { \
@ -477,15 +462,12 @@ namespace bgfx
# undef GL_IMPORT # undef GL_IMPORT
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glXSwapBuffers(display, window); glXSwapBuffers(s_display, s_window);
m_display = display; XUnlockDisplay(s_display);
m_window = window;
XUnlockDisplay(display);
} }
else else
{ {
XResizeWindow(m_display, m_window, _width, _height);
} }
#elif BGFX_USE_EGL #elif BGFX_USE_EGL
if (NULL == m_context) if (NULL == m_context)
@ -558,23 +540,6 @@ namespace bgfx
#endif // BX_PLATFORM_ #endif // BX_PLATFORM_
} }
#if !BGFX_CONFIG_RENDERER_OPENGLES3
if (NULL != glVertexAttribDivisor
&& NULL != glDrawArraysInstanced
&& NULL != glDrawElementsInstanced)
{
s_vertexAttribDivisor = glVertexAttribDivisor;
s_drawArraysInstanced = glDrawArraysInstanced;
s_drawElementsInstanced = glDrawElementsInstanced;
}
else
{
s_vertexAttribDivisor = stubVertexAttribDivisor;
s_drawArraysInstanced = stubDrawArraysInstanced;
s_drawElementsInstanced = stubDrawElementsInstanced;
}
#endif // !BGFX_CONFIG_RENDERER_OPENGLES3
m_flip = true; m_flip = true;
} }
@ -592,7 +557,7 @@ namespace bgfx
eglMakeCurrent(m_display, m_surface, m_surface, m_context); eglMakeCurrent(m_display, m_surface, m_surface, m_context);
eglSwapBuffers(m_display, m_surface); eglSwapBuffers(m_display, m_surface);
#elif BX_PLATFORM_LINUX #elif BX_PLATFORM_LINUX
glXSwapBuffers(m_display, m_window); glXSwapBuffers(s_display, s_window);
#endif // BX_PLATFORM_ #endif // BX_PLATFORM_
} }
@ -760,8 +725,6 @@ namespace bgfx
EGLSurface m_surface; EGLSurface m_surface;
#elif BX_PLATFORM_LINUX #elif BX_PLATFORM_LINUX
GLXContext m_context; GLXContext m_context;
Window m_window;
Display* m_display;
#endif // BX_PLATFORM_NACL #endif // BX_PLATFORM_NACL
}; };
@ -804,18 +767,6 @@ namespace bgfx
{ {
renderFrame(); renderFrame();
} }
#elif BX_PLATFORM_LINUX
bool linuxGetDisplay(Display** _display, Window* _window)
{
if (!s_renderCtx.m_display)
{
return false;
}
*_display = s_renderCtx.m_display;
*_window = s_renderCtx.m_window;
return true;
}
#endif // BX_PLATFORM_ #endif // BX_PLATFORM_
static const GLenum s_primType[] = static const GLenum s_primType[] =
@ -2252,6 +2203,23 @@ namespace bgfx
s_textureFormat[TextureFormat::BGRX8].m_fmt = GL_BGRA_EXT; s_textureFormat[TextureFormat::BGRX8].m_fmt = GL_BGRA_EXT;
s_textureFormat[TextureFormat::BGRA8].m_fmt = GL_BGRA_EXT; s_textureFormat[TextureFormat::BGRA8].m_fmt = GL_BGRA_EXT;
} }
#if !BGFX_CONFIG_RENDERER_OPENGLES3
if (NULL != glVertexAttribDivisor
&& NULL != glDrawArraysInstanced
&& NULL != glDrawElementsInstanced)
{
s_vertexAttribDivisor = glVertexAttribDivisor;
s_drawArraysInstanced = glDrawArraysInstanced;
s_drawElementsInstanced = glDrawElementsInstanced;
}
else
{
s_vertexAttribDivisor = stubVertexAttribDivisor;
s_drawArraysInstanced = stubDrawArraysInstanced;
s_drawElementsInstanced = stubDrawElementsInstanced;
}
#endif // !BGFX_CONFIG_RENDERER_OPENGLES3
} }
} }