21
21
#include <android/log.h>
22
22
#endif
23
23
24
- #if BGFX_API_VERSION != 122
24
+ #if BGFX_API_VERSION != 127
25
25
# error BGFX_API_VERSION mismatch
26
26
#endif
27
27
@@ -101,12 +101,14 @@ struct log_cache {
101
101
char log [MAX_LOGBUFFER ];
102
102
};
103
103
104
+ typedef void (* bgfx_pushlog )(void * context , const char * file , uint16_t line , const char * format , va_list ap );
105
+
104
106
struct callback {
105
107
bgfx_callback_interface_t base ;
106
108
struct screenshot_queue ss ;
107
- struct log_cache lc ;
108
109
uint32_t filterlog ;
109
- bool getlog ;
110
+ bgfx_pushlog pushlog ;
111
+ void * pushlog_context ;
110
112
};
111
113
112
114
static int
@@ -272,6 +274,14 @@ getfield(lua_State *L, const char *key) {
272
274
return ud ;
273
275
}
274
276
277
+ static int
278
+ getfield_int (lua_State * L , const char * key ) {
279
+ lua_getfield (L , 1 , key );
280
+ int v = lua_tointeger (L , -1 );
281
+ lua_pop (L , 1 );
282
+ return v ;
283
+ }
284
+
275
285
static int
276
286
lsetPlatformData (lua_State * L ) {
277
287
luaL_checktype (L , 1 , LUA_TTABLE );
@@ -283,6 +293,7 @@ lsetPlatformData(lua_State *L) {
283
293
bpdt .context = getfield (L , "context" );
284
294
bpdt .backBuffer = getfield (L , "backBuffer" );
285
295
bpdt .backBufferDS = getfield (L , "backBufferDS" );
296
+ bpdt .type = (bgfx_native_window_handle_type_t )getfield_int (L , "type" );
286
297
287
298
BGFX (set_platform_data )(& bpdt );
288
299
@@ -296,40 +307,15 @@ renderer_type_id(lua_State *L, int index) {
296
307
#define RENDERER_TYPE_ID (x ) else if (strcmp(type, #x) == 0) id = BGFX_RENDERER_TYPE_##x
297
308
if (0 ) ;
298
309
RENDERER_TYPE_ID (NOOP );
299
- RENDERER_TYPE_ID (DIRECT3D9 );
300
310
RENDERER_TYPE_ID (DIRECT3D11 );
301
311
RENDERER_TYPE_ID (DIRECT3D12 );
302
- RENDERER_TYPE_ID (GNM );
303
312
RENDERER_TYPE_ID (METAL );
304
- RENDERER_TYPE_ID (NVN );
305
- RENDERER_TYPE_ID (OPENGLES );
306
- RENDERER_TYPE_ID (OPENGL );
307
313
RENDERER_TYPE_ID (VULKAN );
308
314
else return luaL_error (L , "Invalid renderer type %s" , type );
309
315
310
316
return id ;
311
317
}
312
318
313
- static void
314
- append_log (struct log_cache * lc , const char * buffer , int n ) {
315
- spin_lock (lc );
316
- int sz = (int )(lc -> tail - lc -> head ); // sz must less than MAX_LOGBUFFER
317
- if (sz + n > MAX_LOGBUFFER )
318
- n = MAX_LOGBUFFER - sz ;
319
- int offset = lc -> tail % MAX_LOGBUFFER ;
320
- int part = MAX_LOGBUFFER - offset ;
321
- if (part >= n ) {
322
- // only one part
323
- memcpy (lc -> log + offset , buffer , n );
324
- } else {
325
- // ring buffer rewind
326
- memcpy (lc -> log + offset , buffer , part );
327
- memcpy (lc -> log , buffer + part , n - part );
328
- }
329
- lc -> tail += n ;
330
- spin_unlock (lc );
331
- }
332
-
333
319
static const char *
334
320
fatal_code_str (bgfx_fatal_t code ) {
335
321
switch (code ) {
@@ -385,19 +371,20 @@ trace_filter(const char *format, int level) {
385
371
386
372
static void
387
373
cb_trace_vargs (bgfx_callback_interface_t * self , const char * file , uint16_t line , const char * format , va_list ap ) {
388
- char tmp [MAX_LOGBUFFER ];
389
- int n = sprintf (tmp , "%s (%d): " , file , line );
390
-
391
- n += vsnprintf (tmp + n , sizeof (tmp )- n , format , ap );
392
- if (n > MAX_LOGBUFFER ) {
393
- // truncated
394
- n = MAX_LOGBUFFER ;
395
- }
396
374
struct callback * cb = (struct callback * )self ;
397
- if (cb -> getlog ) {
398
- append_log (& (cb -> lc ), tmp , n );
399
- }
400
375
if (cb -> filterlog > 0 && trace_filter (format , cb -> filterlog )) {
376
+ if (cb -> pushlog ) {
377
+ cb -> pushlog (cb -> pushlog_context , file , line , format , ap );
378
+ return ;
379
+ }
380
+ char tmp [MAX_LOGBUFFER ];
381
+ int n = sprintf (tmp , "%s (%d): " , file , line );
382
+
383
+ n += vsnprintf (tmp + n , sizeof (tmp )- n , format , ap );
384
+ if (n > MAX_LOGBUFFER ) {
385
+ // truncated
386
+ n = MAX_LOGBUFFER ;
387
+ }
401
388
#if BX_PLATFORM_ANDROID
402
389
__android_log_write (ANDROID_LOG_INFO , "bgfx" , tmp );
403
390
#else
@@ -634,6 +621,7 @@ linit(lua_State *L) {
634
621
init .platformData .context = NULL ;
635
622
init .platformData .backBuffer = NULL ;
636
623
init .platformData .backBufferDS = NULL ;
624
+ init .platformData .type = BGFX_NATIVE_WINDOW_HANDLE_TYPE_DEFAULT ;
637
625
638
626
if (!lua_isnoneornil (L , 1 )) {
639
627
luaL_checktype (L , 1 , LUA_TTABLE );
@@ -673,19 +661,17 @@ linit(lua_State *L) {
673
661
read_uint32 (L , 1 , "transientIbSize" , & init .limits .transientIbSize );
674
662
read_boolean (L , 1 , "debug" , & init .debug );
675
663
read_boolean (L , 1 , "profile" , & init .profile );
676
- read_boolean (L , 1 , "getlog" , & cb -> getlog );
677
- if (cb -> getlog ) {
678
- cb -> filterlog = 0 ; // log none
679
- } else {
680
- cb -> filterlog = 255 ; // log all
681
- }
664
+
682
665
read_uint32 (L , 1 , "loglevel" , & cb -> filterlog );
666
+ cb -> pushlog = getfield (L , "pushlog" );
667
+ cb -> pushlog_context = getfield (L , "pushlog_context" );
683
668
684
669
init .platformData .ndt = getfield (L , "ndt" );
685
670
init .platformData .nwh = getfield (L , "nwh" );
686
671
init .platformData .context = getfield (L , "context" );
687
672
init .platformData .backBuffer = getfield (L , "backBuffer" );
688
673
init .platformData .backBufferDS = getfield (L , "backBufferDS" );
674
+ init .platformData .type = (bgfx_native_window_handle_type_t )getfield_int (L , "type" );
689
675
690
676
//if (init.debug) {
691
677
luabgfx_getalloc (& init .allocator );
@@ -704,13 +690,9 @@ push_renderer_type(lua_State *L, bgfx_renderer_type_t t) {
704
690
#define RENDERER_TYPE (x ) case BGFX_RENDERER_TYPE_##x : st = #x; break
705
691
switch (t ) {
706
692
RENDERER_TYPE (NOOP );
707
- RENDERER_TYPE (DIRECT3D9 );
708
693
RENDERER_TYPE (DIRECT3D11 );
709
694
RENDERER_TYPE (DIRECT3D12 );
710
- RENDERER_TYPE (GNM );
711
695
RENDERER_TYPE (METAL );
712
- RENDERER_TYPE (OPENGLES );
713
- RENDERER_TYPE (OPENGL );
714
696
RENDERER_TYPE (VULKAN );
715
697
default : {
716
698
luaL_error (L , "Unknown renderer type %d" , t );
@@ -1112,7 +1094,7 @@ lgetStats(lua_State *L) {
1112
1094
break ;
1113
1095
}
1114
1096
default :
1115
- return luaL_error (L , "Unkown stat format %c" , what [i ]);
1097
+ return luaL_error (L , "Unknown stat format %c" , what [i ]);
1116
1098
}}
1117
1099
return 1 ;
1118
1100
}
@@ -3271,7 +3253,12 @@ ldbgTextImage(lua_State *L) {
3271
3253
int y = luaL_checkinteger (L , 2 );
3272
3254
int w = luaL_checkinteger (L , 3 );
3273
3255
int h = luaL_checkinteger (L , 4 );
3274
- const char * image = luaL_checkstring (L , 5 );
3256
+ const char * image ;
3257
+ if (lua_isuserdata (L , 5 )) {
3258
+ image = (const char * )lua_touserdata (L , 5 );
3259
+ } else {
3260
+ image = luaL_checkstring (L , 5 );
3261
+ }
3275
3262
int pitch = luaL_optinteger (L , 6 , 2 * w );
3276
3263
BGFX (dbg_text_image )(x ,y ,w ,h ,image , pitch );
3277
3264
return 0 ;
@@ -4505,8 +4492,9 @@ lsetViewRect(lua_State *L) {
4505
4492
static int
4506
4493
lsetViewName (lua_State * L ) {
4507
4494
bgfx_view_id_t viewid = luaL_checkinteger (L , 1 );
4508
- const char * name = luaL_checkstring (L , 2 );
4509
- BGFX (set_view_name )(viewid , name );
4495
+ size_t sz ;
4496
+ const char * name = luaL_checklstring (L , 2 , & sz );
4497
+ BGFX (set_view_name )(viewid , name , sz );
4510
4498
return 0 ;
4511
4499
}
4512
4500
@@ -5061,34 +5049,6 @@ lgetScreenshot(lua_State *L) {
5061
5049
return memptr ? 6 : 5 ;
5062
5050
}
5063
5051
5064
- static int
5065
- lgetLog (lua_State * L ) {
5066
- if (lua_getfield (L , LUA_REGISTRYINDEX , "bgfx_cb" ) != LUA_TUSERDATA ) {
5067
- return luaL_error (L , "get_log failed!" );
5068
- }
5069
- struct callback * cb = lua_touserdata (L , -1 );
5070
- struct log_cache * lc = & cb -> lc ;
5071
- spin_lock (lc );
5072
- int offset = lc -> head % MAX_LOGBUFFER ;
5073
- int sz = (int )(lc -> tail - lc -> head );
5074
-
5075
- int part = MAX_LOGBUFFER - offset ;
5076
-
5077
- if (part >= sz ) {
5078
- // only one part
5079
- lua_pushlstring (L , lc -> log + offset , sz );
5080
- } else {
5081
- char tmp [MAX_LOGBUFFER ];
5082
- memcpy (tmp , lc -> log + offset , part );
5083
- memcpy (tmp + part , lc -> log , sz - part );
5084
- lua_pushlstring (L , tmp , sz );
5085
- }
5086
- lc -> head = lc -> tail ;
5087
-
5088
- spin_unlock (lc );
5089
- return 1 ;
5090
- }
5091
-
5092
5052
#define SET_UNIFORM 0
5093
5053
#define SET_TEXTURE 1
5094
5054
#define SET_BUFFER 2
@@ -5481,7 +5441,6 @@ luaopen_bgfx(lua_State *L) {
5481
5441
{ "init" , linit },
5482
5442
{ "shutdown" , lshutdown },
5483
5443
5484
- { "get_log" , lgetLog },
5485
5444
{ "get_screenshot" , lgetScreenshot },
5486
5445
{ "request_screenshot" , lrequestScreenshot },
5487
5446
0 commit comments