Commit 4accbe92 by Jamie Madill Committed by Commit Bot

Fix separable Geometry shaders.

Geometry shaders weren't being processed in some of the separable shader logic. This CL fixes two cases: one in Program and one in ProgramPipeline. Bug: angleproject:5409 Change-Id: I19adc5c11a54814d28dd20574a5e038ca9dbd021 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2574827 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 2c90a90a
......@@ -1129,6 +1129,27 @@ const char *GetDebugMessageSeverityString(GLenum severity)
return "Unknown Severity";
}
}
ShaderType GetShaderTypeFromBitfield(size_t singleShaderType)
{
switch (singleShaderType)
{
case GL_VERTEX_SHADER_BIT:
return ShaderType::Vertex;
case GL_FRAGMENT_SHADER_BIT:
return ShaderType::Fragment;
case GL_COMPUTE_SHADER_BIT:
return ShaderType::Compute;
case GL_GEOMETRY_SHADER_BIT:
return ShaderType::Geometry;
case GL_TESS_CONTROL_SHADER_BIT:
return ShaderType::TessControl;
case GL_TESS_EVALUATION_SHADER_BIT:
return ShaderType::TessEvaluation;
default:
return ShaderType::InvalidEnum;
}
}
} // namespace gl
namespace egl
......
......@@ -245,6 +245,8 @@ enum class SrgbOverride
Linear
};
ShaderType GetShaderTypeFromBitfield(size_t singleShaderType);
} // namespace gl
namespace egl
......
......@@ -3323,7 +3323,7 @@ bool Program::linkValidateShaders(InfoLog &infoLog)
{
if (isSeparable())
{
if (!fragmentShader && !vertexShader)
if (!fragmentShader && !vertexShader && !geometryShader)
{
infoLog << "No compiled shaders.";
return false;
......@@ -3342,6 +3342,13 @@ bool Program::linkValidateShaders(InfoLog &infoLog)
infoLog << "Vertex shader is not compiled.";
return false;
}
ASSERT(!geometryShader || geometryShader->getType() == ShaderType::Geometry);
if (geometryShader && !geometryShader->isCompiled())
{
infoLog << "Geometry shader is not compiled.";
return false;
}
}
else
{
......
......@@ -92,41 +92,16 @@ void ProgramPipelineState::useProgramStages(
Program *shaderProgram,
std::vector<angle::ObserverBinding> *programObserverBindings)
{
if (stages == GL_ALL_SHADER_BITS)
for (size_t singleShaderBit : angle::BitSet16<16>(static_cast<uint16_t>(stages)))
{
for (const ShaderType shaderType : gl::AllShaderTypes())
// Cast back to a bit after the iterator returns an index.
ShaderType shaderType = GetShaderTypeFromBitfield(angle::Bit<size_t>(singleShaderBit));
if (shaderType == ShaderType::InvalidEnum)
{
size_t index = static_cast<size_t>(shaderType);
ASSERT(index < programObserverBindings->size());
useProgramStage(context, shaderType, shaderProgram,
&programObserverBindings->at(index));
}
}
else
{
if (stages & GL_VERTEX_SHADER_BIT)
{
size_t index = static_cast<size_t>(ShaderType::Vertex);
ASSERT(index < programObserverBindings->size());
useProgramStage(context, ShaderType::Vertex, shaderProgram,
&programObserverBindings->at(index));
}
if (stages & GL_FRAGMENT_SHADER_BIT)
{
size_t index = static_cast<size_t>(ShaderType::Fragment);
ASSERT(index < programObserverBindings->size());
useProgramStage(context, ShaderType::Fragment, shaderProgram,
&programObserverBindings->at(index));
}
if (stages & GL_COMPUTE_SHADER_BIT)
{
size_t index = static_cast<size_t>(ShaderType::Compute);
ASSERT(index < programObserverBindings->size());
useProgramStage(context, ShaderType::Compute, shaderProgram,
&programObserverBindings->at(index));
break;
}
useProgramStage(context, shaderType, shaderProgram,
&programObserverBindings->at(static_cast<size_t>(shaderType)));
}
}
......
......@@ -191,17 +191,6 @@
5407 VULKAN : dEQP-GLES31.functional.geometry_shading.instanced.multiple_layers_per_invocation* = SKIP
3571 VULKAN : dEQP-GLES31.functional.geometry_shading.*transform_feedback* = SKIP
3571 VULKAN : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.*geo* = SKIP
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.*separable_geometry* = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.41 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.44 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.48 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.51 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.55 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.uniform.random.41 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.uniform.random.44 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.uniform.random.48 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.uniform.random.51 = FAIL
5409 VULKAN : dEQP-GLES31.functional.program_interface_query.uniform.random.55 = FAIL
// Shader I/O blocks:
// Missing matching of block names with unnamed SSBOs with the same member variable
......
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