1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2017 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Implementation of utility classes for various kinds of
22 * allocation memory for buffers and images
23 *//*--------------------------------------------------------------------*/
24
25 #include "vktApiBufferAndImageAllocationUtil.hpp"
26
27 #include "deInt32.h"
28 #include "tcuVectorUtil.hpp"
29 #include "vkQueryUtil.hpp"
30 #include "vkMemUtil.hpp"
31 #include "vkRefUtil.hpp"
32
33 #include <sstream>
34
35 namespace vkt
36 {
37
38 namespace api
39 {
40
createTestBuffer(const DeviceInterface& vk, VkDevice vkDevice, deUint32 queueFamilyIndex, VkDeviceSize size, VkBufferUsageFlags usage, Context& context, Allocator& allocator, Move<VkBuffer>& buffer, const MemoryRequirement& requirement, de::MovePtr<Allocation>& memory) const41 void BufferSuballocation::createTestBuffer (const DeviceInterface& vk,
42 VkDevice vkDevice,
43 deUint32 queueFamilyIndex,
44 VkDeviceSize size,
45 VkBufferUsageFlags usage,
46 Context& context,
47 Allocator& allocator,
48 Move<VkBuffer>& buffer,
49 const MemoryRequirement& requirement,
50 de::MovePtr<Allocation>& memory) const
51 {
52 DE_UNREF(context);
53
54 const VkBufferCreateInfo bufferParams
55 {
56 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
57 DE_NULL, // const void* pNext;
58 0u, // VkBufferCreateFlags flags;
59 size, // VkDeviceSize size;
60 usage, // VkBufferUsageFlags usage;
61 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
62 1u, // deUint32 queueFamilyCount;
63 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
64 };
65
66 buffer = vk::createBuffer(vk, vkDevice, &bufferParams, (const VkAllocationCallbacks*)DE_NULL);
67 memory = allocator.allocate(getBufferMemoryRequirements(vk, vkDevice, *buffer), requirement);
68 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, memory->getMemory(), 0));
69 }
70
createTestBuffer(const DeviceInterface& vk, VkDevice vkDevice, deUint32 queueFamilyIndex, VkDeviceSize size, VkBufferUsageFlags usage, Context& context, Allocator& allocator, Move<VkBuffer>& buffer, const MemoryRequirement& requirement, de::MovePtr<Allocation>& memory) const71 void BufferDedicatedAllocation::createTestBuffer (const DeviceInterface& vk,
72 VkDevice vkDevice,
73 deUint32 queueFamilyIndex,
74 VkDeviceSize size,
75 VkBufferUsageFlags usage,
76 Context& context,
77 Allocator& allocator,
78 Move<VkBuffer>& buffer,
79 const MemoryRequirement& requirement,
80 de::MovePtr<Allocation>& memory) const
81 {
82 DE_UNREF(allocator);
83 if (!context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
84 TCU_THROW(NotSupportedError, "Not supported");
85
86 const InstanceInterface& vkInstance = context.getInstanceInterface();
87 const VkPhysicalDevice vkPhysicalDevice = context.getPhysicalDevice();
88
89 const VkBufferCreateInfo bufferParams
90 {
91 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // VkStructureType sType;
92 DE_NULL, // const void* pNext;
93 0u, // VkBufferCreateFlags flags;
94 size, // VkDeviceSize size;
95 usage, // VkBufferUsageFlags usage;
96 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
97 1u, // deUint32 queueFamilyCount;
98 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
99 };
100
101 buffer = vk::createBuffer(vk, vkDevice, &bufferParams, (const VkAllocationCallbacks*)DE_NULL);
102 memory = allocateDedicated(vkInstance, vk, vkPhysicalDevice, vkDevice, buffer.get(), requirement);
103 VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, memory->getMemory(), memory->getOffset()));
104 }
105
createTestImage(tcu::IVec2 size, VkFormat format, Context& context, Allocator& allocator, Move<VkImage>& image, const MemoryRequirement& requirement, de::MovePtr<Allocation>& memory, VkImageTiling tiling) const106 void ImageSuballocation::createTestImage (tcu::IVec2 size,
107 VkFormat format,
108 Context& context,
109 Allocator& allocator,
110 Move<VkImage>& image,
111 const MemoryRequirement& requirement,
112 de::MovePtr<Allocation>& memory,
113 VkImageTiling tiling) const
114 {
115 const VkDevice vkDevice = context.getDevice();
116 const DeviceInterface& vk = context.getDeviceInterface();
117 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
118
119 const VkImageCreateInfo colorImageParams =
120 {
121 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
122 DE_NULL, // const void* pNext;
123 0u, // VkImageCreateFlags flags;
124 VK_IMAGE_TYPE_2D, // VkImageType imageType;
125 format, // VkFormat format;
126 { (deUint32)size.x(), (deUint32)size.y(), 1u }, // VkExtent3D extent;
127 1u, // deUint32 mipLevels;
128 1u, // deUint32 arraySize;
129 VK_SAMPLE_COUNT_1_BIT, // deUint32 samples;
130 tiling, // VkImageTiling tiling;
131 (vk::VkImageUsageFlags)((tiling == VK_IMAGE_TILING_LINEAR) ? VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT :
132 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT), // VkImageUsageFlags usage;
133 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
134 1u, // deUint32 queueFamilyCount;
135 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
136 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
137 };
138
139 image = createImage(vk, vkDevice, &colorImageParams);
140 memory = allocator.allocate(getImageMemoryRequirements(vk, vkDevice, *image), requirement);
141 VK_CHECK(vk.bindImageMemory(vkDevice, *image, memory->getMemory(), memory->getOffset()));
142 }
143
createTestImage(tcu::IVec2 size, VkFormat format, Context& context, Allocator& allocator, Move<VkImage>& image, const MemoryRequirement& requirement, de::MovePtr<Allocation>& memory, VkImageTiling tiling) const144 void ImageDedicatedAllocation::createTestImage (tcu::IVec2 size,
145 VkFormat format,
146 Context& context,
147 Allocator& allocator,
148 Move<VkImage>& image,
149 const MemoryRequirement& requirement,
150 de::MovePtr<Allocation>& memory,
151 VkImageTiling tiling) const
152 {
153 DE_UNREF(allocator);
154 if (!context.isDeviceFunctionalitySupported("VK_KHR_dedicated_allocation"))
155 TCU_THROW(NotSupportedError, "Not supported");
156
157 const InstanceInterface& vkInstance = context.getInstanceInterface();
158 const VkDevice vkDevice = context.getDevice();
159 const VkPhysicalDevice vkPhysicalDevice = context.getPhysicalDevice();
160 const DeviceInterface& vk = context.getDeviceInterface();
161 const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex();
162
163 const VkImageCreateInfo colorImageParams =
164 {
165 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType;
166 DE_NULL, // const void* pNext;
167 0u, // VkImageCreateFlags flags;
168 VK_IMAGE_TYPE_2D, // VkImageType imageType;
169 format, // VkFormat format;
170 { (deUint32)size.x(), (deUint32)size.y(), 1u }, // VkExtent3D extent;
171 1u, // deUint32 mipLevels;
172 1u, // deUint32 arraySize;
173 VK_SAMPLE_COUNT_1_BIT, // deUint32 samples;
174 tiling, // VkImageTiling tiling;
175 (vk::VkImageUsageFlags)((tiling == VK_IMAGE_TILING_LINEAR) ? VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT :
176 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT), // VkImageUsageFlags usage;
177 VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode;
178 1u, // deUint32 queueFamilyCount;
179 &queueFamilyIndex, // const deUint32* pQueueFamilyIndices;
180 VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout;
181 };
182
183 image = createImage(vk, vkDevice, &colorImageParams);
184 memory = allocateDedicated(vkInstance, vk, vkPhysicalDevice, vkDevice, image.get(), requirement);
185 VK_CHECK(vk.bindImageMemory(vkDevice, *image, memory->getMemory(), memory->getOffset()));
186 }
187
188 } // api
189 } // vkt
190