Add tests for non strict lines

Tests for strict and non-strict lines rasterization:
 * dEQP-VK.rasterization.*.strict_*
 * dEQP-VK.rasterization.*.non_strict_*

Components: Vulkan

VK-GL-CTS issue: 1024

Change-Id: If2c4dbe359be0e2550b063216dbd427f80c980db
diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt
index fd13827..9c8fa32 100644
--- a/android/cts/master/vk-master-2020-03-01.txt
+++ b/android/cts/master/vk-master-2020-03-01.txt
@@ -152502,6 +152502,14 @@
 dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16_r16_3plane_444_unorm.128_128_8
 dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16_r16_3plane_444_unorm.503_137_3
 dEQP-VK.sparse_resources.shader_intrinsics.2d_array_sparse_gather.g16_b16_r16_3plane_444_unorm.11_37_3
+dEQP-VK.rasterization.primitives.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives.no_stipple.strict_line_strip
+dEQP-VK.rasterization.primitives.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives.no_stipple.strict_line_strip_wide
+dEQP-VK.rasterization.primitives.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives.no_stipple.non_strict_line_strip
+dEQP-VK.rasterization.primitives.no_stipple.non_strict_lines_wide
+dEQP-VK.rasterization.primitives.no_stipple.non_strict_line_strip_wide
 dEQP-VK.rasterization.primitives.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives.no_stipple.rectangular_lines_wide
@@ -152554,6 +152562,34 @@
 dEQP-VK.rasterization.primitive_size.points.point_size_4096
 dEQP-VK.rasterization.primitive_size.points.point_size_8192
 dEQP-VK.rasterization.primitive_size.points.point_size_10000
+dEQP-VK.rasterization.interpolation.basic.strict_lines
+dEQP-VK.rasterization.interpolation.basic.strict_line_strip
+dEQP-VK.rasterization.interpolation.basic.strict_lines_wide
+dEQP-VK.rasterization.interpolation.basic.strict_line_strip_wide
+dEQP-VK.rasterization.interpolation.basic.non_strict_lines
+dEQP-VK.rasterization.interpolation.basic.non_strict_line_strip
+dEQP-VK.rasterization.interpolation.basic.non_strict_lines_wide
+dEQP-VK.rasterization.interpolation.basic.non_strict_line_strip_wide
+dEQP-VK.rasterization.interpolation.projected.strict_lines
+dEQP-VK.rasterization.interpolation.projected.strict_line_strip
+dEQP-VK.rasterization.interpolation.projected.strict_lines_wide
+dEQP-VK.rasterization.interpolation.projected.strict_line_strip_wide
+dEQP-VK.rasterization.interpolation.projected.non_strict_lines
+dEQP-VK.rasterization.interpolation.projected.non_strict_line_strip
+dEQP-VK.rasterization.interpolation.projected.non_strict_lines_wide
+dEQP-VK.rasterization.interpolation.projected.non_strict_line_strip_wide
+dEQP-VK.rasterization.flatshading.strict_lines
+dEQP-VK.rasterization.flatshading.strict_line_strip
+dEQP-VK.rasterization.flatshading.strict_lines_wide
+dEQP-VK.rasterization.flatshading.strict_line_strip_wide
+dEQP-VK.rasterization.flatshading.non_strict_lines
+dEQP-VK.rasterization.flatshading.non_strict_line_strip
+dEQP-VK.rasterization.flatshading.non_strict_lines_wide
+dEQP-VK.rasterization.flatshading.non_strict_line_strip_wide
+dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.non_strict_lines_wide
 dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives_multisample_2_bit.no_stipple.rectangular_lines_wide
@@ -152598,6 +152634,14 @@
 dEQP-VK.rasterization.primitives_multisample_2_bit.dynamic_stipple.smooth_line_strip
 dEQP-VK.rasterization.primitives_multisample_2_bit.dynamic_stipple.smooth_lines_wide
 dEQP-VK.rasterization.primitives_multisample_2_bit.dynamic_stipple.smooth_line_strip_wide
+dEQP-VK.rasterization.interpolation_multisample_2_bit.strict_lines
+dEQP-VK.rasterization.interpolation_multisample_2_bit.strict_lines_wide
+dEQP-VK.rasterization.interpolation_multisample_2_bit.non_strict_lines
+dEQP-VK.rasterization.interpolation_multisample_2_bit.non_strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.non_strict_lines_wide
 dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives_multisample_4_bit.no_stipple.rectangular_lines_wide
@@ -152642,6 +152686,14 @@
 dEQP-VK.rasterization.primitives_multisample_4_bit.dynamic_stipple.smooth_line_strip
 dEQP-VK.rasterization.primitives_multisample_4_bit.dynamic_stipple.smooth_lines_wide
 dEQP-VK.rasterization.primitives_multisample_4_bit.dynamic_stipple.smooth_line_strip_wide
+dEQP-VK.rasterization.interpolation_multisample_4_bit.strict_lines
+dEQP-VK.rasterization.interpolation_multisample_4_bit.strict_lines_wide
+dEQP-VK.rasterization.interpolation_multisample_4_bit.non_strict_lines
+dEQP-VK.rasterization.interpolation_multisample_4_bit.non_strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.non_strict_lines_wide
 dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives_multisample_8_bit.no_stipple.rectangular_lines_wide
@@ -152686,6 +152738,14 @@
 dEQP-VK.rasterization.primitives_multisample_8_bit.dynamic_stipple.smooth_line_strip
 dEQP-VK.rasterization.primitives_multisample_8_bit.dynamic_stipple.smooth_lines_wide
 dEQP-VK.rasterization.primitives_multisample_8_bit.dynamic_stipple.smooth_line_strip_wide
+dEQP-VK.rasterization.interpolation_multisample_8_bit.strict_lines
+dEQP-VK.rasterization.interpolation_multisample_8_bit.strict_lines_wide
+dEQP-VK.rasterization.interpolation_multisample_8_bit.non_strict_lines
+dEQP-VK.rasterization.interpolation_multisample_8_bit.non_strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.non_strict_lines_wide
 dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.rectangular_lines_wide
@@ -152730,6 +152790,14 @@
 dEQP-VK.rasterization.primitives_multisample_16_bit.dynamic_stipple.smooth_line_strip
 dEQP-VK.rasterization.primitives_multisample_16_bit.dynamic_stipple.smooth_lines_wide
 dEQP-VK.rasterization.primitives_multisample_16_bit.dynamic_stipple.smooth_line_strip_wide
+dEQP-VK.rasterization.interpolation_multisample_16_bit.strict_lines
+dEQP-VK.rasterization.interpolation_multisample_16_bit.strict_lines_wide
+dEQP-VK.rasterization.interpolation_multisample_16_bit.non_strict_lines
+dEQP-VK.rasterization.interpolation_multisample_16_bit.non_strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.non_strict_lines_wide
 dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives_multisample_32_bit.no_stipple.rectangular_lines_wide
@@ -152774,6 +152842,14 @@
 dEQP-VK.rasterization.primitives_multisample_32_bit.dynamic_stipple.smooth_line_strip
 dEQP-VK.rasterization.primitives_multisample_32_bit.dynamic_stipple.smooth_lines_wide
 dEQP-VK.rasterization.primitives_multisample_32_bit.dynamic_stipple.smooth_line_strip_wide
+dEQP-VK.rasterization.interpolation_multisample_32_bit.strict_lines
+dEQP-VK.rasterization.interpolation_multisample_32_bit.strict_lines_wide
+dEQP-VK.rasterization.interpolation_multisample_32_bit.non_strict_lines
+dEQP-VK.rasterization.interpolation_multisample_32_bit.non_strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.strict_lines
+dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.non_strict_lines
+dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.non_strict_lines_wide
 dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.rectangular_lines
 dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.rectangular_line_strip
 dEQP-VK.rasterization.primitives_multisample_64_bit.no_stipple.rectangular_lines_wide
@@ -152818,6 +152894,10 @@
 dEQP-VK.rasterization.primitives_multisample_64_bit.dynamic_stipple.smooth_line_strip
 dEQP-VK.rasterization.primitives_multisample_64_bit.dynamic_stipple.smooth_lines_wide
 dEQP-VK.rasterization.primitives_multisample_64_bit.dynamic_stipple.smooth_line_strip_wide
+dEQP-VK.rasterization.interpolation_multisample_64_bit.strict_lines
+dEQP-VK.rasterization.interpolation_multisample_64_bit.strict_lines_wide
+dEQP-VK.rasterization.interpolation_multisample_64_bit.non_strict_lines
+dEQP-VK.rasterization.interpolation_multisample_64_bit.non_strict_lines_wide
 dEQP-VK.rasterization.provoking_vertex.triangle_list
 dEQP-VK.rasterization.provoking_vertex.triangle_list_with_adjacency
 dEQP-VK.rasterization.provoking_vertex.triangle_strip
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 321a139..ddd227b 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
Binary files differ
diff --git a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
index 5f35a7d..173dc2b 100644
--- a/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
+++ b/external/vulkancts/modules/vulkan/rasterization/vktRasterizationTests.cpp
@@ -118,6 +118,15 @@
 static const deUint32 lineStippleFactor = 2;
 static const deUint32 lineStipplePattern = 0x0F0F;
 
