mirror of
https://github.com/libretro/RetroArch
synced 2025-03-06 13:13:57 +00:00
Merge pull request #9417 from torarnv/metal-draw-overlay-with-correct-viewport
Metal draw overlay with correct viewport
This commit is contained in:
commit
5140bf9bd0
@ -23,6 +23,11 @@ typedef struct
|
|||||||
__unsafe_unretained id<MTLBuffer> buffer;
|
__unsafe_unretained id<MTLBuffer> buffer;
|
||||||
} BufferRange;
|
} BufferRange;
|
||||||
|
|
||||||
|
typedef NS_ENUM(NSUInteger, ViewportResetMode) {
|
||||||
|
kFullscreenViewport,
|
||||||
|
kVideoViewport
|
||||||
|
};
|
||||||
|
|
||||||
/*! @brief Context contains the render state used by various components */
|
/*! @brief Context contains the render state used by various components */
|
||||||
@interface Context : NSObject
|
@interface Context : NSObject
|
||||||
|
|
||||||
@ -59,8 +64,8 @@ typedef struct
|
|||||||
- (void)convertFormat:(RPixelFormat)fmt from:(id<MTLTexture>)src to:(id<MTLTexture>)dst;
|
- (void)convertFormat:(RPixelFormat)fmt from:(id<MTLTexture>)src to:(id<MTLTexture>)dst;
|
||||||
- (id<MTLRenderPipelineState>)getStockShader:(int)index blend:(bool)blend;
|
- (id<MTLRenderPipelineState>)getStockShader:(int)index blend:(bool)blend;
|
||||||
|
|
||||||
/*! @brief resets the viewport for the main render encoder to the drawable size */
|
/*! @brief resets the viewport for the main render encoder to \a mode */
|
||||||
- (void)resetRenderViewport;
|
- (void)resetRenderViewport:(ViewportResetMode)mode;
|
||||||
|
|
||||||
/*! @brief resets the scissor rect for the main render encoder to the drawable size */
|
/*! @brief resets the scissor rect for the main render encoder to the drawable size */
|
||||||
- (void)resetScissorRect;
|
- (void)resetScissorRect;
|
||||||
|
@ -583,13 +583,14 @@
|
|||||||
return _rce;
|
return _rce;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)resetRenderViewport
|
- (void)resetRenderViewport:(ViewportResetMode)mode
|
||||||
{
|
{
|
||||||
|
bool fullscreen = mode == kFullscreenViewport;
|
||||||
MTLViewport vp = {
|
MTLViewport vp = {
|
||||||
.originX = 0,
|
.originX = fullscreen ? 0 : _viewport.x,
|
||||||
.originY = 0,
|
.originY = fullscreen ? 0 : _viewport.y,
|
||||||
.width = _viewport.full_width,
|
.width = fullscreen ? _viewport.full_width : _viewport.width,
|
||||||
.height = _viewport.full_height,
|
.height = fullscreen ? _viewport.full_height : _viewport.height,
|
||||||
.znear = 0,
|
.znear = 0,
|
||||||
.zfar = 1,
|
.zfar = 1,
|
||||||
};
|
};
|
||||||
|
@ -173,7 +173,7 @@
|
|||||||
id<MTLRenderCommandEncoder> rce = _context.rce;
|
id<MTLRenderCommandEncoder> rce = _context.rce;
|
||||||
if (_clearNextRender)
|
if (_clearNextRender)
|
||||||
{
|
{
|
||||||
[_context resetRenderViewport];
|
[_context resetRenderViewport:kFullscreenViewport];
|
||||||
[_context drawQuadX:0
|
[_context drawQuadX:0
|
||||||
y:0
|
y:0
|
||||||
w:1
|
w:1
|
||||||
|
@ -269,7 +269,8 @@
|
|||||||
[_frameView updateFrame:data pitch:pitch];
|
[_frameView updateFrame:data pitch:pitch];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self _drawViews:video_info];
|
[self _drawCore:video_info];
|
||||||
|
[self _drawMenu:video_info];
|
||||||
|
|
||||||
if (video_info->statistics_show)
|
if (video_info->statistics_show)
|
||||||
{
|
{
|
||||||
@ -286,6 +287,7 @@
|
|||||||
{
|
{
|
||||||
id<MTLRenderCommandEncoder> rce = _context.rce;
|
id<MTLRenderCommandEncoder> rce = _context.rce;
|
||||||
[rce pushDebugGroup:@"overlay"];
|
[rce pushDebugGroup:@"overlay"];
|
||||||
|
[_context resetRenderViewport:_overlay.fullscreen ? kFullscreenViewport : kVideoViewport];
|
||||||
[rce setRenderPipelineState:[_context getStockShader:VIDEO_SHADER_STOCK_BLEND blend:YES]];
|
[rce setRenderPipelineState:[_context getStockShader:VIDEO_SHADER_STOCK_BLEND blend:YES]];
|
||||||
[rce setVertexBytes:_context.uniforms length:sizeof(*_context.uniforms) atIndex:BufferIndexUniforms];
|
[rce setVertexBytes:_context.uniforms length:sizeof(*_context.uniforms) atIndex:BufferIndexUniforms];
|
||||||
[rce setFragmentSamplerState:_samplerStateLinear atIndex:SamplerIndexDraw];
|
[rce setFragmentSamplerState:_samplerStateLinear atIndex:SamplerIndexDraw];
|
||||||
@ -339,7 +341,7 @@
|
|||||||
float g = settings->uints.video_msg_bgcolor_green / 255.0f;
|
float g = settings->uints.video_msg_bgcolor_green / 255.0f;
|
||||||
float b = settings->uints.video_msg_bgcolor_blue / 255.0f;
|
float b = settings->uints.video_msg_bgcolor_blue / 255.0f;
|
||||||
float a = settings->floats.video_msg_bgcolor_opacity;
|
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];
|
[_context drawQuadX:x y:y w:width h:height r:r g:g b:b a:a];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +359,7 @@
|
|||||||
[_context begin];
|
[_context begin];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_drawViews:(video_frame_info_t *)video_info
|
- (void)_drawCore:(video_frame_info_t *)video_info
|
||||||
{
|
{
|
||||||
id<MTLRenderCommandEncoder> rce = _context.rce;
|
id<MTLRenderCommandEncoder> rce = _context.rce;
|
||||||
|
|
||||||
@ -380,8 +382,16 @@
|
|||||||
[_frameView drawWithEncoder:rce];
|
[_frameView drawWithEncoder:rce];
|
||||||
}
|
}
|
||||||
[rce popDebugGroup];
|
[rce popDebugGroup];
|
||||||
|
}
|
||||||
|
|
||||||
if (_menu.enabled && _menu.hasFrame)
|
- (void)_drawMenu:(video_frame_info_t *)video_info
|
||||||
|
{
|
||||||
|
if (!_menu.enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
id<MTLRenderCommandEncoder> rce = _context.rce;
|
||||||
|
|
||||||
|
if (_menu.hasFrame)
|
||||||
{
|
{
|
||||||
[rce pushDebugGroup:@"menu frame"];
|
[rce pushDebugGroup:@"menu frame"];
|
||||||
[_menu.view drawWithContext:_context];
|
[_menu.view drawWithContext:_context];
|
||||||
@ -398,20 +408,11 @@
|
|||||||
[_menu.view drawWithEncoder:rce];
|
[_menu.view drawWithEncoder:rce];
|
||||||
[rce popDebugGroup];
|
[rce popDebugGroup];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_MENU)
|
#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"];
|
[rce pushDebugGroup:@"menu"];
|
||||||
|
[_context resetRenderViewport:kFullscreenViewport];
|
||||||
menu_driver_frame(video_info);
|
menu_driver_frame(video_info);
|
||||||
[rce popDebugGroup];
|
[rce popDebugGroup];
|
||||||
}
|
}
|
||||||
|
@ -330,7 +330,7 @@ static INLINE void write_quad6(SpriteVertex *pv,
|
|||||||
id<MTLRenderCommandEncoder> rce = _context.rce;
|
id<MTLRenderCommandEncoder> rce = _context.rce;
|
||||||
[rce pushDebugGroup:@"render fonts"];
|
[rce pushDebugGroup:@"render fonts"];
|
||||||
|
|
||||||
[_context resetRenderViewport];
|
[_context resetRenderViewport:kFullscreenViewport];
|
||||||
[rce setRenderPipelineState:_state];
|
[rce setRenderPipelineState:_state];
|
||||||
[rce setVertexBytes:&_uniforms length:sizeof(Uniforms) atIndex:BufferIndexUniforms];
|
[rce setVertexBytes:&_uniforms length:sizeof(Uniforms) atIndex:BufferIndexUniforms];
|
||||||
[rce setVertexBuffer:_vert offset:start atIndex:BufferIndexPositions];
|
[rce setVertexBuffer:_vert offset:start atIndex:BufferIndexPositions];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user