Added a hack to fix DeadLock problem regrading the system_memory_annotation function. Also started working on fixing the performance issues that I discovered in the graphics renderer on retina displays (for now I changed to FCoder_View to be layer backed which is faster for rendering animations, this seems to improve performance by a little margin but rendering on high dpi displays is not closed to being smooth yet...).
							parent
							
								
									a737a5409a
								
							
						
					
					
						commit
						de9fc34c3e
					
				|  | @ -347,11 +347,11 @@ function Fancy_String* | |||
| push_fancy_string_fixed(Arena *arena, Fancy_Line *line, FColor fore, | ||||
|                         String_Const_u8 value, i32 max){ | ||||
|     if (value.size <= max){ | ||||
|         return(push_fancy_stringf(arena, line, 0, fore, 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fore, 0.f, 0.f, | ||||
|                                   "%-*.*s", max, string_expand(value))); | ||||
|     } | ||||
|     else{ | ||||
|         return(push_fancy_stringf(arena, line, 0, fore, 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fore, 0.f, 0.f, | ||||
|                                   "%-*.*s...", max - 3, string_expand(value))); | ||||
|     } | ||||
| } | ||||
|  | @ -360,12 +360,12 @@ push_fancy_string_fixed(Arena *arena, Fancy_Line *line, | |||
|                         f32 pre_margin, f32 post_margin, String_Const_u8 value, | ||||
|                         i32 max){ | ||||
|     if (value.size <= max){ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), | ||||
|                                   pre_margin, post_margin, | ||||
|                                   "%-*.*s", max, string_expand(value))); | ||||
|     } | ||||
|     else{ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), | ||||
|                                   pre_margin, post_margin, | ||||
|                                   "%-*.*s...", max - 3, string_expand(value))); | ||||
|     } | ||||
|  | @ -374,11 +374,11 @@ function Fancy_String* | |||
| push_fancy_string_fixed(Arena *arena, Fancy_Line *line, String_Const_u8 value, | ||||
|                         i32 max){ | ||||
|     if (value.size <= max){ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), 0.f, 0.f, | ||||
|                                   "%-*.*s", max, string_expand(value))); | ||||
|     } | ||||
|     else{ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), 0.f, 0.f, | ||||
|                                   "%-*.*s...", max - 3, string_expand(value))); | ||||
|     } | ||||
| } | ||||
|  | @ -452,11 +452,11 @@ function Fancy_String* | |||
| push_fancy_string_trunc(Arena *arena, Fancy_Line *line, FColor fore, | ||||
|                         String_Const_u8 value, i32 max){ | ||||
|     if (value.size <= max){ | ||||
|         return(push_fancy_stringf(arena, line, 0, fore, 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fore, 0.f, 0.f, | ||||
|                                   "%.*s", string_expand(value))); | ||||
|     } | ||||
|     else{ | ||||
|         return(push_fancy_stringf(arena, line, 0, fore, 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fore, 0.f, 0.f, | ||||
|                                   "%.*s...", max - 3, value.str)); | ||||
|     } | ||||
| } | ||||
|  | @ -465,12 +465,12 @@ push_fancy_string_trunc(Arena *arena, Fancy_Line *line, | |||
|                         f32 pre_margin, f32 post_margin, String_Const_u8 value, | ||||
|                         i32 max){ | ||||
|     if (value.size <= max){ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), | ||||
|                                   pre_margin, post_margin, | ||||
|                                   "%.*s", string_expand(value))); | ||||
|     } | ||||
|     else{ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), | ||||
|                                   pre_margin, post_margin, | ||||
|                                   "%.*s...", max - 3, value.str)); | ||||
|     } | ||||
|  | @ -479,11 +479,11 @@ function Fancy_String* | |||
| push_fancy_string_trunc(Arena *arena, Fancy_Line *line, String_Const_u8 value, | ||||
|                         i32 max){ | ||||
|     if (value.size <= max){ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), 0.f, 0.f, | ||||
|                                   "%.*s", string_expand(value))); | ||||
|     } | ||||
|     else{ | ||||
|         return(push_fancy_stringf(arena, line, 0, fcolor_zero(), 0.f, 0.f, | ||||
|         return(push_fancy_stringf(arena, line, (Face_ID)0, fcolor_zero(), 0.f, 0.f, | ||||
|                                   "%.*s...", max - 3, value.str)); | ||||
|     } | ||||
| } | ||||
|  | @ -620,7 +620,7 @@ draw_fancy_string__inner(Application_Links *app, Face_ID face, FColor fore, Fanc | |||
|             use_fore = string->fore; | ||||
|         } | ||||
|         if (use_face != 0){ | ||||
|         ARGB_Color use_argb = fcolor_resolve(use_fore); | ||||
|             ARGB_Color use_argb = fcolor_resolve(use_fore); | ||||
|             Face_Metrics metrics = get_face_metrics(app, use_face); | ||||
|             f32 down_shift = (base_line - metrics.ascent); | ||||
|             down_shift = clamp_bot(0.f, down_shift); | ||||
|  | @ -668,7 +668,7 @@ get_fancy_string_height(Application_Links *app, Face_ID face, | |||
| 
 | ||||
| function f32 | ||||
| get_fancy_string_text_height(Application_Links *app, Face_ID face, | ||||
|                         Fancy_String *string){ | ||||
|                              Fancy_String *string){ | ||||
|     Fancy_String *next = string->next; | ||||
|     string->next = 0; | ||||
|     f32 result = get_fancy_string_text_height__inner(app, face, string); | ||||
|  | @ -700,10 +700,10 @@ function f32 | |||
| get_fancy_line_width(Application_Links *app, Face_ID face, Fancy_Line *line){ | ||||
|     f32 result = 0.f; | ||||
|     if (line != 0){ | ||||
|     if (line->face != 0){ | ||||
|         face = line->face; | ||||
|     } | ||||
|     result = get_fancy_string_width__inner(app, face, line->first); | ||||
|         if (line->face != 0){ | ||||
|             face = line->face; | ||||
|         } | ||||
|         result = get_fancy_string_width__inner(app, face, line->first); | ||||
|     } | ||||
|     return(result); | ||||
| } | ||||
|  | @ -749,12 +749,12 @@ draw_fancy_line(Application_Links *app, Face_ID face, FColor fore, | |||
|                 Fancy_Line *line, Vec2_f32 p, u32 flags, Vec2_f32 delta){ | ||||
|     Vec2_f32 result = {}; | ||||
|     if (line != 0){ | ||||
|     if (line->face != 0){ | ||||
|         face = line->face; | ||||
|     } | ||||
|     if (fcolor_is_valid(line->fore)){ | ||||
|         fore = line->fore; | ||||
|     } | ||||
|         if (line->face != 0){ | ||||
|             face = line->face; | ||||
|         } | ||||
|         if (fcolor_is_valid(line->fore)){ | ||||
|             fore = line->fore; | ||||
|         } | ||||
|         result = draw_fancy_string__inner(app, face, fore, line->first, p, flags, delta); | ||||
|     } | ||||
|     return(result); | ||||
|  |  | |||
|  | @ -131,7 +131,6 @@ float shape_value = (1.0 - smoothstep(-1.0, 0.0, sd)); | |||
| shape_value *= has_thickness; | ||||
| 
 | ||||
| float4 out_color = float4(in.color.xyz, in.color.a * (sample_value + shape_value)); | ||||
| //float4 out_color = float4(1, 1, 1, shape_value); | ||||
| return(out_color); | ||||
| } | ||||
| )"; | ||||
|  | @ -274,9 +273,12 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
| } | ||||
| 
 | ||||
| - (void)drawInMTKView:(nonnull MTKView*)view{ | ||||
| #if FRED_INTERNAL | ||||
|     [capture_scope beginScope]; | ||||
| #endif | ||||
|      | ||||
|     // HACK(yuval): This is the best way I found to force valid width and height without drawing on the next draw cycle (1 frame delay). | ||||
|      | ||||
|     // HACK(yuval): This is the best way I found to force valid width and height without drawing on the next drawing cycle (1 frame delay). | ||||
|     CGSize drawable_size = [view drawableSize]; | ||||
|     i32 width = (i32)Min(_target->width, drawable_size.width); | ||||
|     i32 height = (i32)Min(_target->height, drawable_size.height); | ||||
|  | @ -293,8 +295,8 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|         render_pass_descriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.0f, 0.0f, 0.0f, 1.0f); | ||||
|          | ||||
|         // NOTE(yuval): Create the render command encoder | ||||
|         id<MTLRenderCommandEncoder> render_encoder | ||||
|             = [command_buffer renderCommandEncoderWithDescriptor:render_pass_descriptor]; | ||||
|         id<MTLRenderCommandEncoder> render_encoder = | ||||
|             [command_buffer renderCommandEncoderWithDescriptor:render_pass_descriptor]; | ||||
|         render_encoder.label = @"4coder Render Encoder"; | ||||
|          | ||||
|         // NOTE(yuval): Set the region of the drawable to draw into | ||||
|  | @ -303,7 +305,7 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|         // NOTE(yuval): Set the render pipeline to use for drawing | ||||
|         [render_encoder setRenderPipelineState:pipeline_state]; | ||||
|          | ||||
|         // NOTE(yuval): Calculate and pass in the projection matrix | ||||
|         // NOTE(yuval): Calculate the projection matrix | ||||
|         float left = 0, right = (float)width; | ||||
|         float bottom = (float)height, top = 0; | ||||
|         float near_depth = -1.0f, far_depth = 1.0f; | ||||
|  | @ -325,6 +327,8 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|          | ||||
|         u32 vertex_buffer_size = (all_vertex_count * sizeof(Render_Vertex)); | ||||
|          | ||||
|         printf("Vertices to render: %d\n", all_vertex_count); | ||||
|          | ||||
|         // NOTE(yuval): Find & Get a vertex buffer matching the required size | ||||
|         Metal_Buffer *buffer = [self get_reusable_buffer_with_size:vertex_buffer_size]; | ||||
|          | ||||
|  | @ -338,6 +342,8 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|                 length:sizeof(proj) | ||||
|                 atIndex:1]; | ||||
|          | ||||
|         u32 group_count = 0; | ||||
|          | ||||
|         u32 buffer_offset = 0; | ||||
|         for (Render_Group *group = _target->group_first; | ||||
|              group; | ||||
|  | @ -346,7 +352,6 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|             { | ||||
|                 Rect_i32 box = Ri32(group->clip_box); | ||||
|                  | ||||
|                  | ||||
|                 NSUInteger x0 = (NSUInteger)Min(Max(0, box.x0), width - 1); | ||||
|                 NSUInteger x1 = (NSUInteger)Min(Max(0, box.x1), width); | ||||
|                 NSUInteger y0 = (NSUInteger)Min(Max(0, box.y0), height - 1); | ||||
|  | @ -405,8 +410,12 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|                  | ||||
|                 buffer_offset += (vertex_count * sizeof(Render_Vertex)); | ||||
|             } | ||||
|              | ||||
|             ++group_count; | ||||
|         } | ||||
|          | ||||
|         printf("Group Count: %u\n", group_count); | ||||
|          | ||||
|         [render_encoder endEncoding]; | ||||
|          | ||||
|         // NOTE(yuval): Schedule a present once the framebuffer is complete using the current drawable | ||||
|  | @ -422,7 +431,9 @@ metal__make_buffer(u32 size, id<MTLDevice> device){ | |||
|     // NOTE(yuval): Finalize rendering here and push the command buffer to the GPU | ||||
|     [command_buffer commit]; | ||||
|      | ||||
| #if FRED_INTERNAL | ||||
|     [capture_scope endScope]; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| - (u32)get_texture_of_dim:(Vec3_i32)dim kind:(Texture_Kind)kind{ | ||||
|  |  | |||
|  | @ -315,6 +315,22 @@ mac_error_box(char *msg, b32 shutdown = true){ | |||
| 
 | ||||
| //////////////////////////////// | ||||
| 
 | ||||
| #if defined(FRED_INTERNAL) | ||||
| function inline void | ||||
| mac_profile(char *name, u64 begin, u64 end){ | ||||
|     printf("%s Time: %fs\n", name, ((end - begin) / 1000000.0f)); | ||||
| } | ||||
| 
 | ||||
| #define MacProfileScope(name) for (u64 glue(_i_, __LINE__) = 0, glue(_begin_, __LINE__) = system_now_time();\ | ||||
| glue(_i_, __LINE__) == 0;\ | ||||
| glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_time())) | ||||
| #else | ||||
| # define mac_profile(...) | ||||
| # define MacProfileScope(...) | ||||
| #endif | ||||
| 
 | ||||
| //////////////////////////////// | ||||
| 
 | ||||
| #import "mac_4ed_renderer.mm" | ||||
| 
 | ||||
| #include "4ed_font_provider_freetype.h" | ||||
|  | @ -545,21 +561,6 @@ mac_toggle_fullscreen(void){ | |||
| 
 | ||||
| //////////////////////////////// | ||||
| 
 | ||||
| #if defined(FRED_INTERNAL) | ||||
| function inline void | ||||
| mac_profile(char *name, u64 begin, u64 end){ | ||||
|     printf("%s Time: %fs\n", name, ((end - begin) / 1000000.0f)); | ||||
| } | ||||
| 
 | ||||
| #define MacProfileScope(name) for (u64 glue(_i_, __LINE__) = 0, glue(_begin_, __LINE__) = system_now_time();\ | ||||
| glue(_i_, __LINE__) == 0;\ | ||||
| glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_time())) | ||||
| #else | ||||
| # define MacProfileScope(...) | ||||
| #endif | ||||
| 
 | ||||
| //////////////////////////////// | ||||
| 
 | ||||
| @implementation FCoder_App_Delegate | ||||
| - (void)applicationDidFinishLaunching:(id)sender{ | ||||
| } | ||||
|  | @ -628,7 +629,12 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | |||
|     mac_resize(mac_vars.window); | ||||
| } | ||||
| 
 | ||||