+enum PrimitiveStrictness
+{
+	PRIMITIVESTRICTNESS_STRICT = 0,
+	PRIMITIVESTRICTNESS_NONSTRICT,
+	PRIMITIVESTRICTNESS_IGNORE,
+
+	PRIMITIVESTRICTNESS_LAST
+};
+
 class BaseRenderingTestCase : public TestCase
 {
 public:
@@ -174,7 +183,7 @@
 	const VkPipelineRasterizationStateCreateInfo*	getRasterizationStateCreateInfo	(void) const;
 
 	virtual
-	VkPipelineRasterizationLineStateCreateInfoEXT	getLineRasterizationStateCreateInfo	(void) const;
+	VkPipelineRasterizationLineStateCreateInfoEXT*	getLineRasterizationStateCreateInfo	(void);
 
 	virtual
 	const VkPipelineColorBlendStateCreateInfo*		getColorBlendStateCreateInfo	(void) const;
@@ -220,6 +229,8 @@
 
 	const deUint32									m_additionalRenderSize;
 	const VkDeviceSize								m_additionalResultBufferSize;
+
+	VkPipelineRasterizationLineStateCreateInfoEXT	m_lineRasterizationStateInfo;
 };
 
 BaseRenderingTestInstance::BaseRenderingTestInstance (Context& context, VkSampleCountFlagBits sampleCount, deUint32 renderSize, VkFormat imageFormat, deUint32 additionalRenderSize)
@@ -242,6 +253,8 @@
 	DescriptorPoolBuilder						descriptorPoolBuilder;
 	DescriptorSetLayoutBuilder					descriptorSetLayoutBuilder;
 
+	deMemset(&m_lineRasterizationStateInfo, 0, sizeof(m_lineRasterizationStateInfo));
+
 	// Command Pool
 	m_commandPool = createCommandPool(vkd, vkDevice, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex);
 
@@ -711,9 +724,7 @@
 
 		VkPipelineRasterizationStateCreateInfo rasterizationStateInfo = *getRasterizationStateCreateInfo();
 
-		VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo = getLineRasterizationStateCreateInfo();
-
-		rasterizationStateInfo.pNext = &lineRasterizationStateInfo;
+		rasterizationStateInfo.pNext = getLineRasterizationStateCreateInfo();
 
 		VkPipelineDynamicStateCreateInfo			dynamicStateCreateInfo =
 		{
@@ -867,9 +878,9 @@
 	return &rasterizationStateCreateInfo;
 }
 
-VkPipelineRasterizationLineStateCreateInfoEXT BaseRenderingTestInstance::getLineRasterizationStateCreateInfo (void) const
+VkPipelineRasterizationLineStateCreateInfoEXT* BaseRenderingTestInstance::getLineRasterizationStateCreateInfo (void)
 {
-	VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo	=
+	m_lineRasterizationStateInfo =
 	{
 		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT,	// VkStructureType				sType;
 		DE_NULL,																// const void*					pNext;
@@ -879,7 +890,7 @@
 		0xFFFF,																	// uint16_t						lineStipplePattern;
 	};
 
-	return lineRasterizationStateInfo;
+	return &m_lineRasterizationStateInfo;
 }
 
 const VkPipelineColorBlendStateCreateInfo* BaseRenderingTestInstance::getColorBlendStateCreateInfo (void) const
@@ -993,83 +1004,90 @@
 class BaseLineTestInstance : public BaseRenderingTestInstance
 {
 public:
-							BaseLineTestInstance	(Context& context,
-													 VkPrimitiveTopology primitiveTopology,
-													 PrimitiveWideness wideness,
-													 VkSampleCountFlagBits sampleCount,
-													 LineStipple stipple,
-													 VkLineRasterizationModeEXT	lineRasterizationMode,
-													 const deUint32 additionalRenderSize = 0);
-	virtual tcu::TestStatus	iterate					(void);
-	virtual float			getLineWidth			(void) const;
-	bool					getLineStippleEnable	(void) const { return m_stipple != LINESTIPPLE_DISABLED; }
-	virtual bool			getLineStippleDynamic	(void) const { return m_stipple == LINESTIPPLE_DYNAMIC; };
+								BaseLineTestInstance	(Context&					context,
+														 VkPrimitiveTopology		primitiveTopology,
+														 PrimitiveWideness			wideness,
+														 PrimitiveStrictness		strictness,
+														 VkSampleCountFlagBits		sampleCount,
+														 LineStipple				stipple,
+														 VkLineRasterizationModeEXT	lineRasterizationMode,
+														 const deUint32				additionalRenderSize = 0);
+	virtual tcu::TestStatus		iterate					(void);
+	virtual float				getLineWidth			(void) const;
+	bool						getLineStippleEnable	(void) const { return m_stipple != LINESTIPPLE_DISABLED; }
+	virtual bool				getLineStippleDynamic	(void) const { return m_stipple == LINESTIPPLE_DYNAMIC; };
 
 	virtual
-	VkPipelineRasterizationLineStateCreateInfoEXT	getLineRasterizationStateCreateInfo	(void) const;
+	VkPipelineRasterizationLineStateCreateInfoEXT*		getLineRasterizationStateCreateInfo	(void);
 
 private:
-	virtual void			generateLines			(int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines) = DE_NULL;
+	virtual void				generateLines			(int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines) = DE_NULL;
 
-	bool					resultHasAlpha			(tcu::Surface& result);
+	bool						resultHasAlpha			(tcu::Surface& result);
 
-	int						m_iteration;
-	const int				m_iterationCount;
-	VkPrimitiveTopology		m_primitiveTopology;
-	const PrimitiveWideness	m_primitiveWideness;
-	bool					m_allIterationsPassed;
-	bool					m_qualityWarning;
-	float					m_maxLineWidth;
-	std::vector<float>		m_lineWidths;
-	LineStipple				m_stipple;
+	int							m_iteration;
+	const int					m_iterationCount;
+	VkPrimitiveTopology			m_primitiveTopology;
+	const PrimitiveWideness		m_primitiveWideness;
+	const PrimitiveStrictness	m_primitiveStrictness;
+	bool						m_allIterationsPassed;
+	bool						m_qualityWarning;
+	float						m_maxLineWidth;
+	std::vector<float>			m_lineWidths;
+	LineStipple					m_stipple;
 	VkLineRasterizationModeEXT	m_lineRasterizationMode;
-	Move<VkImage>									m_additionalImage;
-	de::MovePtr<Allocation>							m_additionalImageMemory;
-	Move<VkImageView>								m_additionalImageView;
-	Move<VkImage>									m_additionalResolvedImage;
-	de::MovePtr<Allocation>							m_additionalResolvedImageMemory;
-	Move<VkImageView>								m_additionalResolvedImageView;
-	Move<VkFramebuffer>								m_additionalFrameBuffer;
-	Move<VkBuffer>									m_additionalResultBuffer;
-	de::MovePtr<Allocation>							m_additionalResultBufferMemory;
+	Move<VkImage>				m_additionalImage;
+	de::MovePtr<Allocation>		m_additionalImageMemory;
+	Move<VkImageView>			m_additionalImageView;
+	Move<VkImage>				m_additionalResolvedImage;
+	de::MovePtr<Allocation>		m_additionalResolvedImageMemory;
+	Move<VkImageView>			m_additionalResolvedImageView;
+	Move<VkFramebuffer>			m_additionalFrameBuffer;
+	Move<VkBuffer>				m_additionalResultBuffer;
+	de::MovePtr<Allocation>		m_additionalResultBufferMemory;
 };
 
