blob: 59f0a6d9113e19c05afaaa39c18a72bad42240b4 [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{},
27 mCurrentElementArrayBufferResource(nullptr),
Jamie Madillebf72992017-10-13 14:09:45 -040028 mCurrentVertexDescsValid(false)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040029{
Jamie Madillda854a22017-11-30 17:24:21 -050030 mCurrentArrayBufferHandles.fill(VK_NULL_HANDLE);
31 mCurrentArrayBufferResources.fill(nullptr);
Jamie Madill9e54b5a2016-05-25 12:57:39 -040032}
33
Jamie Madillacf2f3a2017-11-21 19:22:44 -050034VertexArrayVk::~VertexArrayVk()
35{
36}
37
Jamie Madill4928b7c2017-06-20 12:57:39 -040038void VertexArrayVk::destroy(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040039{
40}
41
Jamie Madillc564c072017-06-01 12:45:42 -040042void VertexArrayVk::syncState(const gl::Context *context,
43 const gl::VertexArray::DirtyBits &dirtyBits)
Jamie Madilldd43e6c2017-03-24 14:18:49 -040044{
45 ASSERT(dirtyBits.any());
Jamie Madill72106562017-03-24 14:18:50 -040046
Jamie Madillbd159f02017-10-09 19:39:06 -040047 // Invalidate current pipeline.
Jamie Madill72106562017-03-24 14:18:50 -040048 // TODO(jmadill): Use pipeline cache.
Jamie Madillacf2f3a2017-11-21 19:22:44 -050049 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill49ac74b2017-12-21 14:42:33 -050050 contextVk->onVertexArrayChange();
Jamie Madillbd159f02017-10-09 19:39:06 -040051
Jamie Madillebf72992017-10-13 14:09:45 -040052 // Invalidate the vertex descriptions.
53 invalidateVertexDescriptions();
54
Jamie Madillbd159f02017-10-09 19:39:06 -040055 // Rebuild current attribute buffers cache. This will fail horribly if the buffer changes.
56 // TODO(jmadill): Handle buffer storage changes.
57 const auto &attribs = mState.getVertexAttributes();
58 const auto &bindings = mState.getVertexBindings();
59
60 for (auto dirtyBit : dirtyBits)
61 {
62 if (dirtyBit == gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER)
Jamie Madillda854a22017-11-30 17:24:21 -050063 {
64 gl::Buffer *bufferGL = mState.getElementArrayBuffer().get();
65 if (bufferGL)
66 {
67 mCurrentElementArrayBufferResource = vk::GetImpl(bufferGL);
68 }
69 else
70 {
71 mCurrentElementArrayBufferResource = nullptr;
72 }
Jamie Madillbd159f02017-10-09 19:39:06 -040073 continue;
Jamie Madillda854a22017-11-30 17:24:21 -050074 }
Jamie Madillbd159f02017-10-09 19:39:06 -040075
76 size_t attribIndex = gl::VertexArray::GetVertexIndexFromDirtyBit(dirtyBit);
77
78 const auto &attrib = attribs[attribIndex];
79 const auto &binding = bindings[attrib.bindingIndex];
Jamie Madillebf72992017-10-13 14:09:45 -040080
Jamie Madillbd159f02017-10-09 19:39:06 -040081 if (attrib.enabled)
82 {
83 gl::Buffer *bufferGL = binding.getBuffer().get();
84
85 if (bufferGL)
86 {
Jamie Madillda854a22017-11-30 17:24:21 -050087 BufferVk *bufferVk = vk::GetImpl(bufferGL);
88 mCurrentArrayBufferResources[attribIndex] = bufferVk;
89 mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
Jamie Madillbd159f02017-10-09 19:39:06 -040090 }
91 else
92 {
Jamie Madillda854a22017-11-30 17:24:21 -050093 mCurrentArrayBufferResources[attribIndex] = nullptr;
94 mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
Jamie Madillbd159f02017-10-09 19:39:06 -040095 }
96 }
97 else
98 {
99 UNIMPLEMENTED();
100 }
101 }
102}
103
Jamie Madillda854a22017-11-30 17:24:21 -0500104const gl::AttribArray<VkBuffer> &VertexArrayVk::getCurrentArrayBufferHandles() const
Jamie Madillbd159f02017-10-09 19:39:06 -0400105{
Jamie Madillda854a22017-11-30 17:24:21 -0500106 return mCurrentArrayBufferHandles;
Jamie Madillbd159f02017-10-09 19:39:06 -0400107}
108
Jamie Madill49ac74b2017-12-21 14:42:33 -0500109void VertexArrayVk::updateDrawDependencies(vk::CommandBufferNode *readNode,
110 const gl::AttributesMask &activeAttribsMask,
111 Serial serial,
112 DrawType drawType)
Jamie Madillbd159f02017-10-09 19:39:06 -0400113{
Jamie Madillda854a22017-11-30 17:24:21 -0500114 // Handle the bound array buffers.
Jamie Madillbd159f02017-10-09 19:39:06 -0400115 for (auto attribIndex : activeAttribsMask)
116 {
Jamie Madillda854a22017-11-30 17:24:21 -0500117 ASSERT(mCurrentArrayBufferResources[attribIndex]);
Jamie Madill49ac74b2017-12-21 14:42:33 -0500118 mCurrentArrayBufferResources[attribIndex]->updateDependencies(readNode, serial);
Jamie Madillda854a22017-11-30 17:24:21 -0500119 }
120
121 // Handle the bound element array buffer.
122 if (drawType == DrawType::Elements)
123 {
124 ASSERT(mCurrentElementArrayBufferResource);
Jamie Madill49ac74b2017-12-21 14:42:33 -0500125 mCurrentElementArrayBufferResource->updateDependencies(readNode, serial);
Jamie Madillbd159f02017-10-09 19:39:06 -0400126 }
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400127}
128
Jamie Madillebf72992017-10-13 14:09:45 -0400129void VertexArrayVk::invalidateVertexDescriptions()
130{
131 mCurrentVertexDescsValid = false;
Jamie Madillebf72992017-10-13 14:09:45 -0400132}
133
Jamie Madillf2f6d372018-01-10 21:37:23 -0500134void VertexArrayVk::updateVertexDescriptions(const gl::Context *context,
135 vk::PipelineDesc *pipelineDesc)
Jamie Madillebf72992017-10-13 14:09:45 -0400136{
137 if (mCurrentVertexDescsValid)
138 {
139 return;
140 }
141
142 const auto &attribs = mState.getVertexAttributes();
143 const auto &bindings = mState.getVertexBindings();
144
145 const gl::Program *programGL = context->getGLState().getProgram();
146
Jamie Madillf2f6d372018-01-10 21:37:23 -0500147 pipelineDesc->resetVertexInputState();
148
Jamie Madillebf72992017-10-13 14:09:45 -0400149 for (auto attribIndex : programGL->getActiveAttribLocationsMask())
150 {
151 const auto &attrib = attribs[attribIndex];
152 const auto &binding = bindings[attrib.bindingIndex];
153 if (attrib.enabled)
154 {
Jamie Madillf2f6d372018-01-10 21:37:23 -0500155 pipelineDesc->updateVertexInputInfo(static_cast<uint32_t>(attribIndex), binding,
156 attrib);
Jamie Madillebf72992017-10-13 14:09:45 -0400157 }
158 else
159 {
160 UNIMPLEMENTED();
161 }
162 }
163
164 mCurrentVertexDescsValid = true;
165}
166
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400167} // namespace rx