1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
4 *
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7 * Copyright (c) 2015 Google Inc.
8 *
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
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
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.
20 *
21 *//*--------------------------------------------------------------------*/
22
23 #include "vktApiComputeInstanceResultBuffer.hpp"
24 #include "vktApiBufferComputeInstance.hpp"
25 #include "vkRefUtil.hpp"
26
27 namespace vkt
28 {
29 namespace api
30 {
31
32 using namespace vk;
33
ComputeInstanceResultBuffer(const DeviceInterface & vki,VkDevice device,Allocator & allocator)34 ComputeInstanceResultBuffer::ComputeInstanceResultBuffer (const DeviceInterface &vki,
35 VkDevice device,
36 Allocator &allocator)
37 : m_vki(vki),
38 m_device(device),
39 m_bufferMem(DE_NULL),
40 m_buffer(createResultBuffer(m_vki, m_device, allocator, &m_bufferMem)),
41 m_bufferBarrier(createResultBufferBarrier(*m_buffer))
42 {
43 }
44
readResultContentsTo(tcu::Vec4 (* results)[4]) const45 void ComputeInstanceResultBuffer::readResultContentsTo(tcu::Vec4 (*results)[4]) const
46 {
47 invalidateMappedMemoryRange(m_vki, m_device, m_bufferMem->getMemory(), m_bufferMem->getOffset(), sizeof(*results));
48 deMemcpy(*results, m_bufferMem->getHostPtr(), sizeof(*results));
49 }
50
createResultBuffer(const DeviceInterface & vki,VkDevice device,Allocator & allocator,de::MovePtr<Allocation> * outAllocation)51 Move<VkBuffer> ComputeInstanceResultBuffer::createResultBuffer(const DeviceInterface &vki,
52 VkDevice device,
53 Allocator &allocator,
54 de::MovePtr<Allocation> *outAllocation)
55 {
56 const VkBufferCreateInfo createInfo =
57 {
58 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
59 DE_NULL,
60 0u, // flags
61 (VkDeviceSize) DATA_SIZE, // size
62 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, // usage
63 VK_SHARING_MODE_EXCLUSIVE, // sharingMode
64 0u, // queueFamilyCount
65 DE_NULL, // pQueueFamilyIndices
66 };
67
68 Move<VkBuffer> buffer(createBuffer(vki, device, &createInfo));
69
70 const VkMemoryRequirements requirements = getBufferMemoryRequirements(vki, device, *buffer);
71 de::MovePtr<Allocation> allocation = allocator.allocate(requirements, MemoryRequirement::HostVisible);
72
73 VK_CHECK(vki.bindBufferMemory(device, *buffer, allocation->getMemory(), allocation->getOffset()));
74
75 const float clearValue = -1.0f;
76 void* mapPtr = allocation->getHostPtr();
77
78 for (size_t offset = 0; offset < DATA_SIZE; offset += sizeof(float))
79 deMemcpy(((deUint8 *) mapPtr) + offset, &clearValue, sizeof(float));
80
81 flushMappedMemoryRange(vki, device, allocation->getMemory(), allocation->getOffset(), (VkDeviceSize) DATA_SIZE);
82
83 *outAllocation = allocation;
84 return buffer;
85 }
86
createResultBufferBarrier(VkBuffer buffer)87 VkBufferMemoryBarrier ComputeInstanceResultBuffer::createResultBufferBarrier(VkBuffer buffer)
88 {
89 const VkBufferMemoryBarrier bufferBarrier =
90 {
91 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
92 DE_NULL,
93 VK_ACCESS_SHADER_WRITE_BIT, // outputMask
94 VK_ACCESS_SHADER_READ_BIT, // inputMask
95 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
96 VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex
97 buffer, // buffer
98 (VkDeviceSize) 0u, // offset
99 DATA_SIZE, // size
100 };
101
102 return bufferBarrier;
103 }
104
105 } // api
106 } // vkt
107