-BaseLineTestInstance::BaseLineTestInstance (Context& context,
-											VkPrimitiveTopology primitiveTopology,
-											PrimitiveWideness wideness,
-											VkSampleCountFlagBits sampleCount,
-											LineStipple stipple,
+BaseLineTestInstance::BaseLineTestInstance (Context&					context,
+											VkPrimitiveTopology			primitiveTopology,
+											PrimitiveWideness			wideness,
+											PrimitiveStrictness			strictness,
+											VkSampleCountFlagBits		sampleCount,
+											LineStipple					stipple,
 											VkLineRasterizationModeEXT	lineRasterizationMode,
 											const deUint32 additionalRenderSize)
-	: BaseRenderingTestInstance			(context, sampleCount, RESOLUTION_POT, VK_FORMAT_R8G8B8A8_UNORM, additionalRenderSize)
-	, m_iteration						(0)
-	, m_iterationCount					(3)
-	, m_primitiveTopology				(primitiveTopology)
-	, m_primitiveWideness				(wideness)
-	, m_allIterationsPassed				(true)
-	, m_qualityWarning					(false)
-	, m_maxLineWidth					(1.0f)
-	, m_stipple							(stipple)
-	, m_lineRasterizationMode			(lineRasterizationMode)
+	: BaseRenderingTestInstance	(context, sampleCount, RESOLUTION_POT, VK_FORMAT_R8G8B8A8_UNORM, additionalRenderSize)
+	, m_iteration				(0)
+	, m_iterationCount			(3)
+	, m_primitiveTopology		(primitiveTopology)
+	, m_primitiveWideness		(wideness)
+	, m_primitiveStrictness		(strictness)
+	, m_allIterationsPassed		(true)
+	, m_qualityWarning			(false)
+	, m_maxLineWidth			(1.0f)
+	, m_stipple					(stipple)
+	, m_lineRasterizationMode	(lineRasterizationMode)
 {
 	DE_ASSERT(m_primitiveWideness < PRIMITIVEWIDENESS_LAST);
 
-	if (context.isDeviceFunctionalitySupported("VK_EXT_line_rasterization"))
+	if (m_lineRasterizationMode != VK_LINE_RASTERIZATION_MODE_EXT_LAST)
 	{
-		VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationProperties =
+		if (context.isDeviceFunctionalitySupported("VK_EXT_line_rasterization"))
 		{
-			VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT,	// VkStructureType	sType;
-			DE_NULL,																// void*			pNext;
-			0u,																		// deUint32			lineSubPixelPrecisionBits;
-		};
+			VkPhysicalDeviceLineRasterizationPropertiesEXT lineRasterizationProperties =
+			{
+				VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT,	// VkStructureType	sType;
+				DE_NULL,																// void*			pNext;
+				0u,																		// deUint32			lineSubPixelPrecisionBits;
+			};
 
-		VkPhysicalDeviceProperties2 deviceProperties2;
-		deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
-		deviceProperties2.pNext = &lineRasterizationProperties;
+			VkPhysicalDeviceProperties2 deviceProperties2;
+			deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+			deviceProperties2.pNext = &lineRasterizationProperties;
 
-		context.getInstanceInterface().getPhysicalDeviceProperties2(m_context.getPhysicalDevice(), &deviceProperties2);
+			context.getInstanceInterface().getPhysicalDeviceProperties2(m_context.getPhysicalDevice(), &deviceProperties2);
 
-		m_subpixelBits = lineRasterizationProperties.lineSubPixelPrecisionBits;
+			m_subpixelBits = lineRasterizationProperties.lineSubPixelPrecisionBits;
+		}
 	}
 
 	// create line widths
@@ -1288,8 +1306,8 @@
 		// compare
 		RasterizationArguments	args;
 		LineSceneSpec			scene;
-
-		tcu::IVec4				colorBits = tcu::getTextureFormatBitDepth(getTextureFormat());
+		tcu::IVec4				colorBits	= tcu::getTextureFormatBitDepth(getTextureFormat());
+		bool					strict		= m_primitiveStrictness == PRIMITIVESTRICTNESS_STRICT;
 
 		args.numSamples		= m_multisampling ? 1 : 0;
 		args.subpixelBits	= m_subpixelBits;
@@ -1337,11 +1355,11 @@
 				}
 			}
 
-			if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling)))
+			if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
 			{
 				// Retry with weaker verification. If it passes, consider it a quality warning.
 				scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
-				if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog()))
+				if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), false, strict))
 					m_allIterationsPassed = false;
 				else
 					m_qualityWarning = true;
@@ -1361,14 +1379,21 @@
 				drawPrimitives(additionalResultImage, drawBuffer, colorData, m_primitiveTopology, *m_additionalImage, *m_additionalResolvedImage, *m_additionalFrameBuffer, m_additionalRenderSize, *m_additionalResultBuffer, *m_additionalResultBufferMemory);
 
 				// Compare
-				if (!verifyRelaxedLineGroupRasterization(additionalResultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling)))
+				if (!verifyRelaxedLineGroupRasterization(additionalResultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
 				{
-					// Retry with weaker verification. If it passes, consider it a quality warning.
-					scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
-					if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling)))
+					if (strict)
+					{
 						m_allIterationsPassed = false;
+					}
 					else
-						m_qualityWarning = true;
+					{
+						// Retry with weaker verification. If it passes, consider it a quality warning.
+						scene.verificationMode = tcu::VERIFICATIONMODE_WEAKER;
+						if (!verifyRelaxedLineGroupRasterization(resultImage, scene, args, m_context.getTestContext().getLog(), (0 == m_multisampling), strict))
+							m_allIterationsPassed = false;
+						else
+							m_qualityWarning = true;
+					}
 				}
 			}
 		}
@@ -1396,9 +1421,12 @@
 	return m_lineWidths[m_iteration];
 }
 
-VkPipelineRasterizationLineStateCreateInfoEXT BaseLineTestInstance::getLineRasterizationStateCreateInfo (void) const
+VkPipelineRasterizationLineStateCreateInfoEXT* BaseLineTestInstance::getLineRasterizationStateCreateInfo (void)
 {
-	VkPipelineRasterizationLineStateCreateInfoEXT lineRasterizationStateInfo	=
+	if (m_lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_EXT_LAST)
+		return DE_NULL;
+
+	m_lineRasterizationStateInfo	=
 	{
 		VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT,	// VkStructureType				sType;
 		DE_NULL,																// const void*					pNext;
@@ -1410,17 +1438,23 @@
 
 	if (m_stipple == LINESTIPPLE_STATIC)
 	{
-		lineRasterizationStateInfo.lineStippleFactor = lineStippleFactor;
-		lineRasterizationStateInfo.lineStipplePattern = lineStipplePattern;
+		m_lineRasterizationStateInfo.lineStippleFactor = lineStippleFactor;
+		m_lineRasterizationStateInfo.lineStipplePattern = lineStipplePattern;
 	}
 
-	return lineRasterizationStateInfo;
+	return &m_lineRasterizationStateInfo;
 }
 
 class PointTestInstance : public BaseRenderingTestInstance
 {
 public:
-							PointTestInstance		(Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, /*ignored*/LineStipple stipple, /*ignored*/VkLineRasterizationModeEXT lineRasterizationMode,  deUint32 renderSize);
+							PointTestInstance		(Context&					context,
+													 PrimitiveWideness			wideness,
+													 PrimitiveStrictness		strictness,				// ignored
+													 VkSampleCountFlagBits		sampleCount,
+													 LineStipple				stipple,				// ignored
+													 VkLineRasterizationModeEXT	lineRasterizationMode,	// ignored
+													 deUint32					renderSize);			// ignored
 	virtual tcu::TestStatus	iterate					(void);
 	virtual float			getPointSize			(void) const;
 
@@ -1435,7 +1469,13 @@
 	std::vector<float>		m_pointSizes;
 };
 
-PointTestInstance::PointTestInstance (Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, /*ignored*/LineStipple stipple, /*ignored*/VkLineRasterizationModeEXT lineRasterizationMode, deUint32)
+PointTestInstance::PointTestInstance (Context&						context,
+									  PrimitiveWideness				wideness,
+									  PrimitiveStrictness			strictness,
+									  VkSampleCountFlagBits			sampleCount,
+									  LineStipple					stipple,
+									  VkLineRasterizationModeEXT	lineRasterizationMode,
+									  deUint32						renderSize)
 	: BaseRenderingTestInstance	(context, sampleCount)
 	, m_iteration				(0)
 	, m_iterationCount			(3)
@@ -1443,8 +1483,11 @@
 	, m_allIterationsPassed		(true)
 	, m_maxPointSize			(1.0f)
 {
-	(void)stipple;
-	(void)lineRasterizationMode;
+	DE_UNREF(strictness);
+	DE_UNREF(stipple);
+	DE_UNREF(lineRasterizationMode);
+	DE_UNREF(renderSize);
+
 	// create point sizes
 	if (m_primitiveWideness == PRIMITIVEWIDENESS_NARROW)
 	{
@@ -2120,18 +2163,28 @@
 class WidenessTestCase : public BaseRenderingTestCase
 {
 public:
-								WidenessTestCase	(tcu::TestContext& context, const std::string& name, const std::string& description, PrimitiveWideness wideness, bool isLineTest, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32 additionalRenderSize = 0)
-									: BaseRenderingTestCase(context, name, description, sampleCount)
-									, m_wideness	(wideness)
-									, m_isLineTest	(isLineTest)
-									, m_stipple(stipple)
-									, m_lineRasterizationMode(lineRasterizationMode)
+								WidenessTestCase	(tcu::TestContext&			context,
+													 const std::string&			name,
+													 const std::string&			description,
+													 PrimitiveWideness			wideness,
+													 PrimitiveStrictness		strictness,
+													 bool						isLineTest,
+													 VkSampleCountFlagBits		sampleCount,
+													 LineStipple				stipple,
+													 VkLineRasterizationModeEXT	lineRasterizationMode,
+													 deUint32					additionalRenderSize	= 0)
+									: BaseRenderingTestCase		(context, name, description, sampleCount)
+									, m_wideness(wideness)
+									, m_strictness				(strictness)
+									, m_isLineTest				(isLineTest)
+									, m_stipple					(stipple)
+									, m_lineRasterizationMode	(lineRasterizationMode)
 									, m_additionalRenderSize	(additionalRenderSize)
 								{}
 
 	virtual TestInstance*		createInstance		(Context& context) const
 								{
-									return new ConcreteTestInstance(context, m_wideness, m_sampleCount, m_stipple, m_lineRasterizationMode, m_additionalRenderSize);
+									return new ConcreteTestInstance(context, m_wideness, m_strictness, m_sampleCount, m_stipple, m_lineRasterizationMode, m_additionalRenderSize);
 								}
 
 	virtual	void				checkSupport		(Context& context) const
@@ -2143,40 +2196,65 @@
 
 										switch (m_lineRasterizationMode)
 										{
-										default:
-											DE_ASSERT(0); // fallthrough
-										case VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT:
-											if (!context.getDeviceProperties().limits.strictLines)
-												TCU_THROW(NotSupportedError, "Strict rasterization is not supported");
+											default:
+												TCU_THROW(InternalError, "Unknown line rasterization mode");
 
-											if (getLineStippleEnable() &&
-												!context.getLineRasterizationFeaturesEXT().stippledRectangularLines)
-												TCU_THROW(NotSupportedError, "Stippled rectangular lines not supported");
-											break;
-										case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT:
-											if (!context.getLineRasterizationFeaturesEXT().rectangularLines)
-												TCU_THROW(NotSupportedError, "Rectangular lines not supported");
+											case VK_LINE_RASTERIZATION_MODE_EXT_LAST:
+											{
+												if (m_strictness == PRIMITIVESTRICTNESS_STRICT)
+													if (!context.getDeviceProperties().limits.strictLines)
+														TCU_THROW(NotSupportedError, "Strict rasterization is not supported");
 
-											if (getLineStippleEnable() &&
-												!context.getLineRasterizationFeaturesEXT().stippledRectangularLines)
-												TCU_THROW(NotSupportedError, "Stippled rectangular lines not supported");
-											break;
-										case VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT:
-											if (!context.getLineRasterizationFeaturesEXT().bresenhamLines)
-												TCU_THROW(NotSupportedError, "Bresenham lines not supported");
+												if (m_strictness == PRIMITIVESTRICTNESS_NONSTRICT)
+													if (context.getDeviceProperties().limits.strictLines)
+														TCU_THROW(NotSupportedError, "Nonstrict rasterization is not supported");
 
-											if (getLineStippleEnable() &&
-												!context.getLineRasterizationFeaturesEXT().stippledBresenhamLines)
-												TCU_THROW(NotSupportedError, "Stippled Bresenham lines not supported");
-											break;
-										case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT:
-											if (!context.getLineRasterizationFeaturesEXT().smoothLines)
-												TCU_THROW(NotSupportedError, "Smooth lines not supported");
+												break;
+											}
 
-											if (getLineStippleEnable() &&
-												!context.getLineRasterizationFeaturesEXT().stippledSmoothLines)
-												TCU_THROW(NotSupportedError, "Stippled smooth lines not supported");
-											break;
+											case VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT:
+											{
+												if (!context.getDeviceProperties().limits.strictLines)
+													TCU_THROW(NotSupportedError, "Strict rasterization is not supported");
+
+												if (getLineStippleEnable() &&
+													!context.getLineRasterizationFeaturesEXT().stippledRectangularLines)
+													TCU_THROW(NotSupportedError, "Stippled rectangular lines not supported");
+												break;
+											}
+
+											case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT:
+											{
+												if (!context.getLineRasterizationFeaturesEXT().rectangularLines)
+													TCU_THROW(NotSupportedError, "Rectangular lines not supported");
+
+												if (getLineStippleEnable() &&
+													!context.getLineRasterizationFeaturesEXT().stippledRectangularLines)
+													TCU_THROW(NotSupportedError, "Stippled rectangular lines not supported");
+												break;
+											}
+
+											case VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT:
+											{
+												if (!context.getLineRasterizationFeaturesEXT().bresenhamLines)
+													TCU_THROW(NotSupportedError, "Bresenham lines not supported");
+
+												if (getLineStippleEnable() &&
+													!context.getLineRasterizationFeaturesEXT().stippledBresenhamLines)
+													TCU_THROW(NotSupportedError, "Stippled Bresenham lines not supported");
+												break;
+											}
+
+											case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT:
+											{
+												if (!context.getLineRasterizationFeaturesEXT().smoothLines)
+													TCU_THROW(NotSupportedError, "Smooth lines not supported");
+
+												if (getLineStippleEnable() &&
+													!context.getLineRasterizationFeaturesEXT().stippledSmoothLines)
+													TCU_THROW(NotSupportedError, "Stippled smooth lines not supported");
+												break;
+											}
 										}
 									}
 									else
@@ -2190,18 +2268,19 @@
 	virtual bool			getLineStippleDynamic	(void) const { return m_stipple == LINESTIPPLE_DYNAMIC; };
 
 protected:
-	const PrimitiveWideness		m_wideness;
-	const bool					m_isLineTest;
+	const PrimitiveWideness				m_wideness;
+	const PrimitiveStrictness			m_strictness;
+	const bool							m_isLineTest;
 	const LineStipple					m_stipple;
 	const VkLineRasterizationModeEXT	m_lineRasterizationMode;
-	const deUint32				m_additionalRenderSize;
+	const deUint32						m_additionalRenderSize;
 };
 
 class LinesTestInstance : public BaseLineTestInstance
 {
 public:
-								LinesTestInstance	(Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode,  deUint32 additionalRenderSize = 0)
-									: BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, wideness, sampleCount, stipple, lineRasterizationMode, additionalRenderSize)
+								LinesTestInstance	(Context& context, PrimitiveWideness wideness, PrimitiveStrictness strictness, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32 additionalRenderSize = 0)
+									: BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, wideness, strictness, sampleCount, stipple, lineRasterizationMode, additionalRenderSize)
 								{}
 
 	virtual void				generateLines		(int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines);
@@ -2274,8 +2353,8 @@
 class LineStripTestInstance : public BaseLineTestInstance
 {
 public:
-					LineStripTestInstance	(Context& context, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32)
-						: BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, wideness, sampleCount, stipple, lineRasterizationMode)
+					LineStripTestInstance	(Context& context, PrimitiveWideness wideness, PrimitiveStrictness strictness, VkSampleCountFlagBits sampleCount, LineStipple stipple, VkLineRasterizationModeEXT lineRasterizationMode, deUint32)
+						: BaseLineTestInstance(context, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, wideness, strictness, sampleCount, stipple, lineRasterizationMode)
 					{}
 
 	virtual void	generateLines			(int iteration, std::vector<tcu::Vec4>& outData, std::vector<LineSceneSpec::SceneLine>& outLines);
@@ -3647,7 +3726,7 @@
 class LineInterpolationTestInstance : public BaseRenderingTestInstance
 {
 public:
-							LineInterpolationTestInstance	(Context& context, VkPrimitiveTopology primitiveTopology, int flags, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount);
+							LineInterpolationTestInstance	(Context& context, VkPrimitiveTopology primitiveTopology, int flags, PrimitiveWideness wideness, PrimitiveStrictness strictness, VkSampleCountFlagBits sampleCount);
 
 	virtual tcu::TestStatus	iterate							(void);
 
@@ -3666,9 +3745,10 @@
 	float					m_maxLineWidth;
 	std::vector<float>		m_lineWidths;
 	bool					m_flatshade;
+	PrimitiveStrictness		m_strictness;
 };
 
-LineInterpolationTestInstance::LineInterpolationTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, int flags, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount)
+LineInterpolationTestInstance::LineInterpolationTestInstance (Context& context, VkPrimitiveTopology primitiveTopology, int flags, PrimitiveWideness wideness, PrimitiveStrictness strictness, VkSampleCountFlagBits sampleCount)
 	: BaseRenderingTestInstance			(context, sampleCount)
 	, m_primitiveTopology				(primitiveTopology)
 	, m_projective						((flags & INTERPOLATIONFLAGS_PROJECTED) != 0)
@@ -3678,6 +3758,7 @@
 	, m_allIterationsPassed				(true)
 	, m_maxLineWidth					(1.0f)
 	, m_flatshade						((flags & INTERPOLATIONFLAGS_FLATSHADE) != 0)
+	, m_strictness						(strictness)
 {
 	DE_ASSERT(m_primitiveWideness < PRIMITIVEWIDENESS_LAST);
 
@@ -3749,8 +3830,28 @@
 			scene.lines.swap(lines);
 			scene.lineWidth = getLineWidth();
 
-			if (!verifyTriangulatedLineGroupInterpolation(resultImage, scene, args, m_context.getTestContext().getLog()))
-				m_allIterationsPassed = false;
+			switch (m_strictness)
+			{
+				case PRIMITIVESTRICTNESS_STRICT:
+				{
+					if (!verifyTriangulatedLineGroupInterpolation(resultImage, scene, args, m_context.getTestContext().getLog(), true))
+						m_allIterationsPassed = false;
+
+					break;
+				}
+
+				case PRIMITIVESTRICTNESS_NONSTRICT:
+				case PRIMITIVESTRICTNESS_IGNORE:
+				{
+					if (!verifyTriangulatedLineGroupInterpolation(resultImage, scene, args, m_context.getTestContext().getLog(), false))
+						m_allIterationsPassed = false;
+
+					break;
+				}
+
+				default:
+					TCU_THROW(InternalError, "Not implemented");
+			}
 		}
 	}
 	else
