Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: cherry-pick 2 changes from 1-M124 (#41982)
* chore: [29-x-y] cherry-pick 2 changes from 1-M124 * bc18aec94c82 from DirectXShaderCompiler * ba3b4e239620 from angle * chore: update patches --------- Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
- Loading branch information
1 parent
a43014a
commit 9d4f8a0
Showing
4 changed files
with
308 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
cherry-pick-a65e511a14b4.patch | ||
cherry-pick-bc18aec94c82.patch |
57 changes: 57 additions & 0 deletions
57
patches/DirectXShaderCompiler/cherry-pick-bc18aec94c82.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Antonio Maiorano <amaiorano@google.com> | ||
Date: Thu, 18 Apr 2024 13:07:04 -0400 | ||
Subject: Replace dynamic_cast with virtual call (#6515) | ||
|
||
Make TextDiagnosticPrinter::setPrefix a virtual function in base class | ||
DiagnosticConsumer. This allows us to avoid using dynamic_cast in | ||
BackendConsumer::DxilDiagHandler, required for codebases that do not | ||
enable RTTI. This is also the only place in the codebase that uses RTTI | ||
(AFAICT). | ||
|
||
Bug: chromium:333420620 | ||
Change-Id: Ida73077f24fdb4b705b5d868b04ac6cfecb30327 | ||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5464347 | ||
Reviewed-by: dan sinclair <dsinclair@chromium.org> | ||
Reviewed-by: David Neto <dneto@google.com> | ||
|
||
diff --git a/tools/clang/include/clang/Basic/Diagnostic.h b/tools/clang/include/clang/Basic/Diagnostic.h | ||
index dc9f781c093c0bc8f6da773d514ac6d1503f842d..0b98dffb94185e242320409d43b74dae2c2a908d 100644 | ||
--- a/tools/clang/include/clang/Basic/Diagnostic.h | ||
+++ b/tools/clang/include/clang/Basic/Diagnostic.h | ||
@@ -1395,6 +1395,8 @@ public: | ||
/// warnings and errors. | ||
virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, | ||
const Diagnostic &Info); | ||
+ | ||
+ virtual void setPrefix(std::string Value) {} // HLSL Change | ||
}; | ||
|
||
/// \brief A diagnostic client that ignores all diagnostics. | ||
diff --git a/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h b/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h | ||
index 04a570559fe06a0670ef8a7e6e94c40aa37e55a9..936031e09673a09c6e1164c515efce02ac51b910 100644 | ||
--- a/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h | ||
+++ b/tools/clang/include/clang/Frontend/TextDiagnosticPrinter.h | ||
@@ -45,7 +45,8 @@ public: | ||
/// setPrefix - Set the diagnostic printer prefix string, which will be | ||
/// printed at the start of any diagnostics. If empty, no prefix string is | ||
/// used. | ||
- void setPrefix(std::string Value) { Prefix = Value; } | ||
+ // HLSL Change: add override | ||
+ void setPrefix(std::string Value) override { Prefix = Value; } | ||
|
||
void BeginSourceFile(const LangOptions &LO, const Preprocessor *PP) override; | ||
void EndSourceFile() override; | ||
diff --git a/tools/clang/lib/CodeGen/CodeGenAction.cpp b/tools/clang/lib/CodeGen/CodeGenAction.cpp | ||
index 4fa721e812296356e31fc1bf6ea35ce295c2592c..68ebaadf5a8960c8def189248412136fe9543422 100644 | ||
--- a/tools/clang/lib/CodeGen/CodeGenAction.cpp | ||
+++ b/tools/clang/lib/CodeGen/CodeGenAction.cpp | ||
@@ -557,7 +557,7 @@ BackendConsumer::DxilDiagHandler(const llvm::DiagnosticInfoDxil &D) { | ||
|
||
// If no location information is available, add function name | ||
if (Loc.isInvalid()) { | ||
- auto *DiagClient = dynamic_cast<TextDiagnosticPrinter*>(Diags.getClient()); | ||
+ auto *DiagClient = Diags.getClient(); | ||
auto *func = D.getFunction(); | ||
if (DiagClient && func) | ||
DiagClient->setPrefix("Function: " + func->getName().str()); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,3 @@ | ||
m123_vulkan_fix_access_to_inactive_attributes.patch | ||
cherry-pick-f6672dbbe223.patch | ||
cherry-pick-ba3b4e239620.patch |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,249 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Shahbaz Youssefi <syoussefi@chromium.org> | ||
Date: Mon, 8 Apr 2024 10:14:45 -0400 | ||
Subject: M123: SPIR-V: Fix const constructors with single scalar | ||
|
||
These constructors may be generated because of | ||
RemoveArrayLengthTraverser. | ||
|
||
Bug: chromium:332546345 | ||
Change-Id: I2b2bf3728ef5bae148abc2a8518f8f3f42850025 | ||
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5462388 | ||
(cherry picked from commit 0b776d32f69a932acb61963d9daad9e13f610944) | ||
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5473406 | ||
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> | ||
Reviewed-by: Geoff Lang <geofflang@chromium.org> | ||
Reviewed-by: Daniel Gagnon <dgagnon@google.com> | ||
|
||
diff --git a/src/compiler/translator/Compiler.cpp b/src/compiler/translator/Compiler.cpp | ||
index eddc5e724e8e949aff0624c6caf9aadec7c14647..57a71c5d13fbf5e458c26b084e1f9834edb37f58 100644 | ||
--- a/src/compiler/translator/Compiler.cpp | ||
+++ b/src/compiler/translator/Compiler.cpp | ||
@@ -1056,6 +1056,11 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root, | ||
{ | ||
return false; | ||
} | ||
+ // Fold the expressions again, because |RemoveArrayLengthMethod| can introduce new constants. | ||
+ if (!FoldExpressions(this, root, &mDiagnostics)) | ||
+ { | ||
+ return false; | ||
+ } | ||
|
||
if (!RemoveUnreferencedVariables(this, root, &mSymbolTable)) | ||
{ | ||
diff --git a/src/compiler/translator/spirv/OutputSPIRV.cpp b/src/compiler/translator/spirv/OutputSPIRV.cpp | ||
index caa8f956716abf53aaeb58a5f654f5a4f04c4d6a..67b1fdd4784660483a408f1ee27ce48b05ffcb0a 100644 | ||
--- a/src/compiler/translator/spirv/OutputSPIRV.cpp | ||
+++ b/src/compiler/translator/spirv/OutputSPIRV.cpp | ||
@@ -1335,6 +1335,8 @@ spirv::IdRef OutputSPIRVTraverser::createComplexConstant(const TType &type, | ||
|
||
if (type.isMatrix() && !type.isArray()) | ||
{ | ||
+ ASSERT(parameters.size() == type.getRows() * type.getCols()); | ||
+ | ||
// Matrices are constructed from their columns. | ||
spirv::IdRefList columnIds; | ||
|
||
diff --git a/src/tests/gl_tests/GLSLTest.cpp b/src/tests/gl_tests/GLSLTest.cpp | ||
index cfe6414d52647db92669be954cadd15344603559..a4035db329548491c91e2f7383f837001540c065 100644 | ||
--- a/src/tests/gl_tests/GLSLTest.cpp | ||
+++ b/src/tests/gl_tests/GLSLTest.cpp | ||
@@ -8486,6 +8486,198 @@ void main() | ||
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); | ||
} | ||
|
||
+// Test that array length inside vector constructor works. | ||
+TEST_P(GLSLTest_ES3, ArrayLengthInVectorConstructor) | ||
+{ | ||
+ const char kVS[] = R"(#version 300 es | ||
+precision highp float; | ||
+flat out uvec4 v; | ||
+ | ||
+int[1] f0() | ||
+{ | ||
+ return int[1](1); | ||
+} | ||
+void main() | ||
+{ | ||
+ v = uvec4(vec4(f0().length())); | ||
+ | ||
+ gl_Position.x = ((gl_VertexID & 1) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.y = ((gl_VertexID & 2) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.zw = vec2(0, 1); | ||
+})"; | ||
+ | ||
+ const char kFS[] = R"(#version 300 es | ||
+precision highp float; | ||
+flat in uvec4 v; | ||
+out vec4 color; | ||
+ | ||
+bool isEq(uint a, float b) { return abs(float(a) - b) < 0.01; } | ||
+ | ||
+void main() | ||
+{ | ||
+ if (isEq(v[0], 1.) && | ||
+ isEq(v[1], 1.) && | ||
+ isEq(v[2], 1.) && | ||
+ isEq(v[3], 1.)) | ||
+ { | ||
+ color = vec4(0, 1, 0, 1); | ||
+ } | ||
+ else | ||
+ { | ||
+ color = vec4(1, 0, 0, 1); | ||
+ } | ||
+})"; | ||
+ | ||
+ ANGLE_GL_PROGRAM(program, kVS, kFS); | ||
+ glUseProgram(program); | ||
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | ||
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); | ||
+} | ||
+ | ||
+// Test that array length inside vector constructor works in complex expression. | ||
+TEST_P(GLSLTest_ES3, ArrayLengthInVectorConstructorComplex) | ||
+{ | ||
+ const char kVS[] = R"(#version 300 es | ||
+precision highp float; | ||
+out vec4 v; | ||
+ | ||
+int[1] f0() | ||
+{ | ||
+ return int[1](1); | ||
+} | ||
+void main() | ||
+{ | ||
+ v = vec4(float(uint(f0().length()) + 1u) / 4.); | ||
+ | ||
+ gl_Position.x = ((gl_VertexID & 1) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.y = ((gl_VertexID & 2) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.zw = vec2(0, 1); | ||
+})"; | ||
+ | ||
+ const char kFS[] = R"(#version 300 es | ||
+precision highp float; | ||
+in vec4 v; | ||
+out vec4 color; | ||
+ | ||
+bool isEq(float a, float b) { return abs(float(a) - b) < 0.01; } | ||
+ | ||
+void main() | ||
+{ | ||
+ if (isEq(v[0], 0.5) && | ||
+ isEq(v[1], 0.5) && | ||
+ isEq(v[2], 0.5) && | ||
+ isEq(v[3], 0.5)) | ||
+ { | ||
+ color = vec4(0, 1, 0, 1); | ||
+ } | ||
+ else | ||
+ { | ||
+ color = vec4(1, 0, 0, 1); | ||
+ } | ||
+})"; | ||
+ | ||
+ ANGLE_GL_PROGRAM(program, kVS, kFS); | ||
+ glUseProgram(program); | ||
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | ||
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); | ||
+} | ||
+ | ||
+// Test that array length inside matrix constructor works. | ||
+TEST_P(GLSLTest_ES3, ArrayLengthInMatrixConstructor) | ||
+{ | ||
+ const char kVS[] = R"(#version 300 es | ||
+precision highp float; | ||
+out mat2x2 v; | ||
+ | ||
+int[1] f0() | ||
+{ | ||
+ return int[1](1); | ||
+} | ||
+void main() | ||
+{ | ||
+ v = mat2x2(f0().length()); | ||
+ | ||
+ gl_Position.x = ((gl_VertexID & 1) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.y = ((gl_VertexID & 2) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.zw = vec2(0, 1); | ||
+})"; | ||
+ | ||
+ const char kFS[] = R"(#version 300 es | ||
+precision highp float; | ||
+in mat2x2 v; | ||
+out vec4 color; | ||
+ | ||
+bool isEq(float a, float b) { return abs(a - b) < 0.01; } | ||
+ | ||
+void main() | ||
+{ | ||
+ if (isEq(v[0][0], 1.) && | ||
+ isEq(v[0][1], 0.) && | ||
+ isEq(v[1][0], 0.) && | ||
+ isEq(v[1][1], 1.)) | ||
+ { | ||
+ color = vec4(0, 1, 0, 1); | ||
+ } | ||
+ else | ||
+ { | ||
+ color = vec4(1, 0, 0, 1); | ||
+ } | ||
+})"; | ||
+ | ||
+ ANGLE_GL_PROGRAM(program, kVS, kFS); | ||
+ glUseProgram(program); | ||
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | ||
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); | ||
+} | ||
+ | ||
+// Test that array length inside vector constructor inside matrix constructor works. | ||
+TEST_P(GLSLTest_ES3, ArrayLengthInVectorInMatrixConstructor) | ||
+{ | ||
+ const char kVS[] = R"(#version 300 es | ||
+precision highp float; | ||
+out mat2x2 v; | ||
+ | ||
+int[1] f0() | ||
+{ | ||
+ return int[1](1); | ||
+} | ||
+void main() | ||
+{ | ||
+ v = mat2x2(vec2(f0().length()), f0().length(), 0); | ||
+ | ||
+ gl_Position.x = ((gl_VertexID & 1) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.y = ((gl_VertexID & 2) == 0 ? -1.0 : 1.0); | ||
+ gl_Position.zw = vec2(0, 1); | ||
+})"; | ||
+ | ||
+ const char kFS[] = R"(#version 300 es | ||
+precision highp float; | ||
+in mat2x2 v; | ||
+out vec4 color; | ||
+ | ||
+bool isEq(float a, float b) { return abs(a - b) < 0.01; } | ||
+ | ||
+void main() | ||
+{ | ||
+ if (isEq(v[0][0], 1.) && | ||
+ isEq(v[0][1], 1.) && | ||
+ isEq(v[1][0], 1.) && | ||
+ isEq(v[1][1], 0.)) | ||
+ { | ||
+ color = vec4(0, 1, 0, 1); | ||
+ } | ||
+ else | ||
+ { | ||
+ color = vec4(1, 0, 0, 1); | ||
+ } | ||
+})"; | ||
+ | ||
+ ANGLE_GL_PROGRAM(program, kVS, kFS); | ||
+ glUseProgram(program); | ||
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); | ||
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); | ||
+} | ||
+ | ||
// Test that statements inside switch() get translated to correct HLSL. | ||
TEST_P(GLSLTest_ES3, DifferentStatementsInsideSwitch) | ||
{ |