1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 Google Inc.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and/or associated documentation files (the
9 * "Materials"), to deal in the Materials without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sublicense, and/or sell copies of the Materials, and to
12 * permit persons to whom the Materials are furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice(s) and this permission notice shall be
16 * included in all copies or substantial portions of the Materials.
18 * The Materials are Confidential Information as defined by the
19 * Khronos Membership Agreement until designated non-confidential by
20 * Khronos, at which point this condition clause shall be removed.
22 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
26 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
32 * \brief Simple Smoke Tests
33 *//*--------------------------------------------------------------------*/
35 #include "vktApiTests.hpp"
37 #include "vktTestCaseUtil.hpp"
40 #include "vkPlatform.hpp"
41 #include "vkStrUtil.hpp"
43 #include "vkRefUtil.hpp"
44 #include "vkQueryUtil.hpp"
45 #include "vkMemUtil.hpp"
46 #include "vkDeviceUtil.hpp"
47 #include "vkPrograms.hpp"
48 #include "vkTypeUtil.hpp"
50 #include "tcuTestLog.hpp"
51 #include "tcuFormatUtil.hpp"
53 #include "deUniquePtr.hpp"
68 tcu::TestStatus createSamplerTest (Context& context)
70 const VkDevice vkDevice = context.getDevice();
71 const DeviceInterface& vk = context.getDeviceInterface();
74 const struct VkSamplerCreateInfo samplerInfo =
76 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType;
77 DE_NULL, // const void* pNext;
78 VK_TEX_FILTER_NEAREST, // VkTexFilter magFilter;
79 VK_TEX_FILTER_NEAREST, // VkTexFilter minFilter;
80 VK_TEX_MIPMAP_MODE_BASE, // VkTexMipmapMode mipMode;
81 VK_TEX_ADDRESS_MODE_CLAMP, // VkTexAddressMode addressU;
82 VK_TEX_ADDRESS_MODE_CLAMP, // VkTexAddressMode addressV;
83 VK_TEX_ADDRESS_MODE_CLAMP, // VkTexAddressMode addressW;
84 0.0f, // float mipLodBias;
85 0.0f, // float maxAnisotropy;
86 DE_FALSE, // VkBool32 compareEnable;
87 VK_COMPARE_OP_ALWAYS, // VkCompareOp compareOp;
88 0.0f, // float minLod;
89 0.0f, // float maxLod;
90 VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, // VkBorderColor borderColor;
91 VK_FALSE, // VKBool32 unnormalizedCoords;
94 Move<VkSampler> tmpSampler = createSampler(vk, vkDevice, &samplerInfo);
95 Move<VkSampler> tmp2Sampler;
97 tmp2Sampler = tmpSampler;
99 const Unique<VkSampler> sampler (tmp2Sampler);
102 return tcu::TestStatus::pass("Creating sampler succeeded");
105 void createShaderProgs (SourceCollections& dst)
107 dst.glslSources.add("test") << glu::VertexSource(
109 "in highp vec4 a_position;\n"
110 "void main (void) { gl_Position = a_position; }\n");
113 tcu::TestStatus createShaderModuleTest (Context& context)
115 const VkDevice vkDevice = context.getDevice();
116 const DeviceInterface& vk = context.getDeviceInterface();
117 const Unique<VkShaderModule> shader (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("test"), 0));
119 return tcu::TestStatus::pass("Creating shader module succeeded");
122 void createTriangleAsmProgs (SourceCollections& dst)
124 dst.spirvAsmSources.add("vert") <<
125 " OpSource ESSL 300\n"
126 " OpCapability Shader\n"
127 "%1 = OpExtInstImport \"GLSL.std.450\"\n"
128 " OpMemoryModel Logical GLSL450\n"
129 " OpEntryPoint Vertex %4 \"main\" %10 %12 %16 %17\n"
130 " OpName %4 \"main\"\n"
131 " OpName %10 \"gl_Position\"\n"
132 " OpName %12 \"a_position\"\n"
133 " OpName %16 \"gl_VertexID\"\n"
134 " OpName %17 \"gl_InstanceID\"\n"
135 " OpDecorate %10 BuiltIn Position\n"
136 " OpDecorate %12 Location 0\n"
137 " OpDecorate %16 BuiltIn VertexId\n"
138 " OpDecorate %17 BuiltIn InstanceId\n"
140 "%3 = OpTypeFunction %2\n"
141 "%7 = OpTypeFloat 32\n"
142 "%8 = OpTypeVector %7 4\n"
143 "%9 = OpTypePointer Output %8\n"
144 "%10 = OpVariable %9 Output\n"
145 "%11 = OpTypePointer Input %8\n"
146 "%12 = OpVariable %11 Input\n"
147 "%14 = OpTypeInt 32 1\n"
148 "%15 = OpTypePointer Input %14\n"
149 "%16 = OpVariable %15 Input\n"
150 "%17 = OpVariable %15 Input\n"
151 "%4 = OpFunction %2 None %3\n"
153 "%13 = OpLoad %8 %12\n"
159 dst.spirvAsmSources.add("frag") <<
160 " OpSource ESSL 300\n"
161 " OpCapability Shader\n"
162 "%1 = OpExtInstImport \"GLSL.std.450\"\n"
163 " OpMemoryModel Logical GLSL450\n"
164 " OpEntryPoint Fragment %4 \"main\" %10\n"
165 " OpExecutionMode %4 OriginLowerLeft\n"
166 " OpName %4 \"main\"\n"
167 " OpName %10 \"o_color\"\n"
168 " OpDecorate %10 RelaxedPrecision\n"
169 " OpDecorate %10 Location 0\n"
171 "%3 = OpTypeFunction %2\n"
172 "%7 = OpTypeFloat 32\n"
173 "%8 = OpTypeVector %7 4\n"
174 "%9 = OpTypePointer Output %8\n"
175 "%10 = OpVariable %9 Output\n"
176 "%11 = OpConstant %7 1065353216\n"
177 "%12 = OpConstant %7 0\n"
178 "%13 = OpConstantComposite %8 %11 %12 %11 %11\n"
179 "%4 = OpFunction %2 None %3\n"
188 void createTriangleProgs (SourceCollections& dst)
190 dst.glslSources.add("vert") << glu::VertexSource(
192 "layout(location = 0) in highp vec4 a_position;\n"
193 "void main (void) { gl_Position = a_position; }\n");
194 dst.glslSources.add("frag") << glu::FragmentSource(
196 "layout(location = 0) out lowp vec4 o_color;\n"
197 "void main (void) { o_color = vec4(1.0, 0.0, 1.0, 1.0); }\n");
200 tcu::TestStatus renderTriangleTest (Context& context)
202 const VkDevice vkDevice = context.getDevice();
203 const DeviceInterface& vk = context.getDeviceInterface();
204 const VkQueue queue = context.getUniversalQueue();
205 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
206 SimpleAllocator memAlloc (vk, vkDevice, getPhysicalDeviceMemoryProperties(context.getInstanceInterface(), context.getPhysicalDevice()));
207 const tcu::IVec2 renderSize (256, 256);
209 const tcu::Vec4 vertices[] =
211 tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f),
212 tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f),
213 tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f)
216 const VkBufferCreateInfo vertexBufferParams =
218 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
219 DE_NULL, // const void* pNext;
220 (VkDeviceSize)sizeof(vertices), // VkDeviceSize size;
221 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage;
222 0u, // VkBufferCreateFlags flags;
223 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
224 1u, // deUint32 queueFamilyCount;
225 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
227 const Unique<VkBuffer> vertexBuffer (createBuffer(vk, vkDevice, &vertexBufferParams));
228 const UniquePtr<Allocation> vertexBufferMemory (memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible));
230 VK_CHECK(vk.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
232 const VkDeviceSize imageSizeBytes = (VkDeviceSize)(sizeof(deUint32)*renderSize.x()*renderSize.y());
233 const VkBufferCreateInfo readImageBufferParams =
235 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
236 DE_NULL, // const void* pNext;
237 imageSizeBytes, // VkDeviceSize size;
238 VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT, // VkBufferUsageFlags usage;
239 0u, // VkBufferCreateFlags flags;
240 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
241 1u, // deUint32 queueFamilyCount;
242 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
244 const Unique<VkBuffer> readImageBuffer (createBuffer(vk, vkDevice, &readImageBufferParams));
245 const UniquePtr<Allocation> readImageBufferMemory (memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
247 VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
249 const VkImageCreateInfo imageParams =
251 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
252 DE_NULL, // const void* pNext;
253 VK_IMAGE_TYPE_2D, // VkImageType imageType;
254 VK_FORMAT_R8G8B8A8_UNORM, // VkFormat format;
255 { renderSize.x(), renderSize.y(), 1 }, // VkExtent3D extent;
256 1u, // deUint32 mipLevels;
257 1u, // deUint32 arraySize;
258 1u, // deUint32 samples;
259 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
260 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, // VkImageUsageFlags usage;
261 0u, // VkImageCreateFlags flags;
262 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
263 1u, // deUint32 queueFamilyCount;
264 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
265 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
268 const Unique<VkImage> image (createImage(vk, vkDevice, &imageParams));
269 const UniquePtr<Allocation> imageMemory (memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *image), MemoryRequirement::Any));
271 VK_CHECK(vk.bindImageMemory(vkDevice, *image, imageMemory->getMemory(), imageMemory->getOffset()));
273 const VkAttachmentDescription colorAttDesc =
275 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION, // VkStructureType sType;
276 DE_NULL, // const void* pNext;
277 VK_FORMAT_R8G8B8A8_UNORM, // VkFormat format;
278 1u, // deUint32 samples;
279 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
280 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
281 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
282 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
283 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout;
284 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
285 0u, // VkAttachmentDescriptionFlags flags;
287 const VkAttachmentReference colorAttRef =
289 0u, // deUint32 attachment;
290 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout layout;
292 const VkSubpassDescription subpassDesc =
294 VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION, // VkStructureType sType;
295 DE_NULL, // const void* pNext;
296 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
297 0u, // VkSubpassDescriptionFlags flags;
298 0u, // deUint32 inputCount;
299 DE_NULL, // const VkAttachmentReference* pInputAttachments;
300 1u, // deUint32 colorCount;
301 &colorAttRef, // const VkAttachmentReference* pColorAttachments;
302 DE_NULL, // const VkAttachmentReference* pResolveAttachments;
303 { VK_NO_ATTACHMENT, VK_IMAGE_LAYOUT_GENERAL }, // VkAttachmentReference depthStencilAttachment;
304 0u, // deUint32 preserveCount;
305 DE_NULL, // const VkAttachmentReference* pPreserveAttachments;
308 const VkRenderPassCreateInfo renderPassParams =
310 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
311 DE_NULL, // const void* pNext;
312 1u, // deUint32 attachmentCount;
313 &colorAttDesc, // const VkAttachmentDescription* pAttachments;
314 1u, // deUint32 subpassCount;
315 &subpassDesc, // const VkSubpassDescription* pSubpasses;
316 0u, // deUint32 dependencyCount;
317 DE_NULL, // const VkSubpassDependency* pDependencies;
319 const Unique<VkRenderPass> renderPass (createRenderPass(vk, vkDevice, &renderPassParams));
321 const VkImageViewCreateInfo colorAttViewParams =
323 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
324 DE_NULL, // const void* pNext;
325 *image, // VkImage image;
326 VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
327 VK_FORMAT_R8G8B8A8_UNORM, // VkFormat format;
329 VK_CHANNEL_SWIZZLE_R,
330 VK_CHANNEL_SWIZZLE_G,
331 VK_CHANNEL_SWIZZLE_B,
333 }, // VkChannelMapping channels;
335 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
336 0u, // deUint32 baseMipLevel;
337 1u, // deUint32 mipLevels;
338 0u, // deUint32 baseArrayLayer;
339 1u, // deUint32 arraySize;
340 }, // VkImageSubresourceRange subresourceRange;
341 0u, // VkImageViewCreateFlags flags;
343 const Unique<VkImageView> colorAttView (createImageView(vk, vkDevice, &colorAttViewParams));
345 const Unique<VkShaderModule> vertShaderModule (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("vert"), 0));
346 const VkShaderCreateInfo vertShaderParams =
348 VK_STRUCTURE_TYPE_SHADER_CREATE_INFO, // VkStructureType sType;
349 DE_NULL, // const void* pNext;
350 *vertShaderModule, // VkShaderModule module;
351 "main", // const char* pName;
352 0u, // VkShaderCreateFlags flags;
353 VK_SHADER_STAGE_VERTEX, // VkShaderStage stage;
355 const Unique<VkShader> vertShader (createShader(vk, vkDevice, &vertShaderParams));
356 const Unique<VkShaderModule> fragShaderModule (createShaderModule(vk, vkDevice, context.getBinaryCollection().get("frag"), 0));
357 const VkShaderCreateInfo fragShaderParams =
359 VK_STRUCTURE_TYPE_SHADER_CREATE_INFO, // VkStructureType sType;
360 DE_NULL, // const void* pNext;
361 *fragShaderModule, // VkShaderModule module;
362 "main", // const char* pName;
363 0u, // VkShaderCreateFlags flags;
364 VK_SHADER_STAGE_FRAGMENT, // VkShaderStage stage;
366 const Unique<VkShader> fragShader (createShader(vk, vkDevice, &fragShaderParams));
369 const VkPipelineLayoutCreateInfo pipelineLayoutParams =
371 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
372 DE_NULL, // const void* pNext;
373 0u, // deUint32 descriptorSetCount;
374 DE_NULL, // const VkDescriptorSetLayout* pSetLayouts;
375 0u, // deUint32 pushConstantRangeCount;
376 DE_NULL, // const VkPushConstantRange* pPushConstantRanges;
378 const Unique<VkPipelineLayout> pipelineLayout (createPipelineLayout(vk, vkDevice, &pipelineLayoutParams));
381 const VkSpecializationInfo emptyShaderSpecParams =
383 0u, // deUint32 mapEntryCount;
384 DE_NULL, // const VkSpecializationMapEntry* pMap;
385 0, // const deUintptr dataSize;
386 DE_NULL, // const void* pData;
388 const VkPipelineShaderStageCreateInfo shaderStageParams[] =
391 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
392 DE_NULL, // const void* pNext;
393 VK_SHADER_STAGE_VERTEX, // VkShaderStage stage;
394 *vertShader, // VkShader shader;
395 &emptyShaderSpecParams, // const VkSpecializationInfo* pSpecializationInfo;
398 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
399 DE_NULL, // const void* pNext;
400 VK_SHADER_STAGE_FRAGMENT, // VkShaderStage stage;
401 *fragShader, // VkShader shader;
402 &emptyShaderSpecParams, // const VkSpecializationInfo* pSpecializationInfo;
405 const VkPipelineDepthStencilStateCreateInfo depthStencilParams =
407 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType;
408 DE_NULL, // const void* pNext;
409 DE_FALSE, // deUint32 depthTestEnable;
410 DE_FALSE, // deUint32 depthWriteEnable;
411 VK_COMPARE_OP_ALWAYS, // VkCompareOp depthCompareOp;
412 DE_FALSE, // deUint32 depthBoundsTestEnable;
413 DE_FALSE, // deUint32 stencilTestEnable;
415 VK_STENCIL_OP_KEEP, // VkStencilOp stencilFailOp;
416 VK_STENCIL_OP_KEEP, // VkStencilOp stencilPassOp;
417 VK_STENCIL_OP_KEEP, // VkStencilOp stencilDepthFailOp;
418 VK_COMPARE_OP_ALWAYS, // VkCompareOp stencilCompareOp;
419 0u, // deUint32 stencilCompareMask;
420 0u, // deUint32 stencilWriteMask;
421 0u, // deUint32 stencilReference;
422 }, // VkStencilOpState front;
424 VK_STENCIL_OP_KEEP, // VkStencilOp stencilFailOp;
425 VK_STENCIL_OP_KEEP, // VkStencilOp stencilPassOp;
426 VK_STENCIL_OP_KEEP, // VkStencilOp stencilDepthFailOp;
427 VK_COMPARE_OP_ALWAYS, // VkCompareOp stencilCompareOp;
428 0u, // deUint32 stencilCompareMask;
429 0u, // deUint32 stencilWriteMask;
430 0u, // deUint32 stencilReference;
431 }, // VkStencilOpState back;
432 -1.0f, // float minDepthBounds;
433 +1.0f, // float maxDepthBounds;
435 const VkViewport viewport0 =
437 0.0f, // float originX;
438 0.0f, // float originY;
439 (float)renderSize.x(), // float width;
440 (float)renderSize.y(), // float height;
441 0.0f, // float minDepth;
442 1.0f, // float maxDepth;
444 const VkRect2D scissor0 =
449 }, // VkOffset2D offset;
451 renderSize.x(), // deInt32 width;
452 renderSize.y(), // deInt32 height;
453 }, // VkExtent2D extent;
455 const VkPipelineViewportStateCreateInfo viewportParams =
457 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
458 DE_NULL, // const void* pNext;
459 1u, // deUint32 viewportCount;
464 const VkSampleMask sampleMask = ~0u;
465 const VkPipelineMultisampleStateCreateInfo multisampleParams =
467 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType;
468 DE_NULL, // const void* pNext;
469 1u, // deUint32 rasterSamples;
470 DE_FALSE, // deUint32 sampleShadingEnable;
471 0.0f, // float minSampleShading;
472 &sampleMask, // VkSampleMask sampleMask;
474 const VkPipelineRasterStateCreateInfo rasterParams =
476 VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO, // VkStructureType sType;
477 DE_NULL, // const void* pNext;
478 DE_TRUE, // deUint32 depthClipEnable;
479 DE_FALSE, // deUint32 rasterizerDiscardEnable;
480 VK_FILL_MODE_SOLID, // VkFillMode fillMode;
481 VK_CULL_MODE_NONE, // VkCullMode cullMode;
482 VK_FRONT_FACE_CCW, // VkFrontFace frontFace;
483 VK_FALSE, // VkBool32 depthBiasEnable;
484 0.0f, // float depthBias;
485 0.0f, // float depthBiasClamp;
486 0.0f, // float slopeScaledDepthBias;
487 1.0f, // float lineWidth;
489 const VkPipelineInputAssemblyStateCreateInfo inputAssemblyParams =
491 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
492 DE_NULL, // const void* pNext;
493 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology;
494 DE_FALSE, // deUint32 primitiveRestartEnable;
496 const VkVertexInputBindingDescription vertexBinding0 =
498 0u, // deUint32 binding;
499 (deUint32)sizeof(tcu::Vec4), // deUint32 strideInBytes;
500 VK_VERTEX_INPUT_STEP_RATE_VERTEX, // VkVertexInputStepRate stepRate;
502 const VkVertexInputAttributeDescription vertexAttrib0 =
504 0u, // deUint32 location;
505 0u, // deUint32 binding;
506 VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format;
507 0u, // deUint32 offsetInBytes;
509 const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
511 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
512 DE_NULL, // const void* pNext;
513 1u, // deUint32 bindingCount;
514 &vertexBinding0, // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
515 1u, // deUint32 attributeCount;
516 &vertexAttrib0, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
518 const VkPipelineColorBlendAttachmentState attBlendParams =
520 DE_FALSE, // deUint32 blendEnable;
521 VK_BLEND_ONE, // VkBlend srcBlendColor;
522 VK_BLEND_ZERO, // VkBlend destBlendColor;
523 VK_BLEND_OP_ADD, // VkBlendOp blendOpColor;
524 VK_BLEND_ONE, // VkBlend srcBlendAlpha;
525 VK_BLEND_ZERO, // VkBlend destBlendAlpha;
526 VK_BLEND_OP_ADD, // VkBlendOp blendOpAlpha;
527 VK_CHANNEL_R_BIT|VK_CHANNEL_G_BIT|VK_CHANNEL_B_BIT|VK_CHANNEL_A_BIT, // VkChannelFlags channelWriteMask;
529 const VkPipelineColorBlendStateCreateInfo blendParams =
531 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
532 DE_NULL, // const void* pNext;
533 DE_FALSE, // VkBool32 alphaToCoverageEnable;
534 DE_FALSE, // VkBool32 alphaToOneEnable;
535 DE_FALSE, // VkBool32 logicOpEnable;
536 VK_LOGIC_OP_COPY, // VkLogicOp logicOp;
537 1u, // deUint32 attachmentCount;
538 &attBlendParams, // const VkPipelineColorBlendAttachmentState* pAttachments;
539 { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConst[4];
541 const VkPipelineDynamicStateCreateInfo dynamicStateInfo =
543 VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // VkStructureType sType;
544 DE_NULL, // const void* pNext;
545 0u, // deUint32 dynamicStateCount;
546 DE_NULL // const VkDynamicState* pDynamicStates;
548 const VkGraphicsPipelineCreateInfo pipelineParams =
550 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
551 DE_NULL, // const void* pNext;
552 (deUint32)DE_LENGTH_OF_ARRAY(shaderStageParams), // deUint32 stageCount;
553 shaderStageParams, // const VkPipelineShaderStageCreateInfo* pStages;
554 &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
555 &inputAssemblyParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
556 DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
557 &viewportParams, // const VkPipelineViewportStateCreateInfo* pViewportState;
558 &rasterParams, // const VkPipelineRasterStateCreateInfo* pRasterState;
559 &multisampleParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
560 &depthStencilParams, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
561 &blendParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
562 &dynamicStateInfo, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
563 0u, // VkPipelineCreateFlags flags;
564 *pipelineLayout, // VkPipelineLayout layout;
565 *renderPass, // VkRenderPass renderPass;
566 0u, // deUint32 subpass;
567 DE_NULL, // VkPipeline basePipelineHandle;
568 0u, // deInt32 basePipelineIndex;
571 const Unique<VkPipeline> pipeline (createGraphicsPipeline(vk, vkDevice, DE_NULL, &pipelineParams));
574 const VkFramebufferCreateInfo framebufferParams =
576 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
577 DE_NULL, // const void* pNext;
578 *renderPass, // VkRenderPass renderPass;
579 1u, // deUint32 attachmentCount;
580 &*colorAttView, // const VkImageView* pAttachments;
581 (deUint32)renderSize.x(), // deUint32 width;
582 (deUint32)renderSize.y(), // deUint32 height;
583 1u, // deUint32 layers;
585 const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, vkDevice, &framebufferParams));
587 const VkCmdPoolCreateInfo cmdPoolParams =
589 VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO, // VkStructureType sType;
590 DE_NULL, // const void* pNext;
591 queueFamilyIndex, // deUint32 queueFamilyIndex;
592 VK_CMD_POOL_CREATE_RESET_COMMAND_BUFFER_BIT // VkCmdPoolCreateFlags flags;
594 const Unique<VkCmdPool> cmdPool (createCommandPool(vk, vkDevice, &cmdPoolParams));
597 const VkCmdBufferCreateInfo cmdBufParams =
599 VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO, // VkStructureType sType;
600 DE_NULL, // const void* pNext;
601 *cmdPool, // VkCmdPool pool;
602 VK_CMD_BUFFER_LEVEL_PRIMARY, // VkCmdBufferLevel level;
603 0u, // VkCmdBufferCreateFlags flags;
605 const Unique<VkCmdBuffer> cmdBuf (createCommandBuffer(vk, vkDevice, &cmdBufParams));
607 const VkCmdBufferBeginInfo cmdBufBeginParams =
609 VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO, // VkStructureType sType;
610 DE_NULL, // const void* pNext;
611 0u, // VkCmdBufferOptimizeFlags flags;
612 DE_NULL, // VkRenderPass renderPass;
613 0u, // deUint32 subpass;
614 DE_NULL, // VkFramebuffer framebuffer;
618 VK_CHECK(vk.beginCommandBuffer(*cmdBuf, &cmdBufBeginParams));
621 const VkMemoryBarrier vertFlushBarrier =
623 VK_STRUCTURE_TYPE_MEMORY_BARRIER, // VkStructureType sType;
624 DE_NULL, // const void* pNext;
625 VK_MEMORY_OUTPUT_HOST_WRITE_BIT, // VkMemoryOutputFlags outputMask;
626 VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT, // VkMemoryInputFlags inputMask;
628 const VkImageMemoryBarrier colorAttBarrier =
630 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
631 DE_NULL, // const void* pNext;
632 0u, // VkMemoryOutputFlags outputMask;
633 VK_MEMORY_INPUT_COLOR_ATTACHMENT_BIT, // VkMemoryInputFlags inputMask;
634 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
635 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
636 queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
637 queueFamilyIndex, // deUint32 destQueueFamilyIndex;
638 *image, // VkImage image;
640 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspect aspect;
641 0u, // deUint32 baseMipLevel;
642 1u, // deUint32 mipLevels;
643 0u, // deUint32 baseArraySlice;
644 1u, // deUint32 arraySize;
645 } // VkImageSubresourceRange subresourceRange;
647 const void* barriers[] = { &vertFlushBarrier, &colorAttBarrier };
648 vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_GPU_COMMANDS, DE_FALSE, (deUint32)DE_LENGTH_OF_ARRAY(barriers), barriers);
652 const VkClearValue clearValue = makeClearValueColorF32(0.125f, 0.25f, 0.75f, 1.0f);
653 const VkRenderPassBeginInfo passBeginParams =
655 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
656 DE_NULL, // const void* pNext;
657 *renderPass, // VkRenderPass renderPass;
658 *framebuffer, // VkFramebuffer framebuffer;
659 { { 0, 0 }, { renderSize.x(), renderSize.y() } }, // VkRect2D renderArea;
660 1u, // deUint32 clearValueCount;
661 &clearValue, // const VkClearValue* pClearValues;
663 vk.cmdBeginRenderPass(*cmdBuf, &passBeginParams, VK_RENDER_PASS_CONTENTS_INLINE);
666 vk.cmdBindPipeline(*cmdBuf, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline);
668 const VkDeviceSize bindingOffset = 0;
669 vk.cmdBindVertexBuffers(*cmdBuf, 0u, 1u, &vertexBuffer.get(), &bindingOffset);
671 vk.cmdDraw(*cmdBuf, 3u, 1u, 0u, 0u);
672 vk.cmdEndRenderPass(*cmdBuf);
675 const VkImageMemoryBarrier renderFinishBarrier =
677 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
678 DE_NULL, // const void* pNext;
679 VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT, // VkMemoryOutputFlags outputMask;
680 VK_MEMORY_INPUT_TRANSFER_BIT, // VkMemoryInputFlags inputMask;
681 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
682 VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL, // VkImageLayout newLayout;
683 queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
684 queueFamilyIndex, // deUint32 destQueueFamilyIndex;
685 *image, // VkImage image;
687 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
688 0u, // deUint32 baseMipLevel;
689 1u, // deUint32 mipLevels;
690 0u, // deUint32 baseArraySlice;
691 1u, // deUint32 arraySize;
692 } // VkImageSubresourceRange subresourceRange;
694 const void* barriers[] = { &renderFinishBarrier };
695 vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_ALL_GRAPHICS, VK_PIPELINE_STAGE_TRANSFER_BIT, DE_FALSE, (deUint32)DE_LENGTH_OF_ARRAY(barriers), barriers);
699 const VkBufferImageCopy copyParams =
701 (VkDeviceSize)0u, // VkDeviceSize bufferOffset;
702 (deUint32)renderSize.x(), // deUint32 bufferRowLength;
703 (deUint32)renderSize.y(), // deUint32 bufferImageHeight;
705 VK_IMAGE_ASPECT_COLOR, // VkImageAspect aspect;
706 0u, // deUint32 mipLevel;
707 0u, // deUint32 arrayLayer;
708 1u, // deUint32 arraySize;
709 }, // VkImageSubresourceCopy imageSubresource;
710 { 0u, 0u, 0u }, // VkOffset3D imageOffset;
711 { renderSize.x(), renderSize.y(), 1u } // VkExtent3D imageExtent;
713 vk.cmdCopyImageToBuffer(*cmdBuf, *image, VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL, *readImageBuffer, 1u, ©Params);
717 const VkBufferMemoryBarrier copyFinishBarrier =
719 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
720 DE_NULL, // const void* pNext;
721 VK_MEMORY_OUTPUT_TRANSFER_BIT, // VkMemoryOutputFlags outputMask;
722 VK_MEMORY_INPUT_HOST_READ_BIT, // VkMemoryInputFlags inputMask;
723 queueFamilyIndex, // deUint32 srcQueueFamilyIndex;
724 queueFamilyIndex, // deUint32 destQueueFamilyIndex;
725 *readImageBuffer, // VkBuffer buffer;
726 0u, // VkDeviceSize offset;
727 imageSizeBytes // VkDeviceSize size;
729 const void* barriers[] = { ©FinishBarrier };
730 vk.cmdPipelineBarrier(*cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, DE_FALSE, (deUint32)DE_LENGTH_OF_ARRAY(barriers), barriers);
733 VK_CHECK(vk.endCommandBuffer(*cmdBuf));
735 // Upload vertex data
737 const VkMappedMemoryRange range =
739 VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType;
740 DE_NULL, // const void* pNext;
741 vertexBufferMemory->getMemory(), // VkDeviceMemory mem;
742 0, // VkDeviceSize offset;
743 (VkDeviceSize)sizeof(vertices), // VkDeviceSize size;
745 void* vertexBufPtr = vertexBufferMemory->getHostPtr();
747 deMemcpy(vertexBufPtr, &vertices[0], sizeof(vertices));
748 VK_CHECK(vk.flushMappedMemoryRanges(vkDevice, 1u, &range));
751 // Submit & wait for completion
753 const VkFenceCreateInfo fenceParams =
755 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
756 DE_NULL, // const void* pNext;
757 0u, // VkFenceCreateFlags flags;
759 const Unique<VkFence> fence (createFence(vk, vkDevice, &fenceParams));
761 VK_CHECK(vk.queueSubmit(queue, 1u, &cmdBuf.get(), *fence));
762 VK_CHECK(vk.waitForFences(vkDevice, 1u, &fence.get(), DE_TRUE, ~0ull));
767 const VkMappedMemoryRange range =
769 VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // VkStructureType sType;
770 DE_NULL, // const void* pNext;
771 readImageBufferMemory->getMemory(), // VkDeviceMemory mem;
772 0, // VkDeviceSize offset;
773 imageSizeBytes, // VkDeviceSize size;
775 void* imagePtr = readImageBufferMemory->getHostPtr();
777 VK_CHECK(vk.invalidateMappedMemoryRanges(vkDevice, 1u, &range));
778 context.getTestContext().getLog() << TestLog::Image("Result", "Result", tcu::ConstPixelBufferAccess(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), renderSize.x(), renderSize.y(), 1, imagePtr));
781 return tcu::TestStatus::pass("Rendering succeeded");
786 tcu::TestCaseGroup* createSmokeTests (tcu::TestContext& testCtx)
788 de::MovePtr<tcu::TestCaseGroup> smokeTests (new tcu::TestCaseGroup(testCtx, "smoke", "Smoke Tests"));
790 addFunctionCase (smokeTests.get(), "create_sampler", "", createSamplerTest);
791 addFunctionCaseWithPrograms (smokeTests.get(), "create_shader", "", createShaderProgs, createShaderModuleTest);
792 addFunctionCaseWithPrograms (smokeTests.get(), "triangle", "", createTriangleProgs, renderTriangleTest);
793 addFunctionCaseWithPrograms (smokeTests.get(), "asm_triangle", "", createTriangleAsmProgs, renderTriangleTest);
795 return smokeTests.release();