Commit 9b1c569b by Mohan Maiya Committed by Commit Bot

Vulkan: Handle vertex count and primitive mode error cases in TS

When handling tessellation shaders these 2 requirements need to be met - 1. TCS - vertex count should be declared at least once 2. TES - primitive mode should be declared at least once After translating TCS/TES check whether these requirements are met and error out if they are not. Bug: angleproject:5557 Test: dEQP-GLES31 - functional.shaders.linkage.es31.tessellation.varying.rules.unspecified_* KHR-GLES32 - core.tessellation_shader.compilation_and_linking_errors.te_lacking_primitive_mode_declaration Change-Id: I727d548ad446646bbece1fb78197639537b5f395 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2714465Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent 550f2a3e
...@@ -3389,14 +3389,46 @@ bool Program::linkValidateShaders(InfoLog &infoLog) ...@@ -3389,14 +3389,46 @@ bool Program::linkValidateShaders(InfoLog &infoLog)
Shader *tessControlShader = shaders[ShaderType::TessControl]; Shader *tessControlShader = shaders[ShaderType::TessControl];
if (tessControlShader) if (tessControlShader)
{ {
mState.mExecutable->mTessControlShaderVertices = int tcsShaderVertices = tessControlShader->getTessControlShaderVertices();
tessControlShader->getTessControlShaderVertices(); if (tcsShaderVertices == 0)
{
// In tessellation control shader, output vertices should be specified at least
// once.
// > GLSL ES Version 3.20.6 spec:
// > 4.4.2. Output Layout Qualifiers
// > Tessellation Control Outputs
// > ...
// > There must be at least one layout qualifier specifying an output patch vertex
// > count in any program containing a tessellation control shader.
infoLog << "In Tessellation Control Shader, at least one layout qualifier "
"specifying an output patch vertex count must exist.";
return false;
}
mState.mExecutable->mTessControlShaderVertices = tcsShaderVertices;
} }
Shader *tessEvaluationShader = shaders[ShaderType::TessEvaluation]; Shader *tessEvaluationShader = shaders[ShaderType::TessEvaluation];
if (tessEvaluationShader) if (tessEvaluationShader)
{ {
mState.mExecutable->mTessGenMode = tessEvaluationShader->getTessGenMode(); GLenum tesPrimitiveMode = tessEvaluationShader->getTessGenMode();
if (tesPrimitiveMode == 0)
{
// In tessellation evaluation shader, a primitive mode should be specified at least
// once.
// > GLSL ES Version 3.20.6 spec:
// > 4.4.1. Input Layout Qualifiers
// > Tessellation Evaluation Inputs
// > ...
// > The tessellation evaluation shader object in a program must declare a primitive
// > mode in its input layout. Declaring vertex spacing, ordering, or point mode
// > identifiers is optional.
infoLog << "The Tessellation Evaluation Shader object in a program must declare a "
"primitive mode in its input layout.";
return false;
}
mState.mExecutable->mTessGenMode = tesPrimitiveMode;
mState.mExecutable->mTessGenSpacing = tessEvaluationShader->getTessGenSpacing(); mState.mExecutable->mTessGenSpacing = tessEvaluationShader->getTessGenSpacing();
mState.mExecutable->mTessGenVertexOrder = tessEvaluationShader->getTessGenVertexOrder(); mState.mExecutable->mTessGenVertexOrder = tessEvaluationShader->getTessGenVertexOrder();
mState.mExecutable->mTessGenPointMode = tessEvaluationShader->getTessGenPointMode(); mState.mExecutable->mTessGenPointMode = tessEvaluationShader->getTessGenPointMode();
......
...@@ -183,8 +183,6 @@ ...@@ -183,8 +183,6 @@
5452 VULKAN : dEQP-GLES31.functional.geometry_shading.layered.layer_provoking_vertex_* = FAIL 5452 VULKAN : dEQP-GLES31.functional.geometry_shading.layered.layer_provoking_vertex_* = FAIL
// Tessellation shader support: // Tessellation shader support:
5557 VULKAN : dEQP-GLES31.functional.shaders.linkage.es31.tessellation.varying.rules.unspecified_vertex_count = FAIL
5557 VULKAN : dEQP-GLES31.functional.shaders.linkage.es31.tessellation.varying.rules.unspecified_primitive_mode = FAIL
5557 VULKAN : dEQP-GLES31.functional.tessellation.shader_input_output.barrier = FAIL 5557 VULKAN : dEQP-GLES31.functional.tessellation.shader_input_output.barrier = FAIL
5557 VULKAN : dEQP-GLES31.functional.tessellation.shader_input_output.gl_position_tcs_to_tes = FAIL 5557 VULKAN : dEQP-GLES31.functional.tessellation.shader_input_output.gl_position_tcs_to_tes = FAIL
......
...@@ -48,7 +48,6 @@ ...@@ -48,7 +48,6 @@
5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.vertex.vertex_ordering = FAIL 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.vertex.vertex_ordering = FAIL
5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_tessLevel = FAIL 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_tessLevel = FAIL
5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.compilation_and_linking_errors.te_non_arrayed_per_vertex_input_blocks = SKIP 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.compilation_and_linking_errors.te_non_arrayed_per_vertex_input_blocks = SKIP
5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.compilation_and_linking_errors.te_lacking_primitive_mode_declaration = FAIL
5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.compilation_and_linking_errors.tc_non_arrayed_per_vertex_input_variables = FAIL 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.compilation_and_linking_errors.tc_non_arrayed_per_vertex_input_variables = FAIL
// Vulkan Validation error regarding buffer usage bits for transform feedback: // Vulkan Validation error regarding buffer usage bits for transform feedback:
5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.vertex.vertex_spacing = FAIL 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.vertex.vertex_spacing = FAIL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment