Browse Source

metal: clamp scissor rect to be within the active RT

Alex Szpakowski 4 years ago
parent
commit
2064c140ac
1 changed files with 8 additions and 1 deletions
  1. 8 1
      src/modules/graphics/metal/Graphics.mm

+ 8 - 1
src/modules/graphics/metal/Graphics.mm

@@ -597,12 +597,19 @@ void Graphics::applyRenderState(id<MTLRenderCommandEncoder> encoder, const Verte
 
 		if (state.scissor)
 		{
-			// TODO: clamping
 			double dpiscale = getCurrentDPIScale();
 			rect.x = (NSUInteger)(state.scissorRect.x*dpiscale);
 			rect.y = (NSUInteger)(state.scissorRect.y*dpiscale);
 			rect.width = (NSUInteger)(state.scissorRect.w*dpiscale);
 			rect.height = (NSUInteger)(state.scissorRect.h*dpiscale);
+
+			if (rtw > 0 && (int)rect.x >= rtw)
+				rect.x = rtw - 1;
+			if (rth > 0 && (int)rect.y >= rth)
+				rect.y = rth - 1;
+
+			rect.width = std::min(rect.width, rtw - rect.x);
+			rect.height = std::min(rect.height, rth - rect.y);
 		}
 
 		[encoder setScissorRect:rect];