@@ -3870,21 +3971,30 @@
 class LineInterpolationTestCase : public BaseRenderingTestCase
 {
 public:
-								LineInterpolationTestCase		(tcu::TestContext& context, const std::string& name, const std::string& description, VkPrimitiveTopology primitiveTopology, int flags, PrimitiveWideness wideness, VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT)
+								LineInterpolationTestCase		(tcu::TestContext&		context,
+																 const std::string&		name,
+																 const std::string&		description,
+																 VkPrimitiveTopology	primitiveTopology,
+																 int					flags,
+																 PrimitiveWideness		wideness,
+																 PrimitiveStrictness	strictness,
+																 VkSampleCountFlagBits	sampleCount = VK_SAMPLE_COUNT_1_BIT)
 									: BaseRenderingTestCase		(context, name, description, sampleCount, (flags & INTERPOLATIONFLAGS_FLATSHADE) != 0)
 									, m_primitiveTopology		(primitiveTopology)
 									, m_flags					(flags)
 									, m_wideness				(wideness)
+									, m_strictness				(strictness)
 								{}
 
 	virtual TestInstance*		createInstance					(Context& context) const
 								{
-									return new LineInterpolationTestInstance(context, m_primitiveTopology, m_flags, m_wideness, m_sampleCount);
+									return new LineInterpolationTestInstance(context, m_primitiveTopology, m_flags, m_wideness, m_strictness, m_sampleCount);
 								}
 
 	virtual	void				checkSupport		(Context& context) const
 								{
-									if (!context.getDeviceProperties().limits.strictLines)
+									if (m_strictness == PRIMITIVESTRICTNESS_STRICT &&
+										!context.getDeviceProperties().limits.strictLines)
 										TCU_THROW(NotSupportedError, "Strict rasterization is not supported");
 
 									if (m_wideness == PRIMITIVEWIDENESS_WIDE)
@@ -3894,6 +4004,7 @@
 	const VkPrimitiveTopology	m_primitiveTopology;
 	const int					m_flags;
 	const PrimitiveWideness		m_wideness;
+	const PrimitiveStrictness	m_strictness;
 };
 
 void createRasterizationTests (tcu::TestCaseGroup* rasterizationTests)
@@ -3917,7 +4028,17 @@
 		nostippleTests->addChild(new BaseTestCase<TrianglesTestInstance>		(testCtx, "triangles",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, verify rasterization result"));
 		nostippleTests->addChild(new BaseTestCase<TriangleStripTestInstance>	(testCtx, "triangle_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, verify rasterization result"));
 		nostippleTests->addChild(new BaseTestCase<TriangleFanTestInstance>		(testCtx, "triangle_fan",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, verify rasterization result"));
-		nostippleTests->addChild(new WidenessTestCase<PointTestInstance>		(testCtx, "points",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result",					PRIMITIVEWIDENESS_WIDE, false, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+		nostippleTests->addChild(new WidenessTestCase<PointTestInstance>		(testCtx, "points",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result",					PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, false, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+
+		nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "strict_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in strict mode, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+		nostippleTests->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "strict_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP in strict mode, verify rasterization result",					PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+		nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "strict_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in strict mode with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+		nostippleTests->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "strict_line_strip_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP in strict mode with wide lines, verify rasterization result",	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+
+		nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "non_strict_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in nonstrict mode, verify rasterization result",					PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+		nostippleTests->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "non_strict_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP in nonstrict mode, verify rasterization result",					PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+		nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "non_strict_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in nonstrict mode with wide lines, verify rasterization result",	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+		nostippleTests->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "non_strict_line_strip_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP in nonstrict mode with wide lines, verify rasterization result",	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT, true, VK_SAMPLE_COUNT_1_BIT, LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
 
 		for (int i = 0; i < 3; ++i) {
 
@@ -3925,25 +4046,25 @@
 
 			LineStipple stipple = (LineStipple)i;
 
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines",						"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, i == 0 ? RESOLUTION_NPOT : 0));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines_wide",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines",						"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, i == 0 ? RESOLUTION_NPOT : 0));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines_wide",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
 
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip_wide","Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip_wide","Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
 
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
 
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
-			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
-			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+			g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+			g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, VK_SAMPLE_COUNT_1_BIT, stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
 		}
 	}
 
@@ -4118,10 +4239,20 @@
 			basic->addChild(new TriangleInterpolationTestCase		(testCtx, "triangles",		"Verify triangle interpolation",		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	INTERPOLATIONFLAGS_NONE));
 			basic->addChild(new TriangleInterpolationTestCase		(testCtx, "triangle_strip",	"Verify triangle strip interpolation",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,	INTERPOLATIONFLAGS_NONE));
 			basic->addChild(new TriangleInterpolationTestCase		(testCtx, "triangle_fan",	"Verify triangle fan interpolation",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,		INTERPOLATIONFLAGS_NONE));
-			basic->addChild(new LineInterpolationTestCase			(testCtx, "lines",			"Verify line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW));
-			basic->addChild(new LineInterpolationTestCase			(testCtx, "line_strip",		"Verify line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW));
-			basic->addChild(new LineInterpolationTestCase			(testCtx, "lines_wide",		"Verify wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE));
-			basic->addChild(new LineInterpolationTestCase			(testCtx, "line_strip_wide","Verify wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "lines",			"Verify line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "line_strip",		"Verify line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "lines_wide",		"Verify wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "line_strip_wide","Verify wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE));
+
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "strict_lines",			"Verify strict line interpolation",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "strict_line_strip",		"Verify strict line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "strict_lines_wide",		"Verify strict wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "strict_line_strip_wide",	"Verify strict wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT));
+
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_lines",			"Verify non-strict line interpolation",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_line_strip",		"Verify non-strict line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_lines_wide",		"Verify non-strict wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT));
+			basic->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_line_strip_wide",	"Verify non-strict wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,	INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT));
 		}
 
 		// .projected
@@ -4133,10 +4264,20 @@
 			projected->addChild(new TriangleInterpolationTestCase	(testCtx, "triangles",		"Verify triangle interpolation",		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	INTERPOLATIONFLAGS_PROJECTED));
 			projected->addChild(new TriangleInterpolationTestCase	(testCtx, "triangle_strip",	"Verify triangle strip interpolation",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,	INTERPOLATIONFLAGS_PROJECTED));
 			projected->addChild(new TriangleInterpolationTestCase	(testCtx, "triangle_fan",	"Verify triangle fan interpolation",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,		INTERPOLATIONFLAGS_PROJECTED));
-			projected->addChild(new LineInterpolationTestCase		(testCtx, "lines",			"Verify line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW));
-			projected->addChild(new LineInterpolationTestCase		(testCtx, "line_strip",		"Verify line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW));
-			projected->addChild(new LineInterpolationTestCase		(testCtx, "lines_wide",		"Verify wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE));
-			projected->addChild(new LineInterpolationTestCase		(testCtx, "line_strip_wide","Verify wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "lines",			"Verify line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "line_strip",		"Verify line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "lines_wide",		"Verify wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "line_strip_wide","Verify wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE));
+
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "strict_lines",			"Verify strict line interpolation",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "strict_line_strip",		"Verify strict line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "strict_lines_wide",		"Verify strict wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "strict_line_strip_wide",	"Verify strict wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT));
+
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "non_strict_lines",			"Verify non-strict line interpolation",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "non_strict_line_strip",		"Verify non-strict line strip interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "non_strict_lines_wide",		"Verify non-strict wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT));
+			projected->addChild(new LineInterpolationTestCase		(testCtx, "non_strict_line_strip_wide",	"Verify non-strict wide line strip interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_PROJECTED,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT));
 		}
 	}
 
@@ -4149,10 +4290,20 @@
 		flatshading->addChild(new TriangleInterpolationTestCase		(testCtx, "triangles",		"Verify triangle flatshading",			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	INTERPOLATIONFLAGS_FLATSHADE));
 		flatshading->addChild(new TriangleInterpolationTestCase		(testCtx, "triangle_strip",	"Verify triangle strip flatshading",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,	INTERPOLATIONFLAGS_FLATSHADE));
 		flatshading->addChild(new TriangleInterpolationTestCase		(testCtx, "triangle_fan",	"Verify triangle fan flatshading",		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,		INTERPOLATIONFLAGS_FLATSHADE));
-		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "lines",			"Verify line flatshading",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW));
-		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "line_strip",		"Verify line strip flatshading",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW));
-		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "lines_wide",		"Verify wide line flatshading",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE));
-		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "line_strip_wide","Verify wide line strip flatshading",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "lines",			"Verify line flatshading",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "line_strip",		"Verify line strip flatshading",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "lines_wide",		"Verify wide line flatshading",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "line_strip_wide","Verify wide line strip flatshading",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE));
+
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "strict_lines",			"Verify strict line flatshading",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "strict_line_strip",		"Verify strict line strip flatshading",			VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "strict_lines_wide",		"Verify strict wide line flatshading",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "strict_line_strip_wide",	"Verify strict wide line strip flatshading",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT));
+
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_lines",			"Verify non-strict line flatshading",				VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_line_strip",		"Verify non-strict line strip flatshading",			VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_lines_wide",		"Verify non-strict wide line flatshading",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT));
+		flatshading->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_line_strip_wide",	"Verify non-strict wide line strip flatshading",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,		INTERPOLATIONFLAGS_FLATSHADE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT));
 	}
 
 	const VkSampleCountFlagBits samples[] =
@@ -4186,7 +4337,13 @@
 			primitives->addChild(stippleDynamicTests);
 
 			nostippleTests->addChild(new BaseTestCase<TrianglesTestInstance>		(testCtx, "triangles",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, verify rasterization result",					samples[samplesNdx]));
-			nostippleTests->addChild(new WidenessTestCase<PointTestInstance>		(testCtx, "points",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result",						PRIMITIVEWIDENESS_WIDE,	false, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+			nostippleTests->addChild(new WidenessTestCase<PointTestInstance>		(testCtx, "points",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_POINT_LIST, verify rasterization result",						PRIMITIVEWIDENESS_WIDE,	PRIMITIVESTRICTNESS_IGNORE,	false, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+
+			nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "strict_lines",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in strict mode, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT,	true, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+			nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "strict_lines_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in strict mode with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT,	true, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+
+			nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "non_strict_lines",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in nonstrict mode, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT,	true, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
+			nostippleTests->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "non_strict_lines_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST in nonstrict mode with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT,	true, samples[samplesNdx], LINESTIPPLE_DISABLED, VK_LINE_RASTERIZATION_MODE_EXT_LAST));
 
 			for (int i = 0; i < 3; ++i) {
 
@@ -4194,25 +4351,25 @@
 
 				LineStipple stipple = (LineStipple)i;
 
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines",						"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, i == 0 ? RESOLUTION_NPOT : 0));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines_wide",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines",						"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, i == 0 ? RESOLUTION_NPOT : 0));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "lines_wide",					"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "line_strip_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT));
 
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip_wide","Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "rectangular_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "rectangular_line_strip_wide","Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT));
 
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "bresenham_lines_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "bresenham_line_strip_wide",	"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT));
 
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
-				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
-				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines",				"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, verify rasterization result",						PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+				g->addChild(new WidenessTestCase<LinesTestInstance>		(testCtx, "smooth_lines_wide",			"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_LIST with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
+				g->addChild(new WidenessTestCase<LineStripTestInstance>	(testCtx, "smooth_line_strip_wide",		"Render primitives as VK_PRIMITIVE_TOPOLOGY_LINE_STRIP with wide lines, verify rasterization result",		PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE, true, samples[samplesNdx], stipple, VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT));
 			}
 		}
 
@@ -4235,9 +4392,15 @@
 
 			rasterizationTests->addChild(interpolation);
 
-			interpolation->addChild(new TriangleInterpolationTestCase		(testCtx, "triangles",		"Verify triangle interpolation",		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	INTERPOLATIONFLAGS_NONE,								samples[samplesNdx]));
-			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "lines",			"Verify line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	samples[samplesNdx]));
-			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "lines_wide",		"Verify wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		samples[samplesNdx]));
+			interpolation->addChild(new TriangleInterpolationTestCase		(testCtx, "triangles",		"Verify triangle interpolation",		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	INTERPOLATIONFLAGS_NONE,															samples[samplesNdx]));
+			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "lines",			"Verify line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_IGNORE,	samples[samplesNdx]));
+			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "lines_wide",		"Verify wide line interpolation",		VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_IGNORE,	samples[samplesNdx]));
+
+			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "strict_lines",			"Verify strict line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_STRICT,	samples[samplesNdx]));
+			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "strict_lines_wide",		"Verify strict wide line interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_STRICT,	samples[samplesNdx]));
+
+			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_lines",			"Verify non-strict line interpolation",			VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_NARROW,	PRIMITIVESTRICTNESS_NONSTRICT,	samples[samplesNdx]));
+			interpolation->addChild(new LineInterpolationTestCase			(testCtx, "non_strict_lines_wide",		"Verify non-strict wide line interpolation",	VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		INTERPOLATIONFLAGS_NONE,	PRIMITIVEWIDENESS_WIDE,		PRIMITIVESTRICTNESS_NONSTRICT,	samples[samplesNdx]));
 		}
 	}
 
