1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7 * Copyright (c) 2016 The Android Open Source Project
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 * \brief Vulkan ShaderRenderCase
24 *//*--------------------------------------------------------------------*/
26 #include "vktShaderRender.hpp"
28 #include "tcuImageCompare.hpp"
29 #include "tcuImageIO.hpp"
30 #include "tcuTestLog.hpp"
31 #include "tcuTextureUtil.hpp"
32 #include "tcuSurface.hpp"
33 #include "tcuVector.hpp"
35 #include "deFilePath.hpp"
37 #include "deUniquePtr.hpp"
39 #include "vkDeviceUtil.hpp"
40 #include "vkImageUtil.hpp"
41 #include "vkPlatform.hpp"
42 #include "vkQueryUtil.hpp"
44 #include "vkRefUtil.hpp"
45 #include "vkStrUtil.hpp"
46 #include "vkTypeUtil.hpp"
61 static const deUint32 MAX_RENDER_WIDTH = 128;
62 static const deUint32 MAX_RENDER_HEIGHT = 128;
63 static const tcu::Vec4 DEFAULT_CLEAR_COLOR = tcu::Vec4(0.125f, 0.25f, 0.5f, 1.0f);
65 static VkImageViewType textureTypeToImageViewType (TextureBinding::Type type)
69 case TextureBinding::TYPE_1D: return VK_IMAGE_VIEW_TYPE_1D;
70 case TextureBinding::TYPE_2D: return VK_IMAGE_VIEW_TYPE_2D;
71 case TextureBinding::TYPE_3D: return VK_IMAGE_VIEW_TYPE_3D;
72 case TextureBinding::TYPE_CUBE_MAP: return VK_IMAGE_VIEW_TYPE_CUBE;
73 case TextureBinding::TYPE_1D_ARRAY: return VK_IMAGE_VIEW_TYPE_1D_ARRAY;
74 case TextureBinding::TYPE_2D_ARRAY: return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
75 case TextureBinding::TYPE_CUBE_ARRAY: return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
78 DE_FATAL("Impossible");
79 return (VkImageViewType)0;
83 static VkImageType viewTypeToImageType (VkImageViewType type)
87 case VK_IMAGE_VIEW_TYPE_1D:
88 case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return VK_IMAGE_TYPE_1D;
89 case VK_IMAGE_VIEW_TYPE_2D:
90 case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return VK_IMAGE_TYPE_2D;
91 case VK_IMAGE_VIEW_TYPE_3D: return VK_IMAGE_TYPE_3D;
92 case VK_IMAGE_VIEW_TYPE_CUBE:
93 case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return VK_IMAGE_TYPE_2D;
96 DE_FATAL("Impossible");
97 return (VkImageType)0;
101 /*! Gets the next multiple of a given divisor */
102 static deUint32 getNextMultiple (deUint32 divisor, deUint32 value)
104 if (value % divisor == 0)
108 return value + divisor - (value % divisor);
111 /*! Gets the next value that is multiple of all given divisors */
112 static deUint32 getNextMultiple (const std::vector<deUint32>& divisors, deUint32 value)
114 deUint32 nextMultiple = value;
115 bool nextMultipleFound = false;
119 nextMultipleFound = true;
121 for (size_t divNdx = 0; divNdx < divisors.size(); divNdx++)
122 nextMultipleFound = nextMultipleFound && (nextMultiple % divisors[divNdx] == 0);
124 if (nextMultipleFound)
127 DE_ASSERT(nextMultiple < ~((deUint32)0u));
128 nextMultiple = getNextMultiple(divisors[0], nextMultiple + 1);
141 QuadGrid (int gridSize,
144 const tcu::Vec4& constCoords,
145 const std::vector<tcu::Mat4>& userAttribTransforms,
146 const std::vector<TextureBindingSp>& textures);
149 int getGridSize (void) const { return m_gridSize; }
150 int getNumVertices (void) const { return m_numVertices; }
151 int getNumTriangles (void) const { return m_numTriangles; }
152 const tcu::Vec4& getConstCoords (void) const { return m_constCoords; }
153 const std::vector<tcu::Mat4> getUserAttribTransforms (void) const { return m_userAttribTransforms; }
154 const std::vector<TextureBindingSp>& getTextures (void) const { return m_textures; }
156 const tcu::Vec4* getPositions (void) const { return &m_positions[0]; }
157 const float* getAttribOne (void) const { return &m_attribOne[0]; }
158 const tcu::Vec4* getCoords (void) const { return &m_coords[0]; }
159 const tcu::Vec4* getUnitCoords (void) const { return &m_unitCoords[0]; }
161 const tcu::Vec4* getUserAttrib (int attribNdx) const { return &m_userAttribs[attribNdx][0]; }
162 const deUint16* getIndices (void) const { return &m_indices[0]; }
164 tcu::Vec4 getCoords (float sx, float sy) const;
165 tcu::Vec4 getUnitCoords (float sx, float sy) const;
167 int getNumUserAttribs (void) const { return (int)m_userAttribTransforms.size(); }
168 tcu::Vec4 getUserAttrib (int attribNdx, float sx, float sy) const;
171 const int m_gridSize;
172 const int m_numVertices;
173 const int m_numTriangles;
174 const tcu::Vec4 m_constCoords;
175 const std::vector<tcu::Mat4> m_userAttribTransforms;
177 const std::vector<TextureBindingSp>& m_textures;
179 std::vector<tcu::Vec4> m_screenPos;
180 std::vector<tcu::Vec4> m_positions;
181 std::vector<tcu::Vec4> m_coords; //!< Near-unit coordinates, roughly [-2.0 .. 2.0].
182 std::vector<tcu::Vec4> m_unitCoords; //!< Positive-only coordinates [0.0 .. 1.5].
183 std::vector<float> m_attribOne;
184 std::vector<tcu::Vec4> m_userAttribs[ShaderEvalContext::MAX_TEXTURES];
185 std::vector<deUint16> m_indices;
188 QuadGrid::QuadGrid (int gridSize,
191 const tcu::Vec4& constCoords,
192 const std::vector<tcu::Mat4>& userAttribTransforms,
193 const std::vector<TextureBindingSp>& textures)
194 : m_gridSize (gridSize)
195 , m_numVertices ((gridSize + 1) * (gridSize + 1))
196 , m_numTriangles (gridSize * gridSize * 2)
197 , m_constCoords (constCoords)
198 , m_userAttribTransforms (userAttribTransforms)
199 , m_textures (textures)
201 const tcu::Vec4 viewportScale ((float)width, (float)height, 0.0f, 0.0f);
204 m_screenPos.resize(m_numVertices);
205 m_positions.resize(m_numVertices);
206 m_coords.resize(m_numVertices);
207 m_unitCoords.resize(m_numVertices);
208 m_attribOne.resize(m_numVertices);
211 for (int attrNdx = 0; attrNdx < DE_LENGTH_OF_ARRAY(m_userAttribs); attrNdx++)
212 m_userAttribs[attrNdx].resize(m_numVertices);
214 for (int y = 0; y < gridSize+1; y++)
215 for (int x = 0; x < gridSize+1; x++)
217 float sx = (float)x / (float)gridSize;
218 float sy = (float)y / (float)gridSize;
219 float fx = 2.0f * sx - 1.0f;
220 float fy = 2.0f * sy - 1.0f;
221 int vtxNdx = ((y * (gridSize+1)) + x);
223 m_positions[vtxNdx] = tcu::Vec4(fx, fy, 0.0f, 1.0f);
224 m_coords[vtxNdx] = getCoords(sx, sy);
225 m_unitCoords[vtxNdx] = getUnitCoords(sx, sy);
226 m_attribOne[vtxNdx] = 1.0f;
228 m_screenPos[vtxNdx] = tcu::Vec4(sx, sy, 0.0f, 1.0f) * viewportScale;
230 for (int attribNdx = 0; attribNdx < getNumUserAttribs(); attribNdx++)
231 m_userAttribs[attribNdx][vtxNdx] = getUserAttrib(attribNdx, sx, sy);
235 m_indices.resize(3 * m_numTriangles);
236 for (int y = 0; y < gridSize; y++)
237 for (int x = 0; x < gridSize; x++)
239 int stride = gridSize + 1;
240 int v00 = (y * stride) + x;
241 int v01 = (y * stride) + x + 1;
242 int v10 = ((y+1) * stride) + x;
243 int v11 = ((y+1) * stride) + x + 1;
245 int baseNdx = ((y * gridSize) + x) * 6;
246 m_indices[baseNdx + 0] = (deUint16)v10;
247 m_indices[baseNdx + 1] = (deUint16)v00;
248 m_indices[baseNdx + 2] = (deUint16)v01;
250 m_indices[baseNdx + 3] = (deUint16)v10;
251 m_indices[baseNdx + 4] = (deUint16)v01;
252 m_indices[baseNdx + 5] = (deUint16)v11;
256 QuadGrid::~QuadGrid (void)
260 inline tcu::Vec4 QuadGrid::getCoords (float sx, float sy) const
262 const float fx = 2.0f * sx - 1.0f;
263 const float fy = 2.0f * sy - 1.0f;
264 return tcu::Vec4(fx, fy, -fx + 0.33f*fy, -0.275f*fx - fy);
267 inline tcu::Vec4 QuadGrid::getUnitCoords (float sx, float sy) const
269 return tcu::Vec4(sx, sy, 0.33f*sx + 0.5f*sy, 0.5f*sx + 0.25f*sy);
272 inline tcu::Vec4 QuadGrid::getUserAttrib (int attribNdx, float sx, float sy) const
274 // homogeneous normalized screen-space coordinates
275 return m_userAttribTransforms[attribNdx] * tcu::Vec4(sx, sy, 0.0f, 1.0f);
280 TextureBinding::TextureBinding (const tcu::Archive& archive,
281 const char* filename,
283 const tcu::Sampler& sampler)
285 , m_sampler (sampler)
289 case TYPE_2D: m_binding.tex2D = loadTexture2D(archive, filename).release(); break;
291 DE_FATAL("Unsupported texture type");
295 TextureBinding::TextureBinding (const tcu::Texture1D* tex1D, const tcu::Sampler& sampler)
297 , m_sampler (sampler)
299 m_binding.tex1D = tex1D;
302 TextureBinding::TextureBinding (const tcu::Texture2D* tex2D, const tcu::Sampler& sampler)
304 , m_sampler (sampler)
306 m_binding.tex2D = tex2D;
309 TextureBinding::TextureBinding (const tcu::Texture3D* tex3D, const tcu::Sampler& sampler)
311 , m_sampler (sampler)
313 m_binding.tex3D = tex3D;
316 TextureBinding::TextureBinding (const tcu::TextureCube* texCube, const tcu::Sampler& sampler)
317 : m_type (TYPE_CUBE_MAP)
318 , m_sampler (sampler)
320 m_binding.texCube = texCube;
323 TextureBinding::TextureBinding (const tcu::Texture1DArray* tex1DArray, const tcu::Sampler& sampler)
324 : m_type (TYPE_1D_ARRAY)
325 , m_sampler (sampler)
327 m_binding.tex1DArray = tex1DArray;
330 TextureBinding::TextureBinding (const tcu::Texture2DArray* tex2DArray, const tcu::Sampler& sampler)
331 : m_type (TYPE_2D_ARRAY)
332 , m_sampler (sampler)
334 m_binding.tex2DArray = tex2DArray;
337 TextureBinding::TextureBinding (const tcu::TextureCubeArray* texCubeArray, const tcu::Sampler& sampler)
338 : m_type (TYPE_CUBE_ARRAY)
339 , m_sampler (sampler)
341 m_binding.texCubeArray = texCubeArray;
344 TextureBinding::~TextureBinding (void)
348 case TYPE_1D: delete m_binding.tex1D; break;
349 case TYPE_2D: delete m_binding.tex2D; break;
350 case TYPE_3D: delete m_binding.tex3D; break;
351 case TYPE_CUBE_MAP: delete m_binding.texCube; break;
352 case TYPE_1D_ARRAY: delete m_binding.tex1DArray; break;
353 case TYPE_2D_ARRAY: delete m_binding.tex2DArray; break;
354 case TYPE_CUBE_ARRAY: delete m_binding.texCubeArray; break;
359 de::MovePtr<tcu::Texture2D> TextureBinding::loadTexture2D (const tcu::Archive& archive, const char* filename)
361 tcu::TextureLevel level;
362 tcu::ImageIO::loadImage(level, archive, filename);
364 TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
365 level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
367 // \todo [2015-10-08 elecro] for some reason we get better when using RGBA texture even in RGB case, this needs to be investigated
368 de::MovePtr<tcu::Texture2D> texture(new tcu::Texture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight()));
371 texture->allocLevel(0);
372 tcu::copy(texture->getLevel(0), level.getAccess());
377 // ShaderEvalContext.
379 ShaderEvalContext::ShaderEvalContext (const QuadGrid& quadGrid)
380 : constCoords (quadGrid.getConstCoords())
381 , isDiscarded (false)
382 , m_quadGrid (quadGrid)
384 const std::vector<TextureBindingSp>& bindings = m_quadGrid.getTextures();
385 DE_ASSERT((int)bindings.size() <= MAX_TEXTURES);
387 // Fill in texture array.
388 for (int ndx = 0; ndx < (int)bindings.size(); ndx++)
390 const TextureBinding& binding = *bindings[ndx];
392 if (binding.getType() == TextureBinding::TYPE_NONE)
395 textures[ndx].sampler = binding.getSampler();
397 switch (binding.getType())
399 case TextureBinding::TYPE_1D: textures[ndx].tex1D = &binding.get1D(); break;
400 case TextureBinding::TYPE_2D: textures[ndx].tex2D = &binding.get2D(); break;
401 case TextureBinding::TYPE_3D: textures[ndx].tex3D = &binding.get3D(); break;
402 case TextureBinding::TYPE_CUBE_MAP: textures[ndx].texCube = &binding.getCube(); break;
403 case TextureBinding::TYPE_1D_ARRAY: textures[ndx].tex1DArray = &binding.get1DArray(); break;
404 case TextureBinding::TYPE_2D_ARRAY: textures[ndx].tex2DArray = &binding.get2DArray(); break;
405 case TextureBinding::TYPE_CUBE_ARRAY: textures[ndx].texCubeArray = &binding.getCubeArray(); break;
407 TCU_THROW(InternalError, "Handling of texture binding type not implemented");
412 ShaderEvalContext::~ShaderEvalContext (void)
416 void ShaderEvalContext::reset (float sx, float sy)
419 color = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
423 coords = m_quadGrid.getCoords(sx, sy);
424 unitCoords = m_quadGrid.getUnitCoords(sx, sy);
426 // Compute user attributes.
427 const int numAttribs = m_quadGrid.getNumUserAttribs();
428 DE_ASSERT(numAttribs <= MAX_USER_ATTRIBS);
429 for (int attribNdx = 0; attribNdx < numAttribs; attribNdx++)
430 in[attribNdx] = m_quadGrid.getUserAttrib(attribNdx, sx, sy);
433 tcu::Vec4 ShaderEvalContext::texture2D (int unitNdx, const tcu::Vec2& texCoords)
435 if (textures[unitNdx].tex2D)
436 return textures[unitNdx].tex2D->sample(textures[unitNdx].sampler, texCoords.x(), texCoords.y(), 0.0f);
438 return tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f);
443 ShaderEvaluator::ShaderEvaluator (void)
444 : m_evalFunc(DE_NULL)
448 ShaderEvaluator::ShaderEvaluator (ShaderEvalFunc evalFunc)
449 : m_evalFunc(evalFunc)
453 ShaderEvaluator::~ShaderEvaluator (void)
457 void ShaderEvaluator::evaluate (ShaderEvalContext& ctx) const
459 DE_ASSERT(m_evalFunc);
465 UniformSetup::UniformSetup (void)
466 : m_setupFunc(DE_NULL)
470 UniformSetup::UniformSetup (UniformSetupFunc setupFunc)
471 : m_setupFunc(setupFunc)
475 UniformSetup::~UniformSetup (void)
479 void UniformSetup::setup (ShaderRenderCaseInstance& instance, const tcu::Vec4& constCoords) const
482 m_setupFunc(instance, constCoords);
487 ShaderRenderCase::ShaderRenderCase (tcu::TestContext& testCtx,
488 const std::string& name,
489 const std::string& description,
490 const bool isVertexCase,
491 const ShaderEvalFunc evalFunc,
492 const UniformSetup* uniformSetup,
493 const AttributeSetupFunc attribFunc)
494 : vkt::TestCase (testCtx, name, description)
495 , m_isVertexCase (isVertexCase)
496 , m_evaluator (new ShaderEvaluator(evalFunc))
497 , m_uniformSetup (uniformSetup ? uniformSetup : new UniformSetup())
498 , m_attribFunc (attribFunc)
501 ShaderRenderCase::ShaderRenderCase (tcu::TestContext& testCtx,
502 const std::string& name,
503 const std::string& description,
504 const bool isVertexCase,
505 const ShaderEvaluator* evaluator,
506 const UniformSetup* uniformSetup,
507 const AttributeSetupFunc attribFunc)
508 : vkt::TestCase (testCtx, name, description)
509 , m_isVertexCase (isVertexCase)
510 , m_evaluator (evaluator)
511 , m_uniformSetup (uniformSetup ? uniformSetup : new UniformSetup())
512 , m_attribFunc (attribFunc)
515 ShaderRenderCase::~ShaderRenderCase (void)
519 void ShaderRenderCase::initPrograms (vk::SourceCollections& programCollection) const
521 programCollection.glslSources.add("vert") << glu::VertexSource(m_vertShaderSource);
522 programCollection.glslSources.add("frag") << glu::FragmentSource(m_fragShaderSource);
525 TestInstance* ShaderRenderCase::createInstance (Context& context) const
527 DE_ASSERT(m_evaluator != DE_NULL);
528 DE_ASSERT(m_uniformSetup != DE_NULL);
529 return new ShaderRenderCaseInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_attribFunc);
532 // ShaderRenderCaseInstance.
534 ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context)
535 : vkt::TestInstance (context)
536 , m_imageBackingMode (IMAGE_BACKING_MODE_REGULAR)
537 , m_quadGridSize (static_cast<deUint32>(GRID_SIZE_DEFAULT_FRAGMENT))
538 , m_sparseContext (createSparseContext())
539 , m_memAlloc (getAllocator())
540 , m_clearColor (DEFAULT_CLEAR_COLOR)
541 , m_isVertexCase (false)
542 , m_vertexShaderName ("vert")
543 , m_fragmentShaderName ("frag")
544 , m_renderSize (MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
545 , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
546 , m_evaluator (DE_NULL)
547 , m_uniformSetup (DE_NULL)
548 , m_attribFunc (DE_NULL)
549 , m_sampleCount (VK_SAMPLE_COUNT_1_BIT)
554 ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context,
555 const bool isVertexCase,
556 const ShaderEvaluator& evaluator,
557 const UniformSetup& uniformSetup,
558 const AttributeSetupFunc attribFunc,
559 const ImageBackingMode imageBackingMode,
560 const deUint32 gridSize)
561 : vkt::TestInstance (context)
562 , m_imageBackingMode (imageBackingMode)
563 , m_quadGridSize (gridSize == static_cast<deUint32>(GRID_SIZE_DEFAULTS)
565 ? static_cast<deUint32>(GRID_SIZE_DEFAULT_VERTEX)
566 : static_cast<deUint32>(GRID_SIZE_DEFAULT_FRAGMENT))
568 , m_sparseContext (createSparseContext())
569 , m_memAlloc (getAllocator())
570 , m_clearColor (DEFAULT_CLEAR_COLOR)
571 , m_isVertexCase (isVertexCase)
572 , m_vertexShaderName ("vert")
573 , m_fragmentShaderName ("frag")
574 , m_renderSize (MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
575 , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
576 , m_evaluator (&evaluator)
577 , m_uniformSetup (&uniformSetup)
578 , m_attribFunc (attribFunc)
579 , m_sampleCount (VK_SAMPLE_COUNT_1_BIT)
583 ShaderRenderCaseInstance::ShaderRenderCaseInstance (Context& context,
584 const bool isVertexCase,
585 const ShaderEvaluator* evaluator,
586 const UniformSetup* uniformSetup,
587 const AttributeSetupFunc attribFunc,
588 const ImageBackingMode imageBackingMode,
589 const deUint32 gridSize)
590 : vkt::TestInstance (context)
591 , m_imageBackingMode (imageBackingMode)
592 , m_quadGridSize (gridSize == static_cast<deUint32>(GRID_SIZE_DEFAULTS)
594 ? static_cast<deUint32>(GRID_SIZE_DEFAULT_VERTEX)
595 : static_cast<deUint32>(GRID_SIZE_DEFAULT_FRAGMENT))
597 , m_sparseContext (createSparseContext())
598 , m_memAlloc (getAllocator())
599 , m_clearColor (DEFAULT_CLEAR_COLOR)
600 , m_isVertexCase (isVertexCase)
601 , m_vertexShaderName ("vert")
602 , m_fragmentShaderName ("frag")
603 , m_renderSize (MAX_RENDER_WIDTH, MAX_RENDER_HEIGHT)
604 , m_colorFormat (VK_FORMAT_R8G8B8A8_UNORM)
605 , m_evaluator (evaluator)
606 , m_uniformSetup (uniformSetup)
607 , m_attribFunc (attribFunc)
608 , m_sampleCount (VK_SAMPLE_COUNT_1_BIT)
612 static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstance, VkPhysicalDevice physicalDevice, VkQueueFlags requiredCaps)
614 const std::vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vkInstance, physicalDevice);
616 for (size_t queueNdx = 0; queueNdx < queueProps.size(); queueNdx++)
618 if ((queueProps[queueNdx].queueFlags & requiredCaps) == requiredCaps)
619 return (deUint32)queueNdx;
622 TCU_THROW(NotSupportedError, "No matching queue found");
626 ShaderRenderCaseInstance::SparseContext::SparseContext (vkt::Context& context)
627 : m_context (context)
628 , m_queueFamilyIndex (findQueueFamilyIndexWithCaps(context.getInstanceInterface(), context.getPhysicalDevice(), VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_SPARSE_BINDING_BIT))
629 , m_device (createDevice())
630 , m_deviceInterface (context.getInstanceInterface(), *m_device)
631 , m_allocator (createAllocator())
633 m_deviceInterface.getDeviceQueue(*m_device, m_queueFamilyIndex, 0, &m_queue);
636 Move<VkDevice> ShaderRenderCaseInstance::SparseContext::createDevice () const
638 const InstanceInterface& vk = m_context.getInstanceInterface();
639 const VkPhysicalDevice physicalDevice = m_context.getPhysicalDevice();
640 const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(vk, physicalDevice);
642 VkDeviceQueueCreateInfo queueInfo;
643 VkDeviceCreateInfo deviceInfo;
644 const float queuePriority = 1.0f;
646 deMemset(&queueInfo, 0, sizeof(queueInfo));
647 deMemset(&deviceInfo, 0, sizeof(deviceInfo));
649 queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
650 queueInfo.pNext = DE_NULL;
651 queueInfo.flags = (VkDeviceQueueCreateFlags)0u;
652 queueInfo.queueFamilyIndex = m_queueFamilyIndex;
653 queueInfo.queueCount = 1u;
654 queueInfo.pQueuePriorities = &queuePriority;
656 deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
657 deviceInfo.pNext = DE_NULL;
658 deviceInfo.queueCreateInfoCount = 1u;
659 deviceInfo.pQueueCreateInfos = &queueInfo;
660 deviceInfo.enabledExtensionCount = 0u;
661 deviceInfo.ppEnabledExtensionNames = DE_NULL;
662 deviceInfo.enabledLayerCount = 0u;
663 deviceInfo.ppEnabledLayerNames = DE_NULL;
664 deviceInfo.pEnabledFeatures = &deviceFeatures;
666 return vk::createDevice(vk, physicalDevice, &deviceInfo);
669 vk::Allocator* ShaderRenderCaseInstance::SparseContext::createAllocator () const
671 const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice());
672 return new SimpleAllocator(m_deviceInterface, *m_device, memoryProperties);
675 ShaderRenderCaseInstance::SparseContext* ShaderRenderCaseInstance::createSparseContext (void) const
677 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
679 return new SparseContext(m_context);
685 vk::Allocator& ShaderRenderCaseInstance::getAllocator (void) const
687 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
689 return *m_sparseContext->m_allocator;
692 return m_context.getDefaultAllocator();
695 ShaderRenderCaseInstance::~ShaderRenderCaseInstance (void)
699 VkDevice ShaderRenderCaseInstance::getDevice (void) const
701 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
702 return *m_sparseContext->m_device;
704 return m_context.getDevice();
707 deUint32 ShaderRenderCaseInstance::getUniversalQueueFamilyIndex (void) const
709 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
710 return m_sparseContext->m_queueFamilyIndex;
712 return m_context.getUniversalQueueFamilyIndex();
715 const DeviceInterface& ShaderRenderCaseInstance::getDeviceInterface (void) const
717 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
718 return m_sparseContext->m_deviceInterface;
720 return m_context.getDeviceInterface();
723 VkQueue ShaderRenderCaseInstance::getUniversalQueue (void) const
725 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
726 return m_sparseContext->m_queue;
728 return m_context.getUniversalQueue();
731 VkPhysicalDevice ShaderRenderCaseInstance::getPhysicalDevice (void) const
733 // Same in sparse and regular case
734 return m_context.getPhysicalDevice();
737 const InstanceInterface& ShaderRenderCaseInstance::getInstanceInterface (void) const
739 // Same in sparse and regular case
740 return m_context.getInstanceInterface();
743 tcu::TestStatus ShaderRenderCaseInstance::iterate (void)
748 const tcu::UVec2 viewportSize = getViewportSize();
749 const int width = viewportSize.x();
750 const int height = viewportSize.y();
752 m_quadGrid = de::MovePtr<QuadGrid>(new QuadGrid(m_quadGridSize, width, height, getDefaultConstCoords(), m_userAttribTransforms, m_textures));
755 tcu::Surface resImage (width, height);
757 render(m_quadGrid->getNumVertices(), m_quadGrid->getNumTriangles(), m_quadGrid->getIndices(), m_quadGrid->getConstCoords());
758 tcu::copy(resImage.getAccess(), m_resultImage.getAccess());
760 // Compute reference.
761 tcu::Surface refImage (width, height);
763 computeVertexReference(refImage, *m_quadGrid);
765 computeFragmentReference(refImage, *m_quadGrid);
768 const bool compareOk = compareImages(resImage, refImage, 0.2f);
771 return tcu::TestStatus::pass("Result image matches reference");
773 return tcu::TestStatus::fail("Image mismatch");
776 void ShaderRenderCaseInstance::setup (void)
778 m_resultImage = tcu::TextureLevel();
779 m_descriptorSetLayoutBuilder = de::MovePtr<DescriptorSetLayoutBuilder> (new DescriptorSetLayoutBuilder());
780 m_descriptorPoolBuilder = de::MovePtr<DescriptorPoolBuilder> (new DescriptorPoolBuilder());
781 m_descriptorSetUpdateBuilder = de::MovePtr<DescriptorSetUpdateBuilder> (new DescriptorSetUpdateBuilder());
783 m_uniformInfos.clear();
784 m_vertexBindingDescription.clear();
785 m_vertexAttributeDescription.clear();
786 m_vertexBuffers.clear();
787 m_vertexBufferAllocs.clear();
788 m_pushConstantRanges.clear();
791 void ShaderRenderCaseInstance::setupUniformData (deUint32 bindingLocation, size_t size, const void* dataPtr)
793 const VkDevice vkDevice = getDevice();
794 const DeviceInterface& vk = getDeviceInterface();
795 const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
797 const VkBufferCreateInfo uniformBufferParams =
799 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
800 DE_NULL, // const void* pNext;
801 0u, // VkBufferCreateFlags flags;
802 size, // VkDeviceSize size;
803 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, // VkBufferUsageFlags usage;
804 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
805 1u, // deUint32 queueFamilyCount;
806 &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
809 Move<VkBuffer> buffer = createBuffer(vk, vkDevice, &uniformBufferParams);
810 de::MovePtr<Allocation> alloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
811 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, alloc->getMemory(), alloc->getOffset()));
813 deMemcpy(alloc->getHostPtr(), dataPtr, size);
814 flushMappedMemoryRange(vk, vkDevice, alloc->getMemory(), alloc->getOffset(), size);
816 de::MovePtr<BufferUniform> uniformInfo(new BufferUniform());
817 uniformInfo->type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
818 uniformInfo->descriptor = makeDescriptorBufferInfo(*buffer, 0u, size);
819 uniformInfo->location = bindingLocation;
820 uniformInfo->buffer = VkBufferSp(new vk::Unique<VkBuffer>(buffer));
821 uniformInfo->alloc = AllocationSp(alloc.release());
823 m_uniformInfos.push_back(UniformInfoSp(new de::UniquePtr<UniformInfo>(uniformInfo)));
826 void ShaderRenderCaseInstance::addUniform (deUint32 bindingLocation, vk::VkDescriptorType descriptorType, size_t dataSize, const void* data)
828 m_descriptorSetLayoutBuilder->addSingleBinding(descriptorType, vk::VK_SHADER_STAGE_ALL);
829 m_descriptorPoolBuilder->addType(descriptorType);
831 setupUniformData(bindingLocation, dataSize, data);
834 void ShaderRenderCaseInstance::addAttribute (deUint32 bindingLocation,
836 deUint32 sizePerElement,
840 // Add binding specification
841 const deUint32 binding = (deUint32)m_vertexBindingDescription.size();
842 const VkVertexInputBindingDescription bindingDescription =
844 binding, // deUint32 binding;
845 sizePerElement, // deUint32 stride;
846 VK_VERTEX_INPUT_RATE_VERTEX // VkVertexInputRate stepRate;
849 m_vertexBindingDescription.push_back(bindingDescription);
851 // Add location and format specification
852 const VkVertexInputAttributeDescription attributeDescription =
854 bindingLocation, // deUint32 location;
855 binding, // deUint32 binding;
856 format, // VkFormat format;
857 0u, // deUint32 offset;
860 m_vertexAttributeDescription.push_back(attributeDescription);
862 // Upload data to buffer
863 const VkDevice vkDevice = getDevice();
864 const DeviceInterface& vk = getDeviceInterface();
865 const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
867 const VkDeviceSize inputSize = sizePerElement * count;
868 const VkBufferCreateInfo vertexBufferParams =
870 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
871 DE_NULL, // const void* pNext;
872 0u, // VkBufferCreateFlags flags;
873 inputSize, // VkDeviceSize size;
874 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, // VkBufferUsageFlags usage;
875 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
876 1u, // deUint32 queueFamilyCount;
877 &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
880 Move<VkBuffer> buffer = createBuffer(vk, vkDevice, &vertexBufferParams);
881 de::MovePtr<vk::Allocation> alloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
882 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, alloc->getMemory(), alloc->getOffset()));
884 deMemcpy(alloc->getHostPtr(), dataPtr, (size_t)inputSize);
885 flushMappedMemoryRange(vk, vkDevice, alloc->getMemory(), alloc->getOffset(), inputSize);
887 m_vertexBuffers.push_back(VkBufferSp(new vk::Unique<VkBuffer>(buffer)));
888 m_vertexBufferAllocs.push_back(AllocationSp(alloc.release()));
891 void ShaderRenderCaseInstance::useAttribute (deUint32 bindingLocation, BaseAttributeType type)
893 const EnabledBaseAttribute attribute =
895 bindingLocation, // deUint32 location;
896 type // BaseAttributeType type;
898 m_enabledBaseAttributes.push_back(attribute);
901 void ShaderRenderCaseInstance::setupUniforms (const tcu::Vec4& constCoords)
904 m_uniformSetup->setup(*this, constCoords);
907 void ShaderRenderCaseInstance::useUniform (deUint32 bindingLocation, BaseUniformType type)
909 #define UNIFORM_CASE(type, value) case type: addUniform(bindingLocation, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, value); break
914 UNIFORM_CASE(UB_FALSE, 0);
915 UNIFORM_CASE(UB_TRUE, 1);
918 UNIFORM_CASE(UB4_FALSE, tcu::Vec4(0));
919 UNIFORM_CASE(UB4_TRUE, tcu::Vec4(1));
922 UNIFORM_CASE(UI_ZERO, 0);
923 UNIFORM_CASE(UI_ONE, 1);
924 UNIFORM_CASE(UI_TWO, 2);
925 UNIFORM_CASE(UI_THREE, 3);
926 UNIFORM_CASE(UI_FOUR, 4);
927 UNIFORM_CASE(UI_FIVE, 5);
928 UNIFORM_CASE(UI_SIX, 6);
929 UNIFORM_CASE(UI_SEVEN, 7);
930 UNIFORM_CASE(UI_EIGHT, 8);
931 UNIFORM_CASE(UI_ONEHUNDREDONE, 101);
934 UNIFORM_CASE(UI2_MINUS_ONE, tcu::IVec2(-1));
935 UNIFORM_CASE(UI2_ZERO, tcu::IVec2(0));
936 UNIFORM_CASE(UI2_ONE, tcu::IVec2(1));
937 UNIFORM_CASE(UI2_TWO, tcu::IVec2(2));
938 UNIFORM_CASE(UI2_THREE, tcu::IVec2(3));
939 UNIFORM_CASE(UI2_FOUR, tcu::IVec2(4));
940 UNIFORM_CASE(UI2_FIVE, tcu::IVec2(5));
943 UNIFORM_CASE(UI3_MINUS_ONE, tcu::IVec3(-1));
944 UNIFORM_CASE(UI3_ZERO, tcu::IVec3(0));
945 UNIFORM_CASE(UI3_ONE, tcu::IVec3(1));
946 UNIFORM_CASE(UI3_TWO, tcu::IVec3(2));
947 UNIFORM_CASE(UI3_THREE, tcu::IVec3(3));
948 UNIFORM_CASE(UI3_FOUR, tcu::IVec3(4));
949 UNIFORM_CASE(UI3_FIVE, tcu::IVec3(5));
952 UNIFORM_CASE(UI4_MINUS_ONE, tcu::IVec4(-1));
953 UNIFORM_CASE(UI4_ZERO, tcu::IVec4(0));
954 UNIFORM_CASE(UI4_ONE, tcu::IVec4(1));
955 UNIFORM_CASE(UI4_TWO, tcu::IVec4(2));
956 UNIFORM_CASE(UI4_THREE, tcu::IVec4(3));
957 UNIFORM_CASE(UI4_FOUR, tcu::IVec4(4));
958 UNIFORM_CASE(UI4_FIVE, tcu::IVec4(5));
961 UNIFORM_CASE(UF_ZERO, 0.0f);
962 UNIFORM_CASE(UF_ONE, 1.0f);
963 UNIFORM_CASE(UF_TWO, 2.0f);
964 UNIFORM_CASE(UF_THREE, 3.0f);
965 UNIFORM_CASE(UF_FOUR, 4.0f);
966 UNIFORM_CASE(UF_FIVE, 5.0f);
967 UNIFORM_CASE(UF_SIX, 6.0f);
968 UNIFORM_CASE(UF_SEVEN, 7.0f);
969 UNIFORM_CASE(UF_EIGHT, 8.0f);
971 UNIFORM_CASE(UF_HALF, 1.0f / 2.0f);
972 UNIFORM_CASE(UF_THIRD, 1.0f / 3.0f);
973 UNIFORM_CASE(UF_FOURTH, 1.0f / 4.0f);
974 UNIFORM_CASE(UF_FIFTH, 1.0f / 5.0f);
975 UNIFORM_CASE(UF_SIXTH, 1.0f / 6.0f);
976 UNIFORM_CASE(UF_SEVENTH, 1.0f / 7.0f);
977 UNIFORM_CASE(UF_EIGHTH, 1.0f / 8.0f);
980 UNIFORM_CASE(UV2_MINUS_ONE, tcu::Vec2(-1.0f));
981 UNIFORM_CASE(UV2_ZERO, tcu::Vec2(0.0f));
982 UNIFORM_CASE(UV2_ONE, tcu::Vec2(1.0f));
983 UNIFORM_CASE(UV2_TWO, tcu::Vec2(2.0f));
984 UNIFORM_CASE(UV2_THREE, tcu::Vec2(3.0f));
986 UNIFORM_CASE(UV2_HALF, tcu::Vec2(1.0f / 2.0f));
989 UNIFORM_CASE(UV3_MINUS_ONE, tcu::Vec3(-1.0f));
990 UNIFORM_CASE(UV3_ZERO, tcu::Vec3(0.0f));
991 UNIFORM_CASE(UV3_ONE, tcu::Vec3(1.0f));
992 UNIFORM_CASE(UV3_TWO, tcu::Vec3(2.0f));
993 UNIFORM_CASE(UV3_THREE, tcu::Vec3(3.0f));
995 UNIFORM_CASE(UV3_HALF, tcu::Vec3(1.0f / 2.0f));
998 UNIFORM_CASE(UV4_MINUS_ONE, tcu::Vec4(-1.0f));
999 UNIFORM_CASE(UV4_ZERO, tcu::Vec4(0.0f));
1000 UNIFORM_CASE(UV4_ONE, tcu::Vec4(1.0f));
1001 UNIFORM_CASE(UV4_TWO, tcu::Vec4(2.0f));
1002 UNIFORM_CASE(UV4_THREE, tcu::Vec4(3.0f));
1004 UNIFORM_CASE(UV4_HALF, tcu::Vec4(1.0f / 2.0f));
1006 UNIFORM_CASE(UV4_BLACK, tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
1007 UNIFORM_CASE(UV4_GRAY, tcu::Vec4(0.5f, 0.5f, 0.5f, 1.0f));
1008 UNIFORM_CASE(UV4_WHITE, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
1011 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Unknown Uniform type: " << type << tcu::TestLog::EndMessage;
1018 const tcu::UVec2 ShaderRenderCaseInstance::getViewportSize (void) const
1020 return tcu::UVec2(de::min(m_renderSize.x(), MAX_RENDER_WIDTH),
1021 de::min(m_renderSize.y(), MAX_RENDER_HEIGHT));
1024 void ShaderRenderCaseInstance::setSampleCount (VkSampleCountFlagBits sampleCount)
1026 m_sampleCount = sampleCount;
1029 bool ShaderRenderCaseInstance::isMultiSampling (void) const
1031 return m_sampleCount != VK_SAMPLE_COUNT_1_BIT;
1034 void ShaderRenderCaseInstance::uploadImage (const tcu::TextureFormat& texFormat,
1035 const TextureData& textureData,
1036 const tcu::Sampler& refSampler,
1038 deUint32 arrayLayers,
1041 const VkDevice vkDevice = getDevice();
1042 const DeviceInterface& vk = getDeviceInterface();
1043 const VkQueue queue = getUniversalQueue();
1044 const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
1046 const bool isShadowSampler = refSampler.compare != tcu::Sampler::COMPAREMODE_NONE;
1047 const VkImageAspectFlags aspectMask = isShadowSampler ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
1048 deUint32 bufferSize = 0u;
1049 Move<VkBuffer> buffer;
1050 de::MovePtr<Allocation> bufferAlloc;
1051 Move<VkCommandPool> cmdPool;
1052 Move<VkCommandBuffer> cmdBuffer;
1053 Move<VkFence> fence;
1054 std::vector<VkBufferImageCopy> copyRegions;
1055 std::vector<deUint32> offsetMultiples;
1057 offsetMultiples.push_back(4u);
1058 offsetMultiples.push_back(texFormat.getPixelSize());
1060 // Calculate buffer size
1061 for (TextureData::const_iterator mit = textureData.begin(); mit != textureData.end(); ++mit)
1063 for (TextureLayerData::const_iterator lit = mit->begin(); lit != mit->end(); ++lit)
1065 const tcu::ConstPixelBufferAccess& access = *lit;
1067 bufferSize = getNextMultiple(offsetMultiples, bufferSize);
1068 bufferSize += access.getWidth() * access.getHeight() * access.getDepth() * access.getFormat().getPixelSize();
1072 // Create source buffer
1074 const VkBufferCreateInfo bufferParams =
1076 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
1077 DE_NULL, // const void* pNext;
1078 0u, // VkBufferCreateFlags flags;
1079 bufferSize, // VkDeviceSize size;
1080 VK_BUFFER_USAGE_TRANSFER_SRC_BIT, // VkBufferUsageFlags usage;
1081 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1082 0u, // deUint32 queueFamilyIndexCount;
1083 DE_NULL, // const deUint32* pQueueFamilyIndices;
1086 buffer = createBuffer(vk, vkDevice, &bufferParams);
1087 bufferAlloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
1088 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
1091 // Create command pool and buffer
1093 const VkCommandPoolCreateInfo cmdPoolParams =
1095 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1096 DE_NULL, // const void* pNext;
1097 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCommandPoolCreateFlags flags;
1098 queueFamilyIndex, // deUint32 queueFamilyIndex;
1101 cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
1103 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
1105 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1106 DE_NULL, // const void* pNext;
1107 *cmdPool, // VkCommandPool commandPool;
1108 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1109 1u, // deUint32 bufferCount;
1112 cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
1117 const VkFenceCreateInfo fenceParams =
1119 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
1120 DE_NULL, // const void* pNext;
1121 0u // VkFenceCreateFlags flags;
1124 fence = createFence(vk, vkDevice, &fenceParams);
1127 // Barriers for copying buffer to image
1128 const VkBufferMemoryBarrier preBufferBarrier =
1130 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
1131 DE_NULL, // const void* pNext;
1132 VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask;
1133 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
1134 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1135 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1136 *buffer, // VkBuffer buffer;
1137 0u, // VkDeviceSize offset;
1138 bufferSize // VkDeviceSize size;
1141 const VkImageMemoryBarrier preImageBarrier =
1143 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1144 DE_NULL, // const void* pNext;
1145 0u, // VkAccessFlags srcAccessMask;
1146 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
1147 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1148 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
1149 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1150 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1151 destImage, // VkImage image;
1152 { // VkImageSubresourceRange subresourceRange;
1153 aspectMask, // VkImageAspect aspect;
1154 0u, // deUint32 baseMipLevel;
1155 mipLevels, // deUint32 mipLevels;
1156 0u, // deUint32 baseArraySlice;
1157 arrayLayers // deUint32 arraySize;
1161 const VkImageMemoryBarrier postImageBarrier =
1163 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1164 DE_NULL, // const void* pNext;
1165 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1166 VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask;
1167 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1168 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout;
1169 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1170 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1171 destImage, // VkImage image;
1172 { // VkImageSubresourceRange subresourceRange;
1173 aspectMask, // VkImageAspect aspect;
1174 0u, // deUint32 baseMipLevel;
1175 mipLevels, // deUint32 mipLevels;
1176 0u, // deUint32 baseArraySlice;
1177 arrayLayers // deUint32 arraySize;
1181 const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1183 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
1184 DE_NULL, // const void* pNext;
1185 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
1186 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1189 // Get copy regions and write buffer data
1191 deUint32 layerDataOffset = 0;
1192 deUint8* destPtr = (deUint8*)bufferAlloc->getHostPtr();
1194 for (size_t levelNdx = 0; levelNdx < textureData.size(); levelNdx++)
1196 const TextureLayerData& layerData = textureData[levelNdx];
1198 for (size_t layerNdx = 0; layerNdx < layerData.size(); layerNdx++)
1200 layerDataOffset = getNextMultiple(offsetMultiples, layerDataOffset);
1202 const tcu::ConstPixelBufferAccess& access = layerData[layerNdx];
1203 const tcu::PixelBufferAccess destAccess (access.getFormat(), access.getSize(), destPtr + layerDataOffset);
1205 const VkBufferImageCopy layerRegion =
1207 layerDataOffset, // VkDeviceSize bufferOffset;
1208 (deUint32)access.getWidth(), // deUint32 bufferRowLength;
1209 (deUint32)access.getHeight(), // deUint32 bufferImageHeight;
1210 { // VkImageSubresourceLayers imageSubresource;
1211 aspectMask, // VkImageAspectFlags aspectMask;
1212 (deUint32)levelNdx, // uint32_t mipLevel;
1213 (deUint32)layerNdx, // uint32_t baseArrayLayer;
1214 1u // uint32_t layerCount;
1216 { 0u, 0u, 0u }, // VkOffset3D imageOffset;
1217 { // VkExtent3D imageExtent;
1218 (deUint32)access.getWidth(),
1219 (deUint32)access.getHeight(),
1220 (deUint32)access.getDepth()
1224 copyRegions.push_back(layerRegion);
1225 tcu::copy(destAccess, access);
1227 layerDataOffset += access.getWidth() * access.getHeight() * access.getDepth() * access.getFormat().getPixelSize();
1232 flushMappedMemoryRange(vk, vkDevice, bufferAlloc->getMemory(), bufferAlloc->getOffset(), bufferSize);
1234 // Copy buffer to image
1235 VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
1236 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &preBufferBarrier, 1, &preImageBarrier);
1237 vk.cmdCopyBufferToImage(*cmdBuffer, *buffer, destImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)copyRegions.size(), copyRegions.data());
1238 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
1239 VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
1241 const VkSubmitInfo submitInfo =
1243 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
1244 DE_NULL, // const void* pNext;
1245 0u, // deUint32 waitSemaphoreCount;
1246 DE_NULL, // const VkSemaphore* pWaitSemaphores;
1247 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
1248 1u, // deUint32 commandBufferCount;
1249 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
1250 0u, // deUint32 signalSemaphoreCount;
1251 DE_NULL // const VkSemaphore* pSignalSemaphores;
1254 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
1255 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity */));
1258 void ShaderRenderCaseInstance::clearImage (const tcu::Sampler& refSampler,
1260 deUint32 arrayLayers,
1263 const VkDevice vkDevice = m_context.getDevice();
1264 const DeviceInterface& vk = m_context.getDeviceInterface();
1265 const VkQueue queue = m_context.getUniversalQueue();
1266 const deUint32 queueFamilyIndex = m_context.getUniversalQueueFamilyIndex();
1268 const bool isShadowSampler = refSampler.compare != tcu::Sampler::COMPAREMODE_NONE;
1269 const VkImageAspectFlags aspectMask = isShadowSampler ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
1270 Move<VkCommandPool> cmdPool;
1271 Move<VkCommandBuffer> cmdBuffer;
1272 Move<VkFence> fence;
1274 VkClearValue clearValue;
1275 deMemset(&clearValue, 0, sizeof(clearValue));
1278 // Create command pool and buffer
1280 const VkCommandPoolCreateInfo cmdPoolParams =
1282 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1283 DE_NULL, // const void* pNext;
1284 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCommandPoolCreateFlags flags;
1285 queueFamilyIndex, // deUint32 queueFamilyIndex;
1288 cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
1290 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
1292 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1293 DE_NULL, // const void* pNext;
1294 *cmdPool, // VkCommandPool commandPool;
1295 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1296 1u, // deUint32 bufferCount;
1299 cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
1304 const VkFenceCreateInfo fenceParams =
1306 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
1307 DE_NULL, // const void* pNext;
1308 0u // VkFenceCreateFlags flags;
1311 fence = createFence(vk, vkDevice, &fenceParams);
1314 const VkImageMemoryBarrier preImageBarrier =
1316 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1317 DE_NULL, // const void* pNext;
1318 0u, // VkAccessFlags srcAccessMask;
1319 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
1320 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1321 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
1322 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1323 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1324 destImage, // VkImage image;
1325 { // VkImageSubresourceRange subresourceRange;
1326 aspectMask, // VkImageAspect aspect;
1327 0u, // deUint32 baseMipLevel;
1328 mipLevels, // deUint32 mipLevels;
1329 0u, // deUint32 baseArraySlice;
1330 arrayLayers // deUint32 arraySize;
1334 const VkImageMemoryBarrier postImageBarrier =
1336 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1337 DE_NULL, // const void* pNext;
1338 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1339 VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask;
1340 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1341 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout;
1342 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1343 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1344 destImage, // VkImage image;
1345 { // VkImageSubresourceRange subresourceRange;
1346 aspectMask, // VkImageAspect aspect;
1347 0u, // deUint32 baseMipLevel;
1348 mipLevels, // deUint32 mipLevels;
1349 0u, // deUint32 baseArraySlice;
1350 arrayLayers // deUint32 arraySize;
1354 const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1356 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
1357 DE_NULL, // const void* pNext;
1358 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
1359 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1363 const VkImageSubresourceRange clearRange =
1365 aspectMask, // VkImageAspectFlags aspectMask;
1366 0u, // deUint32 baseMipLevel;
1367 mipLevels, // deUint32 levelCount;
1368 0u, // deUint32 baseArrayLayer;
1369 arrayLayers // deUint32 layerCount;
1372 // Copy buffer to image
1373 VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
1374 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &preImageBarrier);
1375 if (aspectMask == VK_IMAGE_ASPECT_COLOR_BIT)
1377 vk.cmdClearColorImage(*cmdBuffer, destImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue.color, 1, &clearRange);
1381 vk.cmdClearDepthStencilImage(*cmdBuffer, destImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue.depthStencil, 1, &clearRange);
1383 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
1384 VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
1386 const VkSubmitInfo submitInfo =
1388 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
1389 DE_NULL, // const void* pNext;
1390 0u, // deUint32 waitSemaphoreCount;
1391 DE_NULL, // const VkSemaphore* pWaitSemaphores;
1392 DE_NULL, // const VkPipelineStageFlags* pWaitDstStageMask;
1393 1u, // deUint32 commandBufferCount;
1394 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
1395 0u, // deUint32 signalSemaphoreCount;
1396 DE_NULL // const VkSemaphore* pSignalSemaphores;
1399 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
1400 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity */));
1403 // Sparse utility function
1404 Move<VkSemaphore> makeSemaphore (const DeviceInterface& vk, const VkDevice device)
1406 const VkSemaphoreCreateInfo semaphoreCreateInfo =
1408 VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
1413 return createSemaphore(vk, device, &semaphoreCreateInfo);
1416 VkExtent3D mipLevelExtents (const VkExtent3D& baseExtents, const deUint32 mipLevel)
1420 result.width = std::max(baseExtents.width >> mipLevel, 1u);
1421 result.height = std::max(baseExtents.height >> mipLevel, 1u);
1422 result.depth = std::max(baseExtents.depth >> mipLevel, 1u);
1427 tcu::UVec3 alignedDivide (const VkExtent3D& extent, const VkExtent3D& divisor)
1431 result.x() = extent.width / divisor.width + ((extent.width % divisor.width != 0) ? 1u : 0u);
1432 result.y() = extent.height / divisor.height + ((extent.height % divisor.height != 0) ? 1u : 0u);
1433 result.z() = extent.depth / divisor.depth + ((extent.depth % divisor.depth != 0) ? 1u : 0u);
1438 bool isImageSizeSupported (const VkImageType imageType, const tcu::UVec3& imageSize, const vk::VkPhysicalDeviceLimits& limits)
1442 case VK_IMAGE_TYPE_1D:
1443 return (imageSize.x() <= limits.maxImageDimension1D
1444 && imageSize.y() == 1
1445 && imageSize.z() == 1);
1446 case VK_IMAGE_TYPE_2D:
1447 return (imageSize.x() <= limits.maxImageDimension2D
1448 && imageSize.y() <= limits.maxImageDimension2D
1449 && imageSize.z() == 1);
1450 case VK_IMAGE_TYPE_3D:
1451 return (imageSize.x() <= limits.maxImageDimension3D
1452 && imageSize.y() <= limits.maxImageDimension3D
1453 && imageSize.z() <= limits.maxImageDimension3D);
1455 DE_FATAL("Unknown image type");
1460 void ShaderRenderCaseInstance::checkSparseSupport (const VkImageType imageType) const
1462 const InstanceInterface& instance = getInstanceInterface();
1463 const VkPhysicalDevice physicalDevice = getPhysicalDevice();
1464 const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(instance, physicalDevice);
1466 if (!deviceFeatures.shaderResourceResidency)
1467 TCU_THROW(NotSupportedError, "Required feature: shaderResourceResidency.");
1469 if (!deviceFeatures.sparseBinding)
1470 TCU_THROW(NotSupportedError, "Required feature: sparseBinding.");
1472 if (imageType == VK_IMAGE_TYPE_2D && !deviceFeatures.sparseResidencyImage2D)
1473 TCU_THROW(NotSupportedError, "Required feature: sparseResidencyImage2D.");
1475 if (imageType == VK_IMAGE_TYPE_3D && !deviceFeatures.sparseResidencyImage3D)
1476 TCU_THROW(NotSupportedError, "Required feature: sparseResidencyImage3D.");
1479 void ShaderRenderCaseInstance::uploadSparseImage (const tcu::TextureFormat& texFormat,
1480 const TextureData& textureData,
1481 const tcu::Sampler& refSampler,
1482 const deUint32 mipLevels,
1483 const deUint32 arrayLayers,
1484 const VkImage sparseImage,
1485 const VkImageCreateInfo& imageCreateInfo,
1486 const tcu::UVec3 texSize)
1488 const VkDevice vkDevice = getDevice();
1489 const DeviceInterface& vk = getDeviceInterface();
1490 const VkPhysicalDevice physicalDevice = getPhysicalDevice();
1491 const VkQueue queue = getUniversalQueue();
1492 const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
1493 const InstanceInterface& instance = getInstanceInterface();
1494 const VkPhysicalDeviceProperties deviceProperties = getPhysicalDeviceProperties(instance, physicalDevice);
1495 const VkPhysicalDeviceMemoryProperties deviceMemoryProperties = getPhysicalDeviceMemoryProperties(instance, physicalDevice);
1496 const bool isShadowSampler = refSampler.compare != tcu::Sampler::COMPAREMODE_NONE;
1497 const VkImageAspectFlags aspectMask = isShadowSampler ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
1499 const Unique<VkSemaphore> imageMemoryBindSemaphore(makeSemaphore(vk, vkDevice));
1500 deUint32 bufferSize = 0u;
1501 std::vector<deUint32> offsetMultiples;
1502 offsetMultiples.push_back(4u);
1503 offsetMultiples.push_back(texFormat.getPixelSize());
1505 if (isImageSizeSupported(imageCreateInfo.imageType, texSize, deviceProperties.limits) == false)
1506 TCU_THROW(NotSupportedError, "Image size not supported for device.");
1508 // Calculate buffer size
1509 for (TextureData::const_iterator mit = textureData.begin(); mit != textureData.end(); ++mit)
1511 for (TextureLayerData::const_iterator lit = mit->begin(); lit != mit->end(); ++lit)
1513 const tcu::ConstPixelBufferAccess& access = *lit;
1515 bufferSize = getNextMultiple(offsetMultiples, bufferSize);
1516 bufferSize += access.getWidth() * access.getHeight() * access.getDepth() * access.getFormat().getPixelSize();
1521 deUint32 sparseMemoryReqCount = 0;
1523 vk.getImageSparseMemoryRequirements(vkDevice, sparseImage, &sparseMemoryReqCount, DE_NULL);
1525 DE_ASSERT(sparseMemoryReqCount != 0);
1527 std::vector<VkSparseImageMemoryRequirements> sparseImageMemoryRequirements;
1528 sparseImageMemoryRequirements.resize(sparseMemoryReqCount);
1530 vk.getImageSparseMemoryRequirements(vkDevice, sparseImage, &sparseMemoryReqCount, &sparseImageMemoryRequirements[0]);
1532 const deUint32 noMatchFound = ~((deUint32)0);
1534 deUint32 colorAspectIndex = noMatchFound;
1535 for (deUint32 memoryReqNdx = 0; memoryReqNdx < sparseMemoryReqCount; ++memoryReqNdx)
1537 if (sparseImageMemoryRequirements[memoryReqNdx].formatProperties.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT)
1539 colorAspectIndex = memoryReqNdx;
1544 if (colorAspectIndex == noMatchFound)
1545 TCU_THROW(NotSupportedError, "Not supported image aspect - the test supports currently only VK_IMAGE_ASPECT_COLOR_BIT.");
1547 const VkMemoryRequirements memoryRequirements = getImageMemoryRequirements(vk, vkDevice, sparseImage);
1549 deUint32 memoryType = noMatchFound;
1550 for (deUint32 memoryTypeNdx = 0; memoryTypeNdx < deviceMemoryProperties.memoryTypeCount; ++memoryTypeNdx)
1552 if ((memoryRequirements.memoryTypeBits & (1u << memoryTypeNdx)) != 0 &&
1553 MemoryRequirement::Any.matchesHeap(deviceMemoryProperties.memoryTypes[memoryTypeNdx].propertyFlags))
1555 memoryType = memoryTypeNdx;
1560 if (memoryType == noMatchFound)
1561 TCU_THROW(NotSupportedError, "No matching memory type found.");
1563 if (memoryRequirements.size > deviceProperties.limits.sparseAddressSpaceSize)
1564 TCU_THROW(NotSupportedError, "Required memory size for sparse resource exceeds device limits.");
1566 // Check if the image format supports sparse oprerations
1567 const std::vector<VkSparseImageFormatProperties> sparseImageFormatPropVec =
1568 getPhysicalDeviceSparseImageFormatProperties(instance, physicalDevice, imageCreateInfo.format, imageCreateInfo.imageType, imageCreateInfo.samples, imageCreateInfo.usage, imageCreateInfo.tiling);
1570 if (sparseImageFormatPropVec.size() == 0)
1571 TCU_THROW(NotSupportedError, "The image format does not support sparse operations.");
1573 const VkSparseImageMemoryRequirements aspectRequirements = sparseImageMemoryRequirements[colorAspectIndex];
1574 const VkExtent3D imageGranularity = aspectRequirements.formatProperties.imageGranularity;
1576 std::vector<VkSparseImageMemoryBind> imageResidencyMemoryBinds;
1577 std::vector<VkSparseMemoryBind> imageMipTailMemoryBinds;
1579 for (deUint32 layerNdx = 0; layerNdx < arrayLayers; ++ layerNdx)
1581 for (deUint32 mipLevelNdx = 0; mipLevelNdx < aspectRequirements.imageMipTailFirstLod; ++mipLevelNdx)
1583 const VkExtent3D mipExtent = mipLevelExtents(imageCreateInfo.extent, mipLevelNdx);
1584 const tcu::UVec3 numSparseBinds = alignedDivide(mipExtent, imageGranularity);
1585 const tcu::UVec3 lastBlockExtent = tcu::UVec3(mipExtent.width % imageGranularity.width ? mipExtent.width % imageGranularity.width : imageGranularity.width,
1586 mipExtent.height % imageGranularity.height ? mipExtent.height % imageGranularity.height : imageGranularity.height,
1587 mipExtent.depth % imageGranularity.depth ? mipExtent.depth % imageGranularity.depth : imageGranularity.depth );
1589 for (deUint32 z = 0; z < numSparseBinds.z(); ++z)
1590 for (deUint32 y = 0; y < numSparseBinds.y(); ++y)
1591 for (deUint32 x = 0; x < numSparseBinds.x(); ++x)
1593 const VkMemoryRequirements allocRequirements =
1595 // 28.7.5 alignment shows the block size in bytes
1596 memoryRequirements.alignment, // VkDeviceSize size;
1597 memoryRequirements.alignment, // VkDeviceSize alignment;
1598 memoryRequirements.memoryTypeBits, // uint32_t memoryTypeBits;
1601 de::SharedPtr<Allocation> allocation(m_memAlloc.allocate(allocRequirements, MemoryRequirement::Any).release());
1603 m_allocations.push_back(allocation);
1606 offset.x = x*imageGranularity.width;
1607 offset.y = y*imageGranularity.height;
1608 offset.z = z*imageGranularity.depth;
1611 extent.width = (x == numSparseBinds.x() - 1) ? lastBlockExtent.x() : imageGranularity.width;
1612 extent.height = (y == numSparseBinds.y() - 1) ? lastBlockExtent.y() : imageGranularity.height;
1613 extent.depth = (z == numSparseBinds.z() - 1) ? lastBlockExtent.z() : imageGranularity.depth;
1615 const VkSparseImageMemoryBind imageMemoryBind =
1618 aspectMask, // VkImageAspectFlags aspectMask;
1619 mipLevelNdx,// uint32_t mipLevel;
1620 layerNdx, // uint32_t arrayLayer;
1621 }, // VkImageSubresource subresource;
1622 offset, // VkOffset3D offset;
1623 extent, // VkExtent3D extent;
1624 allocation->getMemory(), // VkDeviceMemory memory;
1625 allocation->getOffset(), // VkDeviceSize memoryOffset;
1626 0u, // VkSparseMemoryBindFlags flags;
1629 imageResidencyMemoryBinds.push_back(imageMemoryBind);
1633 // Handle MIP tail. There are two cases to consider here:
1635 // 1) VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT is requested by the driver: each layer needs a separate tail.
1636 // 2) otherwise: only one tail is needed.
1638 if ( imageMipTailMemoryBinds.size() == 0 ||
1639 (imageMipTailMemoryBinds.size() != 0 && (aspectRequirements.formatProperties.flags & VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT) == 0))
1641 const VkMemoryRequirements allocRequirements =
1643 aspectRequirements.imageMipTailSize, // VkDeviceSize size;
1644 memoryRequirements.alignment, // VkDeviceSize alignment;
1645 memoryRequirements.memoryTypeBits, // uint32_t memoryTypeBits;
1648 const de::SharedPtr<Allocation> allocation(m_memAlloc.allocate(allocRequirements, MemoryRequirement::Any).release());
1650 const VkSparseMemoryBind imageMipTailMemoryBind =
1652 aspectRequirements.imageMipTailOffset + layerNdx * aspectRequirements.imageMipTailStride, // VkDeviceSize resourceOffset;
1653 aspectRequirements.imageMipTailSize, // VkDeviceSize size;
1654 allocation->getMemory(), // VkDeviceMemory memory;
1655 allocation->getOffset(), // VkDeviceSize memoryOffset;
1656 0u, // VkSparseMemoryBindFlags flags;
1659 m_allocations.push_back(allocation);
1660 imageMipTailMemoryBinds.push_back(imageMipTailMemoryBind);
1665 VkBindSparseInfo bindSparseInfo =
1667 VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, //VkStructureType sType;
1668 DE_NULL, //const void* pNext;
1669 0u, //deUint32 waitSemaphoreCount;
1670 DE_NULL, //const VkSemaphore* pWaitSemaphores;
1671 0u, //deUint32 bufferBindCount;
1672 DE_NULL, //const VkSparseBufferMemoryBindInfo* pBufferBinds;
1673 0u, //deUint32 imageOpaqueBindCount;
1674 DE_NULL, //const VkSparseImageOpaqueMemoryBindInfo* pImageOpaqueBinds;
1675 0u, //deUint32 imageBindCount;
1676 DE_NULL, //const VkSparseImageMemoryBindInfo* pImageBinds;
1677 1u, //deUint32 signalSemaphoreCount;
1678 &imageMemoryBindSemaphore.get() //const VkSemaphore* pSignalSemaphores;
1681 VkSparseImageMemoryBindInfo imageResidencyBindInfo;
1682 VkSparseImageOpaqueMemoryBindInfo imageMipTailBindInfo;
1684 if (imageResidencyMemoryBinds.size() > 0)
1686 imageResidencyBindInfo.image = sparseImage;
1687 imageResidencyBindInfo.bindCount = static_cast<deUint32>(imageResidencyMemoryBinds.size());
1688 imageResidencyBindInfo.pBinds = &imageResidencyMemoryBinds[0];
1690 bindSparseInfo.imageBindCount = 1u;
1691 bindSparseInfo.pImageBinds = &imageResidencyBindInfo;
1694 if (imageMipTailMemoryBinds.size() > 0)
1696 imageMipTailBindInfo.image = sparseImage;
1697 imageMipTailBindInfo.bindCount = static_cast<deUint32>(imageMipTailMemoryBinds.size());
1698 imageMipTailBindInfo.pBinds = &imageMipTailMemoryBinds[0];
1700 bindSparseInfo.imageOpaqueBindCount = 1u;
1701 bindSparseInfo.pImageOpaqueBinds = &imageMipTailBindInfo;
1704 VK_CHECK(vk.queueBindSparse(queue, 1u, &bindSparseInfo, DE_NULL));
1707 Move<VkCommandPool> cmdPool;
1708 Move<VkCommandBuffer> cmdBuffer;
1709 // Create command pool
1711 const VkCommandPoolCreateInfo cmdPoolParams =
1713 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
1714 DE_NULL, // const void* pNext;
1715 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCommandPoolCreateFlags flags;
1716 queueFamilyIndex, // deUint32 queueFamilyIndex;
1719 cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
1723 // Create command buffer
1724 const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
1726 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
1727 DE_NULL, // const void* pNext;
1728 *cmdPool, // VkCommandPool commandPool;
1729 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCommandBufferLevel level;
1730 1u, // deUint32 bufferCount;
1733 cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
1736 // Create source buffer
1737 const VkBufferCreateInfo bufferParams =
1739 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
1740 DE_NULL, // const void* pNext;
1741 0u, // VkBufferCreateFlags flags;
1742 bufferSize, // VkDeviceSize size;
1743 VK_BUFFER_USAGE_TRANSFER_SRC_BIT, // VkBufferUsageFlags usage;
1744 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
1745 0u, // deUint32 queueFamilyIndexCount;
1746 DE_NULL, // const deUint32* pQueueFamilyIndices;
1749 Move<VkBuffer> buffer = createBuffer(vk, vkDevice, &bufferParams);
1750 de::MovePtr<Allocation> bufferAlloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), MemoryRequirement::HostVisible);
1751 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
1753 // Barriers for copying buffer to image
1754 const VkBufferMemoryBarrier preBufferBarrier =
1756 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
1757 DE_NULL, // const void* pNext;
1758 VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask;
1759 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
1760 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1761 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1762 *buffer, // VkBuffer buffer;
1763 0u, // VkDeviceSize offset;
1764 bufferSize // VkDeviceSize size;
1767 const VkImageMemoryBarrier preImageBarrier =
1769 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1770 DE_NULL, // const void* pNext;
1771 0u, // VkAccessFlags srcAccessMask;
1772 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAccessMask;
1773 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
1774 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout;
1775 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1776 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1777 sparseImage, // VkImage image;
1778 { // VkImageSubresourceRange subresourceRange;
1779 aspectMask, // VkImageAspect aspect;
1780 0u, // deUint32 baseMipLevel;
1781 mipLevels, // deUint32 mipLevels;
1782 0u, // deUint32 baseArraySlice;
1783 arrayLayers // deUint32 arraySize;
1787 const VkImageMemoryBarrier postImageBarrier =
1789 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
1790 DE_NULL, // const void* pNext;
1791 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
1792 VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask;
1793 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout;
1794 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout;
1795 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
1796 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
1797 sparseImage, // VkImage image;
1798 { // VkImageSubresourceRange subresourceRange;
1799 aspectMask, // VkImageAspect aspect;
1800 0u, // deUint32 baseMipLevel;
1801 mipLevels, // deUint32 mipLevels;
1802 0u, // deUint32 baseArraySlice;
1803 arrayLayers // deUint32 arraySize;
1807 const VkCommandBufferBeginInfo cmdBufferBeginInfo =
1809 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
1810 DE_NULL, // const void* pNext;
1811 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, // VkCommandBufferUsageFlags flags;
1812 (const VkCommandBufferInheritanceInfo*)DE_NULL,
1815 std::vector<VkBufferImageCopy> copyRegions;
1816 // Get copy regions and write buffer data
1818 deUint32 layerDataOffset = 0;
1819 deUint8* destPtr = (deUint8*)bufferAlloc->getHostPtr();
1821 for (size_t levelNdx = 0; levelNdx < textureData.size(); levelNdx++)
1823 const TextureLayerData& layerData = textureData[levelNdx];
1825 for (size_t layerNdx = 0; layerNdx < layerData.size(); layerNdx++)
1827 layerDataOffset = getNextMultiple(offsetMultiples, layerDataOffset);
1829 const tcu::ConstPixelBufferAccess& access = layerData[layerNdx];
1830 const tcu::PixelBufferAccess destAccess (access.getFormat(), access.getSize(), destPtr + layerDataOffset);
1832 const VkBufferImageCopy layerRegion =
1834 layerDataOffset, // VkDeviceSize bufferOffset;
1835 (deUint32)access.getWidth(), // deUint32 bufferRowLength;
1836 (deUint32)access.getHeight(), // deUint32 bufferImageHeight;
1837 { // VkImageSubresourceLayers imageSubresource;
1838 aspectMask, // VkImageAspectFlags aspectMask;
1839 (deUint32)levelNdx, // uint32_t mipLevel;
1840 (deUint32)layerNdx, // uint32_t baseArrayLayer;
1841 1u // uint32_t layerCount;
1843 { 0u, 0u, 0u }, // VkOffset3D imageOffset;
1844 { // VkExtent3D imageExtent;
1845 (deUint32)access.getWidth(),
1846 (deUint32)access.getHeight(),
1847 (deUint32)access.getDepth()
1851 copyRegions.push_back(layerRegion);
1852 tcu::copy(destAccess, access);
1854 layerDataOffset += access.getWidth() * access.getHeight() * access.getDepth() * access.getFormat().getPixelSize();
1859 // Copy buffer to image
1860 VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
1861 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &preBufferBarrier, 1, &preImageBarrier);
1862 vk.cmdCopyBufferToImage(*cmdBuffer, *buffer, sparseImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)copyRegions.size(), copyRegions.data());
1863 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
1864 VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
1866 const VkPipelineStageFlags pipelineStageFlags = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
1868 const VkSubmitInfo submitInfo =
1870 VK_STRUCTURE_TYPE_SUBMIT_INFO, // VkStructureType sType;
1871 DE_NULL, // const void* pNext;
1872 1u, // deUint32 waitSemaphoreCount;
1873 &imageMemoryBindSemaphore.get(), // const VkSemaphore* pWaitSemaphores;
1874 &pipelineStageFlags, // const VkPipelineStageFlags* pWaitDstStageMask;
1875 1u, // deUint32 commandBufferCount;
1876 &cmdBuffer.get(), // const VkCommandBuffer* pCommandBuffers;
1877 0u, // deUint32 signalSemaphoreCount;
1878 DE_NULL // const VkSemaphore* pSignalSemaphores;
1881 const VkFenceCreateInfo fenceParams =
1883 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
1884 DE_NULL, // const void* pNext;
1885 0u // VkFenceCreateFlags flags;
1888 Move<VkFence> fence = createFence(vk, vkDevice, &fenceParams);
1892 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
1893 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity */));
1897 VK_CHECK(vk.deviceWaitIdle(vkDevice));
1902 void ShaderRenderCaseInstance::useSampler (deUint32 bindingLocation, deUint32 textureId)
1904 DE_ASSERT(textureId < m_textures.size());
1906 const TextureBinding& textureBinding = *m_textures[textureId];
1907 const TextureBinding::Type textureType = textureBinding.getType();
1908 const tcu::Sampler& refSampler = textureBinding.getSampler();
1909 const TextureBinding::Parameters& textureParams = textureBinding.getParameters();
1910 const bool isMSTexture = textureParams.samples != vk::VK_SAMPLE_COUNT_1_BIT;
1911 deUint32 mipLevels = 1u;
1912 deUint32 arrayLayers = 1u;
1913 tcu::TextureFormat texFormat;
1915 TextureData textureData;
1917 if (textureType == TextureBinding::TYPE_2D)
1919 const tcu::Texture2D& texture = textureBinding.get2D();
1921 texFormat = texture.getFormat();
1922 texSize = tcu::UVec3(texture.getWidth(), texture.getHeight(), 1u);
1923 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
1926 textureData.resize(mipLevels);
1928 for (deUint32 level = 0; level < mipLevels; ++level)
1930 if (texture.isLevelEmpty(level))
1933 textureData[level].push_back(texture.getLevel(level));
1936 else if (textureType == TextureBinding::TYPE_CUBE_MAP)
1938 const tcu::TextureCube& texture = textureBinding.getCube();
1940 texFormat = texture.getFormat();
1941 texSize = tcu::UVec3(texture.getSize(), texture.getSize(), 1u);
1942 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
1945 static const tcu::CubeFace cubeFaceMapping[tcu::CUBEFACE_LAST] =
1947 tcu::CUBEFACE_POSITIVE_X,
1948 tcu::CUBEFACE_NEGATIVE_X,
1949 tcu::CUBEFACE_POSITIVE_Y,
1950 tcu::CUBEFACE_NEGATIVE_Y,
1951 tcu::CUBEFACE_POSITIVE_Z,
1952 tcu::CUBEFACE_NEGATIVE_Z
1955 textureData.resize(mipLevels);
1957 for (deUint32 level = 0; level < mipLevels; ++level)
1959 for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx)
1961 tcu::CubeFace face = cubeFaceMapping[faceNdx];
1963 if (texture.isLevelEmpty(face, level))
1966 textureData[level].push_back(texture.getLevelFace(level, face));
1970 else if (textureType == TextureBinding::TYPE_2D_ARRAY)
1972 const tcu::Texture2DArray& texture = textureBinding.get2DArray();
1974 texFormat = texture.getFormat();
1975 texSize = tcu::UVec3(texture.getWidth(), texture.getHeight(), 1u);
1976 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
1977 arrayLayers = (deUint32)texture.getNumLayers();
1979 textureData.resize(mipLevels);
1981 for (deUint32 level = 0; level < mipLevels; ++level)
1983 if (texture.isLevelEmpty(level))
1986 const tcu::ConstPixelBufferAccess& levelLayers = texture.getLevel(level);
1987 const deUint32 layerSize = levelLayers.getWidth() * levelLayers.getHeight() * levelLayers.getFormat().getPixelSize();
1989 for (deUint32 layer = 0; layer < arrayLayers; ++layer)
1991 const deUint32 layerOffset = layerSize * layer;
1992 tcu::ConstPixelBufferAccess layerData (levelLayers.getFormat(), levelLayers.getWidth(), levelLayers.getHeight(), 1, (deUint8*)levelLayers.getDataPtr() + layerOffset);
1993 textureData[level].push_back(layerData);
1997 else if (textureType == TextureBinding::TYPE_3D)
1999 const tcu::Texture3D& texture = textureBinding.get3D();
2001 texFormat = texture.getFormat();
2002 texSize = tcu::UVec3(texture.getWidth(), texture.getHeight(), texture.getDepth());
2003 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
2006 textureData.resize(mipLevels);
2008 for (deUint32 level = 0; level < mipLevels; ++level)
2010 if (texture.isLevelEmpty(level))
2013 textureData[level].push_back(texture.getLevel(level));
2016 else if (textureType == TextureBinding::TYPE_1D)
2018 const tcu::Texture1D& texture = textureBinding.get1D();
2020 texFormat = texture.getFormat();
2021 texSize = tcu::UVec3(texture.getWidth(), 1, 1);
2022 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
2025 textureData.resize(mipLevels);
2027 for (deUint32 level = 0; level < mipLevels; ++level)
2029 if (texture.isLevelEmpty(level))
2032 textureData[level].push_back(texture.getLevel(level));
2035 else if (textureType == TextureBinding::TYPE_1D_ARRAY)
2037 const tcu::Texture1DArray& texture = textureBinding.get1DArray();
2039 texFormat = texture.getFormat();
2040 texSize = tcu::UVec3(texture.getWidth(), 1, 1);
2041 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
2042 arrayLayers = (deUint32)texture.getNumLayers();
2044 textureData.resize(mipLevels);
2046 for (deUint32 level = 0; level < mipLevels; ++level)
2048 if (texture.isLevelEmpty(level))
2051 const tcu::ConstPixelBufferAccess& levelLayers = texture.getLevel(level);
2052 const deUint32 layerSize = levelLayers.getWidth() * levelLayers.getFormat().getPixelSize();
2054 for (deUint32 layer = 0; layer < arrayLayers; ++layer)
2056 const deUint32 layerOffset = layerSize * layer;
2057 tcu::ConstPixelBufferAccess layerData (levelLayers.getFormat(), levelLayers.getWidth(), 1, 1, (deUint8*)levelLayers.getDataPtr() + layerOffset);
2058 textureData[level].push_back(layerData);
2062 else if (textureType == TextureBinding::TYPE_CUBE_ARRAY)
2064 const tcu::TextureCubeArray& texture = textureBinding.getCubeArray();
2065 texFormat = texture.getFormat();
2066 texSize = tcu::UVec3(texture.getSize(), texture.getSize(), 1);
2067 mipLevels = isMSTexture ? 1u : (deUint32)texture.getNumLevels();
2068 arrayLayers = texture.getDepth();
2070 textureData.resize(mipLevels);
2072 for (deUint32 level = 0; level < mipLevels; ++level)
2074 if (texture.isLevelEmpty(level))
2077 const tcu::ConstPixelBufferAccess& levelLayers = texture.getLevel(level);
2078 const deUint32 layerSize = levelLayers.getWidth() * levelLayers.getHeight() * levelLayers.getFormat().getPixelSize();
2080 for (deUint32 layer = 0; layer < arrayLayers; ++layer)
2082 const deUint32 layerOffset = layerSize * layer;
2083 tcu::ConstPixelBufferAccess layerData (levelLayers.getFormat(), levelLayers.getWidth(), levelLayers.getHeight(), 1, (deUint8*)levelLayers.getDataPtr() + layerOffset);
2084 textureData[level].push_back(layerData);
2090 TCU_THROW(InternalError, "Invalid texture type");
2093 createSamplerUniform(bindingLocation, textureType, textureBinding.getParameters().initialization, texFormat, texSize, textureData, refSampler, mipLevels, arrayLayers, textureParams);
2096 void ShaderRenderCaseInstance::setPushConstantRanges (const deUint32 rangeCount, const vk::VkPushConstantRange* const pcRanges)
2098 m_pushConstantRanges.clear();
2099 for (deUint32 i = 0; i < rangeCount; ++i)
2101 m_pushConstantRanges.push_back(pcRanges[i]);
2105 void ShaderRenderCaseInstance::updatePushConstants (vk::VkCommandBuffer, vk::VkPipelineLayout)
2109 void ShaderRenderCaseInstance::createSamplerUniform (deUint32 bindingLocation,
2110 TextureBinding::Type textureType,
2111 TextureBinding::Init textureInit,
2112 const tcu::TextureFormat& texFormat,
2113 const tcu::UVec3 texSize,
2114 const TextureData& textureData,
2115 const tcu::Sampler& refSampler,
2117 deUint32 arrayLayers,
2118 TextureBinding::Parameters textureParams)
2120 const VkDevice vkDevice = getDevice();
2121 const DeviceInterface& vk = getDeviceInterface();
2122 const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
2124 const bool isShadowSampler = refSampler.compare != tcu::Sampler::COMPAREMODE_NONE;
2125 const VkImageAspectFlags aspectMask = isShadowSampler ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
2126 const VkImageViewType imageViewType = textureTypeToImageViewType(textureType);
2127 const VkImageType imageType = viewTypeToImageType(imageViewType);
2128 const VkFormat format = mapTextureFormat(texFormat);
2129 const bool isCube = imageViewType == VK_IMAGE_VIEW_TYPE_CUBE || imageViewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
2130 VkImageCreateFlags imageCreateFlags = isCube ? (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : (VkImageCreateFlags)0;
2131 VkImageUsageFlags imageUsageFlags = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2132 Move<VkImage> vkTexture;
2133 de::MovePtr<Allocation> allocation;
2135 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
2137 checkSparseSupport(imageType);
2138 imageCreateFlags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT;
2142 const VkImageCreateInfo imageParams =
2144 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
2145 DE_NULL, // const void* pNext;
2146 imageCreateFlags, // VkImageCreateFlags flags;
2147 imageType, // VkImageType imageType;
2148 format, // VkFormat format;
2149 { // VkExtent3D extent;
2154 mipLevels, // deUint32 mipLevels;
2155 arrayLayers, // deUint32 arrayLayers;
2156 textureParams.samples, // VkSampleCountFlagBits samples;
2157 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
2158 imageUsageFlags, // VkImageUsageFlags usage;
2159 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
2160 1u, // deUint32 queueFamilyIndexCount;
2161 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
2162 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
2165 vkTexture = createImage(vk, vkDevice, &imageParams);
2166 allocation = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *vkTexture), MemoryRequirement::Any);
2168 if (m_imageBackingMode != IMAGE_BACKING_MODE_SPARSE)
2170 VK_CHECK(vk.bindImageMemory(vkDevice, *vkTexture, allocation->getMemory(), allocation->getOffset()));
2173 switch (textureInit)
2175 case TextureBinding::INIT_UPLOAD_DATA:
2177 // upload*Image functions use cmdCopyBufferToImage, which is invalid for multisample images
2178 DE_ASSERT(textureParams.samples == VK_SAMPLE_COUNT_1_BIT);
2180 if (m_imageBackingMode == IMAGE_BACKING_MODE_SPARSE)
2182 uploadSparseImage(texFormat, textureData, refSampler, mipLevels, arrayLayers, *vkTexture, imageParams, texSize);
2186 // Upload texture data
2187 uploadImage(texFormat, textureData, refSampler, mipLevels, arrayLayers, *vkTexture);
2191 case TextureBinding::INIT_CLEAR:
2192 clearImage(refSampler, mipLevels, arrayLayers, *vkTexture);
2195 DE_FATAL("Impossible");
2199 const VkSamplerCreateInfo samplerParams = mapSampler(refSampler, texFormat);
2200 Move<VkSampler> sampler = createSampler(vk, vkDevice, &samplerParams);
2201 const deUint32 baseMipLevel = textureParams.baseMipLevel;
2202 const vk::VkComponentMapping components = textureParams.componentMapping;
2203 const VkImageViewCreateInfo viewParams =
2205 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
2206 NULL, // const voide* pNext;
2207 0u, // VkImageViewCreateFlags flags;
2208 *vkTexture, // VkImage image;
2209 imageViewType, // VkImageViewType viewType;
2210 format, // VkFormat format;
2211 components, // VkChannelMapping channels;
2213 aspectMask, // VkImageAspectFlags aspectMask;
2214 baseMipLevel, // deUint32 baseMipLevel;
2215 mipLevels - baseMipLevel, // deUint32 mipLevels;
2216 0, // deUint32 baseArraySlice;
2217 arrayLayers // deUint32 arraySize;
2218 }, // VkImageSubresourceRange subresourceRange;
2221 Move<VkImageView> imageView = createImageView(vk, vkDevice, &viewParams);
2223 const vk::VkDescriptorImageInfo descriptor =
2225 sampler.get(), // VkSampler sampler;
2226 imageView.get(), // VkImageView imageView;
2227 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout imageLayout;
2230 de::MovePtr<SamplerUniform> uniform(new SamplerUniform());
2231 uniform->type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
2232 uniform->descriptor = descriptor;
2233 uniform->location = bindingLocation;
2234 uniform->image = VkImageSp(new vk::Unique<VkImage>(vkTexture));
2235 uniform->imageView = VkImageViewSp(new vk::Unique<VkImageView>(imageView));
2236 uniform->sampler = VkSamplerSp(new vk::Unique<VkSampler>(sampler));
2237 uniform->alloc = AllocationSp(allocation.release());
2239 m_descriptorSetLayoutBuilder->addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, vk::VK_SHADER_STAGE_ALL, DE_NULL);
2240 m_descriptorPoolBuilder->addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
2242 m_uniformInfos.push_back(UniformInfoSp(new de::UniquePtr<UniformInfo>(uniform)));
2245 void ShaderRenderCaseInstance::setupDefaultInputs (void)
2247 /* Configuration of the vertex input attributes:
2248 a_position is at location 0
2249 a_coords is at location 1
2250 a_unitCoords is at location 2
2251 a_one is at location 3
2253 User attributes starts from at the location 4.
2256 DE_ASSERT(m_quadGrid);
2257 const QuadGrid& quadGrid = *m_quadGrid;
2259 addAttribute(0u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getPositions());
2260 addAttribute(1u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getCoords());
2261 addAttribute(2u, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getUnitCoords());
2262 addAttribute(3u, VK_FORMAT_R32_SFLOAT, sizeof(float), quadGrid.getNumVertices(), quadGrid.getAttribOne());
2266 BaseAttributeType type;
2268 } userAttributes[] =
2278 BaseAttributeType matrixType;
2294 for (size_t attrNdx = 0; attrNdx < m_enabledBaseAttributes.size(); attrNdx++)
2296 for (int userNdx = 0; userNdx < DE_LENGTH_OF_ARRAY(userAttributes); userNdx++)
2298 if (userAttributes[userNdx].type != m_enabledBaseAttributes[attrNdx].type)
2301 addAttribute(m_enabledBaseAttributes[attrNdx].location, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(tcu::Vec4), quadGrid.getNumVertices(), quadGrid.getUserAttrib(userNdx));
2304 for (int matNdx = 0; matNdx < DE_LENGTH_OF_ARRAY(matrices); matNdx++)
2307 if (matrices[matNdx].matrixType != m_enabledBaseAttributes[attrNdx].type)
2310 const int numCols = matrices[matNdx].numCols;
2312 for (int colNdx = 0; colNdx < numCols; colNdx++)
2314 addAttribute(m_enabledBaseAttributes[attrNdx].location + colNdx, VK_FORMAT_R32G32B32A32_SFLOAT, (deUint32)(4 * sizeof(float)), quadGrid.getNumVertices(), quadGrid.getUserAttrib(colNdx));
2320 void ShaderRenderCaseInstance::render (deUint32 numVertices,
2321 deUint32 numTriangles,
2322 const deUint16* indices,
2323 const tcu::Vec4& constCoords)
2325 render(numVertices, numTriangles * 3, indices, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, constCoords);
2328 void ShaderRenderCaseInstance::render (deUint32 numVertices,
2329 deUint32 numIndices,
2330 const deUint16* indices,
2331 VkPrimitiveTopology topology,
2332 const tcu::Vec4& constCoords)
2334 const VkDevice vkDevice = getDevice();
2335 const DeviceInterface& vk = getDeviceInterface();
2336 const VkQueue queue = getUniversalQueue();
2337 const deUint32 queueFamilyIndex = getUniversalQueueFamilyIndex();
2339 vk::Move<vk::VkImage> colorImage;
2340 de::MovePtr<vk::Allocation> colorImageAlloc;
2341 vk::Move<vk::VkImageView> colorImageView;
2342 vk::Move<vk::VkImage> resolvedImage;
2343 de::MovePtr<vk::Allocation> resolvedImageAlloc;
2344 vk::Move<vk::VkImageView> resolvedImageView;
2345 vk::Move<vk::VkRenderPass> renderPass;
2346 vk::Move<vk::VkFramebuffer> framebuffer;
2347 vk::Move<vk::VkPipelineLayout> pipelineLayout;
2348 vk::Move<vk::VkPipeline> graphicsPipeline;
2349 vk::Move<vk::VkShaderModule> vertexShaderModule;
2350 vk::Move<vk::VkShaderModule> fragmentShaderModule;
2351 vk::Move<vk::VkBuffer> indexBuffer;
2352 de::MovePtr<vk::Allocation> indexBufferAlloc;
2353 vk::Move<vk::VkDescriptorSetLayout> descriptorSetLayout;
2354 vk::Move<vk::VkDescriptorPool> descriptorPool;
2355 vk::Move<vk::VkDescriptorSet> descriptorSet;
2356 vk::Move<vk::VkCommandPool> cmdPool;
2357 vk::Move<vk::VkCommandBuffer> cmdBuffer;
2358 vk::Move<vk::VkFence> fence;
2360 // Create color image
2362 const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
2363 VkImageFormatProperties properties;
2365 if ((getInstanceInterface().getPhysicalDeviceImageFormatProperties(getPhysicalDevice(),
2368 VK_IMAGE_TILING_OPTIMAL,
2371 &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
2373 TCU_THROW(NotSupportedError, "Format not supported");
2376 if ((properties.sampleCounts & m_sampleCount) != m_sampleCount)
2378 TCU_THROW(NotSupportedError, "Format not supported");
2381 const VkImageCreateInfo colorImageParams =
2383 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
2384 DE_NULL, // const void* pNext;
2385 0u, // VkImageCreateFlags flags;
2386 VK_IMAGE_TYPE_2D, // VkImageType imageType;
2387 m_colorFormat, // VkFormat format;
2388 { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent;
2389 1u, // deUint32 mipLevels;
2390 1u, // deUint32 arraySize;
2391 m_sampleCount, // deUint32 samples;
2392 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
2393 imageUsage, // VkImageUsageFlags usage;
2394 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
2395 1u, // deUint32 queueFamilyCount;
2396 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
2397 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
2400 colorImage = createImage(vk, vkDevice, &colorImageParams);
2402 // Allocate and bind color image memory
2403 colorImageAlloc = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *colorImage), MemoryRequirement::Any);
2404 VK_CHECK(vk.bindImageMemory(vkDevice, *colorImage, colorImageAlloc->getMemory(), colorImageAlloc->getOffset()));
2407 // Create color attachment view
2409 const VkImageViewCreateInfo colorImageViewParams =
2411 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
2412 DE_NULL, // const void* pNext;
2413 0u, // VkImageViewCreateFlags flags;
2414 *colorImage, // VkImage image;
2415 VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
2416 m_colorFormat, // VkFormat format;
2418 VK_COMPONENT_SWIZZLE_R, // VkChannelSwizzle r;
2419 VK_COMPONENT_SWIZZLE_G, // VkChannelSwizzle g;
2420 VK_COMPONENT_SWIZZLE_B, // VkChannelSwizzle b;
2421 VK_COMPONENT_SWIZZLE_A // VkChannelSwizzle a;
2422 }, // VkChannelMapping channels;
2424 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
2425 0, // deUint32 baseMipLevel;
2426 1, // deUint32 mipLevels;
2427 0, // deUint32 baseArraySlice;
2428 1 // deUint32 arraySize;
2429 }, // VkImageSubresourceRange subresourceRange;
2432 colorImageView = createImageView(vk, vkDevice, &colorImageViewParams);
2435 if (isMultiSampling())
2439 const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2440 VkImageFormatProperties properties;
2442 if ((getInstanceInterface().getPhysicalDeviceImageFormatProperties(getPhysicalDevice(),
2445 VK_IMAGE_TILING_OPTIMAL,
2448 &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
2450 TCU_THROW(NotSupportedError, "Format not supported");
2453 const VkImageCreateInfo imageCreateInfo =
2455 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
2456 DE_NULL, // const void* pNext;
2457 0u, // VkImageCreateFlags flags;
2458 VK_IMAGE_TYPE_2D, // VkImageType imageType;
2459 m_colorFormat, // VkFormat format;
2460 { m_renderSize.x(), m_renderSize.y(), 1u }, // VkExtent3D extent;
2461 1u, // deUint32 mipLevels;
2462 1u, // deUint32 arrayLayers;
2463 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
2464 VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling;
2465 imageUsage, // VkImageUsageFlags usage;
2466 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
2467 1u, // deUint32 queueFamilyIndexCount;
2468 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
2469 VK_IMAGE_LAYOUT_UNDEFINED // VkImageLayout initialLayout;
2472 resolvedImage = vk::createImage(vk, vkDevice, &imageCreateInfo, DE_NULL);
2473 resolvedImageAlloc = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *resolvedImage), MemoryRequirement::Any);
2474 VK_CHECK(vk.bindImageMemory(vkDevice, *resolvedImage, resolvedImageAlloc->getMemory(), resolvedImageAlloc->getOffset()));
2477 // Resolved Image View
2479 const VkImageViewCreateInfo imageViewCreateInfo =
2481 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // VkStructureType sType;
2482 DE_NULL, // const void* pNext;
2483 0u, // VkImageViewCreateFlags flags;
2484 *resolvedImage, // VkImage image;
2485 VK_IMAGE_VIEW_TYPE_2D, // VkImageViewType viewType;
2486 m_colorFormat, // VkFormat format;
2488 VK_COMPONENT_SWIZZLE_R, // VkChannelSwizzle r;
2489 VK_COMPONENT_SWIZZLE_G, // VkChannelSwizzle g;
2490 VK_COMPONENT_SWIZZLE_B, // VkChannelSwizzle b;
2491 VK_COMPONENT_SWIZZLE_A // VkChannelSwizzle a;
2494 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
2495 0u, // deUint32 baseMipLevel;
2496 1u, // deUint32 mipLevels;
2497 0u, // deUint32 baseArrayLayer;
2498 1u, // deUint32 arraySize;
2499 }, // VkImageSubresourceRange subresourceRange;
2502 resolvedImageView = vk::createImageView(vk, vkDevice, &imageViewCreateInfo, DE_NULL);
2506 // Create render pass
2508 const VkAttachmentDescription attachmentDescription[] =
2511 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
2512 m_colorFormat, // VkFormat format;
2513 m_sampleCount, // deUint32 samples;
2514 VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp;
2515 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
2516 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
2517 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
2518 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout;
2519 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
2522 (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags;
2523 m_colorFormat, // VkFormat format;
2524 VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples;
2525 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp loadOp;
2526 VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp;
2527 VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp;
2528 VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp;
2529 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout initialLayout;
2530 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout;
2534 const VkAttachmentReference attachmentReference =
2536 0u, // deUint32 attachment;
2537 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
2540 const VkAttachmentReference resolveAttachmentRef =
2542 1u, // deUint32 attachment;
2543 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout;
2546 const VkSubpassDescription subpassDescription =
2548 0u, // VkSubpassDescriptionFlags flags;
2549 VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint;
2550 0u, // deUint32 inputCount;
2551 DE_NULL, // constVkAttachmentReference* pInputAttachments;
2552 1u, // deUint32 colorCount;
2553 &attachmentReference, // constVkAttachmentReference* pColorAttachments;
2554 isMultiSampling() ? &resolveAttachmentRef : DE_NULL,// constVkAttachmentReference* pResolveAttachments;
2555 DE_NULL, // VkAttachmentReference depthStencilAttachment;
2556 0u, // deUint32 preserveCount;
2557 DE_NULL // constVkAttachmentReference* pPreserveAttachments;
2560 const VkRenderPassCreateInfo renderPassParams =
2562 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType;
2563 DE_NULL, // const void* pNext;
2564 0u, // VkRenderPassCreateFlags flags;
2565 isMultiSampling() ? 2u : 1u, // deUint32 attachmentCount;
2566 attachmentDescription, // const VkAttachmentDescription* pAttachments;
2567 1u, // deUint32 subpassCount;
2568 &subpassDescription, // const VkSubpassDescription* pSubpasses;
2569 0u, // deUint32 dependencyCount;
2570 DE_NULL // const VkSubpassDependency* pDependencies;
2573 renderPass = createRenderPass(vk, vkDevice, &renderPassParams);
2576 // Create framebuffer
2578 const VkImageView attachments[] =
2584 const VkFramebufferCreateInfo framebufferParams =
2586 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, // VkStructureType sType;
2587 DE_NULL, // const void* pNext;
2588 (VkFramebufferCreateFlags)0,
2589 *renderPass, // VkRenderPass renderPass;
2590 isMultiSampling() ? 2u : 1u, // deUint32 attachmentCount;
2591 attachments, // const VkImageView* pAttachments;
2592 (deUint32)m_renderSize.x(), // deUint32 width;
2593 (deUint32)m_renderSize.y(), // deUint32 height;
2594 1u // deUint32 layers;
2597 framebuffer = createFramebuffer(vk, vkDevice, &framebufferParams);
2600 // Create descriptors
2602 setupUniforms(constCoords);
2604 descriptorSetLayout = m_descriptorSetLayoutBuilder->build(vk, vkDevice);
2605 if (!m_uniformInfos.empty())
2607 descriptorPool = m_descriptorPoolBuilder->build(vk, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
2608 const VkDescriptorSetAllocateInfo allocInfo =
2610 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2614 &descriptorSetLayout.get(),
2617 descriptorSet = allocateDescriptorSet(vk, vkDevice, &allocInfo);
2620 for (deUint32 i = 0; i < m_uniformInfos.size(); i++)
2622 const UniformInfo* uniformInfo = m_uniformInfos[i].get()->get();
2623 deUint32 location = uniformInfo->location;
2625 if (uniformInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER)
2627 const BufferUniform* bufferInfo = dynamic_cast<const BufferUniform*>(uniformInfo);
2629 m_descriptorSetUpdateBuilder->writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), uniformInfo->type, &bufferInfo->descriptor);
2631 else if (uniformInfo->type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
2633 const SamplerUniform* samplerInfo = dynamic_cast<const SamplerUniform*>(uniformInfo);
2635 m_descriptorSetUpdateBuilder->writeSingle(*descriptorSet, DescriptorSetUpdateBuilder::Location::binding(location), uniformInfo->type, &samplerInfo->descriptor);
2638 DE_FATAL("Impossible");
2641 m_descriptorSetUpdateBuilder->update(vk, vkDevice);
2644 // Create pipeline layout
2646 const VkPushConstantRange* const pcRanges = m_pushConstantRanges.empty() ? DE_NULL : &m_pushConstantRanges[0];
2647 const VkPipelineLayoutCreateInfo pipelineLayoutParams =
2649 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // VkStructureType sType;
2650 DE_NULL, // const void* pNext;
2651 (VkPipelineLayoutCreateFlags)0,
2652 1u, // deUint32 descriptorSetCount;
2653 &*descriptorSetLayout, // const VkDescriptorSetLayout* pSetLayouts;
2654 deUint32(m_pushConstantRanges.size()), // deUint32 pushConstantRangeCount;
2655 pcRanges // const VkPushConstantRange* pPushConstantRanges;
2658 pipelineLayout = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
2663 vertexShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get(m_vertexShaderName), 0);
2664 fragmentShaderModule = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get(m_fragmentShaderName), 0);
2669 const VkPipelineShaderStageCreateInfo shaderStageParams[2] =
2672 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
2673 DE_NULL, // const void* pNext;
2674 (VkPipelineShaderStageCreateFlags)0,
2675 VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStage stage;
2676 *vertexShaderModule, // VkShader shader;
2678 DE_NULL // const VkSpecializationInfo* pSpecializationInfo;
2681 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType;
2682 DE_NULL, // const void* pNext;
2683 (VkPipelineShaderStageCreateFlags)0,
2684 VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStage stage;
2685 *fragmentShaderModule, // VkShader shader;
2687 DE_NULL // const VkSpecializationInfo* pSpecializationInfo;
2691 // Add test case specific attributes
2693 m_attribFunc(*this, numVertices);
2695 // Add base attributes
2696 setupDefaultInputs();
2698 const VkPipelineVertexInputStateCreateInfo vertexInputStateParams =
2700 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType;
2701 DE_NULL, // const void* pNext;
2702 (VkPipelineVertexInputStateCreateFlags)0,
2703 (deUint32)m_vertexBindingDescription.size(), // deUint32 bindingCount;
2704 &m_vertexBindingDescription[0], // const VkVertexInputBindingDescription* pVertexBindingDescriptions;
2705 (deUint32)m_vertexAttributeDescription.size(), // deUint32 attributeCount;
2706 &m_vertexAttributeDescription[0], // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions;
2709 const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateParams =
2711 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType;
2712 DE_NULL, // const void* pNext;
2713 (VkPipelineInputAssemblyStateCreateFlags)0,
2714 topology, // VkPrimitiveTopology topology;
2715 false // VkBool32 primitiveRestartEnable;
2718 const VkViewport viewport =
2720 0.0f, // float originX;
2721 0.0f, // float originY;
2722 (float)m_renderSize.x(), // float width;
2723 (float)m_renderSize.y(), // float height;
2724 0.0f, // float minDepth;
2725 1.0f // float maxDepth;
2728 const VkRect2D scissor =
2733 }, // VkOffset2D offset;
2735 m_renderSize.x(), // deUint32 width;
2736 m_renderSize.y(), // deUint32 height;
2737 }, // VkExtent2D extent;
2740 const VkPipelineViewportStateCreateInfo viewportStateParams =
2742 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType;
2743 DE_NULL, // const void* pNext;
2744 0u, // VkPipelineViewportStateCreateFlags flags;
2745 1u, // deUint32 viewportCount;
2746 &viewport, // const VkViewport* pViewports;
2747 1u, // deUint32 scissorsCount;
2748 &scissor, // const VkRect2D* pScissors;
2751 const VkPipelineRasterizationStateCreateInfo rasterStateParams =
2753 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType;
2754 DE_NULL, // const void* pNext;
2755 (VkPipelineRasterizationStateCreateFlags)0,
2756 false, // VkBool32 depthClipEnable;
2757 false, // VkBool32 rasterizerDiscardEnable;
2758 VK_POLYGON_MODE_FILL, // VkFillMode fillMode;
2759 VK_CULL_MODE_NONE, // VkCullMode cullMode;
2760 VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace;
2761 false, // VkBool32 depthBiasEnable;
2762 0.0f, // float depthBias;
2763 0.0f, // float depthBiasClamp;
2764 0.0f, // float slopeScaledDepthBias;
2765 1.0f, // float lineWidth;
2768 const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
2770 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType;
2771 DE_NULL, // const void* pNext;
2772 0u, // VkPipelineMultisampleStateCreateFlags flags;
2773 m_sampleCount, // VkSampleCountFlagBits rasterizationSamples;
2774 VK_FALSE, // VkBool32 sampleShadingEnable;
2775 0.0f, // float minSampleShading;
2776 DE_NULL, // const VkSampleMask* pSampleMask;
2777 VK_FALSE, // VkBool32 alphaToCoverageEnable;
2778 VK_FALSE // VkBool32 alphaToOneEnable;
2781 const VkPipelineColorBlendAttachmentState colorBlendAttachmentState =
2783 false, // VkBool32 blendEnable;
2784 VK_BLEND_FACTOR_ONE, // VkBlend srcBlendColor;
2785 VK_BLEND_FACTOR_ZERO, // VkBlend destBlendColor;
2786 VK_BLEND_OP_ADD, // VkBlendOp blendOpColor;
2787 VK_BLEND_FACTOR_ONE, // VkBlend srcBlendAlpha;
2788 VK_BLEND_FACTOR_ZERO, // VkBlend destBlendAlpha;
2789 VK_BLEND_OP_ADD, // VkBlendOp blendOpAlpha;
2790 (VK_COLOR_COMPONENT_R_BIT |
2791 VK_COLOR_COMPONENT_G_BIT |
2792 VK_COLOR_COMPONENT_B_BIT |
2793 VK_COLOR_COMPONENT_A_BIT), // VkChannelFlags channelWriteMask;
2796 const VkPipelineColorBlendStateCreateInfo colorBlendStateParams =
2798 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType;
2799 DE_NULL, // const void* pNext;
2800 (VkPipelineColorBlendStateCreateFlags)0,
2801 false, // VkBool32 logicOpEnable;
2802 VK_LOGIC_OP_COPY, // VkLogicOp logicOp;
2803 1u, // deUint32 attachmentCount;
2804 &colorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments;
2805 { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConst[4];
2808 const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
2810 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType;
2811 DE_NULL, // const void* pNext;
2812 0u, // VkPipelineCreateFlags flags;
2813 2u, // deUint32 stageCount;
2814 shaderStageParams, // const VkPipelineShaderStageCreateInfo* pStages;
2815 &vertexInputStateParams, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState;
2816 &inputAssemblyStateParams, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState;
2817 DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState;
2818 &viewportStateParams, // const VkPipelineViewportStateCreateInfo* pViewportState;
2819 &rasterStateParams, // const VkPipelineRasterStateCreateInfo* pRasterState;
2820 &multisampleStateParams, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState;
2821 DE_NULL, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState;
2822 &colorBlendStateParams, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState;
2823 (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState;
2824 *pipelineLayout, // VkPipelineLayout layout;
2825 *renderPass, // VkRenderPass renderPass;
2826 0u, // deUint32 subpass;
2827 0u, // VkPipeline basePipelineHandle;
2828 0u // deInt32 basePipelineIndex;
2831 graphicsPipeline = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
2834 // Create vertex indices buffer
2835 if (numIndices != 0)
2837 const VkDeviceSize indexBufferSize = numIndices * sizeof(deUint16);
2838 const VkBufferCreateInfo indexBufferParams =
2840 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
2841 DE_NULL, // const void* pNext;
2842 0u, // VkBufferCreateFlags flags;
2843 indexBufferSize, // VkDeviceSize size;
2844 VK_BUFFER_USAGE_INDEX_BUFFER_BIT, // VkBufferUsageFlags usage;
2845 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
2846 1u, // deUint32 queueFamilyCount;
2847 &queueFamilyIndex // const deUint32* pQueueFamilyIndices;
2850 indexBuffer = createBuffer(vk, vkDevice, &indexBufferParams);
2851 indexBufferAlloc = m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *indexBuffer), MemoryRequirement::HostVisible);
2853 VK_CHECK(vk.bindBufferMemory(vkDevice, *indexBuffer, indexBufferAlloc->getMemory(), indexBufferAlloc->getOffset()));
2855 // Load vertice indices into buffer
2856 deMemcpy(indexBufferAlloc->getHostPtr(), indices, (size_t)indexBufferSize);
2857 flushMappedMemoryRange(vk, vkDevice, indexBufferAlloc->getMemory(), indexBufferAlloc->getOffset(), indexBufferSize);
2860 // Create command pool
2862 const VkCommandPoolCreateInfo cmdPoolParams =
2864 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // VkStructureType sType;
2865 DE_NULL, // const void* pNext;
2866 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, // VkCmdPoolCreateFlags flags;
2867 queueFamilyIndex, // deUint32 queueFamilyIndex;
2870 cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
2873 // Create command buffer
2875 const VkCommandBufferAllocateInfo cmdBufferParams =
2877 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
2878 DE_NULL, // const void* pNext;
2879 *cmdPool, // VkCmdPool cmdPool;
2880 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCmdBufferLevel level;
2881 1u // deUint32 bufferCount;
2884 const VkCommandBufferBeginInfo cmdBufferBeginInfo =
2886 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
2887 DE_NULL, // const void* pNext;
2888 0u, // VkCmdBufferOptimizeFlags flags;
2889 (const VkCommandBufferInheritanceInfo*)DE_NULL,
2892 const VkClearValue clearValues = makeClearValueColorF32(m_clearColor.x(),
2897 const VkRenderPassBeginInfo renderPassBeginInfo =
2899 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType;
2900 DE_NULL, // const void* pNext;
2901 *renderPass, // VkRenderPass renderPass;
2902 *framebuffer, // VkFramebuffer framebuffer;
2903 { { 0, 0 }, {m_renderSize.x(), m_renderSize.y() } }, // VkRect2D renderArea;
2904 1, // deUint32 clearValueCount;
2905 &clearValues, // const VkClearValue* pClearValues;
2908 cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferParams);
2910 VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
2913 const VkImageMemoryBarrier imageBarrier =
2915 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
2916 DE_NULL, // const void* pNext;
2917 0u, // VkAccessFlags srcAccessMask;
2918 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask;
2919 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
2920 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
2921 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
2922 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
2923 *colorImage, // VkImage image;
2924 { // VkImageSubresourceRange subresourceRange;
2925 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
2926 0u, // deUint32 baseMipLevel;
2927 1u, // deUint32 mipLevels;
2928 0u, // deUint32 baseArrayLayer;
2929 1u, // deUint32 arraySize;
2933 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, DE_NULL, 1, &imageBarrier);
2935 if (isMultiSampling()) {
2936 // add multisample barrier
2937 const VkImageMemoryBarrier multiSampleImageBarrier =
2939 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
2940 DE_NULL, // const void* pNext;
2941 0u, // VkAccessFlags srcAccessMask;
2942 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask;
2943 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout;
2944 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout;
2945 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
2946 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
2947 *resolvedImage, // VkImage image;
2948 { // VkImageSubresourceRange subresourceRange;
2949 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
2950 0u, // deUint32 baseMipLevel;
2951 1u, // deUint32 mipLevels;
2952 0u, // deUint32 baseArrayLayer;
2953 1u, // deUint32 arraySize;
2957 vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, DE_NULL, 1, &multiSampleImageBarrier);
2961 vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
2962 updatePushConstants(*cmdBuffer, *pipelineLayout);
2963 vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
2964 if (!m_uniformInfos.empty())
2965 vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1, &*descriptorSet, 0u, DE_NULL);
2967 const deUint32 numberOfVertexAttributes = (deUint32)m_vertexBuffers.size();
2968 const std::vector<VkDeviceSize> offsets(numberOfVertexAttributes, 0);
2970 std::vector<VkBuffer> buffers(numberOfVertexAttributes);
2971 for (size_t i = 0; i < numberOfVertexAttributes; i++)
2973 buffers[i] = m_vertexBuffers[i].get()->get();
2976 vk.cmdBindVertexBuffers(*cmdBuffer, 0, numberOfVertexAttributes, &buffers[0], &offsets[0]);
2977 if (numIndices != 0)
2979 vk.cmdBindIndexBuffer(*cmdBuffer, *indexBuffer, 0, VK_INDEX_TYPE_UINT16);
2980 vk.cmdDrawIndexed(*cmdBuffer, numIndices, 1, 0, 0, 0);
2983 vk.cmdDraw(*cmdBuffer, numVertices, 1, 0, 1);
2985 vk.cmdEndRenderPass(*cmdBuffer);
2986 VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
2991 const VkFenceCreateInfo fenceParams =
2993 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, // VkStructureType sType;
2994 DE_NULL, // const void* pNext;
2995 0u // VkFenceCreateFlags flags;
2997 fence = createFence(vk, vkDevice, &fenceParams);
3002 const VkSubmitInfo submitInfo =
3004 VK_STRUCTURE_TYPE_SUBMIT_INFO,
3007 (const VkSemaphore*)DE_NULL,
3008 (const VkPipelineStageFlags*)DE_NULL,
3012 (const VkSemaphore*)DE_NULL,
3015 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
3016 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity*/));
3019 // Read back the result
3021 const tcu::TextureFormat resultFormat = mapVkFormat(m_colorFormat);
3022 const VkDeviceSize imageSizeBytes = (VkDeviceSize)(resultFormat.getPixelSize() * m_renderSize.x() * m_renderSize.y());
3023 const VkBufferCreateInfo readImageBufferParams =
3025 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
3026 DE_NULL, // const void* pNext;
3027 0u, // VkBufferCreateFlags flags;
3028 imageSizeBytes, // VkDeviceSize size;
3029 VK_BUFFER_USAGE_TRANSFER_DST_BIT, // VkBufferUsageFlags usage;
3030 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
3031 1u, // deUint32 queueFamilyCount;
3032 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
3034 const Unique<VkBuffer> readImageBuffer (createBuffer(vk, vkDevice, &readImageBufferParams));
3035 const de::UniquePtr<Allocation> readImageBufferMemory (m_memAlloc.allocate(getBufferMemoryRequirements(vk, vkDevice, *readImageBuffer), MemoryRequirement::HostVisible));
3037 VK_CHECK(vk.bindBufferMemory(vkDevice, *readImageBuffer, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset()));
3039 // Copy image to buffer
3040 const VkCommandBufferAllocateInfo cmdBufferParams =
3042 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType sType;
3043 DE_NULL, // const void* pNext;
3044 *cmdPool, // VkCmdPool cmdPool;
3045 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // VkCmdBufferLevel level;
3046 1u // deUint32 bufferCount;
3049 const VkCommandBufferBeginInfo cmdBufferBeginInfo =
3051 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, // VkStructureType sType;
3052 DE_NULL, // const void* pNext;
3053 0u, // VkCmdBufferOptimizeFlags flags;
3054 (const VkCommandBufferInheritanceInfo*)DE_NULL,
3057 const Move<VkCommandBuffer> resultCmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferParams);
3059 const VkBufferImageCopy copyParams =
3061 0u, // VkDeviceSize bufferOffset;
3062 (deUint32)m_renderSize.x(), // deUint32 bufferRowLength;
3063 (deUint32)m_renderSize.y(), // deUint32 bufferImageHeight;
3065 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspect aspect;
3066 0u, // deUint32 mipLevel;
3067 0u, // deUint32 arraySlice;
3068 1u, // deUint32 arraySize;
3069 }, // VkImageSubresourceCopy imageSubresource;
3070 { 0u, 0u, 0u }, // VkOffset3D imageOffset;
3071 { m_renderSize.x(), m_renderSize.y(), 1u } // VkExtent3D imageExtent;
3073 const VkSubmitInfo submitInfo =
3075 VK_STRUCTURE_TYPE_SUBMIT_INFO,
3078 (const VkSemaphore*)DE_NULL,
3079 (const VkPipelineStageFlags*)DE_NULL,
3081 &resultCmdBuffer.get(),
3083 (const VkSemaphore*)DE_NULL,
3086 VK_CHECK(vk.beginCommandBuffer(*resultCmdBuffer, &cmdBufferBeginInfo));
3088 const VkImageMemoryBarrier imageBarrier =
3090 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
3091 DE_NULL, // const void* pNext;
3092 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask;
3093 VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask;
3094 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout;
3095 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout;
3096 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
3097 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
3098 isMultiSampling() ? *resolvedImage : *colorImage, // VkImage image;
3099 { // VkImageSubresourceRange subresourceRange;
3100 VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask;
3101 0u, // deUint32 baseMipLevel;
3102 1u, // deUint32 mipLevels;
3103 0u, // deUint32 baseArraySlice;
3104 1u // deUint32 arraySize;
3108 const VkBufferMemoryBarrier bufferBarrier =
3110 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
3111 DE_NULL, // const void* pNext;
3112 VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask;
3113 VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask;
3114 VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
3115 VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex;
3116 *readImageBuffer, // VkBuffer buffer;
3117 0u, // VkDeviceSize offset;
3118 imageSizeBytes // VkDeviceSize size;
3121 vk.cmdPipelineBarrier(*resultCmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
3122 vk.cmdCopyImageToBuffer(*resultCmdBuffer, isMultiSampling() ? *resolvedImage : *colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *readImageBuffer, 1u, ©Params);
3123 vk.cmdPipelineBarrier(*resultCmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
3125 VK_CHECK(vk.endCommandBuffer(*resultCmdBuffer));
3127 VK_CHECK(vk.resetFences(vkDevice, 1, &fence.get()));
3128 VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
3129 VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity */));
3131 invalidateMappedMemoryRange(vk, vkDevice, readImageBufferMemory->getMemory(), readImageBufferMemory->getOffset(), imageSizeBytes);
3133 const tcu::ConstPixelBufferAccess resultAccess (resultFormat, m_renderSize.x(), m_renderSize.y(), 1, readImageBufferMemory->getHostPtr());
3135 m_resultImage.setStorage(resultFormat, m_renderSize.x(), m_renderSize.y());
3136 tcu::copy(m_resultImage.getAccess(), resultAccess);
3140 void ShaderRenderCaseInstance::computeVertexReference (tcu::Surface& result, const QuadGrid& quadGrid)
3142 DE_ASSERT(m_evaluator);
3145 const int width = result.getWidth();
3146 const int height = result.getHeight();
3147 const int gridSize = quadGrid.getGridSize();
3148 const int stride = gridSize + 1;
3149 const bool hasAlpha = true; // \todo [2015-09-07 elecro] add correct alpha check
3150 ShaderEvalContext evalCtx (quadGrid);
3152 // Evaluate color for each vertex.
3153 std::vector<tcu::Vec4> colors ((gridSize + 1) * (gridSize + 1));
3154 for (int y = 0; y < gridSize+1; y++)
3155 for (int x = 0; x < gridSize+1; x++)
3157 const float sx = (float)x / (float)gridSize;
3158 const float sy = (float)y / (float)gridSize;
3159 const int vtxNdx = ((y * (gridSize+1)) + x);
3161 evalCtx.reset(sx, sy);
3162 m_evaluator->evaluate(evalCtx);
3163 DE_ASSERT(!evalCtx.isDiscarded); // Discard is not available in vertex shader.
3164 tcu::Vec4 color = evalCtx.color;
3169 colors[vtxNdx] = color;
3173 for (int y = 0; y < gridSize; y++)
3174 for (int x = 0; x < gridSize; x++)
3176 const float x0 = (float)x / (float)gridSize;
3177 const float x1 = (float)(x + 1) / (float)gridSize;
3178 const float y0 = (float)y / (float)gridSize;
3179 const float y1 = (float)(y + 1) / (float)gridSize;
3181 const float sx0 = x0 * (float)width;
3182 const float sx1 = x1 * (float)width;
3183 const float sy0 = y0 * (float)height;
3184 const float sy1 = y1 * (float)height;
3185 const float oosx = 1.0f / (sx1 - sx0);
3186 const float oosy = 1.0f / (sy1 - sy0);
3188 const int ix0 = deCeilFloatToInt32(sx0 - 0.5f);
3189 const int ix1 = deCeilFloatToInt32(sx1 - 0.5f);
3190 const int iy0 = deCeilFloatToInt32(sy0 - 0.5f);
3191 const int iy1 = deCeilFloatToInt32(sy1 - 0.5f);
3193 const int v00 = (y * stride) + x;
3194 const int v01 = (y * stride) + x + 1;
3195 const int v10 = ((y + 1) * stride) + x;
3196 const int v11 = ((y + 1) * stride) + x + 1;
3197 const tcu::Vec4 c00 = colors[v00];
3198 const tcu::Vec4 c01 = colors[v01];
3199 const tcu::Vec4 c10 = colors[v10];
3200 const tcu::Vec4 c11 = colors[v11];
3202 //printf("(%d,%d) -> (%f..%f, %f..%f) (%d..%d, %d..%d)\n", x, y, sx0, sx1, sy0, sy1, ix0, ix1, iy0, iy1);
3204 for (int iy = iy0; iy < iy1; iy++)
3205 for (int ix = ix0; ix < ix1; ix++)
3207 DE_ASSERT(deInBounds32(ix, 0, width));
3208 DE_ASSERT(deInBounds32(iy, 0, height));
3210 const float sfx = (float)ix + 0.5f;
3211 const float sfy = (float)iy + 0.5f;
3212 const float fx1 = deFloatClamp((sfx - sx0) * oosx, 0.0f, 1.0f);
3213 const float fy1 = deFloatClamp((sfy - sy0) * oosy, 0.0f, 1.0f);
3215 // Triangle quad interpolation.
3216 const bool tri = fx1 + fy1 <= 1.0f;
3217 const float tx = tri ? fx1 : (1.0f-fx1);
3218 const float ty = tri ? fy1 : (1.0f-fy1);
3219 const tcu::Vec4& t0 = tri ? c00 : c11;
3220 const tcu::Vec4& t1 = tri ? c01 : c10;
3221 const tcu::Vec4& t2 = tri ? c10 : c01;
3222 const tcu::Vec4 color = t0 + (t1-t0)*tx + (t2-t0)*ty;
3224 result.setPixel(ix, iy, tcu::RGBA(color));
3229 void ShaderRenderCaseInstance::computeFragmentReference (tcu::Surface& result, const QuadGrid& quadGrid)
3231 DE_ASSERT(m_evaluator);
3234 const int width = result.getWidth();
3235 const int height = result.getHeight();
3236 const bool hasAlpha = true; // \todo [2015-09-07 elecro] add correct alpha check
3237 ShaderEvalContext evalCtx (quadGrid);
3240 for (int y = 0; y < height; y++)
3241 for (int x = 0; x < width; x++)
3243 const float sx = ((float)x + 0.5f) / (float)width;
3244 const float sy = ((float)y + 0.5f) / (float)height;
3246 evalCtx.reset(sx, sy);
3247 m_evaluator->evaluate(evalCtx);
3248 // Select either clear color or computed color based on discarded bit.
3249 tcu::Vec4 color = evalCtx.isDiscarded ? m_clearColor : evalCtx.color;
3254 result.setPixel(x, y, tcu::RGBA(color));
3258 bool ShaderRenderCaseInstance::compareImages (const tcu::Surface& resImage, const tcu::Surface& refImage, float errorThreshold)
3260 return tcu::fuzzyCompare(m_context.getTestContext().getLog(), "ComparisonResult", "Image comparison result", refImage, resImage, errorThreshold, tcu::COMPARE_LOG_EVERYTHING);