121be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang/*-------------------------------------------------------------------------
221be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang * Vulkan Conformance Tests
321be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang * ------------------------
421be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *
521be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang * Copyright (c) 2015 Google Inc.
621be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *
7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
1021be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1221be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
1821be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *
1921be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *//*!
2021be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang * \file
2121be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang * \brief Compute Shader Based Test Case Utility Structs/Functions
2221be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang *//*--------------------------------------------------------------------*/
2321be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang
2421be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang#include "vktSpvAsmComputeShaderTestUtil.hpp"
2521be639ab35b03f6d4d05e11fe662a7dd6bfee2bLei Zhang
2656bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhangnamespace vkt
2756bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang{
2856bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhangnamespace SpirVAssembly
2956bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang{
30658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazinnamespace
31658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin{
32658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazinbool verifyOutputWithEpsilon (const std::vector<AllocationSp>& outputAllocs, const std::vector<BufferSp>& expectedOutputs, tcu::TestLog& log, const float epsilon)
33658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin{
34658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	DE_ASSERT(outputAllocs.size() != 0);
35658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	DE_ASSERT(outputAllocs.size() == expectedOutputs.size());
36658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin
37658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	for (size_t outputNdx = 0; outputNdx < outputAllocs.size(); ++outputNdx)
38658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	{
39658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		std::vector<deUint8>	expectedBytes;
40658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		expectedOutputs[outputNdx]->getBytes(expectedBytes);
41658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin
42658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		std::vector<float>	expectedFloats	(expectedBytes.size() / sizeof (float));
43658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		std::vector<float>	actualFloats	(expectedBytes.size() / sizeof (float));
44658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin
45658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		memcpy(&expectedFloats[0], &expectedBytes.front(), expectedBytes.size());
46658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		memcpy(&actualFloats[0], outputAllocs[outputNdx]->getHostPtr(), expectedBytes.size());
47658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		for (size_t floatNdx = 0; floatNdx < actualFloats.size(); ++floatNdx)
48658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		{
49658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin			// Use custom epsilon because of the float->string conversion
50658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin			if (fabs(expectedFloats[floatNdx] - actualFloats[floatNdx]) > epsilon)
51658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin			{
52658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin				log << tcu::TestLog::Message << "Error: The actual and expected values not matching."
53658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin					<< " Expected: " << expectedFloats[floatNdx] << " Actual: " << actualFloats[floatNdx] << " Epsilon: " << epsilon << tcu::TestLog::EndMessage;
54658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin				return false;
55658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin			}
56658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin		}
57658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	}
58658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	return true;
59658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin}
60658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin}
6156bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang
62ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhangconst char* getComputeAsmShaderPreamble (void)
63ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang{
64ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang	return
65ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpCapability Shader\n"
66ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpMemoryModel Logical GLSL450\n"
67ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpEntryPoint GLCompute %main \"main\" %id\n"
68ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpExecutionMode %main LocalSize 1 1 1\n";
69ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang}
7056bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang
71dede38b74ca401d392ca80f26ca86c634c751e6bDavid Netostd::string getComputeAsmCommonTypes (std::string blockStorageClass)
72ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang{
73dede38b74ca401d392ca80f26ca86c634c751e6bDavid Neto	return std::string(
74ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%bool      = OpTypeBool\n"
75ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%void      = OpTypeVoid\n"
76ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%voidf     = OpTypeFunction %void\n"
77ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%u32       = OpTypeInt 32 0\n"
78ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%i32       = OpTypeInt 32 1\n"
79ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%f32       = OpTypeFloat 32\n"
80ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%uvec3     = OpTypeVector %u32 3\n"
81ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%fvec3     = OpTypeVector %f32 3\n"
82dede38b74ca401d392ca80f26ca86c634c751e6bDavid Neto		"%uvec3ptr  = OpTypePointer Input %uvec3\n") +
83dede38b74ca401d392ca80f26ca86c634c751e6bDavid Neto		"%i32ptr    = OpTypePointer " + blockStorageClass + " %i32\n"
84dede38b74ca401d392ca80f26ca86c634c751e6bDavid Neto		"%f32ptr    = OpTypePointer " + blockStorageClass + " %f32\n"
85ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%i32arr    = OpTypeRuntimeArray %i32\n"
86ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%f32arr    = OpTypeRuntimeArray %f32\n";
87ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang}
8856bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang
89f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrandconst char* getComputeAsmCommonInt64Types (void)
90f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand{
91f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand	return
92f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand		"%i64       = OpTypeInt 64 1\n"
93f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand		"%i64ptr    = OpTypePointer Uniform %i64\n"
94f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand		"%i64arr    = OpTypeRuntimeArray %i64\n";
95f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand}
96f5ceec91baed6c97fdb6ca35bbbbdd2e32abdc39Jason Ekstrand
97ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhangconst char* getComputeAsmInputOutputBuffer (void)
98ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang{
99ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang	return
100ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%buf     = OpTypeStruct %f32arr\n"
101ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%bufptr  = OpTypePointer Uniform %buf\n"
102ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%indata    = OpVariable %bufptr Uniform\n"
103ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"%outdata   = OpVariable %bufptr Uniform\n";
104ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang}
10556bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang
106ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhangconst char* getComputeAsmInputOutputBufferTraits (void)
107ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang{
108ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang	return
109ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpDecorate %buf BufferBlock\n"
110ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpDecorate %indata DescriptorSet 0\n"
111ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpDecorate %indata Binding 0\n"
112ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpDecorate %outdata DescriptorSet 0\n"
113ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpDecorate %outdata Binding 1\n"
114ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpDecorate %f32arr ArrayStride 4\n"
115ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang		"OpMemberDecorate %buf 0 Offset 0\n";
116ba23b9e1fccb231af89f3de3e9fff7d8f8055e51Lei Zhang}
11756bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang
118658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazinbool verifyOutput (const std::vector<BufferSp>&, const std::vector<AllocationSp>& outputAllocs, const std::vector<BufferSp>& expectedOutputs, tcu::TestLog& log)
119658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin{
120e09e233b1c941e9b24404b93d05f54a58cf30f07Slawomir Cygan	const float	epsilon	= 0.001f;
121658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin	return verifyOutputWithEpsilon(outputAllocs, expectedOutputs, log, epsilon);
122658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin}
123658bcdaa15cfe3b39c3f16cd1e34bb7491324a5fAlexander Galazin
12456bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang} // SpirVAssembly
12556bd1576eb438e10e8ccb22e17b08354fbf3bac7Lei Zhang} // vkt
126