diff --git a/gfx/common/metal/Context.h b/gfx/common/metal/Context.h index e180ac5917..770fa3d55c 100644 --- a/gfx/common/metal/Context.h +++ b/gfx/common/metal/Context.h @@ -23,6 +23,11 @@ typedef struct __unsafe_unretained id buffer; } BufferRange; +typedef NS_ENUM(NSUInteger, ViewportResetMode) { + kFullscreenViewport, + kVideoViewport +}; + /*! @brief Context contains the render state used by various components */ @interface Context : NSObject @@ -59,8 +64,8 @@ typedef struct - (void)convertFormat:(RPixelFormat)fmt from:(id)src to:(id)dst; - (id)getStockShader:(int)index blend:(bool)blend; -/*! @brief resets the viewport for the main render encoder to the drawable size */ -- (void)resetRenderViewport; +/*! @brief resets the viewport for the main render encoder to \a mode */ +- (void)resetRenderViewport:(ViewportResetMode)mode; /*! @brief resets the scissor rect for the main render encoder to the drawable size */ - (void)resetScissorRect; diff --git a/gfx/common/metal/Context.m b/gfx/common/metal/Context.m index 1cef6ec0a7..22b1c13ead 100644 --- a/gfx/common/metal/Context.m +++ b/gfx/common/metal/Context.m @@ -583,13 +583,14 @@ return _rce; } -- (void)resetRenderViewport +- (void)resetRenderViewport:(ViewportResetMode)mode { + bool fullscreen = mode == kFullscreenViewport; MTLViewport vp = { - .originX = 0, - .originY = 0, - .width = _viewport.full_width, - .height = _viewport.full_height, + .originX = fullscreen ? 0 : _viewport.x, + .originY = fullscreen ? 0 : _viewport.y, + .width = fullscreen ? _viewport.full_width : _viewport.width, + .height = fullscreen ? _viewport.full_height : _viewport.height, .znear = 0, .zfar = 1, }; diff --git a/gfx/common/metal/MenuDisplay.m b/gfx/common/metal/MenuDisplay.m index f35c16f908..2445cd18fe 100644 --- a/gfx/common/metal/MenuDisplay.m +++ b/gfx/common/metal/MenuDisplay.m @@ -173,7 +173,7 @@ id rce = _context.rce; if (_clearNextRender) { - [_context resetRenderViewport]; + [_context resetRenderViewport:kFullscreenViewport]; [_context drawQuadX:0 y:0 w:1 diff --git a/gfx/common/metal_common.m b/gfx/common/metal_common.m index 65d238b907..b1c60c0d59 100644 --- a/gfx/common/metal_common.m +++ b/gfx/common/metal_common.m @@ -269,7 +269,8 @@ [_frameView updateFrame:data pitch:pitch]; } - [self _drawViews:video_info]; + [self _drawCore:video_info]; + [self _drawMenu:video_info]; if (video_info->statistics_show) { @@ -286,6 +287,7 @@ { id rce = _context.rce; [rce pushDebugGroup:@"overlay"]; + [_context resetRenderViewport:_overlay.fullscreen ? kFullscreenViewport : kVideoViewport]; [rce setRenderPipelineState:[_context getStockShader:VIDEO_SHADER_STOCK_BLEND blend:YES]]; [rce setVertexBytes:_context.uniforms length:sizeof(*_context.uniforms) atIndex:BufferIndexUniforms]; [rce setFragmentSamplerState:_samplerStateLinear atIndex:SamplerIndexDraw]; @@ -339,7 +341,7 @@ 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]; + [_context resetRenderViewport:kFullscreenViewport]; [_context drawQuadX:x y:y w:width h:height r:r g:g b:b a:a]; } @@ -357,7 +359,7 @@ [_context begin]; } -- (void)_drawViews:(video_frame_info_t *)video_info +- (void)_drawCore:(video_frame_info_t *)video_info { id rce = _context.rce; @@ -380,8 +382,16 @@ [_frameView drawWithEncoder:rce]; } [rce popDebugGroup]; +} - if (_menu.enabled && _menu.hasFrame) +- (void)_drawMenu:(video_frame_info_t *)video_info +{ + if (!_menu.enabled) + return; + + id rce = _context.rce; + + if (_menu.hasFrame) { [rce pushDebugGroup:@"menu frame"]; [_menu.view drawWithContext:_context]; @@ -398,20 +408,11 @@ [_menu.view drawWithEncoder:rce]; [rce popDebugGroup]; } - #if defined(HAVE_MENU) - if (_menu.enabled) + else { - MTLViewport viewport = { - .originX = 0.0f, - .originY = 0.0f, - .width = _viewport->full_width, - .height = _viewport->full_height, - .znear = 0.0f, - .zfar = 1.0, - }; - [rce setViewport:viewport]; [rce pushDebugGroup:@"menu"]; + [_context resetRenderViewport:kFullscreenViewport]; menu_driver_frame(video_info); [rce popDebugGroup]; } diff --git a/gfx/drivers_font/metal_raster_font.m b/gfx/drivers_font/metal_raster_font.m index 6dd79b0597..c3869d9aac 100644 --- a/gfx/drivers_font/metal_raster_font.m +++ b/gfx/drivers_font/metal_raster_font.m @@ -330,7 +330,7 @@ static INLINE void write_quad6(SpriteVertex *pv, id rce = _context.rce; [rce pushDebugGroup:@"render fonts"]; - [_context resetRenderViewport]; + [_context resetRenderViewport:kFullscreenViewport]; [rce setRenderPipelineState:_state]; [rce setVertexBytes:&_uniforms length:sizeof(Uniforms) atIndex:BufferIndexUniforms]; [rce setVertexBuffer:_vert offset:start atIndex:BufferIndexPositions];