1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2016 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*
20 * \file vktSparseResourcesShaderIntrinsics.cpp
21 * \brief Sparse Resources Shader Intrinsics
22 *//*--------------------------------------------------------------------*/
23
24 #include "vktSparseResourcesShaderIntrinsicsSampled.hpp"
25 #include "vktSparseResourcesShaderIntrinsicsStorage.hpp"
26
27 using namespace vk;
28
29 namespace vkt
30 {
31 namespace sparse
32 {
33
createSparseResourcesShaderIntrinsicsTests(tcu::TestContext & testCtx)34 tcu::TestCaseGroup* createSparseResourcesShaderIntrinsicsTests (tcu::TestContext& testCtx)
35 {
36 de::MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "shader_intrinsics", "Sparse Resources Shader Intrinsics"));
37
38 static const deUint32 sizeCountPerImageType = 4u;
39
40 struct ImageParameters
41 {
42 ImageType imageType;
43 tcu::UVec3 imageSizes[sizeCountPerImageType];
44 };
45
46 static const ImageParameters imageParametersArray[] =
47 {
48 { IMAGE_TYPE_2D, { tcu::UVec3(512u, 256u, 1u), tcu::UVec3(128u, 128u, 1u), tcu::UVec3(503u, 137u, 1u), tcu::UVec3(11u, 37u, 1u) } },
49 { IMAGE_TYPE_2D_ARRAY, { tcu::UVec3(512u, 256u, 6u), tcu::UVec3(128u, 128u, 8u), tcu::UVec3(503u, 137u, 3u), tcu::UVec3(11u, 37u, 3u) } },
50 { IMAGE_TYPE_CUBE, { tcu::UVec3(256u, 256u, 1u), tcu::UVec3(128u, 128u, 1u), tcu::UVec3(137u, 137u, 1u), tcu::UVec3(11u, 11u, 1u) } },
51 { IMAGE_TYPE_CUBE_ARRAY,{ tcu::UVec3(256u, 256u, 6u), tcu::UVec3(128u, 128u, 8u), tcu::UVec3(137u, 137u, 3u), tcu::UVec3(11u, 11u, 3u) } },
52 { IMAGE_TYPE_3D, { tcu::UVec3(256u, 256u, 16u), tcu::UVec3(128u, 128u, 8u), tcu::UVec3(503u, 137u, 3u), tcu::UVec3(11u, 37u, 3u) } }
53 };
54
55 static const tcu::TextureFormat formats[] =
56 {
57 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32),
58 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT16),
59 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT8),
60 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32),
61 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16),
62 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8)
63 };
64
65 static const std::string functions[SPARSE_SPIRV_FUNCTION_TYPE_LAST] =
66 {
67 "_sparse_fetch",
68 "_sparse_read",
69 "_sparse_sample_explicit_lod",
70 "_sparse_sample_implicit_lod",
71 "_sparse_gather",
72 };
73
74 for (deUint32 functionNdx = 0; functionNdx < SPARSE_SPIRV_FUNCTION_TYPE_LAST; ++functionNdx)
75 {
76 const SpirVFunction function = static_cast<SpirVFunction>(functionNdx);
77
78 for (deInt32 imageTypeNdx = 0; imageTypeNdx < DE_LENGTH_OF_ARRAY(imageParametersArray); ++imageTypeNdx)
79 {
80 const ImageType imageType = imageParametersArray[imageTypeNdx].imageType;
81 de::MovePtr<tcu::TestCaseGroup> imageTypeGroup(new tcu::TestCaseGroup(testCtx, (getImageTypeName(imageType) + functions[functionNdx]).c_str(), ""));
82
83 for (deInt32 formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
84 {
85 const tcu::TextureFormat& format = formats[formatNdx];
86 de::MovePtr<tcu::TestCaseGroup> formatGroup(new tcu::TestCaseGroup(testCtx, getShaderImageFormatQualifier(format).c_str(), ""));
87
88 for (deInt32 imageSizeNdx = 0; imageSizeNdx < DE_LENGTH_OF_ARRAY(imageParametersArray[imageTypeNdx].imageSizes); ++imageSizeNdx)
89 {
90 const tcu::UVec3 imageSize = imageParametersArray[imageTypeNdx].imageSizes[imageSizeNdx];
91
92 std::ostringstream stream;
93 stream << imageSize.x() << "_" << imageSize.y() << "_" << imageSize.z();
94
95 switch (function)
96 {
97 case SPARSE_FETCH:
98 if ((imageType == IMAGE_TYPE_CUBE) || (imageType == IMAGE_TYPE_CUBE_ARRAY)) continue;
99 break;
100 case SPARSE_SAMPLE_EXPLICIT_LOD:
101 case SPARSE_SAMPLE_IMPLICIT_LOD:
102 case SPARSE_GATHER:
103 if ((imageType == IMAGE_TYPE_CUBE) || (imageType == IMAGE_TYPE_CUBE_ARRAY) || (imageType == IMAGE_TYPE_3D)) continue;
104 break;
105 default:
106 break;
107 }
108
109 switch (function)
110 {
111 case SPARSE_FETCH:
112 formatGroup->addChild(new SparseCaseOpImageSparseFetch(testCtx, stream.str(), function, imageType, imageSize, format));
113 break;
114 case SPARSE_READ:
115 formatGroup->addChild(new SparseCaseOpImageSparseRead(testCtx, stream.str(), function, imageType, imageSize, format));
116 break;
117 case SPARSE_SAMPLE_EXPLICIT_LOD:
118 formatGroup->addChild(new SparseCaseOpImageSparseSampleExplicitLod(testCtx, stream.str(), function, imageType, imageSize, format));
119 break;
120 case SPARSE_SAMPLE_IMPLICIT_LOD:
121 formatGroup->addChild(new SparseCaseOpImageSparseSampleImplicitLod(testCtx, stream.str(), function, imageType, imageSize, format));
122 break;
123 case SPARSE_GATHER:
124 formatGroup->addChild(new SparseCaseOpImageSparseGather(testCtx, stream.str(), function, imageType, imageSize, format));
125 break;
126 default:
127 DE_ASSERT(0);
128 break;
129 }
130 }
131 imageTypeGroup->addChild(formatGroup.release());
132 }
133 testGroup->addChild(imageTypeGroup.release());
134 }
135 }
136
137 return testGroup.release();
138 }
139
140 } // sparse
141 } // vkt
142