blob: 0a5529737a91f47aa4ccd0d0646a83732969ac84 [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
2// Copyright 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// VertexArrayVk.cpp:
7// Implements the class methods for VertexArrayVk.
8//
9
10#include "libANGLE/renderer/vulkan/VertexArrayVk.h"
11
12#include "common/debug.h"
13
Jamie Madillc564c072017-06-01 12:45:42 -040014#include "libANGLE/Context.h"
Jamie Madillbd159f02017-10-09 19:39:06 -040015#include "libANGLE/renderer/vulkan/BufferVk.h"
Jamie Madill49ac74b2017-12-21 14:42:33 -050016#include "libANGLE/renderer/vulkan/CommandBufferNode.h"
Jamie Madilldd43e6c2017-03-24 14:18:49 -040017#include "libANGLE/renderer/vulkan/ContextVk.h"
Jamie Madill3c424b42018-01-19 12:35:09 -050018#include "libANGLE/renderer/vulkan/vk_format_utils.h"
Jamie Madilldd43e6c2017-03-24 14:18:49 -040019
Jamie Madill9e54b5a2016-05-25 12:57:39 -040020namespace rx
21{
22
Jamie Madillbd159f02017-10-09 19:39:06 -040023VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state)
24 : VertexArrayImpl(state),
Jamie Madillda854a22017-11-30 17:24:21 -050025 mCurrentArrayBufferHandles{},
26 mCurrentArrayBufferResources{},
Jamie Madill112a3a82018-01-23 13:04:06 -050027 mCurrentElementArrayBufferResource(nullptr)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040028{
Jamie Madillda854a22017-11-30 17:24:21 -050029 mCurrentArrayBufferHandles.fill(VK_NULL_HANDLE);
30 mCurrentArrayBufferResources.fill(nullptr);
Jamie Madill112a3a82018-01-23 13:04:06 -050031
32 mPackedInputBindings.fill({0, 0});
33 mPackedInputAttributes.fill({0, 0, 0});
Jamie Madill9e54b5a2016-05-25 12:57:39 -040034}
35
Jamie Madillacf2f3a2017-11-21 19:22:44 -050036VertexArrayVk::~VertexArrayVk()
37{
38}
39
Jamie Madill4928b7c2017-06-20 12:57:39 -040040void VertexArrayVk::destroy(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040041{
42}
43
Jamie Madillc564c072017-06-01 12:45:42 -040044void VertexArrayVk::syncState(const gl::Context *context,
45 const gl::VertexArray::DirtyBits &dirtyBits)
Jamie Madilldd43e6c2017-03-24 14:18:49 -040046{
47 ASSERT(dirtyBits.any());
Jamie Madill72106562017-03-24 14:18:50 -040048
Jamie Madillbd159f02017-10-09 19:39:06 -040049 // Invalidate current pipeline.
Jamie Madillacf2f3a2017-11-21 19:22:44 -050050 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill49ac74b2017-12-21 14:42:33 -050051 contextVk->onVertexArrayChange();
Jamie Madillbd159f02017-10-09 19:39:06 -040052
53 // Rebuild current attribute buffers cache. This will fail horribly if the buffer changes.
54 // TODO(jmadill): Handle buffer storage changes.
55 const auto &attribs = mState.getVertexAttributes();
56 const auto &bindings = mState.getVertexBindings();
57
58 for (auto dirtyBit : dirtyBits)
59 {
60 if (dirtyBit == gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
Jamie Madillda854a22017-11-30 17:24:21 -050061 {
62 gl::Buffer *bufferGL = mState.getElementArrayBuffer().get();
63 if (bufferGL)
64 {
65 mCurrentElementArrayBufferResource = vk::GetImpl(bufferGL);
66 }
67 else
68 {
69 mCurrentElementArrayBufferResource = nullptr;
70 }
Jamie Madillbd159f02017-10-09 19:39:06 -040071 continue;
Jamie Madillda854a22017-11-30 17:24:21 -050072 }
Jamie Madillbd159f02017-10-09 19:39:06 -040073
74 size_t attribIndex = gl::VertexArray::GetVertexIndexFromDirtyBit(dirtyBit);
75
Jamie Madill112a3a82018-01-23 13:04:06 -050076 // Invalidate the input description for pipelines.
77 mDirtyPackedInputs.set(attribIndex);
78
Jamie Madillbd159f02017-10-09 19:39:06 -040079 const auto &attrib = attribs[attribIndex];
80 const auto &binding = bindings[attrib.bindingIndex];
Jamie Madillebf72992017-10-13 14:09:45 -040081
Jamie Madillbd159f02017-10-09 19:39:06 -040082 if (attrib.enabled)
83 {
84 gl::Buffer *bufferGL = binding.getBuffer().get();
85
86 if (bufferGL)
87 {
Jamie Madillda854a22017-11-30 17:24:21 -050088 BufferVk *bufferVk = vk::GetImpl(bufferGL);
89 mCurrentArrayBufferResources[attribIndex] = bufferVk;
90 mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
Jamie Madillbd159f02017-10-09 19:39:06 -040091 }
92 else
93 {
Jamie Madillda854a22017-11-30 17:24:21 -050094 mCurrentArrayBufferResources[attribIndex] = nullptr;
95 mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
Jamie Madillbd159f02017-10-09 19:39:06 -040096 }
97 }
98 else
99 {
100 UNIMPLEMENTED();
101 }
102 }
103}
104
Jamie Madillda854a22017-11-30 17:24:21 -0500105const gl::AttribArray<VkBuffer> &VertexArrayVk::getCurrentArrayBufferHandles() const
Jamie Madillbd159f02017-10-09 19:39:06 -0400106{
Jamie Madillda854a22017-11-30 17:24:21 -0500107 return mCurrentArrayBufferHandles;
Jamie Madillbd159f02017-10-09 19:39:06 -0400108}
109
Jamie Madill49ac74b2017-12-21 14:42:33 -0500110void VertexArrayVk::updateDrawDependencies(vk::CommandBufferNode *readNode,
111 const gl::AttributesMask &activeAttribsMask,
112 Serial serial,
113 DrawType drawType)
Jamie Madillbd159f02017-10-09 19:39:06 -0400114{
Jamie Madillda854a22017-11-30 17:24:21 -0500115 // Handle the bound array buffers.
Jamie Madillbd159f02017-10-09 19:39:06 -0400116 for (auto attribIndex : activeAttribsMask)
117 {
Jamie Madillda854a22017-11-30 17:24:21 -0500118 ASSERT(mCurrentArrayBufferResources[attribIndex]);
Jamie Madill0e654542018-02-07 14:50:06 -0500119 mCurrentArrayBufferResources[attribIndex]->onReadResource(readNode, serial);
Jamie Madillda854a22017-11-30 17:24:21 -0500120 }
121
122 // Handle the bound element array buffer.
123 if (drawType == DrawType::Elements)
124 {
125 ASSERT(mCurrentElementArrayBufferResource);
Jamie Madill0e654542018-02-07 14:50:06 -0500126 mCurrentElementArrayBufferResource->onReadResource(readNode, serial);
Jamie Madillbd159f02017-10-09 19:39:06 -0400127 }
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400128}
129
Jamie Madill112a3a82018-01-23 13:04:06 -0500130void VertexArrayVk::getPackedInputDescriptions(vk::PipelineDesc *pipelineDesc)
Jamie Madillebf72992017-10-13 14:09:45 -0400131{
Jamie Madill112a3a82018-01-23 13:04:06 -0500132 updatePackedInputDescriptions();
133 pipelineDesc->updateVertexInputInfo(mPackedInputBindings, mPackedInputAttributes);
Jamie Madillebf72992017-10-13 14:09:45 -0400134}
135
Jamie Madill112a3a82018-01-23 13:04:06 -0500136void VertexArrayVk::updatePackedInputDescriptions()
Jamie Madillebf72992017-10-13 14:09:45 -0400137{
Jamie Madill112a3a82018-01-23 13:04:06 -0500138 if (!mDirtyPackedInputs.any())
Jamie Madillebf72992017-10-13 14:09:45 -0400139 {
140 return;
141 }
142
143 const auto &attribs = mState.getVertexAttributes();
144 const auto &bindings = mState.getVertexBindings();
145
Jamie Madill112a3a82018-01-23 13:04:06 -0500146 for (auto attribIndex : mDirtyPackedInputs)
Jamie Madillebf72992017-10-13 14:09:45 -0400147 {
148 const auto &attrib = attribs[attribIndex];
149 const auto &binding = bindings[attrib.bindingIndex];
150 if (attrib.enabled)
151 {
Jamie Madill112a3a82018-01-23 13:04:06 -0500152 updatePackedInputInfo(static_cast<uint32_t>(attribIndex), binding, attrib);
Jamie Madillebf72992017-10-13 14:09:45 -0400153 }
154 else
155 {
156 UNIMPLEMENTED();
157 }
158 }
159
Jamie Madill112a3a82018-01-23 13:04:06 -0500160 mDirtyPackedInputs.reset();
161}
162
163void VertexArrayVk::updatePackedInputInfo(uint32_t attribIndex,
164 const gl::VertexBinding &binding,
165 const gl::VertexAttribute &attrib)
166{
167 vk::PackedVertexInputBindingDesc &bindingDesc = mPackedInputBindings[attribIndex];
168
169 size_t attribSize = gl::ComputeVertexAttributeTypeSize(attrib);
170 ASSERT(attribSize <= std::numeric_limits<uint16_t>::max());
171
172 bindingDesc.stride = static_cast<uint16_t>(attribSize);
173 bindingDesc.inputRate = static_cast<uint16_t>(
174 binding.getDivisor() > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX);
175
176 gl::VertexFormatType vertexFormatType = gl::GetVertexFormatType(attrib);
177 VkFormat vkFormat = vk::GetNativeVertexFormat(vertexFormatType);
178 ASSERT(vkFormat <= std::numeric_limits<uint16_t>::max());
179
180 vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
181 attribDesc.format = static_cast<uint16_t>(vkFormat);
182 attribDesc.location = static_cast<uint16_t>(attribIndex);
183 attribDesc.offset = static_cast<uint32_t>(ComputeVertexAttributeOffset(attrib, binding));
Jamie Madillebf72992017-10-13 14:09:45 -0400184}
185
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400186} // namespace rx