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
#include "bgfxplatform.h"
#include <stdlib.h>
#include <bx/thread.h>
#include <bx/os.h>
#undef None
#include "entry.h"
#define DEFAULT_WIDTH 1280
#define DEFAULT_HEIGHT 720
extern int _main_(int _argc, char** _argv);
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()
{
return Event::Nop;
@ -18,11 +102,10 @@ namespace entry
} // namespace entry
extern 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

View file

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

View file

@ -1,31 +1,39 @@
/*
* Copyright 2011-2013 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#ifndef __BGFXPLATFORM_H__
#define __BGFXPLATFORM_H__
#include <bx/bx.h>
#if BX_PLATFORM_NACL
# include <ppapi/c/ppb_graphics_3d.h>
# include <ppapi/c/ppb_instance.h>
namespace bgfx
{
typedef void (*PostSwapBuffersFn)(uint32_t _width, uint32_t _height);
void naclSetIntefraces(PP_Instance, const PPB_Instance*, const PPB_Graphics3D*, PostSwapBuffersFn);
} // namespace bgfx
#elif BX_PLATFORM_WINDOWS
# include <windows.h>
namespace bgfx
{
void setHwnd(HWND _hwnd);
} // namespace bgfx
#endif // BX_PLATFORM_
#endif // __BGFXPLATFORM_H__
/*
* Copyright 2011-2013 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#ifndef __BGFXPLATFORM_H__
#define __BGFXPLATFORM_H__
#include <bx/bx.h>
#if BX_PLATFORM_LINUX
# include <X11/Xlib.h>
namespace bgfx
{
void x11SetDisplayWindow(::Display* _display, ::Window _window);
} // namespace bgfx
#elif BX_PLATFORM_NACL
# include <ppapi/c/ppb_graphics_3d.h>
# include <ppapi/c/ppb_instance.h>
namespace bgfx
{
typedef void (*PostSwapBuffersFn)(uint32_t _width, uint32_t _height);
void naclSetIntefraces(::PP_Instance, const ::PPB_Instance*, const ::PPB_Graphics3D*, PostSwapBuffersFn);
} // namespace bgfx
#elif BX_PLATFORM_WINDOWS
# include <windows.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
#if BX_PLATFORM_WINDOWS
void setHwnd(HWND _hwnd)
{
g_bgfxHwnd = _hwnd;
}
void setHwnd(::HWND _hwnd)
{
g_bgfxHwnd = _hwnd;
}
#endif // BX_PLATFORM_WINDOWS
struct CallbackStub : public CallbackI
@ -1035,7 +1035,7 @@ namespace bgfx
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)
{
BGFX_CHECK_MAIN_THREAD();
@ -1081,52 +1081,52 @@ namespace bgfx
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();
BX_CHECK(NULL != _mem, "_mem can't be NULL");
if (_width == 0
|| _height == 0)
{
release(_mem);
}
else
{
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)
{
if (_width == 0
|| _height == 0)
{
release(_mem);
}
else
{
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)
{
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL");
if (_width == 0
|| _height == 0
|| _depth == 0)
{
release(_mem);
}
else
{
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)
{
if (_width == 0
|| _height == 0
|| _depth == 0)
{
release(_mem);
}
else
{
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)
{
BGFX_CHECK_MAIN_THREAD();
BX_CHECK(NULL != _mem, "_mem can't be NULL");
BX_CHECK(_side >= 0 && _side <= 5, "Invalid side %d.", _side);
if (_width == 0
|| _height == 0)
{
release(_mem);
}
else
{
s_ctx.updateTexture(_handle, _side, _mip, _x, _y, 0, _width, _height, 1, _mem);
}
}
if (_width == 0
|| _height == 0)
{
release(_mem);
}
else
{
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)
{

View file

@ -12,6 +12,17 @@
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
{
enum Enum
@ -196,8 +207,6 @@ namespace bgfx
, m_surface(NULL)
#elif BX_PLATFORM_LINUX
, m_context(0)
, m_window(0)
, m_display(NULL)
#endif // BX_PLATFORM_
{
memset(&m_resolution, 0, sizeof(m_resolution) );
@ -334,15 +343,12 @@ namespace bgfx
}
#elif BX_PLATFORM_LINUX
if (0 == m_display)
if (0 == m_context)
{
Display* display = XOpenDisplay(0);
BGFX_FATAL(display, Fatal::UnableToInitialize, "Failed to open X display (0).");
XLockDisplay(display);
XLockDisplay(s_display);
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( (major == 1 && minor >= 3) || major > 1
, Fatal::UnableToInitialize
@ -369,14 +375,14 @@ namespace bgfx
GLXFBConfig bestConfig = NULL;
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);
XVisualInfo* visualInfo = 0;
for (int ii = 0; ii < numConfigs; ++ii)
{
visualInfo = glXGetVisualFromFBConfig(display, configs[ii]);
visualInfo = glXGetVisualFromFBConfig(s_display, configs[ii]);
if (NULL != visualInfo)
{
BX_TRACE("---");
@ -384,7 +390,7 @@ namespace bgfx
for (uint32_t attr = 6; attr < countof(attrsGlx)-1 && attrsGlx[attr] != None; attr += 2)
{
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)"
, ii
, numConfigs
@ -418,29 +424,8 @@ namespace bgfx
XFree(configs);
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.");
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.");
XFree(visualInfo);
@ -457,16 +442,16 @@ namespace bgfx
None,
};
GLXContext context = glXCreateContextAttribsARB(display, bestConfig, 0, true, contextAttrs);
GLXContext context = glXCreateContextAttribsARB(s_display, bestConfig, 0, true, contextAttrs);
if (NULL != context)
{
glXDestroyContext(display, m_context);
glXDestroyContext(s_display, m_context);
m_context = context;
}
}
glXMakeCurrent(display, window, m_context);
glXMakeCurrent(s_display, s_window, m_context);
# define GL_IMPORT(_optional, _proto, _func) \
{ \
@ -477,15 +462,12 @@ namespace bgfx
# undef GL_IMPORT
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glXSwapBuffers(display, window);
glXSwapBuffers(s_display, s_window);
m_display = display;
m_window = window;
XUnlockDisplay(display);
XUnlockDisplay(s_display);
}
else
{
XResizeWindow(m_display, m_window, _width, _height);
}
#elif BGFX_USE_EGL
if (NULL == m_context)
@ -558,23 +540,6 @@ namespace bgfx
#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;
}
@ -592,7 +557,7 @@ namespace bgfx
eglMakeCurrent(m_display, m_surface, m_surface, m_context);
eglSwapBuffers(m_display, m_surface);
#elif BX_PLATFORM_LINUX
glXSwapBuffers(m_display, m_window);
glXSwapBuffers(s_display, s_window);
#endif // BX_PLATFORM_
}
@ -760,8 +725,6 @@ namespace bgfx
EGLSurface m_surface;
#elif BX_PLATFORM_LINUX
GLXContext m_context;
Window m_window;
Display* m_display;
#endif // BX_PLATFORM_NACL
};
@ -804,18 +767,6 @@ namespace bgfx
{
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_
static const GLenum s_primType[] =
@ -2252,6 +2203,23 @@ namespace bgfx
s_textureFormat[TextureFormat::BGRX8].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
}
}