diff --git a/external/vulkancts/mustpass/master/src/excluded-tests.txt b/external/vulkancts/mustpass/master/src/excluded-tests.txt
index 2d2dc32..160f3df 100644
--- a/external/vulkancts/mustpass/master/src/excluded-tests.txt
+++ b/external/vulkancts/mustpass/master/src/excluded-tests.txt
@@ -15,4 +15,9 @@
 
 # VK-GL-CTS 1829
 # Test shader length is excessive, excluding until such time as the test case can be re-visited.
-dEQP-VK.ssbo.layout.random.scalar.75
\ No newline at end of file
+dEQP-VK.ssbo.layout.random.scalar.75
+
+# VK-GL-CTS 1024
+dEQP-VK.rasterization.interpolation_multisample_16_bit.lines_wide
+dEQP-VK.rasterization.interpolation_multisample_16_bit.non_strict_lines_wide
+dEQP-VK.rasterization.primitives_multisample_16_bit.no_stipple.non_strict_lines_wide
diff --git a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
index 18cb4e6..73512ef 100644
--- a/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
+++ b/external/vulkancts/mustpass/master/vk-default-no-waivers.txt
Binary files differ
diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt
index b0acfc5..c2f97fb 100644
--- a/external/vulkancts/mustpass/master/vk-default.txt
+++ b/external/vulkancts/mustpass/master/vk-default.txt
Binary files differ
diff --git a/framework/common/tcuRasterizationVerifier.cpp b/framework/common/tcuRasterizationVerifier.cpp
index 3945bce..8fe7cf3 100644
--- a/framework/common/tcuRasterizationVerifier.cpp
+++ b/framework/common/tcuRasterizationVerifier.cpp
@@ -28,7 +28,9 @@
 #include "tcuTextureUtil.hpp"
 #include "tcuVectorUtil.hpp"
 #include "tcuFloat.hpp"
+
 #include "deMath.h"
+#include "deStringUtil.hpp"
 
 #include "rrRasterizer.hpp"
 
@@ -651,7 +653,11 @@
 };
 
 template <typename Interpolator>
