1/*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2017 The Khronos Group Inc.
6 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 *//*!
21 * \file
22 * \brief Protected content buffer validator helper
23 *//*--------------------------------------------------------------------*/
24
25#include "vktProtectedMemBufferValidator.hpp"
26
27#include "tcuTestLog.hpp"
28
29#include "vkBuilderUtil.hpp"
30#include "vkPrograms.hpp"
31#include "vkTypeUtil.hpp"
32#include "vktTestCase.hpp"
33#include "vktTestGroupUtil.hpp"
34#include "tcuStringTemplate.hpp"
35
36#include "vktProtectedMemUtils.hpp"
37
38namespace vkt
39{
40namespace ProtectedMem
41{
42namespace
43{
44
45const char* generateShaderVarString (TestType testType)
46{
47	switch (testType)
48	{
49		case TYPE_UINT:		return "uvec4";
50		case TYPE_INT:		return "ivec4";
51		case TYPE_FLOAT:	return "vec4";
52
53		default: DE_FATAL("Incorrect vector type format"); return "";
54	}
55}
56
57const char* generateShaderBufferString (TestType testType, BufferType bufferType)
58{
59	if (bufferType == STORAGE_BUFFER)
60		return "buffer";
61
62	DE_ASSERT(bufferType == SAMPLER_BUFFER);
63
64	switch (testType) {
65		case TYPE_UINT:		return "uniform usamplerBuffer";
66		case TYPE_INT:		return "uniform isamplerBuffer";
67		case TYPE_FLOAT:	return "uniform samplerBuffer";
68
69		default: DE_FATAL("Incorrect sampler buffer format"); return "";
70	}
71}
72
73} // anonymous
74
75void initBufferValidatorPrograms (vk::SourceCollections& programCollection, TestType testType, BufferType bufferType)
76{
77	// Layout:
78	//  set = 0, location = 0 -> buffer|uniform usamplerBuffer|uniform isamplerBuffer|uniform samplerBuffersampler2D u_protectedBuffer
79	//  set = 0, location = 1 -> buffer ProtectedHelper (2 * uint)
80	//  set = 0, location = 2 -> uniform Data (2 * vec2 + 4 * vec4|ivec4|uvec4)
81	const char* validatorShaderTemplateSamplerBuffer = "#version 450\n"
82					  "layout(local_size_x = 1) in;\n"
83					  "\n"
84					  "layout(set=0, binding=0) ${BUFFER_TYPE} u_protectedBuffer;\n"
85					  "\n"
86					  "layout(set=0, binding=1) buffer ProtectedHelper\n"
87					  "{\n"
88					  "    highp uint zero; // set to 0\n"
89					  "    highp uint dummyOut;\n"
90					  "} helper;\n"
91					  "\n"
92					  "layout(set=0, binding=2) uniform Data\n"
93					  "{\n"
94					  "    highp ivec4 protectedBufferPosition[4];\n"
95					  "    highp ${VAR_TYPE} protectedBufferRef[4];\n"
96					  "};\n"
97					  "\n"
98					  "void error ()\n"
99					  "{\n"
100					  "    for (uint x = 0; x < 10; x += helper.zero)\n"
101					  "        atomicAdd(helper.dummyOut, 1u);\n"
102					  "}\n"
103					  "\n"
104					  "bool compare (${VAR_TYPE} a, ${VAR_TYPE} b, float threshold)\n"
105					  "{\n"
106					  "    return all(lessThanEqual(abs(a - b), ${VAR_TYPE}(threshold)));\n"
107					  "}\n"
108					  "\n"
109					  "void main (void)\n"
110					  "{\n"
111					  "    float threshold = 0.1;\n"
112					  "    for (uint i = 0; i < 4; i++)\n"
113					  "    {\n"
114					  "        ${VAR_TYPE} v = texelFetch(u_protectedBuffer, protectedBufferPosition[i].x);\n"
115					  "        if (!compare(v, protectedBufferRef[i], threshold))\n"
116					  "            error();\n"
117					  "    }\n"
118					  "}\n";
119
120	const char* validatorShaderTemplateStorageBuffer = "#version 450\n"
121					  "layout(local_size_x = 1) in;\n"
122					  "\n"
123					  "layout(set=0, binding=0) ${BUFFER_TYPE} u_protectedBuffer\n"
124					  "{\n"
125					  "    highp ${VAR_TYPE} protectedTestValues;\n"
126					  "} testBuffer;\n"
127					  "\n"
128					  "layout(set=0, binding=1) buffer ProtectedHelper\n"
129					  "{\n"
130					  "    highp uint zero; // set to 0\n"
131					  "    highp uint dummyOut;\n"
132					  "} helper;\n"
133					  "\n"
134					  "layout(set=0, binding=2) uniform Data\n"
135					  "{\n"
136					  "    highp ${VAR_TYPE} protectedReferenceValues;\n"
137					  "};\n"
138					  "\n"
139					  "void error ()\n"
140					  "{\n"
141					  "    for (uint x = 0; x < 10; x += helper.zero)\n"
142					  "        atomicAdd(helper.dummyOut, 1u);\n"
143					  "}\n"
144					  "\n"
145					  "bool compare (${VAR_TYPE} a, ${VAR_TYPE} b, float threshold)\n"
146					  "{\n"
147					  "    return all(lessThanEqual(abs(a - b), ${VAR_TYPE}(threshold)));\n"
148					  "}\n"
149					  "\n"
150					  "void main (void)\n"
151					  "{\n"
152					  "    float threshold = 0.1;\n"
153					  "    if (!compare(testBuffer.protectedTestValues, protectedReferenceValues, threshold))\n"
154					  "        error();\n"
155					  "}\n";
156
157	tcu::StringTemplate validatorShaderTemplate(bufferType == SAMPLER_BUFFER ? validatorShaderTemplateSamplerBuffer : validatorShaderTemplateStorageBuffer);
158
159	std::map<std::string, std::string> validatorParams;
160	validatorParams["VAR_TYPE"]		= generateShaderVarString(testType);
161	validatorParams["BUFFER_TYPE"]	= generateShaderBufferString(testType, bufferType);
162	std::string validatorShader		= validatorShaderTemplate.specialize(validatorParams);
163
164	const char* resetSSBOShader = "#version 450\n"
165					  "layout(local_size_x = 1) in;\n"
166					  "\n"
167					  "layout(set=0, binding=1) buffer ProtectedHelper\n"
168					  "{\n"
169					  "    highp uint zero; // set to 0\n"
170					  "    highp uint dummyOut;\n"
171					  "} helper;\n"
172					  "\n"
173					  "void main (void)\n"
174					  "{\n"
175					  "    helper.zero = 0;\n"
176					  "}\n";
177
178	programCollection.glslSources.add("ResetSSBO") << glu::ComputeSource(resetSSBOShader);
179	programCollection.glslSources.add("BufferValidator") << glu::ComputeSource(validatorShader);
180}
181
182vk::VkDescriptorType getDescriptorType (BufferType bufferType)
183{
184	switch (bufferType)
185	{
186		case STORAGE_BUFFER: return vk::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
187		case SAMPLER_BUFFER: return vk::VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
188		default: DE_FATAL("Incorrect buffer type specified"); return (vk::VkDescriptorType)0;
189	}
190}
191
192} // ProtectedMem
193} // vkt
194