Merge pull request #9417 from torarnv/metal-draw-overlay-with-correct-viewport

Metal draw overlay with correct viewport
This commit is contained in:
Twinaphex 2019-09-02 20:01:39 +02:00 committed by GitHub
commit 5140bf9bd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 31 additions and 24 deletions

View File

@ -23,6 +23,11 @@ typedef struct
__unsafe_unretained id<MTLBuffer> 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<MTLTexture>)src to:(id<MTLTexture>)dst;
- (id<MTLRenderPipelineState>)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;

View File

@ -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,
};

View File

@ -173,7 +173,7 @@
id<MTLRenderCommandEncoder> rce = _context.rce;
if (_clearNextRender)
{
[_context resetRenderViewport];
[_context resetRenderViewport:kFullscreenViewport];
[_context drawQuadX:0
y:0
w:1

View File

@ -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<MTLRenderCommandEncoder> 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<MTLRenderCommandEncoder> 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<MTLRenderCommandEncoder> 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];
}

View File

@ -330,7 +330,7 @@ static INLINE void write_quad6(SpriteVertex *pv,
id<MTLRenderCommandEncoder> 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];