diff options
author | Chris Mayer <cmayer@nvidia.com> | 2019-08-12 16:58:06 +0200 |
---|---|---|
committer | Mark Lobodzinski <mark@lunarg.com> | 2019-08-20 10:04:25 -0600 |
commit | 9c888d581986fc4cc38fe2b01c368ed038f82397 (patch) | |
tree | d801dc13cf1d83ccd1cf64133a5d3e050785d931 | |
parent | f7416f3837a9e47c14f84494112835217a4696f9 (diff) | |
download | vulkan-validation-layers-9c888d581986fc4cc38fe2b01c368ed038f82397.tar.gz |
test: Added VK_NV_geometry_shader_passthrough
Added positive layer test to make sure that the usage of
VK_NV_geometry_shader_passthrough does not cause any
errors.
-rw-r--r-- | tests/vkpositivelayertests.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/vkpositivelayertests.cpp b/tests/vkpositivelayertests.cpp index a9e01dac0..a0a114b1e 100644 --- a/tests/vkpositivelayertests.cpp +++ b/tests/vkpositivelayertests.cpp @@ -8092,3 +8092,98 @@ TEST_F(VkPositiveLayerTest, SubpassWithReadOnlyLayoutWithoutDependency) { vkDestroyRenderPass(m_device->device(), rp, nullptr); vkDestroyImageView(m_device->device(), view, nullptr); } + +TEST_F(VkPositiveLayerTest, GeometryShaderPassthroughNV) { + TEST_DESCRIPTION("Test to validate VK_NV_geometry_shader_passthrough"); + + ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); + + VkPhysicalDeviceFeatures available_features = {}; + ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features)); + + if (!available_features.geometryShader) { + printf("%s VkPhysicalDeviceFeatures::geometryShader is not supported, skipping test\n", kSkipPrefix); + return; + } + + if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME)) { + m_device_extension_names.push_back(VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME); + } else { + printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME); + return; + } + + ASSERT_NO_FATAL_FAILURE(InitState()); + ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); + + const char vs_src[] = R"( + #version 450 + + out gl_PerVertex { + vec4 gl_Position; + }; + + layout(location = 0) out ColorBlock {vec4 vertexColor;}; + + const vec2 positions[3] = { vec2( 0.0f, -0.5f), + vec2( 0.5f, 0.5f), + vec2(-0.5f, 0.5f) + }; + + const vec4 colors[3] = { vec4(1.0f, 0.0f, 0.0f, 1.0f), + vec4(0.0f, 1.0f, 0.0f, 1.0f), + vec4(0.0f, 0.0f, 1.0f, 1.0f) + }; + void main() + { + vertexColor = colors[gl_VertexIndex % 3]; + gl_Position = vec4(positions[gl_VertexIndex % 3], 0.0, 1.0); + })"; + + const char gs_src[] = R"( + #version 450 + #extension GL_NV_geometry_shader_passthrough: require + + layout(triangles) in; + layout(triangle_strip, max_vertices = 3) out; + + layout(passthrough) in gl_PerVertex {vec4 gl_Position;}; + layout(location = 0, passthrough) in ColorBlock {vec4 vertexColor;}; + + void main() + { + gl_Layer = 0; + })"; + + const char fs_src[] = R"( + #version 450 + + layout(location = 0) in ColorBlock {vec4 vertexColor;}; + layout(location = 0) out vec4 outColor; + + void main() { + outColor = vertexColor; + })"; + + m_errorMonitor->ExpectSuccess(); + + const VkPipelineLayoutObj pl(m_device); + + VkPipelineObj pipe(m_device); + pipe.AddDefaultColorAttachment(); + + VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this); + pipe.AddShader(&vs); + + VkShaderObj gs(m_device, gs_src, VK_SHADER_STAGE_GEOMETRY_BIT, this); + pipe.AddShader(&gs); + + VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this); + pipe.AddShader(&fs); + + // Create pipeline and make sure that the usage of NV_geometry_shader_passthrough + // in the fragment shader does not cause any errors. + pipe.CreateVKPipeline(pl.handle(), renderPass()); + + m_errorMonitor->VerifyNotFound(); +} |