| - (void)drawRect:(NSRect)bounds{ | ||||
| - (BOOL)wantsUpdateLayer | ||||
| { | ||||
|     return YES; | ||||
| } | ||||
| 
 | ||||
| - (void)updateLayer{ | ||||
|     u64 prev_timer_start; | ||||
|      | ||||
|     MacProfileScope("Draw Rect"){ | ||||
|  | @ -840,7 +846,9 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | |||
|     } | ||||
|      | ||||
|     mac_profile("Frame", prev_timer_start, mac_vars.timer_start); | ||||
| #if FRED_INTERNAL | ||||
|     printf("\n"); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| - (BOOL)acceptsFirstResponder{ | ||||
|  | @ -856,8 +864,6 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | |||
| } | ||||
| 
 | ||||
| - (void)keyDown:(NSEvent*)event{ | ||||
|     printf("Key Down: %#X\n", [event keyCode]); | ||||
|      | ||||
|     // NOTE(yuval): Process keyboard event | ||||
|     [self process_keyboard_event:event down:true]; | ||||
|      | ||||
|  | @ -896,7 +902,6 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | |||
| } | ||||
| 
 | ||||
| - (void)keyUp:(NSEvent*)event{ | ||||
|     printf("Key Up: %#X\n", [event keyCode]); | ||||
|     [self process_keyboard_event:event down:false]; | ||||
| } | ||||
| 
 | ||||
|  | @ -988,7 +993,7 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | |||
| } | ||||
| 
 | ||||
| - (void)request_display{ | ||||
|     printf("Display Requested!\n"); | ||||
|     //printf("Display Requested!\n"); | ||||
|     CGRect cg_rect = CGRectMake(0, 0, mac_vars.width, mac_vars.height); | ||||
|     NSRect rect = NSRectFromCGRect(cg_rect); | ||||
|     [self setNeedsDisplayInRect:rect]; | ||||
|  | @ -1068,6 +1073,10 @@ glue(_i_, __LINE__) = 1, mac_profile(name, glue(_begin_, __LINE__), system_now_t | |||
|     Vec2_i32 new_m = V2i32(backing_location.x, mac_vars.height - backing_location.y); | ||||
|     if (new_m != mac_vars.input_chunk.pers.mouse){ | ||||
|         mac_vars.input_chunk.pers.mouse = new_m; | ||||
|          | ||||
|         Rect_i32 screen = Ri32(0, 0, target.width, target.height); | ||||
|         mac_vars.input_chunk.trans.out_of_window = !rect_contains_point(screen, new_m); | ||||
|          | ||||
|     } | ||||
|      | ||||
|     system_signal_step(0); | ||||
|  | @ -1270,6 +1279,7 @@ main(int arg_count, char **args){ | |||
|         mac_vars.view = [[FCoder_View alloc] init]; | ||||
|         [mac_vars.view setFrame:[content_view bounds]]; | ||||
|         [mac_vars.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | ||||
|         mac_vars.view.wantsLayer = true; | ||||
|          | ||||
|         // NOTE(yuval): Display window and view | ||||
|         [content_view addSubview:mac_vars.view]; | ||||
|  |  | |||
|  | @ -844,7 +844,9 @@ system_memory_annotation_sig(){ | |||
|         for (Memory_Annotation_Tracker_Node *node = memory_tracker.first; | ||||
|              node != 0; | ||||
|              node = node->next){ | ||||
|             Memory_Annotation_Node *r_node = push_array(arena, Memory_Annotation_Node, 1); | ||||
|             // TODO(yuval): Fix the API so that annotations would not mess with the system memory. | ||||
|             // Memory_Annotation_Node *r_node = push_array(arena, Memory_Annotation_Node, 1); | ||||
|             Memory_Annotation_Node *r_node = (Memory_Annotation_Node*)malloc(sizeof(Memory_Annotation_Node)); | ||||
|             sll_queue_push(result.first, result.last, r_node); | ||||
|             result.count += 1; | ||||
|              | ||||
|  |  | |||
|  | @ -15,8 +15,6 @@ struct Mac_Metal{ | |||
| 
 | ||||
| function | ||||
| mac_render_sig(mac_metal__render){ | ||||
|     printf("Rendering using Metal!\n"); | ||||
|      | ||||
|     Mac_Metal *metal = (Mac_Metal*)renderer; | ||||
|     [metal->view draw]; | ||||
| } | ||||
|  | @ -77,8 +75,6 @@ mac_metal__init(NSWindow *window, Render_Target *target){ | |||
| // TODO(yuval): This function should be exported to a DLL | ||||
| function | ||||
| mac_load_renderer_sig(mac_load_metal_renderer){ | ||||
|     printf("Loding The Metal Renderer!\n"); | ||||
|      | ||||
|     Mac_Renderer *renderer = (Mac_Renderer*)mac_metal__init(window, target); | ||||
|     return(renderer); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuval Dolev
						Yuval Dolev