diff --git a/gfx/common/d3d_common.c b/gfx/common/d3d_common.c index 9362cedd09..1522fe8853 100644 --- a/gfx/common/d3d_common.c +++ b/gfx/common/d3d_common.c @@ -118,7 +118,8 @@ int32_t d3d_translate_filter(unsigned type) case RARCH_FILTER_UNSPEC: { settings_t *settings = config_get_ptr(); - if (!settings->bools.video_smooth) + bool video_smooth = settings->bools.video_smooth; + if (!video_smooth) break; } /* fall-through */ @@ -140,19 +141,19 @@ void d3d_input_driver(const char* input_name, const char* joypad_name, if (string_is_equal(input_name, "xinput")) { void *xinput = input_xinput.init(joypad_name); - *input = xinput ? (input_driver_t*)&input_xinput : NULL; - *input_data = xinput; + *input = xinput ? (input_driver_t*)&input_xinput : NULL; + *input_data = xinput; } else { - void *uwp = input_uwp.init(joypad_name); - *input = uwp ? (input_driver_t*)&input_uwp : NULL; - *input_data = uwp; + void *uwp = input_uwp.init(joypad_name); + *input = uwp ? (input_driver_t*)&input_uwp : NULL; + *input_data = uwp; } #elif defined(_XBOX) - void *xinput = input_xinput.init(joypad_name); - *input = xinput ? (input_driver_t*)&input_xinput : NULL; - *input_data = xinput; + void *xinput = input_xinput.init(joypad_name); + *input = xinput ? (input_driver_t*)&input_xinput : NULL; + *input_data = xinput; #else #if _WIN32_WINNT >= 0x0501 /* winraw only available since XP */ @@ -169,7 +170,7 @@ void d3d_input_driver(const char* input_name, const char* joypad_name, #ifdef HAVE_DINPUT *input_data = input_dinput.init(joypad_name); - *input = *input_data ? &input_dinput : NULL; + *input = *input_data ? &input_dinput : NULL; #endif #endif } diff --git a/gfx/common/metal_common.m b/gfx/common/metal_common.m index f57cccc4bd..684596a2fa 100644 --- a/gfx/common/metal_common.m +++ b/gfx/common/metal_common.m @@ -355,32 +355,42 @@ - (void)_renderMessage:(const char *)msg info:(video_frame_info_t *)video_info { - settings_t *settings = config_get_ptr(); - if (settings && settings->bools.video_msg_bgcolor_enable) + settings_t *settings = config_get_ptr(); + bool msg_bgcolor_enable = settings->bools.video_msg_bgcolor_enable; + + if (msg_bgcolor_enable) { - int msg_width = + float r, g, b, a; + int msg_width = font_driver_get_message_width(NULL, msg, (unsigned)strlen(msg), 1.0f); + float font_size = settings->floats.video_font_size; + unsigned bgcolor_red + = settings->uints.video_msg_bgcolor_red; + unsigned bgcolor_green + = settings->uints.video_msg_bgcolor_green; + unsigned bgcolor_blue + = settings->uints.video_msg_bgcolor_blue; + float bgcolor_opacity = settings->floats.video_msg_bgcolor_opacity; + float x = video_info->font_msg_pos_x; + float y = 1.0f - video_info->font_msg_pos_y; + float width = msg_width / (float)_viewport->full_width; + float height = font_size / (float)_viewport->full_height; - float x = video_info->font_msg_pos_x; - float y = 1.0f - video_info->font_msg_pos_y; - float width = msg_width / (float)_viewport->full_width; - float height = - settings->floats.video_font_size / (float)_viewport->full_height; + float x2 = 0.005f; /* extend background around text */ + float y2 = 0.005f; - y -= height; + y -= height; - float x2 = 0.005f; /* extend background around text */ - float y2 = 0.005f; + x -= x2; + y -= y2; + width += x2; + height += y2; - x -= x2; - y -= y2; - width += x2; - height += y2; + r = bgcolor_red / 255.0f; + g = bgcolor_green / 255.0f; + b = bgcolor_blue / 255.0f; + a = bgcolor_opacity; - float r = settings->uints.video_msg_bgcolor_red / 255.0f; - float g = settings->uints.video_msg_bgcolor_green / 255.0f; - float b = settings->uints.video_msg_bgcolor_blue / 255.0f; - float a = settings->floats.video_msg_bgcolor_opacity; [_context resetRenderViewport:kFullscreenViewport]; [_context drawQuadX:x y:y w:width h:height r:r g:g b:b a:a]; } @@ -392,10 +402,10 @@ { video_viewport_t vp = *_viewport; video_driver_update_viewport(_viewport, NO, _keepAspect); + if (memcmp(&vp, _viewport, sizeof(vp)) != 0) - { _context.viewport = _viewport; - } + [_context begin]; } @@ -403,7 +413,7 @@ { id rce = _context.rce; - // draw back buffer + /* draw back buffer */ [rce pushDebugGroup:@"core frame"]; [_frameView drawWithContext:_context]; @@ -1182,11 +1192,11 @@ typedef struct MTLALIGN(16) [self _freeVideoShader:_shader]; _shader = nil; - config_file_t *conf = video_shader_read_preset(path.UTF8String); - struct video_shader *shader = (struct video_shader *)calloc(1, sizeof(*shader)); - - settings_t *settings = config_get_ptr(); - NSString *shadersPath = [NSString stringWithFormat:@"%s/", settings->paths.directory_video_shader]; + config_file_t *conf = video_shader_read_preset(path.UTF8String); + struct video_shader *shader = (struct video_shader *)calloc(1, sizeof(*shader)); + settings_t *settings = config_get_ptr(); + const char *dir_video_shader = settings->paths.directory_video_shader; + NSString *shadersPath = [NSString stringWithFormat:@"%s/", dir_video_shader]; @try { @@ -1252,15 +1262,16 @@ typedef struct MTLALIGN(16) // vertex descriptor @try { - MTLVertexDescriptor *vd = [MTLVertexDescriptor new]; - vd.attributes[0].offset = offsetof(VertexSlang, position); - vd.attributes[0].format = MTLVertexFormatFloat4; + NSError *err; + MTLVertexDescriptor *vd = [MTLVertexDescriptor new]; + vd.attributes[0].offset = offsetof(VertexSlang, position); + vd.attributes[0].format = MTLVertexFormatFloat4; vd.attributes[0].bufferIndex = 4; - vd.attributes[1].offset = offsetof(VertexSlang, texCoord); - vd.attributes[1].format = MTLVertexFormatFloat2; + vd.attributes[1].offset = offsetof(VertexSlang, texCoord); + vd.attributes[1].format = MTLVertexFormatFloat2; vd.attributes[1].bufferIndex = 4; - vd.layouts[4].stride = sizeof(VertexSlang); - vd.layouts[4].stepFunction = MTLVertexStepFunctionPerVertex; + vd.layouts[4].stride = sizeof(VertexSlang); + vd.layouts[4].stepFunction = MTLVertexStepFunctionPerVertex; MTLRenderPipelineDescriptor *psd = [MTLRenderPipelineDescriptor new]; @@ -1271,18 +1282,17 @@ typedef struct MTLALIGN(16) ca.pixelFormat = SelectOptimalPixelFormat(glslang_format_to_metal(_engine.pass[i].semantics.format)); - // TODO(sgc): confirm we never need blending for render passes - ca.blendingEnabled = NO; - ca.sourceAlphaBlendFactor = MTLBlendFactorSourceAlpha; - ca.sourceRGBBlendFactor = MTLBlendFactorSourceAlpha; + /* TODO(sgc): confirm we never need blending for render passes */ + ca.blendingEnabled = NO; + ca.sourceAlphaBlendFactor = MTLBlendFactorSourceAlpha; + ca.sourceRGBBlendFactor = MTLBlendFactorSourceAlpha; ca.destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha; - ca.destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha; + ca.destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha; - psd.sampleCount = 1; - psd.vertexDescriptor = vd; + psd.sampleCount = 1; + psd.vertexDescriptor = vd; - NSError *err; - id lib = [_context.device newLibraryWithSource:vs_src options:nil error:&err]; + id lib = [_context.device newLibraryWithSource:vs_src options:nil error:&err]; if (err != nil) { if (lib == nil) @@ -1327,9 +1337,7 @@ typedef struct MTLALIGN(16) { unsigned int size = _engine.pass[i].semantics.cbuffers[j].size; if (size == 0) - { continue; - } id buf = [_context.device newBufferWithLength:size options:MTLResourceStorageModeManaged]; STRUCT_ASSIGN(_engine.pass[i].buffers[j], buf); @@ -1338,11 +1346,11 @@ typedef struct MTLALIGN(16) { if (save_msl) { + NSError *err = nil; NSString *basePath = [[NSString stringWithUTF8String:shader->pass[i].source.path] stringByDeletingPathExtension]; RARCH_LOG("[Metal]: saving metal shader files to %s\n", basePath.UTF8String); - NSError *err = nil; [vs_src writeToFile:[basePath stringByAppendingPathExtension:@"vs.metal"] atomically:NO encoding:NSStringEncodingConversionAllowLossy @@ -1375,7 +1383,7 @@ typedef struct MTLALIGN(16) for (i = 0; i < shader->luts; i++) { struct texture_image image = {0}; - image.supports_rgba = true; + image.supports_rgba = true; if (!image_texture_load(&image, shader->lut[i].path)) return NO; diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index f3ce176625..31fb5298e2 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -579,10 +579,12 @@ static void win32_save_position(void) { RECT rect; WINDOWPLACEMENT placement; - int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); - int title_bar_height = GetSystemMetrics(SM_CYCAPTION); - int menu_bar_height = GetSystemMetrics(SM_CYMENU); - settings_t *settings = config_get_ptr(); + int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME); + int title_bar_height = GetSystemMetrics(SM_CYCAPTION); + int menu_bar_height = GetSystemMetrics(SM_CYMENU); + settings_t *settings = config_get_ptr(); + bool window_save_positions = settings->bools.video_window_save_positions; + bool video_fullscreen = settings->bools.video_fullscreen; memset(&placement, 0, sizeof(placement)); @@ -598,9 +600,11 @@ static void win32_save_position(void) g_win32_pos_width = rect.right - rect.left; g_win32_pos_height = rect.bottom - rect.top; } - if (settings && settings->bools.video_window_save_positions) + if (window_save_positions) { - if (!settings->bools.video_fullscreen && !retroarch_is_forced_fullscreen() && !retroarch_is_switching_display_mode()) + if ( !video_fullscreen && + !retroarch_is_forced_fullscreen() && + !retroarch_is_switching_display_mode()) { settings->uints.window_position_x = g_win32_pos_x; settings->uints.window_position_y = g_win32_pos_y; @@ -1463,13 +1467,16 @@ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, settings_t *settings = config_get_ptr(); if (fullscreen) { + float video_refresh = settings->floats.video_refresh_rate; + unsigned swap_interval = settings->uints.video_swap_interval; + bool bfi = settings->bools.video_black_frame_insertion; /* Windows only reports the refresh rates for modelines as * an integer, so video_refresh_rate needs to be rounded. Also, account * for black frame insertion using video_refresh_rate set to half * of the display refresh rate, as well as higher vsync swap intervals. */ - float refresh_mod = settings->bools.video_black_frame_insertion ? 2.0f : 1.0f; - unsigned refresh = roundf(settings->floats.video_refresh_rate - * refresh_mod * settings->uints.video_swap_interval); + float refresh_mod = bfi ? 2.0f : 1.0f; + unsigned refresh = roundf(video_refresh * refresh_mod + * swap_interval); if (windowed_full) { diff --git a/gfx/drivers/network_gfx.c b/gfx/drivers/network_gfx.c index 52501e6689..6546a89e5d 100644 --- a/gfx/drivers/network_gfx.c +++ b/gfx/drivers/network_gfx.c @@ -67,13 +67,14 @@ static unsigned *network_video_temp_buf = NULL; static void *network_gfx_init(const video_info_t *video, input_driver_t **input, void **input_data) { + int fd; gfx_ctx_input_t inp; void *ctx_data = NULL; - settings_t *settings = config_get_ptr(); - network_video_t *network = (network_video_t*)calloc(1, sizeof(*network)); const gfx_ctx_driver_t *ctx_driver = NULL; struct addrinfo *addr = NULL, *next_addr = NULL; - int fd; + settings_t *settings = config_get_ptr(); + network_video_t *network = (network_video_t*)calloc(1, sizeof(*network)); + bool video_font_enable = settings->bools.video_font_enable; *input = NULL; *input_data = NULL; @@ -106,7 +107,7 @@ static void *network_gfx_init(const video_info_t *video, video_context_driver_input_driver(&inp); - if (settings->bools.video_font_enable) + if (font_enable) font_driver_init_osd(network, video, false, diff --git a/gfx/drivers/sdl2_gfx.c b/gfx/drivers/sdl2_gfx.c index 2800de601e..5fdb530aeb 100644 --- a/gfx/drivers/sdl2_gfx.c +++ b/gfx/drivers/sdl2_gfx.c @@ -96,16 +96,20 @@ static INLINE void sdl_tex_zero(sdl2_tex_t *t) } static void sdl2_init_font(sdl2_video_t *vid, const char *font_path, - unsigned font_size) + unsigned font_size) { int i, r, g, b; SDL_Color colors[256]; - SDL_Surface *tmp = NULL; - SDL_Palette *pal = NULL; + SDL_Surface *tmp = NULL; + SDL_Palette *pal = NULL; const struct font_atlas *atlas = NULL; - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); + bool video_font_enable = settings->bools.video_font_enable; + float msg_color_r = settings->floats.video_msg_color_r; + float msg_color_g = settings->floats.video_msg_color_g; + float msg_color_b = settings->floats.video_msg_color_b; - if (!settings->bools.video_font_enable) + if (!video_font_enable) return; if (!font_renderer_create_default( @@ -116,21 +120,22 @@ static void sdl2_init_font(sdl2_video_t *vid, const char *font_path, return; } - r = settings->floats.video_msg_color_r * 255; - g = settings->floats.video_msg_color_g * 255; - b = settings->floats.video_msg_color_b * 255; + r = msg_color_r * 255; + g = msg_color_g * 255; + b = msg_color_b * 255; - r = (r < 0) ? 0 : (r > 255 ? 255 : r); - g = (g < 0) ? 0 : (g > 255 ? 255 : g); - b = (b < 0) ? 0 : (b > 255 ? 255 : b); + r = (r < 0) ? 0 : (r > 255 ? 255 : r); + g = (g < 0) ? 0 : (g > 255 ? 255 : g); + b = (b < 0) ? 0 : (b > 255 ? 255 : b); vid->font_r = r; vid->font_g = g; vid->font_b = b; - atlas = vid->font_driver->get_atlas(vid->font_data); + atlas = vid->font_driver->get_atlas(vid->font_data); - tmp = SDL_CreateRGBSurfaceFrom(atlas->buffer, atlas->width, + tmp = SDL_CreateRGBSurfaceFrom( + atlas->buffer, atlas->width, atlas->height, 8, atlas->width, 0, 0, 0, 0); @@ -164,20 +169,21 @@ static void sdl2_init_font(sdl2_video_t *vid, const char *font_path, static void sdl2_render_msg(sdl2_video_t *vid, const char *msg) { - int x, y, delta_x, delta_y; - unsigned width = vid->vp.width; - unsigned height = vid->vp.height; + int delta_x = 0; + int delta_y = 0; + unsigned width = vid->vp.width; + unsigned height = vid->vp.height; settings_t *settings = config_get_ptr(); + float msg_pos_x = settings->floats.video_msg_pos_x; + float msg_pos_y = settings->floats.video_msg_pos_y; + int x = msg_pos_x * width; + int y = (1.0f - msg_pos_y) * height; if (!vid->font_data) return; - x = settings->floats.video_msg_pos_x * width; - y = (1.0f - settings->floats.video_msg_pos_y) * height; - delta_x = 0; - delta_y = 0; - - SDL_SetTextureColorMod(vid->font.tex, vid->font_r, vid->font_g, vid->font_b); + SDL_SetTextureColorMod(vid->font.tex, + vid->font_r, vid->font_g, vid->font_b); for (; *msg; msg++) { @@ -258,7 +264,9 @@ static void sdl_refresh_renderer(sdl2_video_t *vid) static void sdl_refresh_viewport(sdl2_video_t *vid) { int win_w, win_h; - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); + bool video_scale_integer = settings->bools.video_scale_integer; + unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx; SDL_GetWindowSize(vid->window, &win_w, &win_h); @@ -269,11 +277,11 @@ static void sdl_refresh_viewport(sdl2_video_t *vid) vid->vp.full_width = win_w; vid->vp.full_height = win_h; - if (settings->bools.video_scale_integer) + if (video_scale_integer) video_viewport_get_scaled_integer(&vid->vp, win_w, win_h, video_driver_get_aspect_ratio(), vid->video.force_aspect); - else if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) + else if (aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const struct video_viewport *custom = (const struct video_viewport*)video_viewport_get_custom(); @@ -428,7 +436,9 @@ static void *sdl2_gfx_init(const video_info_t *video, SDL_ShowCursor(SDL_DISABLE); sdl2_init_renderer(vid); - sdl2_init_font(vid, settings->paths.path_font, settings->floats.video_font_size); + sdl2_init_font(vid, + settings->paths.path_font, + settings->floats.video_font_size); #if defined(_WIN32) sdl2_set_handles(vid->window, RARCH_DISPLAY_WIN32); @@ -455,7 +465,8 @@ static void check_window(sdl2_video_t *vid) SDL_Event event; SDL_PumpEvents(); - while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_QUIT, SDL_WINDOWEVENT) > 0) + while (SDL_PeepEvents(&event, 1, + SDL_GETEVENT, SDL_QUIT, SDL_WINDOWEVENT) > 0) { switch (event.type) { @@ -520,7 +531,7 @@ static void sdl2_gfx_set_nonblock_state(void *data, bool toggle, { sdl2_video_t *vid = (sdl2_video_t*)data; - vid->video.vsync = !toggle; + vid->video.vsync = !toggle; sdl_refresh_renderer(vid); } diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index 17fd44d972..2e43333795 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -252,6 +252,10 @@ static void *sdl_gfx_init(const video_info_t *video, settings_t *settings = config_get_ptr(); const char *path_font = settings->paths.path_font; float video_font_size = settings->floats.video_font_size; + bool video_font_enable = settings->bools.video_font_enable; + float msg_color_r = settings->floats.video_msg_color_r; + float msg_color_g = settings->floats.video_msg_color_g; + float msg_color_b = settings->floats.video_msg_color_b; #ifdef HAVE_X11 XInitThreads(); @@ -313,11 +317,11 @@ static void *sdl_gfx_init(const video_info_t *video, } sdl_init_font(vid, - settings->bools.video_font_enable + video_font_enable, path_font, video_font_size, - settings->floats.video_msg_color_r, - settings->floats.video_msg_color_g, - settings->floats.video_msg_color_b); + msg_color_r, + msg_color_g, + msg_color_b); vid->scaler.scaler_type = video->smooth ? SCALER_TYPE_BILINEAR : SCALER_TYPE_POINT; vid->scaler.in_fmt = video->rgb32 ? SCALER_FMT_ARGB8888 : SCALER_FMT_RGB565; diff --git a/gfx/drivers_context/cocoa_gl_ctx.m b/gfx/drivers_context/cocoa_gl_ctx.m index e036551ac7..e20d21844c 100644 --- a/gfx/drivers_context/cocoa_gl_ctx.m +++ b/gfx/drivers_context/cocoa_gl_ctx.m @@ -212,34 +212,35 @@ static float get_from_selector(Class obj_class, id obj_id, SEL selector, CGFloat void *get_chosen_screen(void) { + unsigned monitor_index; settings_t *settings = config_get_ptr(); - NSArray *screens = [RAScreen screens]; + NSArray *screens = [RAScreen screens]; if (!screens || !settings) return NULL; - if (settings->uints.video_monitor_index >= screens.count) + monitor_index = settings->uints.video_monitor_index; + + if (monitor_index >= screens.count) { RARCH_WARN("video_monitor_index is greater than the number of connected monitors; using main screen instead."); return (BRIDGE void*)screens; } - return ((BRIDGE void*)[screens objectAtIndex:settings->uints.video_monitor_index]); + return ((BRIDGE void*)[screens objectAtIndex:monitor_index]); } float get_backing_scale_factor(void) { static float - backing_scale_def = 0.0f; + backing_scale_def = 0.0f; RAScreen *screen = NULL; - (void)screen; - if (backing_scale_def != 0.0f) return backing_scale_def; - backing_scale_def = 1.0f; + backing_scale_def = 1.0f; #if defined(HAVE_COCOA) || defined(HAVE_COCOA_METAL) - screen = (BRIDGE RAScreen*)get_chosen_screen(); + screen = (BRIDGE RAScreen*)get_chosen_screen(); if (screen) { diff --git a/gfx/drivers_context/vc_egl_ctx.c b/gfx/drivers_context/vc_egl_ctx.c index a8af883f5a..0a98ca621e 100644 --- a/gfx/drivers_context/vc_egl_ctx.c +++ b/gfx/drivers_context/vc_egl_ctx.c @@ -105,14 +105,15 @@ static void gfx_ctx_vc_check_window(void *data, bool *quit, static void gfx_ctx_vc_get_video_size(void *data, unsigned *width, unsigned *height) { - vc_ctx_data_t *vc = (vc_ctx_data_t*)data; - settings_t *settings = config_get_ptr(); + vc_ctx_data_t *vc = (vc_ctx_data_t*)data; + settings_t *settings = config_get_ptr(); + unsigned fullscreen_x = settings->uints.video_fullscreen_x; + unsigned fullscreen_y = settings->uints.video_fullscreen_y; /* Use dispmanx upscaling if * fullscreen_x and fullscreen_y are set. */ - if (settings->uints.video_fullscreen_x != 0 && - settings->uints.video_fullscreen_y != 0) + if (fullscreen_x != 0 && fullscreen_y != 0) { /* Keep input and output aspect ratio equal. * There are other aspect ratio settings @@ -120,17 +121,16 @@ static void gfx_ctx_vc_get_video_size(void *data, /* Calculate source and destination aspect ratios. */ - float srcAspect = (float)settings->uints.video_fullscreen_x - / (float)settings->uints.video_fullscreen_y; - float dstAspect = (float)vc->fb_width / (float)vc->fb_height; + float src_aspect = (float)fullscreen_x / (float)fullscreen_y; + float dst_aspect = (float)vc->fb_width / (float)vc->fb_height; /* If source and destination aspect ratios * are not equal correct source width. */ - if (srcAspect != dstAspect) - *width = (unsigned)(settings->uints.video_fullscreen_y * dstAspect); + if (src_aspect != dst_aspect) + *width = (unsigned)(fullscreen_y * dst_aspect); else - *width = settings->uints.video_fullscreen_x; - *height = settings->uints.video_fullscreen_y; + *width = fullscreen_x; + *height = fullscreen_y; } else { @@ -183,8 +183,10 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) EGL_NONE }; #endif - settings_t *settings = config_get_ptr(); - vc_ctx_data_t *vc = NULL; + settings_t *settings = config_get_ptr(); + vc_ctx_data_t *vc = NULL; + unsigned fullscreen_x = settings->uints.video_fullscreen_x; + unsigned fullscreen_y = settings->uints.video_fullscreen_y; if (g_egl_inited) { @@ -202,10 +204,12 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) * Has to be done before any EGL call. * NOTE this is commented out because it should be the right way to do it, but * currently it doesn't work, so we are using an vsync callback based solution.*/ - /* if (video_info->max_swapchain_images <= 2) +#if 0 + if (video_info->max_swapchain_images <= 2) setenv("V3D_DOUBLE_BUFFER", "1", 1); else - setenv("V3D_DOUBLE_BUFFER", "0", 1); */ + setenv("V3D_DOUBLE_BUFFER", "0", 1); +#endif bcm_host_init(); @@ -226,7 +230,8 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) #endif /* Create an EGL window surface. */ - if (graphics_get_display_size(0 /* LCD */, &vc->fb_width, &vc->fb_height) < 0) + if (graphics_get_display_size(0 /* LCD */, + &vc->fb_width, &vc->fb_height) < 0) goto error; dst_rect.x = 0; @@ -239,21 +244,21 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) /* Use dispmanx upscaling if fullscreen_x * and fullscreen_y are set. */ - if ((settings->uints.video_fullscreen_x != 0) && - (settings->uints.video_fullscreen_y != 0)) + if ((fullscreen_x != 0) && + (fullscreen_y != 0)) { /* Keep input and output aspect ratio equal. * There are other aspect ratio settings which can be used to stretch video output. */ /* Calculate source and destination aspect ratios. */ - float srcAspect = (float)settings->uints.video_fullscreen_x / (float)settings->uints.video_fullscreen_y; - float dstAspect = (float)vc->fb_width / (float)vc->fb_height; + float src_aspect = (float)fullscreen_x / (float)fullscreen_y; + float dst_aspect = (float)vc->fb_width / (float)vc->fb_height; /* If source and destination aspect ratios are not equal correct source width. */ - if (srcAspect != dstAspect) - src_rect.width = (unsigned)(settings->uints.video_fullscreen_y * dstAspect) << 16; + if (src_aspect != dst_aspect) + src_rect.width = (unsigned)(fullscreen_y * dst_aspect) << 16; else - src_rect.width = settings->uints.video_fullscreen_x << 16; - src_rect.height = settings->uints.video_fullscreen_y << 16; + src_rect.width = fullscreen_x << 16; + src_rect.height = fullscreen_y << 16; } else { @@ -272,36 +277,43 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) alpha.opacity = 255; alpha.mask = 0; - dispman_element = vc_dispmanx_element_add(dispman_update, dispman_display, - 0 /*layer*/, &dst_rect, 0 /*src*/, - &src_rect, DISPMANX_PROTECTION_NONE, &alpha, 0 /*clamp*/, DISPMANX_NO_ROTATE); + dispman_element = vc_dispmanx_element_add( + dispman_update, + dispman_display, + 0 /*layer*/, + &dst_rect, + 0 /*src*/, + &src_rect, + DISPMANX_PROTECTION_NONE, + &alpha, + 0 /*clamp*/, + DISPMANX_NO_ROTATE); vc->native_window.element = dispman_element; /* Use dispmanx upscaling if fullscreen_x and fullscreen_y are set. */ - if (settings->uints.video_fullscreen_x != 0 && - settings->uints.video_fullscreen_y != 0) + if (fullscreen_x != 0 && + fullscreen_y != 0) { /* Keep input and output aspect ratio equal. * There are other aspect ratio settings which * can be used to stretch video output. */ /* Calculate source and destination aspect ratios. */ - float srcAspect = (float)settings->uints.video_fullscreen_x - / (float)settings->uints.video_fullscreen_y; + float srcAspect = (float)fullscreen_x / (float)fullscreen_y; float dstAspect = (float)vc->fb_width / (float)vc->fb_height; /* If source and destination aspect ratios are not equal correct source width. */ if (srcAspect != dstAspect) - vc->native_window.width = (unsigned)(settings->uints.video_fullscreen_y * dstAspect); + vc->native_window.width = (unsigned)(fullscreen_y * dstAspect); else - vc->native_window.width = settings->uints.video_fullscreen_x; - vc->native_window.height = settings->uints.video_fullscreen_y; + vc->native_window.width = fullscreen_x; + vc->native_window.height = fullscreen_y; } else { - vc->native_window.width = vc->fb_width; + vc->native_window.width = vc->fb_width; vc->native_window.height = vc->fb_height; } vc_dispmanx_update_submit_sync(dispman_update); @@ -368,10 +380,6 @@ static enum gfx_ctx_api gfx_ctx_vc_get_api(void *data) static bool gfx_ctx_vc_bind_api(void *data, enum gfx_ctx_api api, unsigned major, unsigned minor) { - (void)data; - (void)major; - (void)minor; - vc_api = api; switch (api) diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index 57e3c82108..d55628cee5 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -626,10 +626,13 @@ static bool gfx_ctx_x_set_video_mode(void *data, char *wm_name = NULL; int (*old_handler)(Display*, XErrorEvent*) = NULL; gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*)data; - Atom net_wm_icon = XInternAtom(g_x11_dpy, "_NET_WM_ICON", False); - Atom cardinal = XInternAtom(g_x11_dpy, "CARDINAL", False); - settings_t *settings = config_get_ptr(); - unsigned opacity = settings->uints.video_window_opacity * ((unsigned)-1 / 100.0); + Atom net_wm_icon = XInternAtom(g_x11_dpy, "_NET_WM_ICON", False); + Atom cardinal = XInternAtom(g_x11_dpy, "CARDINAL", False); + settings_t *settings = config_get_ptr(); + unsigned opacity = settings->uints.video_window_opacity + * ((unsigned)-1 / 100.0); + bool disable_composition = settings->bools.video_disable_composition; + bool show_decorations = settings->bools.video_window_show_decorations; frontend_driver_install_signal_handler(); @@ -734,9 +737,9 @@ static bool gfx_ctx_x_set_video_mode(void *data, XChangeProperty(g_x11_dpy, g_x11_win, net_wm_icon, cardinal, 32, PropModeReplace, (const unsigned char*)retroarch_icon_data, sizeof(retroarch_icon_data) / sizeof(*retroarch_icon_data)); - if (fullscreen && settings->bools.video_disable_composition) + if (fullscreen && disable_composition) { - uint32_t value = 1; + uint32_t value = 1; Atom net_wm_bypass_compositor = XInternAtom(g_x11_dpy, "_NET_WM_BYPASS_COMPOSITOR", False); RARCH_LOG("[GLX]: Requesting compositor bypass.\n"); @@ -749,14 +752,15 @@ static bool gfx_ctx_x_set_video_mode(void *data, XChangeProperty(g_x11_dpy, g_x11_win, net_wm_opacity, cardinal, 32, PropModeReplace, (const unsigned char*)&opacity, 1); } - if (!settings->bools.video_window_show_decorations) + if (!show_decorations) { - /* We could have just set _NET_WM_WINDOW_TYPE_DOCK instead, but that removes the window from any taskbar/panel, + /* We could have just set _NET_WM_WINDOW_TYPE_DOCK instead, + * but that removes the window from any taskbar/panel, * so we are forced to use the old motif hints method. */ Hints hints; - Atom property = XInternAtom(g_x11_dpy, "_MOTIF_WM_HINTS", False); + Atom property = XInternAtom(g_x11_dpy, "_MOTIF_WM_HINTS", False); - hints.flags = 2; + hints.flags = 2; hints.decorations = 0; XChangeProperty(g_x11_dpy, g_x11_win, property, property, 32, PropModeReplace, (const unsigned char*)&hints, 5);