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