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, ...@@ -3796,8 +3796,14 @@ void GlslangAssignLocations(const GlslangSourceOptions &options,
AssignNonTextureBindings(options, programExecutable, shaderType, programInterfaceInfo, AssignNonTextureBindings(options, programExecutable, shaderType, programInterfaceInfo,
variableInfoMapOut); 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, AssignTransformFeedbackEmulationBindings(shaderType, programState, isTransformFeedbackStage,
programInterfaceInfo, variableInfoMapOut); programInterfaceInfo, variableInfoMapOut);
} }
...@@ -3821,9 +3827,10 @@ void GlslangGetShaderSource(const GlslangSourceOptions &options, ...@@ -3821,9 +3827,10 @@ void GlslangGetShaderSource(const GlslangSourceOptions &options,
// Write transform feedback output code for emulation path // Write transform feedback output code for emulation path
if (xfbStage == gl::ShaderType::Vertex && !xfbSource->empty() && 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, GenerateTransformFeedbackEmulationOutputs(options, xfbStage, programState,
programInterfaceInfo, xfbSource, programInterfaceInfo, xfbSource,
......
...@@ -51,7 +51,8 @@ struct GlslangProgramInterfaceInfo ...@@ -51,7 +51,8 @@ struct GlslangProgramInterfaceInfo
struct GlslangSourceOptions struct GlslangSourceOptions
{ {
bool supportsTransformFeedbackExtension = false; bool supportsTransformFeedbackExtension = false;
bool emulateTransformFeedback = false; bool supportsTransformFeedbackEmulation = false;
bool enableTransformFeedbackEmulation = false;
bool emulateBresenhamLines = false; bool emulateBresenhamLines = false;
}; };
......
...@@ -414,12 +414,13 @@ void GlslangGetShaderSource(const gl::ProgramState &programState, ...@@ -414,12 +414,13 @@ void GlslangGetShaderSource(const gl::ProgramState &programState,
GlslangProgramInterfaceInfo programInterfaceInfo; GlslangProgramInterfaceInfo programInterfaceInfo;
ResetGlslangProgramInterfaceInfo(&programInterfaceInfo); ResetGlslangProgramInterfaceInfo(&programInterfaceInfo);
options.emulateTransformFeedback = true; options.supportsTransformFeedbackEmulation = true;
// This will generate shader source WITHOUT XFB emulated outputs.
rx::GlslangGetShaderSource(options, programState, resources, &programInterfaceInfo, rx::GlslangGetShaderSource(options, programState, resources, &programInterfaceInfo,
shaderSourcesOut, variableInfoMapOut); shaderSourcesOut, variableInfoMapOut);
// Special version for XFB only // This will generate vertex shader source WITH XFB emulated outputs.
if (xfbOnlyShaderSourceOut && !programState.getLinkedTransformFeedbackVaryings().empty()) if (xfbOnlyShaderSourceOut && !programState.getLinkedTransformFeedbackVaryings().empty())
{ {
gl::Shader *glShader = programState.getAttachedShader(gl::ShaderType::Vertex); gl::Shader *glShader = programState.getAttachedShader(gl::ShaderType::Vertex);
...@@ -428,6 +429,8 @@ void GlslangGetShaderSource(const gl::ProgramState &programState, ...@@ -428,6 +429,8 @@ void GlslangGetShaderSource(const gl::ProgramState &programState,
GlslangProgramInterfaceInfo xfbOnlyInterfaceInfo; GlslangProgramInterfaceInfo xfbOnlyInterfaceInfo;
ResetGlslangProgramInterfaceInfo(&xfbOnlyInterfaceInfo); ResetGlslangProgramInterfaceInfo(&xfbOnlyInterfaceInfo);
options.enableTransformFeedbackEmulation = true;
rx::GlslangGenTransformFeedbackEmulationOutputs( rx::GlslangGenTransformFeedbackEmulationOutputs(
options, programState, &xfbOnlyInterfaceInfo, xfbOnlyShaderSourceOut, options, programState, &xfbOnlyInterfaceInfo, xfbOnlyShaderSourceOut,
xfbOnlyVSVariableInfoMapOut); xfbOnlyVSVariableInfoMapOut);
......
...@@ -30,8 +30,9 @@ GlslangSourceOptions GlslangWrapperVk::CreateSourceOptions(const angle::Features ...@@ -30,8 +30,9 @@ GlslangSourceOptions GlslangWrapperVk::CreateSourceOptions(const angle::Features
options.supportsTransformFeedbackExtension = options.supportsTransformFeedbackExtension =
features.supportsTransformFeedbackExtension.enabled; features.supportsTransformFeedbackExtension.enabled;
options.emulateTransformFeedback = features.emulateTransformFeedback.enabled; options.supportsTransformFeedbackEmulation = features.emulateTransformFeedback.enabled;
options.emulateBresenhamLines = features.basicGLLineRasterization.enabled; options.enableTransformFeedbackEmulation = options.supportsTransformFeedbackEmulation;
options.emulateBresenhamLines = features.basicGLLineRasterization.enabled;
return options; return options;
} }
......
...@@ -214,9 +214,6 @@ TEST_P(TransformFeedbackTest, RecordAndDraw) ...@@ -214,9 +214,6 @@ TEST_P(TransformFeedbackTest, RecordAndDraw)
// Fails on Mac GL drivers. http://anglebug.com/4992 // Fails on Mac GL drivers. http://anglebug.com/4992
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX()); 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); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
...@@ -295,9 +292,6 @@ TEST_P(TransformFeedbackTest, SpanMultipleRenderPasses) ...@@ -295,9 +292,6 @@ TEST_P(TransformFeedbackTest, SpanMultipleRenderPasses)
// anglebug.com/5429 // anglebug.com/5429
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES()); 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); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
...@@ -456,9 +450,6 @@ TEST_P(TransformFeedbackTest, ClearWhileRecordingDoesNotContribute) ...@@ -456,9 +450,6 @@ TEST_P(TransformFeedbackTest, ClearWhileRecordingDoesNotContribute)
// anglebug.com/5434 // anglebug.com/5434
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES()); ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
auto clear = []() { auto clear = []() {
glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE); glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
...@@ -498,9 +489,6 @@ TEST_P(TransformFeedbackTest, CopyWhileRecordingDoesNotContribute) ...@@ -498,9 +489,6 @@ TEST_P(TransformFeedbackTest, CopyWhileRecordingDoesNotContribute)
// anglebug.com/5434 // anglebug.com/5434
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES()); ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
auto copy = []() { auto copy = []() {
GLTexture texture; GLTexture texture;
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0); glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0);
...@@ -538,9 +526,6 @@ TEST_P(TransformFeedbackTest, BlitWhileRecordingDoesNotContribute) ...@@ -538,9 +526,6 @@ TEST_P(TransformFeedbackTest, BlitWhileRecordingDoesNotContribute)
// anglebug.com/5434 // anglebug.com/5434
ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES()); ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
auto blit = []() { auto blit = []() {
GLFramebuffer dstFbo; GLFramebuffer dstFbo;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFbo);
...@@ -2249,9 +2234,6 @@ TEST_P(TransformFeedbackTest, OverrunWithPauseAndResume) ...@@ -2249,9 +2234,6 @@ TEST_P(TransformFeedbackTest, OverrunWithPauseAndResume)
// Fails on Windows Intel GL drivers. http://anglebug.com/4697 // Fails on Windows Intel GL drivers. http://anglebug.com/4697
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows()); ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
const std::vector<GLfloat> vertices = { 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,
-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) ...@@ -2299,9 +2281,6 @@ TEST_P(TransformFeedbackTest, OverrunWithMultiplePauseAndResume)
// Crashes on Mac Intel GL drivers. http://anglebug.com/4992 // Crashes on Mac Intel GL drivers. http://anglebug.com/4992
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX()); ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
const std::vector<GLfloat> vertices = { 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,
-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) ...@@ -2421,9 +2400,6 @@ TEST_P(TransformFeedbackTest, DrawWithoutTransformFeedbackThenWith)
// Fails on Mac Intel GL drivers. http://anglebug.com/4992 // Fails on Mac Intel GL drivers. http://anglebug.com/4992
ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX()); ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsOSX());
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
constexpr char kVS[] = constexpr char kVS[] =
R"(#version 300 es R"(#version 300 es
in float in_value; in float in_value;
...@@ -2516,9 +2492,6 @@ TEST_P(TransformFeedbackTest, RecordAndDrawWithScissorTest) ...@@ -2516,9 +2492,6 @@ TEST_P(TransformFeedbackTest, RecordAndDrawWithScissorTest)
// http://crbug.com/1135841 // http://crbug.com/1135841
ANGLE_SKIP_TEST_IF(IsAMD() && IsOSX()); 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); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE); glDepthMask(GL_TRUE);
...@@ -2599,9 +2572,6 @@ class TransformFeedbackWithDepthBufferTest : public TransformFeedbackTest ...@@ -2599,9 +2572,6 @@ class TransformFeedbackWithDepthBufferTest : public TransformFeedbackTest
TEST_P(TransformFeedbackWithDepthBufferTest, RecordAndDrawWithDepthWriteEnabled) TEST_P(TransformFeedbackWithDepthBufferTest, RecordAndDrawWithDepthWriteEnabled)
{ {
// crbug.com/1167763
ANGLE_SKIP_TEST_IF(IsOSX() && IsARM64() && IsMetal());
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_TRUE); 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