Update test for helperlane wave on VS. (#4367)
* Update test for helperlane wave on VS.
This commit is contained in:
Родитель
3aaf42a042
Коммит
6834925179
|
@ -3250,7 +3250,7 @@
|
||||||
|
|
||||||
PSInput VSMain(float3 pos : POSITION) {
|
PSInput VSMain(float3 pos : POSITION) {
|
||||||
HelperLaneWaveTestResult60 tr60 = RunHelperLaneWaveTests60();
|
HelperLaneWaveTestResult60 tr60 = RunHelperLaneWaveTests60();
|
||||||
if (WaveGetLaneIndex() == 2) { // last lane writes results
|
if ( WaveGetLaneIndex() == WaveActiveMax(WaveGetLaneIndex())) { // last lane writes results
|
||||||
g_TestResults[VS_INDEX].sm60_wave = tr60;
|
g_TestResults[VS_INDEX].sm60_wave = tr60;
|
||||||
}
|
}
|
||||||
PSInput r;
|
PSInput r;
|
||||||
|
@ -3261,7 +3261,7 @@
|
||||||
PSInput VSMain65(float3 pos : POSITION) {
|
PSInput VSMain65(float3 pos : POSITION) {
|
||||||
HelperLaneWaveTestResult60 tr60 = RunHelperLaneWaveTests60();
|
HelperLaneWaveTestResult60 tr60 = RunHelperLaneWaveTests60();
|
||||||
HelperLaneWaveTestResult65 tr65 = RunHelperLaneWaveTests65();
|
HelperLaneWaveTestResult65 tr65 = RunHelperLaneWaveTests65();
|
||||||
if (WaveGetLaneIndex() == 2) { // last lane writes results
|
if ( WaveGetLaneIndex() == WaveActiveMax(WaveGetLaneIndex())) { // last lane writes results
|
||||||
g_TestResults[VS_INDEX].sm60_wave = tr60;
|
g_TestResults[VS_INDEX].sm60_wave = tr60;
|
||||||
g_TestResults[VS_INDEX].sm65_wave = tr65;
|
g_TestResults[VS_INDEX].sm65_wave = tr65;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <atlcoll.h>
|
#include <atlcoll.h>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <bitset>
|
||||||
|
|
||||||
#undef _read
|
#undef _read
|
||||||
#include "WexTestClass.h"
|
#include "WexTestClass.h"
|
||||||
|
@ -9754,6 +9755,100 @@ bool VerifyHelperLaneWaveResults(ExecutionTest::D3D_SHADER_MODEL sm, HelperLaneW
|
||||||
}
|
}
|
||||||
return passed;
|
return passed;
|
||||||
}
|
}
|
||||||
|
// Contrary to compute or pixel shaders the layout of lanes in vertex shaders is
|
||||||
|
// not specified. A conforming implementation could, in the extreme case, decide
|
||||||
|
// to dispatch three waves that each process only a single vertex.
|
||||||
|
// So instead of compare with fixed expected result, calculate the correct
|
||||||
|
// result from ballot.
|
||||||
|
bool VerifyHelperLaneWaveResultsForVS(ExecutionTest::D3D_SHADER_MODEL sm,
|
||||||
|
HelperLaneWaveTestResult &testResults) {
|
||||||
|
bool passed = true;
|
||||||
|
XMUINT4 mask = testResults.sm60.ballot;
|
||||||
|
unsigned countBits = 0;
|
||||||
|
std::bitset<32> x(mask.x);
|
||||||
|
std::bitset<32> y(mask.y);
|
||||||
|
std::bitset<32> z(mask.z);
|
||||||
|
std::bitset<32> w(mask.w);
|
||||||
|
countBits += (unsigned)x.count();
|
||||||
|
countBits += (unsigned)y.count();
|
||||||
|
countBits += (unsigned)z.count();
|
||||||
|
countBits += (unsigned)w.count();
|
||||||
|
|
||||||
|
{
|
||||||
|
// For VS, IsHelperLane always return false.
|
||||||
|
HelperLaneWaveTestResult60 &tr60 = testResults.sm60;
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveAnyTrue(IsHelperLane())",
|
||||||
|
0, tr60.anyTrue);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveActiveAllTrue(!IsHelperLane())", 1, tr60.allTrue);
|
||||||
|
bool ballotMatch = 1 <= countBits && countBits <= 3;
|
||||||
|
|
||||||
|
LogCommentFmt(L"%sWaveActiveBallot(true) expected 1~3 bits set, actual = %u",
|
||||||
|
ballotMatch ? L" - " : L"FAILED: ", tr60.ballot);
|
||||||
|
|
||||||
|
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"!WaveReadLaneFirst(IsHelperLane()) && WaveIsFirstLane() in a "
|
||||||
|
L"waterfall loop",
|
||||||
|
countBits, tr60.waterfallLoopCount);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveActiveAllEqual(IsHelperLane())", 1, tr60.allEqual);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveCountBits(true)",
|
||||||
|
countBits, tr60.countBits);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveSum(4)", 4 * countBits,
|
||||||
|
tr60.sum);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveProduct(4)", (unsigned)std::pow(4, countBits),
|
||||||
|
tr60.product);
|
||||||
|
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveBitAnd(!IsHelperLane())",
|
||||||
|
1, tr60.bitAnd);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveBitOr(IsHelperLane())",
|
||||||
|
0, tr60.bitOr);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WaveActiveBitXor(IsHelperLane())",
|
||||||
|
0, tr60.bitXor);
|
||||||
|
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveActiveMin(IsHelperLane() ? 1 : 10)", 10, tr60.min);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveActiveMax(IsHelperLane() ? 10 : 1)", 1, tr60.max);
|
||||||
|
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WavePrefixCountBits(1)",
|
||||||
|
countBits-1,
|
||||||
|
tr60.prefixCountBits);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WavePrefixProduct(4)",
|
||||||
|
(unsigned)std::pow(4, countBits - 1),
|
||||||
|
tr60.prefixProduct);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(L"WavePrefixSum(2)",
|
||||||
|
2 * (countBits-1), tr60.prefixSum);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sm >= ExecutionTest::D3D_SHADER_MODEL_6_5) {
|
||||||
|
HelperLaneWaveTestResult65 &tr65 = testResults.sm65;
|
||||||
|
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveMatch(true) has exactly 3 bits set", mask, tr65.match);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveMultiPrefixCountBits(1, no_masked_bits)", countBits-1,
|
||||||
|
tr65.mpCountBits);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveMultiPrefixSum(2, no_masked_bits)", 2*(countBits-1), tr65.mpSum);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveMultiPrefixProduct(4, no_masked_bits)",
|
||||||
|
(unsigned)std::pow(4, countBits - 1),
|
||||||
|
tr65.mpProduct);
|
||||||
|
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveMultiPrefixAnd(IsHelperLane() ? 0 : 1, no_masked_bits)",
|
||||||
|
1, tr65.mpBitAnd);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"WaveMultiPrefixOr(IsHelperLane() ? 1 : 0, no_masked_bits)",
|
||||||
|
0, tr65.mpBitOr);
|
||||||
|
passed &= HelperLaneResultLogAndVerify(
|
||||||
|
L"verify WaveMultiPrefixXor(IsHelperLane() ? 1 : 0, no_masked_bits)",
|
||||||
|
0, tr65.mpBitXor);
|
||||||
|
}
|
||||||
|
return passed;
|
||||||
|
}
|
||||||
|
|
||||||
void CleanUAVBuffer0Buffer(LPCSTR BufferName, std::vector<BYTE>& Data, st::ShaderOp* pShaderOp) {
|
void CleanUAVBuffer0Buffer(LPCSTR BufferName, std::vector<BYTE>& Data, st::ShaderOp* pShaderOp) {
|
||||||
UNREFERENCED_PARAMETER(pShaderOp);
|
UNREFERENCED_PARAMETER(pShaderOp);
|
||||||
|
@ -9868,7 +9963,7 @@ TEST_F(ExecutionTest, HelperLaneTestWave) {
|
||||||
test->Test->GetReadBackData("UAVBuffer0", &uavData);
|
test->Test->GetReadBackData("UAVBuffer0", &uavData);
|
||||||
HelperLaneWaveTestResult* pTestResults = (HelperLaneWaveTestResult*)uavData.data();
|
HelperLaneWaveTestResult* pTestResults = (HelperLaneWaveTestResult*)uavData.data();
|
||||||
LogCommentFmt(L"\r\nVertex shader");
|
LogCommentFmt(L"\r\nVertex shader");
|
||||||
smPassed &= VerifyHelperLaneWaveResults(sm, pTestResults[VS_INDEX], HelperLane_VS_ExpectedResults, false);
|
smPassed &= VerifyHelperLaneWaveResultsForVS(sm, pTestResults[VS_INDEX]);
|
||||||
LogCommentFmt(L"\r\nPixel shader");
|
LogCommentFmt(L"\r\nPixel shader");
|
||||||
smPassed &= VerifyHelperLaneWaveResults(sm, pTestResults[PS_INDEX], PS_ExpectedResults, true);
|
smPassed &= VerifyHelperLaneWaveResults(sm, pTestResults[PS_INDEX], PS_ExpectedResults, true);
|
||||||
LogCommentFmt(L"\r\nPixel shader with discarded pixel");
|
LogCommentFmt(L"\r\nPixel shader with discarded pixel");
|
||||||
|
|
Загрузка…
Ссылка в новой задаче