Fix reference context when clearing empty area.

Reference context clear*() calls were crashing on assert when target rectangle
width or height was zero after applying scissor and viewport. Reference context
now skips clears when target area size is zero.

Bug: 19695755
Change-Id: I10e98fbbb8db0e099c039ecd583d6f5bb81af626
diff --git a/framework/opengl/simplereference/sglrReferenceContext.cpp b/framework/opengl/simplereference/sglrReferenceContext.cpp
index 1bead80..57a10c7 100644
--- a/framework/opengl/simplereference/sglrReferenceContext.cpp
+++ b/framework/opengl/simplereference/sglrReferenceContext.cpp
@@ -3341,14 +3341,16 @@
 	rr::MultisamplePixelBufferAccess	colorBuf0	= getDrawColorbuffer();
 	rr::MultisamplePixelBufferAccess	depthBuf	= getDrawDepthbuffer();
 	rr::MultisamplePixelBufferAccess	stencilBuf	= getDrawStencilbuffer();
-	bool								hasColor0	= !isEmpty(colorBuf0);
-	bool								hasDepth	= !isEmpty(depthBuf);
-	bool								hasStencil	= !isEmpty(stencilBuf);
 	IVec4								baseArea	= m_scissorEnabled ? m_scissorBox : IVec4(0, 0, 0x7fffffff, 0x7fffffff);