-bool verifyTriangleGroupInterpolationWithInterpolator (const tcu::Surface& surface, const TriangleSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const Interpolator& interpolator)
+bool verifyTriangleGroupInterpolationWithInterpolator (const tcu::Surface&							surface,
+													   const TriangleSceneSpec&						scene,
+													   const RasterizationArguments&				args,
+													   VerifyTriangleGroupInterpolationLogStash&	logStash,
+													   const Interpolator&							interpolator)
 {
 	const tcu::RGBA		invalidPixelColor	= tcu::RGBA(255, 0, 0, 255);
 	const bool			multisampled		= (args.numSamples != 0);
@@ -666,21 +672,22 @@
 
 	// log format
 
-	log << tcu::TestLog::Message << "Verifying rasterization result. Native format is RGB" << args.redBits << args.greenBits << args.blueBits << tcu::TestLog::EndMessage;
+	logStash.messages.push_back(std::string("Verifying rasterization result. Native format is RGB" + de::toString(args.redBits) + de::toString(args.greenBits) + de::toString(args.blueBits)));
 	if (args.redBits > 8 || args.greenBits > 8 || args.blueBits > 8)
-		log << tcu::TestLog::Message << "Warning! More than 8 bits in a color channel, this may produce false negatives." << tcu::TestLog::EndMessage;
+		logStash.messages.push_back(std::string("Warning! More than 8 bits in a color channel, this may produce false negatives."));
 
 	// subpixel bits in a valid range?
 
 	if (subPixelBits < 0)
 	{
-		log << tcu::TestLog::Message << "Invalid subpixel count (" << subPixelBits << "), assuming 0" << tcu::TestLog::EndMessage;
+		logStash.messages.push_back(std::string("Invalid subpixel count (" + de::toString(subPixelBits) + "), assuming 0"));
 		subPixelBits = 0;
 	}
 	else if (subPixelBits > 16)
 	{
 		// At high subpixel bit counts we might overflow. Checking at lower bit count is ok, but is less strict
-		log << tcu::TestLog::Message << "Subpixel count is greater than 16 (" << subPixelBits << "). Checking results using less strict 16 bit requirements. This may produce false positives." << tcu::TestLog::EndMessage;
+		logStash.messages.push_back(std::string("Subpixel count is greater than 16 (" + de::toString(subPixelBits) + ")."
+												" Checking results using less strict 16 bit requirements. This may produce false positives."));
 		subPixelBits = 16;
 	}
 
@@ -763,11 +770,13 @@
 				// don't fill the logs with too much data
 				if (errorCount < errorFloodThreshold)
 				{
-					log << tcu::TestLog::Message
-						<< "Found an invalid pixel at (" << x << "," << y << ")\n"
+					std::ostringstream str;
+
+					str << "Found an invalid pixel at (" << x << "," << y << ")\n"
 						<< "\tPixel color:\t\t" << color << "\n"
-						<< "\tExpected background color.\n"
-						<< tcu::TestLog::EndMessage;
+						<< "\tExpected background color.\n";
+
+					logStash.messages.push_back(str.str());
 				}
 
 				++invalidPixels;
@@ -816,8 +825,9 @@
 				// don't fill the logs with too much data
 				if (errorCount <= errorFloodThreshold)
 				{
-					log << tcu::TestLog::Message
-						<< "Found an invalid pixel at (" << x << "," << y << ")\n"
+					std::ostringstream str;
+
+					str << "Found an invalid pixel at (" << x << "," << y << ")\n"
 						<< "\tPixel color:\t\t" << color << "\n"
 						<< "\tNative color:\t\t" << pixelNativeColor << "\n"
 						<< "\tAllowed error:\t\t" << tcu::IVec3(thresholdRed, thresholdGreen, thresholdBlue) << "\n"
@@ -826,8 +836,8 @@
 						<< "\tReference native float min: " << tcu::clamp(colorMinF - tcu::IVec3(thresholdRed, thresholdGreen, thresholdBlue).cast<float>(), tcu::Vec3(0.0f, 0.0f, 0.0f), formatLimit.cast<float>()) << "\n"
 						<< "\tReference native float max: " << tcu::clamp(colorMaxF + tcu::IVec3(thresholdRed, thresholdGreen, thresholdBlue).cast<float>(), tcu::Vec3(0.0f, 0.0f, 0.0f), formatLimit.cast<float>()) << "\n"
 						<< "\tFmin:\t" << tcu::clamp(valueRangeMin, tcu::Vec3(0.0f, 0.0f, 0.0f), tcu::Vec3(1.0f, 1.0f, 1.0f)) << "\n"
-						<< "\tFmax:\t" << tcu::clamp(valueRangeMax, tcu::Vec3(0.0f, 0.0f, 0.0f), tcu::Vec3(1.0f, 1.0f, 1.0f)) << "\n"
-						<< tcu::TestLog::EndMessage;
+						<< "\tFmax:\t" << tcu::clamp(valueRangeMax, tcu::Vec3(0.0f, 0.0f, 0.0f), tcu::Vec3(1.0f, 1.0f, 1.0f)) << "\n";
+					logStash.messages.push_back(str.str());
 				}
 
 				++invalidPixels;
@@ -838,28 +848,16 @@
 
 	// don't just hide failures
 	if (errorCount > errorFloodThreshold)
-		log << tcu::TestLog::Message << "Omitted " << (errorCount-errorFloodThreshold) << " pixel error description(s)." << tcu::TestLog::EndMessage;
+		logStash.messages.push_back(std::string("Omitted " + de::toString(errorCount - errorFloodThreshold) + " pixel error description(s)."));
+
+	logStash.success		= (invalidPixels == 0);
+	logStash.invalidPixels	= invalidPixels;
 
 	// report result
-	if (invalidPixels)
-	{
-		log << tcu::TestLog::Message << invalidPixels << " invalid pixel(s) found." << tcu::TestLog::EndMessage;
-		log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
-			<< tcu::TestLog::Image("Result", "Result",			surface)
-			<< tcu::TestLog::Image("ErrorMask", "ErrorMask",	errorMask)
-			<< tcu::TestLog::EndImageSet;
+	if (!logStash.success)
+		logStash.errorMask = errorMask;
 
-		return false;
-	}
-	else
-	{
-		log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
-		log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
-			<< tcu::TestLog::Image("Result", "Result", surface)
-			<< tcu::TestLog::EndImageSet;
-
-		return true;
-	}
+	return logStash.success;
 }
 
 
@@ -907,7 +905,14 @@
 	CLIPMODE_LAST
 };
 
-bool verifyMultisampleLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, ClipMode clipMode, VerifyTriangleGroupRasterizationLogStash* logStash = DE_NULL, const bool vulkanLinesTest = false)
+bool verifyMultisampleLineGroupRasterization (const tcu::Surface&						surface,
+											  const LineSceneSpec&						scene,
+											  const RasterizationArguments&				args,
+											  tcu::TestLog&								log,
+											  ClipMode									clipMode,
+											  VerifyTriangleGroupRasterizationLogStash*	logStash,
+											  const bool								vulkanLinesTest,
+											  const bool								strictMode)
 {
 	// Multisampled line == 2 triangles
 
@@ -948,7 +953,9 @@
 		};
 
 		const tcu::Vec2 lineDir			= tcu::normalize(lineScreenSpace[1] - lineScreenSpace[0]);
-		const tcu::Vec2 lineNormalDir	= tcu::Vec2(lineDir.y(), -lineDir.x());
+		const tcu::Vec2 lineNormalDir	= strictMode ? tcu::Vec2(lineDir.y(), -lineDir.x())
+										: isLineXMajor(lineScreenSpace[0], lineScreenSpace[1]) ? tcu::Vec2(0.0f, 1.0f)
+										: tcu::Vec2(1.0f, 0.0f);
 
 		if (scene.stippleEnable)
 		{
@@ -1060,10 +1067,20 @@
 		}
 	}
 
-	return verifyTriangleGroupRasterization(surface, triangleScene, args, log, scene.verificationMode, logStash, vulkanLinesTest);
+	if (logStash != DE_NULL)
+	{
+		logStash->messages.push_back("Rasterization clipping mode: " + std::string(clipMode == CLIPMODE_USE_CLIPPING_BOX ? "CLIPMODE_USE_CLIPPING_BOX" : "CLIPMODE_NO_CLIPPING") + ".");
+		logStash->messages.push_back("Rasterization line draw strictness mode: " + std::string(strictMode ? "strict" : "non-strict") + ".");
+	}
+
+	return verifyTriangleGroupRasterization(surface, triangleScene, args, log, VERIFICATIONMODE_STRICT, logStash, vulkanLinesTest);
 }
 
-bool verifyMultisampleLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log)
+bool verifyMultisampleLineGroupInterpolationInternal (const tcu::Surface&						surface,
+													  const LineSceneSpec&						scene,
+													  const RasterizationArguments&				args,
+													  VerifyTriangleGroupInterpolationLogStash&	logStash,
+													  const bool								strictMode)
 {
 	// Multisampled line == 2 triangles
 
@@ -1087,7 +1104,9 @@
 		};
 
 		const tcu::Vec2 lineDir			= tcu::normalize(lineScreenSpace[1] - lineScreenSpace[0]);
-		const tcu::Vec2 lineNormalDir	= tcu::Vec2(lineDir.y(), -lineDir.x());
+		const tcu::Vec2 lineNormalDir	= strictMode ? tcu::Vec2(lineDir.y(), -lineDir.x())
+										: isLineXMajor(lineScreenSpace[0], lineScreenSpace[1]) ? tcu::Vec2(0.0f, 1.0f)
+										: tcu::Vec2(1.0f, 0.0f);
 
 		const tcu::Vec2 lineQuadScreenSpace[4] =
 		{
@@ -1129,7 +1148,76 @@
 		triangleScene.triangles[lineNdx*2 + 1].colors[2] = scene.lines[lineNdx].colors[1];
 	}
 
-	return verifyTriangleGroupInterpolationWithInterpolator(surface, triangleScene, args, log, MultisampleLineInterpolator(scene));
+	return verifyTriangleGroupInterpolationWithInterpolator(surface, triangleScene, args, logStash, MultisampleLineInterpolator(scene));
+}
+
+static void logTriangleGroupnterpolationStash (const tcu::Surface& surface, tcu::TestLog& log, VerifyTriangleGroupInterpolationLogStash& logStash)
+{
+	// Output results
+	log << tcu::TestLog::Message << "Verifying rasterization result." << tcu::TestLog::EndMessage;
+
+	for (size_t msgNdx = 0; msgNdx < logStash.messages.size(); ++msgNdx)
+		log << tcu::TestLog::Message << logStash.messages[msgNdx] << tcu::TestLog::EndMessage;
+
+	// report result
+	if (!logStash.success)
+	{
+		log << tcu::TestLog::Message << logStash.invalidPixels << " invalid pixel(s) found." << tcu::TestLog::EndMessage;
+		log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+			<< tcu::TestLog::Image("Result", "Result",			surface)
+			<< tcu::TestLog::Image("ErrorMask", "ErrorMask",	logStash.errorMask)
+			<< tcu::TestLog::EndImageSet;
+	}
+	else
+	{
+		log << tcu::TestLog::Message << "No invalid pixels found." << tcu::TestLog::EndMessage;
+		log << tcu::TestLog::ImageSet("Verification result", "Result of rendering")
+			<< tcu::TestLog::Image("Result", "Result", surface)
+			<< tcu::TestLog::EndImageSet;
+	}
+}
+
+static bool verifyMultisampleLineGroupInterpolation (const tcu::Surface&			surface,
+													 const LineSceneSpec&			scene,
+													 const RasterizationArguments&	args,
+													 tcu::TestLog&					log,
+													 const bool						strictMode = true)
+{
+	bool										result					= false;
+	VerifyTriangleGroupInterpolationLogStash	nonStrictModeLogStash;
+	VerifyTriangleGroupInterpolationLogStash	strictModeLogStash;
+
+	nonStrictModeLogStash.messages.push_back("Non-strict line draw mode.");
+	strictModeLogStash.messages.push_back("Strict mode line draw mode.");
+
+	if (strictMode)
+	{
+		result = verifyMultisampleLineGroupInterpolationInternal(surface,scene, args, strictModeLogStash, strictMode);
+
+		logTriangleGroupnterpolationStash(surface, log, strictModeLogStash);
+	}
+	else
+	{
+		if (verifyMultisampleLineGroupInterpolationInternal(surface,scene, args, nonStrictModeLogStash, false))
+		{
+			logTriangleGroupnterpolationStash(surface, log, nonStrictModeLogStash);
+
+			result	= true;
+		}
+		else if (verifyMultisampleLineGroupInterpolationInternal(surface,scene, args, strictModeLogStash, true))
+		{
+			logTriangleGroupnterpolationStash(surface, log, strictModeLogStash);
+
+			result	= true;
+		}
+		else
+		{
+			logTriangleGroupnterpolationStash(surface, log, nonStrictModeLogStash);
+			logTriangleGroupnterpolationStash(surface, log, strictModeLogStash);
+		}
+	}
+
+	return result;
 }
 
 bool verifyMultisamplePointGroupRasterization (const tcu::Surface& surface, const PointSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log)
