@@ -1339,6 +1339,55 @@ template <typename T> struct ExpectedBuilder<OpType::ModF, T> {
13391339 }
13401340};
13411341
1342+ //
1343+ // Derivative Ops
1344+ //
1345+
1346+ // Coarse derivatives (ddx/ddy): All lanes in quad get same result
1347+ // Fine derivatives (ddx_fine/ddy_fine): Each lane gets unique result
1348+ // For testing, we validate results on lane 3 to keep validation generic
1349+ //
1350+ // The value of A in each lane is computed by : A = A + LaneID*2
1351+ //
1352+ // Top right (lane 1) - Top Left (lane 0)
1353+ DEFAULT_OP_1 (OpType::DerivativeDdx, ((A + 2 ) - (A + 0 )));
1354+ // Lower left (lane 2) - Top Left (lane 0)
1355+ DEFAULT_OP_1 (OpType::DerivativeDdy, ((A + 4 ) - (A + 0 )));
1356+
1357+ // Bottom right (lane 3) - Bottom left (lane 2)
1358+ DEFAULT_OP_1 (OpType::DerivativeDdxFine, ((A + 6 ) - (A + 4 )));
1359+ // Bottom right (lane 3) - Top right (lane 1)
1360+ DEFAULT_OP_1 (OpType::DerivativeDdyFine, ((A + 6 ) - (A + 2 )));
1361+
1362+ //
1363+ // Quad Read Ops
1364+ //
1365+
1366+ // We keep things generic so we can re-use this macro for all quad ops.
1367+ // The lane we write to is determined via a defines in the shader code.
1368+ // See TestQuadRead in ShaderOpArith.xml.
1369+ // For all cases we simply fill the vector on that lane with the value of the
1370+ // third element.
1371+ #define QUAD_READ_OP (OP, ARITY ) \
1372+ template <typename T> struct Op <OP, T, ARITY> : DefaultValidation<T> {}; \
1373+ template <typename T> struct ExpectedBuilder <OP, T> { \
1374+ static std::vector<T> buildExpected (Op<OP, T, ARITY> &, \
1375+ const InputSets<T> &Inputs) { \
1376+ DXASSERT_NOMSG (Inputs.size () == ARITY); \
1377+ std::vector<T> Expected; \
1378+ const size_t VectorSize = Inputs[0 ].size (); \
1379+ Expected.assign (VectorSize, Inputs[0 ][2 ]); \
1380+ return Expected; \
1381+ } \
1382+ };
1383+
1384+ QUAD_READ_OP (OpType::QuadReadLaneAt, 2 );
1385+ QUAD_READ_OP (OpType::QuadReadAcrossX, 1 );
1386+ QUAD_READ_OP (OpType::QuadReadAcrossY, 1 );
1387+ QUAD_READ_OP (OpType::QuadReadAcrossDiagonal, 1 );
1388+
1389+ #undef QUAD_READ_OP
1390+
13421391//
13431392// Wave Ops
13441393//
@@ -1701,7 +1750,7 @@ void dispatchWaveOpTest(ID3D12Device *D3DDevice, bool VerboseLogging,
17011750
17021751 const std::string AdditionalCompilerOptions =
17031752 " -DWAVE_SIZE=" + std::to_string (WaveSize) +
1704- " -DNUMTHREADS_X =" + std::to_string (WaveSize);
1753+ " -DNUMTHREADS_XYZ =" + std::to_string (WaveSize) + " ,1,1 " ;
17051754
17061755 for (size_t VectorSize : InputVectorSizes) {
17071756 std::vector<std::vector<T>> Inputs =
@@ -2493,6 +2542,60 @@ class DxilConf_SM69_Vectorized {
24932542 HLK_TEST (LoadAndStore_RD_SB_SRV, double );
24942543 HLK_TEST (LoadAndStore_RD_SB_UAV, double );
24952544
2545+ // Derivative
2546+ HLK_TEST (DerivativeDdx, HLSLHalf_t);
2547+ HLK_TEST (DerivativeDdy, HLSLHalf_t);
2548+ HLK_TEST (DerivativeDdxFine, HLSLHalf_t);
2549+ HLK_TEST (DerivativeDdyFine, HLSLHalf_t);
2550+ HLK_TEST (DerivativeDdx, float );
2551+ HLK_TEST (DerivativeDdy, float );
2552+ HLK_TEST (DerivativeDdxFine, float );
2553+ HLK_TEST (DerivativeDdyFine, float );
2554+
2555+ // Quad
2556+ HLK_TEST (QuadReadLaneAt, HLSLBool_t);
2557+ HLK_TEST (QuadReadAcrossX, HLSLBool_t);
2558+ HLK_TEST (QuadReadAcrossY, HLSLBool_t);
2559+ HLK_TEST (QuadReadAcrossDiagonal, HLSLBool_t);
2560+ HLK_TEST (QuadReadLaneAt, int16_t );
2561+ HLK_TEST (QuadReadAcrossX, int16_t );
2562+ HLK_TEST (QuadReadAcrossY, int16_t );
2563+ HLK_TEST (QuadReadAcrossDiagonal, int16_t );
2564+ HLK_TEST (QuadReadLaneAt, int32_t );
2565+ HLK_TEST (QuadReadAcrossX, int32_t );
2566+ HLK_TEST (QuadReadAcrossY, int32_t );
2567+ HLK_TEST (QuadReadAcrossDiagonal, int32_t );
2568+ HLK_TEST (QuadReadLaneAt, int64_t );
2569+ HLK_TEST (QuadReadAcrossX, int64_t );
2570+ HLK_TEST (QuadReadAcrossY, int64_t );
2571+ HLK_TEST (QuadReadAcrossDiagonal, int64_t );
2572+ HLK_TEST (QuadReadLaneAt, uint16_t );
2573+ HLK_TEST (QuadReadAcrossX, uint16_t );
2574+ HLK_TEST (QuadReadAcrossY, uint16_t );
2575+ HLK_TEST (QuadReadAcrossDiagonal, uint16_t );
2576+ HLK_TEST (QuadReadLaneAt, uint32_t );
2577+ HLK_TEST (QuadReadAcrossX, uint32_t );
2578+ HLK_TEST (QuadReadAcrossY, uint32_t );
2579+ HLK_TEST (QuadReadAcrossDiagonal, uint32_t );
2580+ HLK_TEST (QuadReadLaneAt, uint64_t );
2581+ HLK_TEST (QuadReadAcrossX, uint64_t );
2582+ HLK_TEST (QuadReadAcrossY, uint64_t );
2583+ HLK_TEST (QuadReadAcrossDiagonal, uint64_t );
2584+ HLK_TEST (QuadReadLaneAt, HLSLHalf_t);
2585+ HLK_TEST (QuadReadAcrossX, HLSLHalf_t);
2586+ HLK_TEST (QuadReadAcrossY, HLSLHalf_t);
2587+ HLK_TEST (QuadReadAcrossDiagonal, HLSLHalf_t);
2588+ HLK_TEST (QuadReadLaneAt, float );
2589+ HLK_TEST (QuadReadAcrossX, float );
2590+ HLK_TEST (QuadReadAcrossY, float );
2591+ HLK_TEST (QuadReadAcrossDiagonal, float );
2592+ HLK_TEST (QuadReadLaneAt, double );
2593+ HLK_TEST (QuadReadAcrossX, double );
2594+ HLK_TEST (QuadReadAcrossY, double );
2595+ HLK_TEST (QuadReadAcrossDiagonal, double );
2596+
2597+ // Wave
2598+
24962599 HLK_WAVEOP_TEST (WaveActiveAllEqual, HLSLBool_t);
24972600 HLK_WAVEOP_TEST (WaveReadLaneAt, HLSLBool_t);
24982601 HLK_WAVEOP_TEST (WaveReadLaneFirst, HLSLBool_t);
0 commit comments