xref: /aosp_15_r20/external/deqp/modules/internal/ditAstcTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Internal Test Module
3*35238bceSAndroid Build Coastguard Worker  * ---------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2016 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief ASTC tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "ditAstcTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuCompressedTexture.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuAstcUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker namespace dit
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker using std::string;
36*35238bceSAndroid Build Coastguard Worker using std::vector;
37*35238bceSAndroid Build Coastguard Worker using namespace tcu;
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker namespace
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker class AstcCase : public tcu::TestCase
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker public:
45*35238bceSAndroid Build Coastguard Worker     AstcCase(tcu::TestContext &testCtx, CompressedTexFormat format);
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker private:
50*35238bceSAndroid Build Coastguard Worker     const CompressedTexFormat m_format;
51*35238bceSAndroid Build Coastguard Worker };
52*35238bceSAndroid Build Coastguard Worker 
getASTCFormatShortName(CompressedTexFormat format)53*35238bceSAndroid Build Coastguard Worker static const string getASTCFormatShortName(CompressedTexFormat format)
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(isAstcFormat(format));
56*35238bceSAndroid Build Coastguard Worker     const IVec3 blockSize = getBlockPixelSize(format);
57*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(blockSize.z() == 1);
58*35238bceSAndroid Build Coastguard Worker 
59*35238bceSAndroid Build Coastguard Worker     return de::toString(blockSize.x()) + "x" + de::toString(blockSize.y()) +
60*35238bceSAndroid Build Coastguard Worker            (tcu::isAstcSRGBFormat(format) ? "_srgb" : "");
61*35238bceSAndroid Build Coastguard Worker }
62*35238bceSAndroid Build Coastguard Worker 
AstcCase(tcu::TestContext & testCtx,CompressedTexFormat format)63*35238bceSAndroid Build Coastguard Worker AstcCase::AstcCase(tcu::TestContext &testCtx, CompressedTexFormat format)
64*35238bceSAndroid Build Coastguard Worker     : tcu::TestCase(testCtx, getASTCFormatShortName(format).c_str(), "")
65*35238bceSAndroid Build Coastguard Worker     , m_format(format)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker }
68*35238bceSAndroid Build Coastguard Worker 
testDecompress(CompressedTexFormat format,TexDecompressionParams::AstcMode mode,size_t numBlocks,const uint8_t * data)69*35238bceSAndroid Build Coastguard Worker void testDecompress(CompressedTexFormat format, TexDecompressionParams::AstcMode mode, size_t numBlocks,
70*35238bceSAndroid Build Coastguard Worker                     const uint8_t *data)
71*35238bceSAndroid Build Coastguard Worker {
72*35238bceSAndroid Build Coastguard Worker     const IVec3 blockPixelSize = getBlockPixelSize(format);
73*35238bceSAndroid Build Coastguard Worker     const TexDecompressionParams decompressionParams(mode);
74*35238bceSAndroid Build Coastguard Worker     const TextureFormat uncompressedFormat = getUncompressedFormat(format);
75*35238bceSAndroid Build Coastguard Worker     TextureLevel texture(uncompressedFormat, blockPixelSize.x() * (int)numBlocks, blockPixelSize.y());
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker     decompress(texture.getAccess(), format, data, decompressionParams);
78*35238bceSAndroid Build Coastguard Worker }
79*35238bceSAndroid Build Coastguard Worker 
testDecompress(CompressedTexFormat format,size_t numBlocks,const uint8_t * data)80*35238bceSAndroid Build Coastguard Worker void testDecompress(CompressedTexFormat format, size_t numBlocks, const uint8_t *data)
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker     testDecompress(format, TexDecompressionParams::ASTCMODE_LDR, numBlocks, data);
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker     if (!isAstcSRGBFormat(format))
85*35238bceSAndroid Build Coastguard Worker         testDecompress(format, TexDecompressionParams::ASTCMODE_HDR, numBlocks, data);
86*35238bceSAndroid Build Coastguard Worker }
87*35238bceSAndroid Build Coastguard Worker 
verifyBlocksValid(CompressedTexFormat format,TexDecompressionParams::AstcMode mode,size_t numBlocks,const uint8_t * data)88*35238bceSAndroid Build Coastguard Worker void verifyBlocksValid(CompressedTexFormat format, TexDecompressionParams::AstcMode mode, size_t numBlocks,
89*35238bceSAndroid Build Coastguard Worker                        const uint8_t *data)
90*35238bceSAndroid Build Coastguard Worker {
91*35238bceSAndroid Build Coastguard Worker     for (size_t blockNdx = 0; blockNdx < numBlocks; blockNdx++)
92*35238bceSAndroid Build Coastguard Worker     {
93*35238bceSAndroid Build Coastguard Worker         if (!astc::isValidBlock(data + blockNdx * astc::BLOCK_SIZE_BYTES, format, mode))
94*35238bceSAndroid Build Coastguard Worker             TCU_FAIL("Invalid ASTC block was generated");
95*35238bceSAndroid Build Coastguard Worker     }
96*35238bceSAndroid Build Coastguard Worker }
97*35238bceSAndroid Build Coastguard Worker 
getNumBlocksFromBytes(size_t numBytes)98*35238bceSAndroid Build Coastguard Worker inline size_t getNumBlocksFromBytes(size_t numBytes)
99*35238bceSAndroid Build Coastguard Worker {
100*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(numBytes % astc::BLOCK_SIZE_BYTES == 0);
101*35238bceSAndroid Build Coastguard Worker     return (numBytes / astc::BLOCK_SIZE_BYTES);
102*35238bceSAndroid Build Coastguard Worker }
103*35238bceSAndroid Build Coastguard Worker 
iterate(void)104*35238bceSAndroid Build Coastguard Worker AstcCase::IterateResult AstcCase::iterate(void)
105*35238bceSAndroid Build Coastguard Worker {
106*35238bceSAndroid Build Coastguard Worker     vector<uint8_t> generatedData;
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker     // Verify that can generate & decode data with all BlockTestType's
109*35238bceSAndroid Build Coastguard Worker     for (int blockTestTypeNdx = 0; blockTestTypeNdx < astc::BLOCK_TEST_TYPE_LAST; blockTestTypeNdx++)
110*35238bceSAndroid Build Coastguard Worker     {
111*35238bceSAndroid Build Coastguard Worker         const astc::BlockTestType blockTestType = (astc::BlockTestType)blockTestTypeNdx;
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker         if (astc::isBlockTestTypeHDROnly(blockTestType) && isAstcSRGBFormat(m_format))
114*35238bceSAndroid Build Coastguard Worker             continue;
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker         generatedData.clear();
117*35238bceSAndroid Build Coastguard Worker         astc::generateBlockCaseTestData(generatedData, m_format, blockTestType);
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker         testDecompress(m_format, getNumBlocksFromBytes(generatedData.size()), &generatedData[0]);
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker         // All but random case should generate only valid blocks
122*35238bceSAndroid Build Coastguard Worker         if (blockTestType != astc::BLOCK_TEST_TYPE_RANDOM)
123*35238bceSAndroid Build Coastguard Worker         {
124*35238bceSAndroid Build Coastguard Worker             // \note CEMS generates HDR blocks as well
125*35238bceSAndroid Build Coastguard Worker             if (!astc::isBlockTestTypeHDROnly(blockTestType) && (blockTestType != astc::BLOCK_TEST_TYPE_CEMS))
126*35238bceSAndroid Build Coastguard Worker                 verifyBlocksValid(m_format, TexDecompressionParams::ASTCMODE_LDR,
127*35238bceSAndroid Build Coastguard Worker                                   getNumBlocksFromBytes(generatedData.size()), &generatedData[0]);
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker             if (!isAstcSRGBFormat(m_format))
130*35238bceSAndroid Build Coastguard Worker                 verifyBlocksValid(m_format, TexDecompressionParams::ASTCMODE_HDR,
131*35238bceSAndroid Build Coastguard Worker                                   getNumBlocksFromBytes(generatedData.size()), &generatedData[0]);
132*35238bceSAndroid Build Coastguard Worker         }
133*35238bceSAndroid Build Coastguard Worker     }
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     // Verify generating void extent blocks (format-independent)
136*35238bceSAndroid Build Coastguard Worker     {
137*35238bceSAndroid Build Coastguard Worker         const size_t numBlocks = 1024;
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker         generatedData.resize(numBlocks * astc::BLOCK_SIZE_BYTES);
140*35238bceSAndroid Build Coastguard Worker         astc::generateDefaultVoidExtentBlocks(&generatedData[0], numBlocks);
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker         testDecompress(m_format, numBlocks, &generatedData[0]);
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker         verifyBlocksValid(m_format, TexDecompressionParams::ASTCMODE_LDR, numBlocks, &generatedData[0]);
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker         if (!isAstcSRGBFormat(m_format))
147*35238bceSAndroid Build Coastguard Worker             verifyBlocksValid(m_format, TexDecompressionParams::ASTCMODE_HDR, numBlocks, &generatedData[0]);
148*35238bceSAndroid Build Coastguard Worker     }
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     // Verify generating unused normal blocks
151*35238bceSAndroid Build Coastguard Worker     {
152*35238bceSAndroid Build Coastguard Worker         const size_t numBlocks     = 1024;
153*35238bceSAndroid Build Coastguard Worker         const IVec3 blockPixelSize = getBlockPixelSize(m_format);
154*35238bceSAndroid Build Coastguard Worker 
155*35238bceSAndroid Build Coastguard Worker         generatedData.resize(numBlocks * astc::BLOCK_SIZE_BYTES);
156*35238bceSAndroid Build Coastguard Worker         astc::generateDefaultNormalBlocks(&generatedData[0], numBlocks, blockPixelSize.x(), blockPixelSize.y());
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker         testDecompress(m_format, numBlocks, &generatedData[0]);
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker         verifyBlocksValid(m_format, TexDecompressionParams::ASTCMODE_LDR, numBlocks, &generatedData[0]);
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker         if (!isAstcSRGBFormat(m_format))
163*35238bceSAndroid Build Coastguard Worker             verifyBlocksValid(m_format, TexDecompressionParams::ASTCMODE_HDR, numBlocks, &generatedData[0]);
164*35238bceSAndroid Build Coastguard Worker     }
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker     // Verify generating random valid blocks
167*35238bceSAndroid Build Coastguard Worker     for (int astcModeNdx = 0; astcModeNdx < TexDecompressionParams::ASTCMODE_LAST; astcModeNdx++)
168*35238bceSAndroid Build Coastguard Worker     {
169*35238bceSAndroid Build Coastguard Worker         const TexDecompressionParams::AstcMode mode = (TexDecompressionParams::AstcMode)astcModeNdx;
170*35238bceSAndroid Build Coastguard Worker         const size_t numBlocks                      = 1024;
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker         if (mode == tcu::TexDecompressionParams::ASTCMODE_HDR && isAstcFormat(m_format))
173*35238bceSAndroid Build Coastguard Worker             continue; // sRGB is not supported in HDR mode
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker         generatedData.resize(numBlocks * astc::BLOCK_SIZE_BYTES);
176*35238bceSAndroid Build Coastguard Worker         astc::generateRandomValidBlocks(&generatedData[0], numBlocks, m_format, mode,
177*35238bceSAndroid Build Coastguard Worker                                         deInt32Hash(m_format) ^ deInt32Hash(mode));
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker         testDecompress(m_format, numBlocks, &generatedData[0]);
180*35238bceSAndroid Build Coastguard Worker 
181*35238bceSAndroid Build Coastguard Worker         verifyBlocksValid(m_format, mode, numBlocks, &generatedData[0]);
182*35238bceSAndroid Build Coastguard Worker     }
183*35238bceSAndroid Build Coastguard Worker 
184*35238bceSAndroid Build Coastguard Worker     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All checks passed");
185*35238bceSAndroid Build Coastguard Worker     return STOP;
186*35238bceSAndroid Build Coastguard Worker }
187*35238bceSAndroid Build Coastguard Worker 
188*35238bceSAndroid Build Coastguard Worker } // namespace
189*35238bceSAndroid Build Coastguard Worker 
createAstcTests(tcu::TestContext & testCtx)190*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *createAstcTests(tcu::TestContext &testCtx)
191*35238bceSAndroid Build Coastguard Worker {
192*35238bceSAndroid Build Coastguard Worker     de::MovePtr<tcu::TestCaseGroup> astcTests(new tcu::TestCaseGroup(testCtx, "astc", "Tests for ASTC Utilities"));
193*35238bceSAndroid Build Coastguard Worker 
194*35238bceSAndroid Build Coastguard Worker     for (int formatNdx = 0; formatNdx < COMPRESSEDTEXFORMAT_LAST; formatNdx++)
195*35238bceSAndroid Build Coastguard Worker     {
196*35238bceSAndroid Build Coastguard Worker         const CompressedTexFormat format = (CompressedTexFormat)formatNdx;
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker         if (isAstcFormat(format))
199*35238bceSAndroid Build Coastguard Worker             astcTests->addChild(new AstcCase(testCtx, format));
200*35238bceSAndroid Build Coastguard Worker     }
201*35238bceSAndroid Build Coastguard Worker 
202*35238bceSAndroid Build Coastguard Worker     return astcTests.release();
203*35238bceSAndroid Build Coastguard Worker }
204*35238bceSAndroid Build Coastguard Worker 
205*35238bceSAndroid Build Coastguard Worker } // namespace dit
206