Put linux now time on microseconds so dt is computed correctly; fix a bug in linux_schedule_step

master
Allen Webster 2020-02-27 20:04:46 -08:00
parent d934161447
commit e300b209c1
6 changed files with 88 additions and 85 deletions

View File

@ -252,7 +252,7 @@ App_Init_Sig(app_init){
working_set_init(models, &models->working_set); working_set_init(models, &models->working_set);
Mutex_Lock file_order_lock(models->working_set.mutex); Mutex_Lock file_order_lock(models->working_set.mutex);
// NOTE(allen): // NOTE(allen):
global_history_init(&models->global_history); global_history_init(&models->global_history);
text_layout_init(tctx, &models->text_layouts); text_layout_init(tctx, &models->text_layouts);

View File

@ -53,7 +53,7 @@ delta_apply(Application_Links *app, View_ID view,
} }
function Buffer_Point_Delta_Result function Buffer_Point_Delta_Result
delta_apply(Application_Links *app, View_ID view, delta_apply(Application_Links *app, View_ID view,
Delta_Rule_Function *func, Data delta_ctx, Delta_Rule_Function *func, Data delta_ctx,
f32 dt, Buffer_Scroll scroll){ f32 dt, Buffer_Scroll scroll){
return(delta_apply(app, view, func, delta_ctx, return(delta_apply(app, view, func, delta_ctx,
@ -61,7 +61,7 @@ delta_apply(Application_Links *app, View_ID view,
} }
function Buffer_Point_Delta_Result function Buffer_Point_Delta_Result
delta_apply(Application_Links *app, View_ID view, delta_apply(Application_Links *app, View_ID view,
f32 dt, Buffer_Point position, Buffer_Point target){ f32 dt, Buffer_Point position, Buffer_Point target){
View_Context ctx = view_current_context(app, view); View_Context ctx = view_current_context(app, view);
Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule);
@ -70,7 +70,7 @@ delta_apply(Application_Links *app, View_ID view,
} }
function Buffer_Point_Delta_Result function Buffer_Point_Delta_Result
delta_apply(Application_Links *app, View_ID view, delta_apply(Application_Links *app, View_ID view,
f32 dt, Buffer_Scroll scroll){ f32 dt, Buffer_Scroll scroll){
View_Context ctx = view_current_context(app, view); View_Context ctx = view_current_context(app, view);
Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule);
@ -119,7 +119,7 @@ delta_apply(Application_Links *app, View_ID view,
} }
function Vec2_f32_Delta_Result function Vec2_f32_Delta_Result
delta_apply(Application_Links *app, View_ID view, delta_apply(Application_Links *app, View_ID view,
f32 dt, Vec2_f32 position, Vec2_f32 target){ f32 dt, Vec2_f32 position, Vec2_f32 target){
View_Context ctx = view_current_context(app, view); View_Context ctx = view_current_context(app, view);
Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule);
@ -128,7 +128,7 @@ delta_apply(Application_Links *app, View_ID view,
} }
function Vec2_f32_Delta_Result function Vec2_f32_Delta_Result
delta_apply(Application_Links *app, View_ID view, delta_apply(Application_Links *app, View_ID view,
f32 dt, Basic_Scroll scroll){ f32 dt, Basic_Scroll scroll){
View_Context ctx = view_current_context(app, view); View_Context ctx = view_current_context(app, view);
Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule); Data delta_ctx = view_current_context_hook_memory(app, view, HookID_DeltaRule);

View File

@ -11,8 +11,8 @@
// TOP // TOP
#define FPS 60 #define FPS 60
#define frame_useconds (1000000 / FPS) #define frame_useconds (Million(1) / FPS)
#define frame_nseconds (UINT64_C(1000000000) / FPS) #define frame_nseconds (Billion(1) / FPS)
#define SLASH '/' #define SLASH '/'
#define DLL "so" #define DLL "so"
@ -168,7 +168,6 @@ struct Linux_Vars {
int epoll; int epoll;
int step_timer_fd; int step_timer_fd;
u64 last_step_time; u64 last_step_time;
b32 step_pending;
XCursor xcursors[APP_MOUSE_CURSOR_COUNT]; XCursor xcursors[APP_MOUSE_CURSOR_COUNT];
Application_Mouse_Cursor cursor; Application_Mouse_Cursor cursor;
@ -336,8 +335,8 @@ linux_system_get_file_list_filter(const struct dirent *dirent) {
} }
internal u64 internal u64
linux_ns_from_timespec(const struct timespec timespec) { linux_us_from_timespec(const struct timespec timespec) {
return timespec.tv_nsec + UINT64_C(1000000000) * timespec.tv_sec; return timespec.tv_nsec/Thousand(1) + Million(1) * timespec.tv_sec;
} }
internal File_Attribute_Flag internal File_Attribute_Flag
@ -351,29 +350,28 @@ internal File_Attributes
linux_file_attributes_from_struct_stat(struct stat* file_stat) { linux_file_attributes_from_struct_stat(struct stat* file_stat) {
File_Attributes result = {}; File_Attributes result = {};
result.size = file_stat->st_size; result.size = file_stat->st_size;
result.last_write_time = linux_ns_from_timespec(file_stat->st_mtim); result.last_write_time = linux_us_from_timespec(file_stat->st_mtim);
result.flags = linux_convert_file_attribute_flags(file_stat->st_mode); result.flags = linux_convert_file_attribute_flags(file_stat->st_mode);
return(result); return(result);
} }
internal void internal void
linux_schedule_step(){ linux_schedule_step(){
if(!__sync_bool_compare_and_swap(&linuxvars.step_pending, 0, 1)) {
return;
}
u64 now = system_now_time(); u64 now = system_now_time();
u64 diff = (now - linuxvars.last_step_time); u64 diff = (now - linuxvars.last_step_time);
struct itimerspec its = {}; struct itimerspec its = {};
timerfd_gettime(linuxvars.step_timer_fd, &its);
if(diff >= frame_nseconds) { if (diff > frame_useconds) {
its.it_value.tv_nsec = 1; its.it_value.tv_nsec = 1;
timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL);
} else { } else {
its.it_value.tv_nsec = frame_nseconds - diff; if (its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0){
its.it_value.tv_nsec = (frame_useconds - diff) * 1000UL;
timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL);
}
} }
timerfd_settime(linuxvars.step_timer_fd, 0, &its, NULL);
} }
enum wm_state_mode { enum wm_state_mode {
@ -583,8 +581,7 @@ linux_find_font(Face_Description* desc) {
} }
} }
FcPattern *pattern = FcPatternBuild( FcPattern *pattern = FcPatternBuild(0,
0,
FC_POSTSCRIPT_NAME, FcTypeString, name, FC_POSTSCRIPT_NAME, FcTypeString, name,
FC_SIZE, FcTypeDouble, size, FC_SIZE, FcTypeDouble, size,
FC_FONTFORMAT, FcTypeString, "TrueType", FC_FONTFORMAT, FcTypeString, "TrueType",
@ -1455,8 +1452,7 @@ linux_handle_x11_events() {
// Notify WM that we're still responding (don't grey our window out). // Notify WM that we're still responding (don't grey our window out).
else if(atom == linuxvars.atom__NET_WM_PING) { else if(atom == linuxvars.atom__NET_WM_PING) {
event.xclient.window = DefaultRootWindow(linuxvars.dpy); event.xclient.window = DefaultRootWindow(linuxvars.dpy);
XSendEvent( XSendEvent(linuxvars.dpy,
linuxvars.dpy,
event.xclient.window, event.xclient.window,
False, False,
SubstructureRedirectMask | SubstructureNotifyMask, SubstructureRedirectMask | SubstructureNotifyMask,
@ -1599,7 +1595,7 @@ main(int argc, char **argv){
//InitializeCriticalSection(&win32vars.thread_launch_mutex); //InitializeCriticalSection(&win32vars.thread_launch_mutex);
//InitializeConditionVariable(&win32vars.thread_launch_cv); //InitializeConditionVariable(&win32vars.thread_launch_cv);
linuxvars.clipboard_catch_all = true; linuxvars.clipboard_catch_all = false;
// NOTE(allen): load core // NOTE(allen): load core
System_Library core_library = {}; System_Library core_library = {};
@ -1729,6 +1725,7 @@ main(int argc, char **argv){
linux_schedule_step(); linux_schedule_step();
b32 first_step = true; b32 first_step = true;
u64 timer_start = system_now_time();
for (;;) { for (;;) {
@ -1813,11 +1810,17 @@ main(int argc, char **argv){
gl_render(&render_target); gl_render(&render_target);
glXSwapBuffers(linuxvars.dpy, linuxvars.win); glXSwapBuffers(linuxvars.dpy, linuxvars.win);
// TODO(allen): don't let the screen size change until HERE after the render
// NOTE(allen): Schedule a step if necessary
if (result.animating){
linux_schedule_step();
}
first_step = false; first_step = false;
linalloc_clear(linuxvars.frame_arena); linalloc_clear(linuxvars.frame_arena);
block_zero_struct(&linuxvars.input.trans); block_zero_struct(&linuxvars.input.trans);
linuxvars.step_pending = false;
} }
return 0; return 0;

View File

@ -267,8 +267,8 @@ internal u64
system_now_time(void){ system_now_time(void){
//LINUX_FN_DEBUG(); //LINUX_FN_DEBUG();
struct timespec time; struct timespec time;
clock_gettime(CLOCK_MONOTONIC_RAW, &time); clock_gettime(CLOCK_MONOTONIC, &time);
return linux_ns_from_timespec(time); return linux_us_from_timespec(time);
} }
internal Plat_Handle internal Plat_Handle

View File

@ -86,7 +86,7 @@
#define frame_useconds (1000000UL / FPS) #define frame_useconds (1000000UL / FPS)
#define LINUX_FN_DEBUG(fmt, ...) do { \ #define LINUX_FN_DEBUG(fmt, ...) do { \
/*LOGF("%s: " fmt "\n", __func__, ##__VA_ARGS__);*/ \ /*LOGF("%s: " fmt "\n", __func__, ##__VA_ARGS__);*/ \
} while (0) } while (0)
// TODO(allen): Make an intrinsics header that uses the cracked OS to define a single set of intrinsic names. // TODO(allen): Make an intrinsics header that uses the cracked OS to define a single set of intrinsic names.
@ -547,41 +547,41 @@ Sys_Font_Path(name, parameters){
Font_Path path = {}; Font_Path path = {};
FcPattern *pattern_regular = FcPatternBuild( FcPattern *pattern_regular = FcPatternBuild(
0, 0,
FC_POSTSCRIPT_NAME, FcTypeString, name, FC_POSTSCRIPT_NAME, FcTypeString, name,
FC_SIZE, FcTypeDouble, (double)parameters->pt_size, FC_SIZE, FcTypeDouble, (double)parameters->pt_size,
FC_FONTFORMAT, FcTypeString, "TrueType", FC_FONTFORMAT, FcTypeString, "TrueType",
FC_STYLE, FcTypeString, (FcChar8*)"Regular", FC_STYLE, FcTypeString, (FcChar8*)"Regular",
(void*)0); (void*)0);
FcPattern *pattern_styled = 0; FcPattern *pattern_styled = 0;
if (parameters->italics || parameters->bold){ if (parameters->italics || parameters->bold){
if (parameters->italics && !parameters->bold){ if (parameters->italics && !parameters->bold){
pattern_styled = FcPatternBuild( pattern_styled = FcPatternBuild(
0, 0,
FC_POSTSCRIPT_NAME, FcTypeString, name, FC_POSTSCRIPT_NAME, FcTypeString, name,
FC_SIZE, FcTypeDouble, (double)parameters->pt_size, FC_SIZE, FcTypeDouble, (double)parameters->pt_size,
FC_FONTFORMAT, FcTypeString, "TrueType", FC_FONTFORMAT, FcTypeString, "TrueType",
FC_STYLE, FcTypeString, (FcChar8*)"Italic", FC_STYLE, FcTypeString, (FcChar8*)"Italic",
(void*)0); (void*)0);
} }
else if (!parameters->italics && parameters->bold){ else if (!parameters->italics && parameters->bold){
pattern_styled = FcPatternBuild( pattern_styled = FcPatternBuild(
0, 0,
FC_POSTSCRIPT_NAME, FcTypeString, name, FC_POSTSCRIPT_NAME, FcTypeString, name,
FC_SIZE, FcTypeDouble, (double)parameters->pt_size, FC_SIZE, FcTypeDouble, (double)parameters->pt_size,
FC_FONTFORMAT, FcTypeString, "TrueType", FC_FONTFORMAT, FcTypeString, "TrueType",
FC_STYLE, FcTypeString, (FcChar8*)"Bold", FC_STYLE, FcTypeString, (FcChar8*)"Bold",
(void*)0); (void*)0);
} }
else{ else{
pattern_styled = FcPatternBuild( pattern_styled = FcPatternBuild(
0, 0,
FC_POSTSCRIPT_NAME, FcTypeString, name, FC_POSTSCRIPT_NAME, FcTypeString, name,
FC_SIZE, FcTypeDouble, (double)parameters->pt_size, FC_SIZE, FcTypeDouble, (double)parameters->pt_size,
FC_FONTFORMAT, FcTypeString, "TrueType", FC_FONTFORMAT, FcTypeString, "TrueType",
FC_STYLE, FcTypeString, (FcChar8*)"Bold Italic", FC_STYLE, FcTypeString, (FcChar8*)"Bold Italic",
(void*)0); (void*)0);
} }
} }
@ -672,9 +672,9 @@ linux_get_loadable_fonts(Partition *part, Font_Setup_List *list){
} }
FcPattern* pat = FcPatternBuild( FcPattern* pat = FcPatternBuild(
0, 0,
FC_STYLE, FcTypeString, (FcChar8*)"Regular", FC_STYLE, FcTypeString, (FcChar8*)"Regular",
(void*)0); (void*)0);
FcObjectSet* os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char*)0); FcObjectSet* os = FcObjectSetBuild(FC_FAMILY, FC_FILE, (char*)0);
FcFontSet* fs = FcFontList(fc_config, pat, os); FcFontSet* fs = FcFontList(fc_config, pat, os);
if (fs != 0){ if (fs != 0){
@ -778,7 +778,7 @@ InitializeOpenGLContext(Display *XDisplay, Window XWindow, GLXFBConfig *best_con
if (glXCreateContextAttribsARB == 0){ if (glXCreateContextAttribsARB == 0){
//LOG("glXCreateContextAttribsARB() not found, using old-style GLX context\n" ); //LOG("glXCreateContextAttribsARB() not found, using old-style GLX context\n" );
ctx = glXCreateNewContext( XDisplay, *best_config, GLX_RGBA_TYPE, 0, True ); ctx = glXCreateNewContext( XDisplay, *best_config, GLX_RGBA_TYPE, 0, True );
} }
else{ else{
int context_attribs[] = { int context_attribs[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB, 2, GLX_CONTEXT_MAJOR_VERSION_ARB, 2,
@ -926,7 +926,7 @@ ChooseGLXConfig(Display *XDisplay, int XScreenIndex)
GLX_STENCIL_SIZE , 8, GLX_STENCIL_SIZE , 8,
GLX_DOUBLEBUFFER , True, GLX_DOUBLEBUFFER , True,
None None
}; };
int ConfigCount = 0; int ConfigCount = 0;
GLXFBConfig *Configs = glXChooseFBConfig(XDisplay, XScreenIndex, DesiredAttributes, &ConfigCount); GLXFBConfig *Configs = glXChooseFBConfig(XDisplay, XScreenIndex, DesiredAttributes, &ConfigCount);
@ -1196,7 +1196,7 @@ LinuxGetXSettingsDPI(Display* dpy, int screen)
Window xset_win = XGetSelectionOwner(dpy, XSET_SEL); Window xset_win = XGetSelectionOwner(dpy, XSET_SEL);
if (xset_win == None){ if (xset_win == None){
// TODO(inso): listen for the ClientMessage about it becoming available? // TODO(inso): listen for the ClientMessage about it becoming available?
// there's not much point atm if DPI scaling is only done at startup // there's not much point atm if DPI scaling is only done at startup
goto out; goto out;
} }
@ -1760,11 +1760,11 @@ linux_handle_x11_events(void)
else if ((Atom)event.xclient.data.l[0] == linuxvars.atom__NET_WM_PING){ else if ((Atom)event.xclient.data.l[0] == linuxvars.atom__NET_WM_PING){
event.xclient.window = DefaultRootWindow(linuxvars.XDisplay); event.xclient.window = DefaultRootWindow(linuxvars.XDisplay);
XSendEvent( XSendEvent(
linuxvars.XDisplay, linuxvars.XDisplay,
event.xclient.window, event.xclient.window,
False, False,
SubstructureRedirectMask | SubstructureNotifyMask, SubstructureRedirectMask | SubstructureNotifyMask,
&event); &event);
} }
}break; }break;
@ -1792,14 +1792,14 @@ linux_handle_x11_events(void)
if (request.target == linuxvars.atom_TARGETS){ if (request.target == linuxvars.atom_TARGETS){
XChangeProperty( XChangeProperty(
request.display, request.display,
request.requestor, request.requestor,
request.property, request.property,
XA_ATOM, XA_ATOM,
32, 32,
PropModeReplace, PropModeReplace,
(u8*)atoms, (u8*)atoms,
ArrayCount(atoms)); ArrayCount(atoms));
response.property = request.property; response.property = request.property;
@ -1814,15 +1814,15 @@ linux_handle_x11_events(void)
if (found){ if (found){
XChangeProperty( XChangeProperty(
request.display, request.display,
request.requestor, request.requestor,
request.property, request.property,
request.target, request.target,
8, 8,
PropModeReplace, PropModeReplace,
(u8*)linuxvars.clipboard_outgoing.str, (u8*)linuxvars.clipboard_outgoing.str,
linuxvars.clipboard_outgoing.size linuxvars.clipboard_outgoing.size
); );
response.property = request.property; response.property = request.property;
} }
@ -1915,7 +1915,7 @@ main(int argc, char **argv){
memory_init(); memory_init();
// //
// HACK(allen): // HACK(allen):
// Previously zipped stuff is here, it should be zipped in the new pattern now. // Previously zipped stuff is here, it should be zipped in the new pattern now.
// //

View File

@ -1343,9 +1343,9 @@ win32_gl_create_window(HWND *wnd_out, HGLRC *context_out, DWORD style, RECT rect
// NOTE(allen): Load wgl extensions // NOTE(allen): Load wgl extensions
#define LoadWGL(f,l) Stmnt((f) = (f##_Function*)wglGetProcAddress(#f); \ #define LoadWGL(f,l) Stmnt((f) = (f##_Function*)wglGetProcAddress(#f); \
(l) = (l) && win32_wgl_good((Void_Func*)(f));) (l) = (l) && win32_wgl_good((Void_Func*)(f));)
b32 load_success = true; b32 load_success = true;
LoadWGL(wglCreateContextAttribsARB, load_success); LoadWGL(wglCreateContextAttribsARB, load_success);
LoadWGL(wglChoosePixelFormatARB, load_success); LoadWGL(wglChoosePixelFormatARB, load_success);
LoadWGL(wglGetExtensionsStringEXT, load_success); LoadWGL(wglGetExtensionsStringEXT, load_success);