Commit de53e308 by Shahbaz Youssefi Committed by Commit Bot

Metal: Fix XFB failures on ARM.

Metal back-end needs to generate 2 versions of XFB shader: - one version without XFB emulation code for rasterized draw. - one version with XFB emulation code for draws with rasterization disabled. Based on a change by le.hoang.q@gmail.com Bug: chromium:1167763 Change-Id: I2858859e15b18701fadff09092bb08778c4a7e64 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2648636Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarLe Hoang Quyen <le.hoang.q@gmail.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 4921e457
......@@ -3796,8 +3796,14 @@ void GlslangAssignLocations(const GlslangSourceOptions &options,
AssignNonTextureBindings(options, programExecutable, shaderType, programInterfaceInfo,
variableInfoMapOut);
if (options.emulateTransformFeedback && gl::ShaderTypeSupportsTransformFeedback(shaderType))
if (options.supportsTransformFeedbackEmulation &&
gl::ShaderTypeSupportsTransformFeedback(shaderType))
{
// If transform feedback emulation is not enabled, mark all transform feedback output
// buffers as inactive.
isTransformFeedbackStage =
isTransformFeedbackStage && options.enableTransformFeedbackEmulation;
AssignTransformFeedbackEmulationBindings(shaderType, programState, isTransformFeedbackStage,
programInterfaceInfo, variableInfoMapOut);
}
......@@ -3821,9 +3827,10 @@ void GlslangGetShaderSource(const GlslangSourceOptions &options,
// Write transform feedback output code for emulation path
if (xfbStage == gl::ShaderType::Vertex && !xfbSource->empty() &&
options.emulateTransformFeedback)
options.supportsTransformFeedbackEmulation)
{
if (!programState.getLinkedTransformFeedbackVaryings().empty())
if (options.enableTransformFeedbackEmulation &&
!programState.getLinkedTransformFeedbackVaryings().empty())
{
GenerateTransformFeedbackEmulationOutputs(options, xfbStage, programState,
programInterfaceInfo, xfbSource,
......
......@@ -51,7 +51,8 @@ struct GlslangProgramInterfaceInfo
struct GlslangSourceOptions
{
bool supportsTransformFeedbackExtension = false;
bool emulateTransformFeedback = false;
bool supportsTransformFeedbackEmulation = false;
bool enableTransformFeedbackEmulation = false;
bool emulateBresenhamLines = false;
};
......
......@@ -414,12 +414,13 @@ void GlslangGetShaderSource(const gl::ProgramState &programState,
GlslangProgramInterfaceInfo programInterfaceInfo;
ResetGlslangProgramInterfaceInfo(&programInterfaceInfo);
options.emulateTransformFeedback = true;
options.supportsTransformFeedbackEmulation = true;
// This will generate shader source WITHOUT XFB emulated outputs.
rx::GlslangGetShaderSource(options, programState, resources, &programInterfaceInfo,
shaderSourcesOut, variableInfoMapOut);
// Special version for XFB only
// This will generate vertex shader source WITH XFB emulated outputs.
if (xfbOnlyShaderSourceOut && !programState.getLinkedTransformFeedbackVaryings().empty())
{
gl::Shader *glShader = programState.getAttachedShader(gl::ShaderType::Vertex);
......@@ -428,6 +429,8 @@ void GlslangGetShaderSource(const gl::ProgramState &programState,
GlslangProgramInterfaceInfo xfbOnlyInterfaceInfo;
ResetGlslangProgramInterfaceInfo(&xfbOnlyInterfaceInfo);
options.enableTransformFeedbackEmulation = true;
rx::GlslangGenTransformFeedbackEmulationOutputs(
options, programState, &xfbOnlyInterfaceInfo, xfbOnlyShaderSourceOut,
xfbOnlyVSVariableInfoMapOut);
......
......@@ -30,8 +30,9 @@ GlslangSourceOptions GlslangWrapperVk::CreateSourceOptions(const angle::Features
options.supportsTransformFeedbackExtension =
features.supportsTransformFeedbackExtension.enabled;
options.emulateTransformFeedback = features.emulateTransformFeedback.enabled;
options.emulateBresenhamLines = features.basicGLLineRasterization.enabled;
options.supportsTransformFeedbackEmulation = features.emulateTransformFeedback.enabled;
options.enableTransformFeedbackEmulation = options.supportsTransformFeedbackEmulation;
options.emulateBresenhamLines = features.basicGLLineRasterization.enabled;
return options;
}
......
......@@ -214,9 +214,6 @@ TEST_P(TransformFeedbackTest, RecordAndDraw)
// Fails on Mac GL drivers. http://anglebug.com/4992
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
......@@ -295,9 +292,6 @@ TEST_P(TransformFeedbackTest, SpanMultipleRenderPasses)
// anglebug.com/5429
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
......@@ -456,9 +450,6 @@ TEST_P(TransformFeedbackTest, ClearWhileRecordingDoesNotContribute)
// anglebug.com/5434
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
auto clear = []() {
glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
......@@ -498,9 +489,6 @@ TEST_P(TransformFeedbackTest, CopyWhileRecordingDoesNotContribute)
// anglebug.com/5434
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
auto copy = []() {
GLTexture texture;
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
......@@ -538,9 +526,6 @@ TEST_P(TransformFeedbackTest, BlitWhileRecordingDoesNotContribute)
// anglebug.com/5434
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
auto blit = []() {
GLFramebuffer dstFbo;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFbo);
......@@ -2249,9 +2234,6 @@ TEST_P(TransformFeedbackTest, OverrunWithPauseAndResume)
// Fails on Windows Intel GL drivers. http://anglebug.com/4697
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
const std::vector<GLfloat> vertices = {
-1.0f, 1.0f, 0.5f, 1.0f, -1.0f, -1.0f, 0.5f, 1.0f, 1.0f, -1.0f, 0.5f, 1.0f,
-1.0f, 1.0f, 0.5f, 1.0f, 1.0f, -1.0f, 0.5f, 1.0f, 1.0f, 1.0f, 0.5f, 1.0f,
......@@ -2299,9 +2281,6 @@ TEST_P(TransformFeedbackTest, OverrunWithMultiplePauseAndResume)
// Crashes on Mac Intel GL drivers. http://anglebug.com/4992
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
const std::vector<GLfloat> vertices = {
-1.0f, 1.0f, 0.5f, 1.0f, -1.0f, -1.0f, 0.5f, 1.0f, 1.0f, -1.0f, 0.5f, 1.0f,
-1.0f, 1.0f, 0.5f, 1.0f, 1.0f, -1.0f, 0.5f, 1.0f, 1.0f, 1.0f, 0.5f, 1.0f,
......@@ -2421,9 +2400,6 @@ TEST_P(TransformFeedbackTest, DrawWithoutTransformFeedbackThenWith)
// Fails on Mac Intel GL drivers. http://anglebug.com/4992
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
constexpr char kVS[] =
R"(#version 300 es
in float in_value;
......@@ -2516,9 +2492,6 @@ TEST_P(TransformFeedbackTest, RecordAndDrawWithScissorTest)
// http://crbug.com/1135841
ANGLE_SKIP_TEST_IF(IsAMD() && IsOSX());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
......@@ -2599,9 +2572,6 @@ class TransformFeedbackWithDepthBufferTest : public TransformFeedbackTest
TEST_P(TransformFeedbackWithDepthBufferTest, RecordAndDrawWithDepthWriteEnabled)
{
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE);
......
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