@@ -2346,11 +2434,14 @@
 	}
 }
 
-static void verifyTriangleGroupRasterizationLog (const tcu::Surface& surface, tcu::TestLog& log, VerifyTriangleGroupRasterizationLogStash& logStash)
+static void logTriangleGroupRasterizationStash (const tcu::Surface& surface, tcu::TestLog& log, VerifyTriangleGroupRasterizationLogStash& logStash)
 {
 	// Output results
 	log << tcu::TestLog::Message << "Verifying rasterization result." << tcu::TestLog::EndMessage;
 
+	for (size_t msgNdx = 0; msgNdx < logStash.messages.size(); ++msgNdx)
+		log << tcu::TestLog::Message << logStash.messages[msgNdx] << tcu::TestLog::EndMessage;
+
 	if (!logStash.result)
 	{
 		log << tcu::TestLog::Message << "Invalid pixels found:\n\t"
@@ -2563,7 +2654,7 @@
 
 		if (logStash == DE_NULL)
 		{
-			verifyTriangleGroupRasterizationLog(surface, log, *tempLogStash);
+			logTriangleGroupRasterizationStash(surface, log, *tempLogStash);
 			delete tempLogStash;
 		}
 	}
@@ -2576,34 +2667,44 @@
 	const bool multisampled = args.numSamples != 0;
 
 	if (multisampled)
-		return verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_NO_CLIPPING, DE_NULL);
+		return verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_NO_CLIPPING, DE_NULL, false, true);
 	else
 		return verifySinglesampleLineGroupRasterization(surface, scene, args, log);
 }
 
 bool verifyClippedTriangulatedLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log)
 {
-	return verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_USE_CLIPPING_BOX, DE_NULL);
+	return verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_USE_CLIPPING_BOX, DE_NULL, false, true);
 }
 
-bool verifyRelaxedLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const bool vulkanLinesTest)
+bool verifyRelaxedLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const bool vulkanLinesTest, const bool strict)
 {
-	VerifyTriangleGroupRasterizationLogStash noClippingLogStash;
 	VerifyTriangleGroupRasterizationLogStash useClippingLogStash;
+	VerifyTriangleGroupRasterizationLogStash noClippingLogStash;
+	VerifyTriangleGroupRasterizationLogStash useClippingForcedStrictLogStash;
+	VerifyTriangleGroupRasterizationLogStash noClippingForcedStrictLogStash;
 
-	if (verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_USE_CLIPPING_BOX, &useClippingLogStash, vulkanLinesTest))
+	if (verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_USE_CLIPPING_BOX, &useClippingLogStash, vulkanLinesTest, strict))
 	{
-		log << tcu::TestLog::Message << "Relaxed rasterization succeeded with CLIPMODE_USE_CLIPPING_BOX, details follow." << tcu::TestLog::EndMessage;
-
-		verifyTriangleGroupRasterizationLog(surface, log, useClippingLogStash);
+		logTriangleGroupRasterizationStash(surface, log, useClippingLogStash);
 
 		return true;
 	}
-	else if (verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_NO_CLIPPING, &noClippingLogStash, vulkanLinesTest))
+	else if (verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_NO_CLIPPING, &noClippingLogStash, vulkanLinesTest, strict))
 	{
-		log << tcu::TestLog::Message << "Relaxed rasterization succeeded with CLIPMODE_NO_CLIPPING, details follow." << tcu::TestLog::EndMessage;
+		logTriangleGroupRasterizationStash(surface, log, noClippingLogStash);
 
-		verifyTriangleGroupRasterizationLog(surface, log, noClippingLogStash);
+		return true;
+	}
+	else if (strict == false && verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_USE_CLIPPING_BOX, &useClippingForcedStrictLogStash, vulkanLinesTest, true))
+	{
+		logTriangleGroupRasterizationStash(surface, log, useClippingForcedStrictLogStash);
+
+		return true;
+	}
+	else if (strict == false && verifyMultisampleLineGroupRasterization(surface, scene, args, log, CLIPMODE_NO_CLIPPING, &noClippingForcedStrictLogStash, vulkanLinesTest, true))
+	{
+		logTriangleGroupRasterizationStash(surface, log, noClippingForcedStrictLogStash);
 
 		return true;
 	}
@@ -2611,8 +2712,14 @@
 	{
 		log << tcu::TestLog::Message << "Relaxed rasterization failed, details follow." << tcu::TestLog::EndMessage;
 
-		verifyTriangleGroupRasterizationLog(surface, log, useClippingLogStash);
-		verifyTriangleGroupRasterizationLog(surface, log, noClippingLogStash);
+		logTriangleGroupRasterizationStash(surface, log, useClippingLogStash);
+		logTriangleGroupRasterizationStash(surface, log, noClippingLogStash);
+
+		if (strict == false)
+		{
+			logTriangleGroupRasterizationStash(surface, log, useClippingForcedStrictLogStash);
+			logTriangleGroupRasterizationStash(surface, log, noClippingForcedStrictLogStash);
+		}
 
 		return false;
 	}
@@ -2626,7 +2733,12 @@
 
 bool verifyTriangleGroupInterpolation (const tcu::Surface& surface, const TriangleSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log)
 {
-	return verifyTriangleGroupInterpolationWithInterpolator(surface, scene, args, log, TriangleInterpolator(scene));
+	VerifyTriangleGroupInterpolationLogStash	logStash;
+	const bool									result		= verifyTriangleGroupInterpolationWithInterpolator(surface, scene, args, logStash, TriangleInterpolator(scene));
+
+	logTriangleGroupnterpolationStash(surface, log, logStash);
+
+	return result;
 }
 
 LineInterpolationMethod verifyLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log)
@@ -2664,9 +2776,9 @@
 	}
 }
 
-bool verifyTriangulatedLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log)
+bool verifyTriangulatedLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const bool strictMode)
 {
-	return verifyMultisampleLineGroupInterpolation(surface, scene, args, log);
+	return verifyMultisampleLineGroupInterpolation(surface, scene, args, log, strictMode);
 }
 
 } // tcu
diff --git a/framework/common/tcuRasterizationVerifier.hpp b/framework/common/tcuRasterizationVerifier.hpp
index ffff501..eb8323c 100644
--- a/framework/common/tcuRasterizationVerifier.hpp
+++ b/framework/common/tcuRasterizationVerifier.hpp
@@ -119,10 +119,19 @@
 
 struct VerifyTriangleGroupRasterizationLogStash
 {
-	int				missingPixels;
-	int				unexpectedPixels;
-	tcu::Surface	errorMask;
-	bool			result;
+	std::vector<std::string>	messages;
+	int							missingPixels;
+	int							unexpectedPixels;
+	tcu::Surface				errorMask;
+	bool						result;
+};
+
+struct VerifyTriangleGroupInterpolationLogStash
+{
+	std::vector<std::string>	messages;
+	int							invalidPixels;
+	tcu::Surface				errorMask;
+	bool						success;
 };
 
 /*--------------------------------------------------------------------*//*!
@@ -178,7 +187,7 @@
  *
  * Returns false if both rasterizations are invalid.
  *//*--------------------------------------------------------------------*/
-bool verifyRelaxedLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const bool vulkanLinesTest = false);
+bool verifyRelaxedLineGroupRasterization (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const bool vulkanLinesTest = false, const bool strict = true);
 
 /*--------------------------------------------------------------------*//*!
  * \brief Verify point rasterization result
@@ -223,7 +232,7 @@
  *
  * Returns false if invalid rasterization interpolation is found.
  *//*--------------------------------------------------------------------*/
-bool verifyTriangulatedLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log);
+bool verifyTriangulatedLineGroupInterpolation (const tcu::Surface& surface, const LineSceneSpec& scene, const RasterizationArguments& args, tcu::TestLog& log, const bool strictMode = true);
 
 } // tcu