metal: Set up correct viewport before rendering overlay

This commit is contained in:
Tor Arne Vestbø 2019-09-02 18:01:18 +02:00
parent 48d28aa734
commit 204407b64a
5 changed files with 18 additions and 19 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

@ -287,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];
@ -340,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];
}
@ -411,15 +412,7 @@
else
{
[rce pushDebugGroup:@"menu"];
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];
[_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];