+	IVec4								colorArea	= intersect(baseArea, getBufferRect(colorBuf0));
+	IVec4								depthArea	= intersect(baseArea, getBufferRect(depthBuf));
+	IVec4								stencilArea	= intersect(baseArea, getBufferRect(stencilBuf));
+	bool								hasColor0	= !isEmpty(colorArea);
+	bool								hasDepth	= !isEmpty(depthArea);
+	bool								hasStencil	= !isEmpty(stencilArea);
 
 	if (hasColor0 && (buffers & GL_COLOR_BUFFER_BIT) != 0)
 	{
-		IVec4								colorArea	= intersect(baseArea, getBufferRect(colorBuf0));
 		rr::MultisamplePixelBufferAccess	access		= rr::getSubregion(colorBuf0, colorArea.x(), colorArea.y(), colorArea.z(), colorArea.w());
 		bool								isSRGB		= tcu::isSRGB(colorBuf0.raw().getFormat());
 		Vec4								c			= (isSRGB && m_sRGBUpdateEnabled) ? tcu::linearToSRGB(m_clearColor) : m_clearColor;
@@ -3369,7 +3371,6 @@
 
 	if (hasDepth && (buffers & GL_DEPTH_BUFFER_BIT) != 0 && m_depthMask)
 	{
-		IVec4								depthArea				= intersect(baseArea, getBufferRect(depthBuf));
 		rr::MultisamplePixelBufferAccess	access					= rr::getSubregion(depthBuf, depthArea.x(), depthArea.y(), depthArea.z(), depthArea.w());
 		bool								isSharedDepthStencil	= depthBuf.raw().getFormat().order != tcu::TextureFormat::D;
 
@@ -3399,7 +3400,6 @@
 
 	if (hasStencil && (buffers & GL_STENCIL_BUFFER_BIT) != 0)
 	{
-		IVec4								stencilArea				= intersect(baseArea, getBufferRect(stencilBuf));
 		rr::MultisamplePixelBufferAccess	access					= rr::getSubregion(stencilBuf, stencilArea.x(), stencilArea.y(), stencilArea.z(), stencilArea.w());
 		int									stencilBits				= getNumStencilBits(stencilBuf.raw().getFormat());
 		int									stencil					= maskStencil(stencilBits, m_clearStencil);
@@ -3442,10 +3442,10 @@
 		rr::MultisamplePixelBufferAccess	colorBuf	= getDrawColorbuffer();
 		bool								maskUsed	= !m_colorMask[0] || !m_colorMask[1] || !m_colorMask[2] || !m_colorMask[3];
 		bool								maskZero	= !m_colorMask[0] && !m_colorMask[1] && !m_colorMask[2] && !m_colorMask[3];
+		IVec4								area		= intersect(baseArea, getBufferRect(colorBuf));
 
-		if (!isEmpty(colorBuf) && !maskZero)
+		if (!isEmpty(area) && !maskZero)
 		{
-			IVec4								area		= intersect(baseArea, getBufferRect(colorBuf));
 			rr::MultisamplePixelBufferAccess	access		= rr::getSubregion(colorBuf, area.x(), area.y(), area.z(), area.w());
 			IVec4								color		(value[0], value[1], value[2], value[3]);
 
@@ -3464,11 +3464,11 @@
 	{
 		TCU_CHECK_INTERNAL(buffer == GL_STENCIL);
 
-		rr::MultisamplePixelBufferAccess stencilBuf = getDrawStencilbuffer();
+		rr::MultisamplePixelBufferAccess	stencilBuf	= getDrawStencilbuffer();
+		IVec4								area		= intersect(baseArea, getBufferRect(stencilBuf));
 
-		if (!isEmpty(stencilBuf) && m_stencil[rr::FACETYPE_FRONT].writeMask != 0)
+		if (!isEmpty(area) && m_stencil[rr::FACETYPE_FRONT].writeMask != 0)
 		{
-			IVec4								area		= intersect(baseArea, getBufferRect(stencilBuf));
 			rr::MultisamplePixelBufferAccess	access		= rr::getSubregion(stencilBuf, area.x(), area.y(), area.z(), area.w());
 			int									stencil		= value[0];
 
@@ -3492,10 +3492,10 @@
 		rr::MultisamplePixelBufferAccess	colorBuf	= getDrawColorbuffer();
 		bool								maskUsed	= !m_colorMask[0] || !m_colorMask[1] || !m_colorMask[2] || !m_colorMask[3];
 		bool								maskZero	= !m_colorMask[0] && !m_colorMask[1] && !m_colorMask[2] && !m_colorMask[3];
+		IVec4								area		= intersect(baseArea, getBufferRect(colorBuf));
 
-		if (!isEmpty(colorBuf) && !maskZero)
+		if (!isEmpty(area) && !maskZero)
 		{
-			IVec4								area		= intersect(baseArea, getBufferRect(colorBuf));
 			rr::MultisamplePixelBufferAccess	access		= rr::getSubregion(colorBuf, area.x(), area.y(), area.z(), area.w());
 			Vec4								color		(value[0], value[1], value[2], value[3]);
 
@@ -3517,11 +3517,11 @@
 	{
 		TCU_CHECK_INTERNAL(buffer == GL_DEPTH);
 
-		rr::MultisamplePixelBufferAccess depthBuf = getDrawDepthbuffer();
+		rr::MultisamplePixelBufferAccess	depthBuf	= getDrawDepthbuffer();
+		IVec4								area		= intersect(baseArea, getBufferRect(depthBuf));
 
-		if (!isEmpty(depthBuf) && m_depthMask)
+		if (!isEmpty(area) && m_depthMask)
 		{
-			IVec4								area		= intersect(baseArea, getBufferRect(depthBuf));
 			rr::MultisamplePixelBufferAccess	access		= rr::getSubregion(depthBuf, area.x(), area.y(), area.z(), area.w());
 			float								depth		= value[0];
 
@@ -3545,10 +3545,10 @@
 		rr::MultisamplePixelBufferAccess	colorBuf	= getDrawColorbuffer();
 		bool								maskUsed	= !m_colorMask[0] || !m_colorMask[1] || !m_colorMask[2] || !m_colorMask[3];
 		bool								maskZero	= !m_colorMask[0] && !m_colorMask[1] && !m_colorMask[2] && !m_colorMask[3];
+		IVec4								area		= intersect(baseArea, getBufferRect(colorBuf));
 
-		if (!isEmpty(colorBuf) && !maskZero)
+		if (!isEmpty(area) && !maskZero)
 		{
-			IVec4								area		= intersect(baseArea, getBufferRect(colorBuf));
 			rr::MultisamplePixelBufferAccess	access		= rr::getSubregion(colorBuf, area.x(), area.y(), area.z(), area.w());
 			tcu::UVec4							color		(value[0], value[1], value[2], value[3]);