blob: fce9d9853b08defb18a9c21c36ad929b7b5600d2 [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 Madill1f46bc12018-02-20 16:09:43 -050016#include "libANGLE/renderer/vulkan/CommandGraph.h"
Jamie Madilldd43e6c2017-03-24 14:18:49 -040017#include "libANGLE/renderer/vulkan/ContextVk.h"
Jamie Madill316c6062018-05-29 10:49:45 -040018#include "libANGLE/renderer/vulkan/FramebufferVk.h"
Jamie Madillc3755fc2018-04-05 08:39:13 -040019#include "libANGLE/renderer/vulkan/RendererVk.h"
Jamie Madill3c424b42018-01-19 12:35:09 -050020#include "libANGLE/renderer/vulkan/vk_format_utils.h"
Jamie Madilldd43e6c2017-03-24 14:18:49 -040021
Jamie Madill9e54b5a2016-05-25 12:57:39 -040022namespace rx
23{
Jamie Madillc3755fc2018-04-05 08:39:13 -040024namespace
25{
26constexpr size_t kDynamicVertexDataSize = 1024 * 1024;
27constexpr size_t kDynamicIndexDataSize = 1024 * 8;
Frank Henigmane4523822018-07-19 16:10:53 -040028
29bool BindingIsAligned(const gl::VertexBinding &binding, unsigned componentSize)
30{
31 return (binding.getOffset() % componentSize == 0) && (binding.getStride() % componentSize == 0);
32}
Jamie Madillc3755fc2018-04-05 08:39:13 -040033} // anonymous namespace
Jamie Madill9e54b5a2016-05-25 12:57:39 -040034
Frank Henigmane4523822018-07-19 16:10:53 -040035#define INIT \
36 { \
37 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, 1024 * 8 \
38 }
39
Luc Ferrona9ab0f32018-05-17 17:03:55 -040040VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer)
Jamie Madillbd159f02017-10-09 19:39:06 -040041 : VertexArrayImpl(state),
Jamie Madillda854a22017-11-30 17:24:21 -050042 mCurrentArrayBufferHandles{},
Frank Henigman17448952017-01-05 15:48:26 -050043 mCurrentArrayBufferOffsets{},
Jamie Madillda854a22017-11-30 17:24:21 -050044 mCurrentArrayBufferResources{},
Frank Henigman419acc82018-06-24 19:57:31 -040045 mCurrentArrayBufferFormats{},
46 mCurrentArrayBufferStrides{},
Frank Henigmane4523822018-07-19 16:10:53 -040047 mCurrentArrayBufferConversion{{
48 INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT, INIT,
49 INIT,
50 }},
51 mCurrentArrayBufferConversionCanRelease{},
Jamie Madillc3755fc2018-04-05 08:39:13 -040052 mCurrentElementArrayBufferHandle(VK_NULL_HANDLE),
53 mCurrentElementArrayBufferOffset(0),
54 mCurrentElementArrayBufferResource(nullptr),
55 mDynamicVertexData(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, kDynamicVertexDataSize),
56 mDynamicIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kDynamicIndexDataSize),
Luc Ferron6ed167a2018-06-13 13:45:55 -040057 mTranslatedByteIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kDynamicIndexDataSize),
Luc Ferrona9ab0f32018-05-17 17:03:55 -040058 mLineLoopHelper(renderer),
Jamie Madillb8e39662018-04-04 11:41:42 -040059 mDirtyLineLoopTranslation(true),
Jamie Madillc3755fc2018-04-05 08:39:13 -040060 mVertexBuffersDirty(false),
Luc Ferron49aacad2018-06-12 08:33:59 -040061 mIndexBufferDirty(false),
62 mLastIndexBufferOffset(0)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040063{
Jamie Madillda854a22017-11-30 17:24:21 -050064 mCurrentArrayBufferHandles.fill(VK_NULL_HANDLE);
Frank Henigman17448952017-01-05 15:48:26 -050065 mCurrentArrayBufferOffsets.fill(0);
Jamie Madillda854a22017-11-30 17:24:21 -050066 mCurrentArrayBufferResources.fill(nullptr);
Jamie Madill112a3a82018-01-23 13:04:06 -050067
68 mPackedInputBindings.fill({0, 0});
69 mPackedInputAttributes.fill({0, 0, 0});
Jamie Madillc3755fc2018-04-05 08:39:13 -040070
Frank Henigmane4523822018-07-19 16:10:53 -040071 for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
72 {
73 buffer.init(1, renderer);
74 }
Luc Ferrona9ab0f32018-05-17 17:03:55 -040075 mDynamicVertexData.init(1, renderer);
76 mDynamicIndexData.init(1, renderer);
Luc Ferron6ed167a2018-06-13 13:45:55 -040077 mTranslatedByteIndexData.init(1, renderer);
Jamie Madill9e54b5a2016-05-25 12:57:39 -040078}
79
Jamie Madillacf2f3a2017-11-21 19:22:44 -050080VertexArrayVk::~VertexArrayVk()
81{
82}
83
Jamie Madill4928b7c2017-06-20 12:57:39 -040084void VertexArrayVk::destroy(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040085{
Jamie Madillc3755fc2018-04-05 08:39:13 -040086 VkDevice device = vk::GetImpl(context)->getRenderer()->getDevice();
Frank Henigmane4523822018-07-19 16:10:53 -040087 for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
88 {
89 buffer.destroy(device);
90 }
Jamie Madillc3755fc2018-04-05 08:39:13 -040091 mDynamicVertexData.destroy(device);
92 mDynamicIndexData.destroy(device);
Luc Ferron6ed167a2018-06-13 13:45:55 -040093 mTranslatedByteIndexData.destroy(device);
Jamie Madill22f12fe2018-04-08 14:23:40 -040094 mLineLoopHelper.destroy(device);
Jamie Madill9e54b5a2016-05-25 12:57:39 -040095}
96
Jamie Madill21061022018-07-12 23:56:30 -040097angle::Result VertexArrayVk::streamVertexData(ContextVk *contextVk,
98 const gl::AttributesMask &attribsToStream,
99 const gl::DrawCallParams &drawCallParams)
Frank Henigman17448952017-01-05 15:48:26 -0500100{
Jamie Madillc3755fc2018-04-05 08:39:13 -0400101 ASSERT(!attribsToStream.none());
102
Jamie Madillbcef3222018-04-13 15:19:11 -0400103 const auto &attribs = mState.getVertexAttributes();
104 const auto &bindings = mState.getVertexBindings();
Frank Henigman17448952017-01-05 15:48:26 -0500105
106 // TODO(fjhenigman): When we have a bunch of interleaved attributes, they end up
107 // un-interleaved, wasting space and copying time. Consider improving on that.
Jamie Madillb8e39662018-04-04 11:41:42 -0400108 for (size_t attribIndex : attribsToStream)
Frank Henigman17448952017-01-05 15:48:26 -0500109 {
Frank Henigman6dd4a922018-03-02 16:35:13 -0500110 const gl::VertexAttribute &attrib = attribs[attribIndex];
111 const gl::VertexBinding &binding = bindings[attrib.bindingIndex];
112 ASSERT(attrib.enabled && binding.getBuffer().get() == nullptr);
Frank Henigman17448952017-01-05 15:48:26 -0500113
Frank Henigman419acc82018-06-24 19:57:31 -0400114 // Only vertexCount() vertices will be used by the upcoming draw so that is
115 // all we copy, but we allocate space firstVertex() + vertexCount() so indexing
Frank Henigman6dd4a922018-03-02 16:35:13 -0500116 // will work. If we don't start at zero all the indices will be off.
117 // TODO(fjhenigman): See if we can account for indices being off by adjusting
118 // the offset, thus avoiding wasted memory.
Frank Henigman419acc82018-06-24 19:57:31 -0400119 const size_t bytesAllocated =
120 (drawCallParams.firstVertex() + drawCallParams.vertexCount()) *
121 mCurrentArrayBufferStrides[attribIndex];
122 const uint8_t *src = static_cast<const uint8_t *>(attrib.pointer) +
123 drawCallParams.firstVertex() * binding.getStride();
Jamie Madill493f9572018-05-24 19:52:15 -0400124 uint8_t *dst = nullptr;
Luc Ferron7a06ac12018-03-15 10:17:04 -0400125 uint32_t offset = 0;
Frank Henigman419acc82018-06-24 19:57:31 -0400126 ANGLE_TRY(mDynamicVertexData.allocate(contextVk, bytesAllocated, &dst,
127 &mCurrentArrayBufferHandles[attribIndex], &offset,
128 nullptr));
129 dst += drawCallParams.firstVertex() * mCurrentArrayBufferStrides[attribIndex];
Luc Ferron7a06ac12018-03-15 10:17:04 -0400130 mCurrentArrayBufferOffsets[attribIndex] = static_cast<VkDeviceSize>(offset);
Frank Henigman419acc82018-06-24 19:57:31 -0400131 mCurrentArrayBufferFormats[attribIndex]->vertexLoadFunction(
132 src, binding.getStride(), drawCallParams.vertexCount(), dst);
Frank Henigman17448952017-01-05 15:48:26 -0500133 }
134
Jamie Madill21061022018-07-12 23:56:30 -0400135 ANGLE_TRY(mDynamicVertexData.flush(contextVk));
136 mDynamicVertexData.releaseRetainedBuffers(contextVk->getRenderer());
137 return angle::Result::Continue();
Jamie Madillc3755fc2018-04-05 08:39:13 -0400138}
139
Jamie Madill21061022018-07-12 23:56:30 -0400140angle::Result VertexArrayVk::streamIndexData(ContextVk *contextVk,
141 const gl::DrawCallParams &drawCallParams)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400142{
143 ASSERT(!mState.getElementArrayBuffer().get());
144
145 uint32_t offset = 0;
146
147 const GLsizei amount = sizeof(GLushort) * drawCallParams.indexCount();
148 GLubyte *dst = nullptr;
149
Jamie Madill21061022018-07-12 23:56:30 -0400150 ANGLE_TRY(mDynamicIndexData.allocate(contextVk, amount, &dst, &mCurrentElementArrayBufferHandle,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400151 &offset, nullptr));
152 if (drawCallParams.type() == GL_UNSIGNED_BYTE)
153 {
154 // Unsigned bytes don't have direct support in Vulkan so we have to expand the
155 // memory to a GLushort.
156 const GLubyte *in = static_cast<const GLubyte *>(drawCallParams.indices());
157 GLushort *expandedDst = reinterpret_cast<GLushort *>(dst);
158 for (GLsizei index = 0; index < drawCallParams.indexCount(); index++)
159 {
160 expandedDst[index] = static_cast<GLushort>(in[index]);
161 }
162 }
163 else
164 {
165 memcpy(dst, drawCallParams.indices(), amount);
166 }
Jamie Madill21061022018-07-12 23:56:30 -0400167 ANGLE_TRY(mDynamicIndexData.flush(contextVk));
168 mDynamicIndexData.releaseRetainedBuffers(contextVk->getRenderer());
Jamie Madillc3755fc2018-04-05 08:39:13 -0400169 mCurrentElementArrayBufferOffset = offset;
Jamie Madill21061022018-07-12 23:56:30 -0400170 return angle::Result::Continue();
Frank Henigman17448952017-01-05 15:48:26 -0500171}
172
Frank Henigmane4523822018-07-19 16:10:53 -0400173// We assume the buffer is completely full of the same kind of data and convert
174// and/or align it as we copy it to a DynamicBuffer. The assumption could be wrong
175// but the alternative of copying it piecemeal on each draw would have a lot more
176// overhead.
177angle::Result VertexArrayVk::convertVertexBuffer(ContextVk *context,
178 BufferVk *srcBuffer,
179 const gl::VertexBinding &binding,
180 size_t attribIndex)
181{
182
183 // Preparation for mapping source buffer.
184 ANGLE_TRY(context->getRenderer()->finish(context));
185
186 unsigned srcFormatSize = mCurrentArrayBufferFormats[attribIndex]->angleFormat().pixelBytes;
187 unsigned dstFormatSize = mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
188
189 // Bytes usable for vertex data.
190 GLint64 bytes = srcBuffer->getSize() - binding.getOffset();
191 if (bytes < srcFormatSize)
192 return angle::Result::Continue();
193
194 // Count the last vertex. It may occupy less than a full stride.
195 size_t numVertices = 1;
196 bytes -= srcFormatSize;
197
198 // Count how many strides fit remaining space.
199 if (bytes > 0)
200 numVertices += static_cast<size_t>(bytes) / binding.getStride();
201
202 void *src = nullptr;
203 uint8_t *dst = nullptr;
204 uint32_t offset = 0;
205
206 ANGLE_TRY(mCurrentArrayBufferConversion[attribIndex].allocate(
207 context, numVertices * dstFormatSize, &dst, &mCurrentArrayBufferHandles[attribIndex],
208 &offset, nullptr));
209 ANGLE_TRY(srcBuffer->mapImpl(context, &src));
210 mCurrentArrayBufferFormats[attribIndex]->vertexLoadFunction(
211 static_cast<const uint8_t *>(src) + binding.getOffset(), binding.getStride(), numVertices,
212 dst);
213 ANGLE_TRY(srcBuffer->unmapImpl(context));
214 ANGLE_TRY(mCurrentArrayBufferConversion[attribIndex].flush(context));
215
216 mCurrentArrayBufferConversionCanRelease[attribIndex] = true;
217 mCurrentArrayBufferOffsets[attribIndex] = offset;
218 mCurrentArrayBufferStrides[attribIndex] = dstFormatSize;
219
220 return angle::Result::Continue();
221}
222
223void VertexArrayVk::ensureConversionReleased(RendererVk *renderer, size_t attribIndex)
224{
225 if (mCurrentArrayBufferConversionCanRelease[attribIndex])
226 {
227 mCurrentArrayBufferConversion[attribIndex].release(renderer);
228 mCurrentArrayBufferConversionCanRelease[attribIndex] = false;
229 }
230}
231
232#define ANGLE_VERTEX_DIRTY_ATTRIB_FUNC(INDEX) \
233 case gl::VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX: \
234 ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
235 bindings[attribs[INDEX].bindingIndex], INDEX)); \
236 invalidatePipeline = true; \
Jamie Madilla56467e2018-04-11 16:19:41 -0400237 break;
238
Frank Henigmane4523822018-07-19 16:10:53 -0400239#define ANGLE_VERTEX_DIRTY_BINDING_FUNC(INDEX) \
240 case gl::VertexArray::DIRTY_BIT_BINDING_0 + INDEX: \
241 ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
242 bindings[attribs[INDEX].bindingIndex], INDEX)); \
243 invalidatePipeline = true; \
Jamie Madilla56467e2018-04-11 16:19:41 -0400244 break;
245
Frank Henigmane4523822018-07-19 16:10:53 -0400246#define ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC(INDEX) \
247 case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \
248 ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
249 bindings[attribs[INDEX].bindingIndex], INDEX)); \
Jamie Madilla56467e2018-04-11 16:19:41 -0400250 break;
251
Frank Henigman0af5b862018-03-27 20:19:33 -0400252gl::Error VertexArrayVk::syncState(const gl::Context *context,
253 const gl::VertexArray::DirtyBits &dirtyBits,
254 const gl::VertexArray::DirtyAttribBitsArray &attribBits,
255 const gl::VertexArray::DirtyBindingBitsArray &bindingBits)
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400256{
257 ASSERT(dirtyBits.any());
Jamie Madill72106562017-03-24 14:18:50 -0400258
Jamie Madillc3755fc2018-04-05 08:39:13 -0400259 bool invalidatePipeline = false;
260
Jamie Madill5a4c9322018-07-16 11:01:58 -0400261 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madillbd159f02017-10-09 19:39:06 -0400262
263 // Rebuild current attribute buffers cache. This will fail horribly if the buffer changes.
264 // TODO(jmadill): Handle buffer storage changes.
265 const auto &attribs = mState.getVertexAttributes();
266 const auto &bindings = mState.getVertexBindings();
267
Jamie Madill09463932018-04-04 05:26:59 -0400268 for (size_t dirtyBit : dirtyBits)
Jamie Madillbd159f02017-10-09 19:39:06 -0400269 {
Jamie Madill09463932018-04-04 05:26:59 -0400270 switch (dirtyBit)
Jamie Madillda854a22017-11-30 17:24:21 -0500271 {
Jamie Madill09463932018-04-04 05:26:59 -0400272 case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER:
Jamie Madillda854a22017-11-30 17:24:21 -0500273 {
Jamie Madill09463932018-04-04 05:26:59 -0400274 gl::Buffer *bufferGL = mState.getElementArrayBuffer().get();
275 if (bufferGL)
276 {
Jamie Madillc3755fc2018-04-05 08:39:13 -0400277 BufferVk *bufferVk = vk::GetImpl(bufferGL);
278 mCurrentElementArrayBufferResource = bufferVk;
279 mCurrentElementArrayBufferHandle = bufferVk->getVkBuffer().getHandle();
Jamie Madill09463932018-04-04 05:26:59 -0400280 }
281 else
282 {
283 mCurrentElementArrayBufferResource = nullptr;
Jamie Madillc3755fc2018-04-05 08:39:13 -0400284 mCurrentElementArrayBufferHandle = VK_NULL_HANDLE;
Jamie Madill09463932018-04-04 05:26:59 -0400285 }
Luc Ferron387b3b32018-05-28 10:11:57 -0400286
287 mCurrentElementArrayBufferOffset = 0;
288 mLineLoopBufferFirstIndex.reset();
289 mLineLoopBufferLastIndex.reset();
Jamie Madillb8e39662018-04-04 11:41:42 -0400290 mIndexBufferDirty = true;
291 mDirtyLineLoopTranslation = true;
Jamie Madill09463932018-04-04 05:26:59 -0400292 break;
Jamie Madillda854a22017-11-30 17:24:21 -0500293 }
Jamie Madill09463932018-04-04 05:26:59 -0400294
295 case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA:
Jamie Madillc3755fc2018-04-05 08:39:13 -0400296 mLineLoopBufferFirstIndex.reset();
297 mLineLoopBufferLastIndex.reset();
Jamie Madillb8e39662018-04-04 11:41:42 -0400298 mDirtyLineLoopTranslation = true;
Jamie Madill09463932018-04-04 05:26:59 -0400299 break;
300
Jamie Madilla56467e2018-04-11 16:19:41 -0400301 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_ATTRIB_FUNC);
302 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_BINDING_FUNC);
303 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC);
304
Jamie Madill09463932018-04-04 05:26:59 -0400305 default:
Jamie Madilla56467e2018-04-11 16:19:41 -0400306 UNREACHABLE();
Jamie Madill09463932018-04-04 05:26:59 -0400307 break;
Jamie Madillbd159f02017-10-09 19:39:06 -0400308 }
309 }
Frank Henigman0af5b862018-03-27 20:19:33 -0400310
Jamie Madillc3755fc2018-04-05 08:39:13 -0400311 if (invalidatePipeline)
312 {
313 mVertexBuffersDirty = true;
314 contextVk->invalidateCurrentPipeline();
315 }
316
Frank Henigman0af5b862018-03-27 20:19:33 -0400317 return gl::NoError();
Jamie Madillbd159f02017-10-09 19:39:06 -0400318}
319
Frank Henigmane4523822018-07-19 16:10:53 -0400320angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
321 const gl::VertexAttribute &attrib,
322 const gl::VertexBinding &binding,
323 size_t attribIndex)
Jamie Madilla56467e2018-04-11 16:19:41 -0400324{
325 // Invalidate the input description for pipelines.
326 mDirtyPackedInputs.set(attribIndex);
327
Frank Henigman67c388e2018-07-19 19:16:11 -0400328 RendererVk *renderer = contextVk->getRenderer();
Frank Henigmane4523822018-07-19 16:10:53 -0400329 bool releaseConversion = true;
Jamie Madill5a4c9322018-07-16 11:01:58 -0400330
Jamie Madilla56467e2018-04-11 16:19:41 -0400331 if (attrib.enabled)
332 {
Frank Henigman67c388e2018-07-19 19:16:11 -0400333 gl::Buffer *bufferGL = binding.getBuffer().get();
Frank Henigman419acc82018-06-24 19:57:31 -0400334 mCurrentArrayBufferFormats[attribIndex] = &renderer->getFormat(GetVertexFormatID(attrib));
Frank Henigmane4523822018-07-19 16:10:53 -0400335
Jamie Madilla56467e2018-04-11 16:19:41 -0400336 if (bufferGL)
337 {
Frank Henigmane4523822018-07-19 16:10:53 -0400338 BufferVk *bufferVk = vk::GetImpl(bufferGL);
339 unsigned componentSize =
340 mCurrentArrayBufferFormats[attribIndex]->angleFormat().pixelBytes / attrib.size;
Frank Henigman419acc82018-06-24 19:57:31 -0400341
Frank Henigmane4523822018-07-19 16:10:53 -0400342 if (mCurrentArrayBufferFormats[attribIndex]->vertexLoadRequiresConversion ||
343 !BindingIsAligned(binding, componentSize))
344 {
345 ANGLE_TRY(convertVertexBuffer(contextVk, bufferVk, binding, attribIndex));
346
347 mCurrentArrayBufferConversion[attribIndex].releaseRetainedBuffers(renderer);
348 mCurrentArrayBufferResources[attribIndex] = nullptr;
349 releaseConversion = false;
350 }
351 else
352 {
353 mCurrentArrayBufferResources[attribIndex] = bufferVk;
354 mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
355 mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
356 mCurrentArrayBufferStrides[attribIndex] = binding.getStride();
357 }
Jamie Madilla56467e2018-04-11 16:19:41 -0400358 }
359 else
360 {
361 mCurrentArrayBufferResources[attribIndex] = nullptr;
362 mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
Luc Ferronfa5d84b2018-06-28 10:40:04 -0400363 mCurrentArrayBufferOffsets[attribIndex] = 0;
Frank Henigman419acc82018-06-24 19:57:31 -0400364 mCurrentArrayBufferStrides[attribIndex] =
Frank Henigmane4523822018-07-19 16:10:53 -0400365 mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
Jamie Madilla56467e2018-04-11 16:19:41 -0400366 }
Jamie Madilla56467e2018-04-11 16:19:41 -0400367 }
368 else
369 {
Jamie Madill5a4c9322018-07-16 11:01:58 -0400370 contextVk->invalidateDefaultAttribute(attribIndex);
371
372 // These will be filled out by the ContextVk.
373 mCurrentArrayBufferResources[attribIndex] = nullptr;
374 mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
375 mCurrentArrayBufferOffsets[attribIndex] = 0;
376 mCurrentArrayBufferStrides[attribIndex] = 0;
377 mCurrentArrayBufferFormats[attribIndex] =
Jamie Madillba365932018-07-18 17:23:46 -0400378 &renderer->getFormat(angle::FormatID::R32G32B32A32_FLOAT);
Jamie Madilla56467e2018-04-11 16:19:41 -0400379 }
Frank Henigmane4523822018-07-19 16:10:53 -0400380
381 if (releaseConversion)
382 ensureConversionReleased(renderer, attribIndex);
383
384 return angle::Result::Continue();
Jamie Madilla56467e2018-04-11 16:19:41 -0400385}
386
Jamie Madill316c6062018-05-29 10:49:45 -0400387void VertexArrayVk::updateArrayBufferReadDependencies(vk::CommandGraphResource *drawFramebuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400388 const gl::AttributesMask &activeAttribsMask,
389 Serial serial)
Jamie Madillbd159f02017-10-09 19:39:06 -0400390{
Jamie Madillda854a22017-11-30 17:24:21 -0500391 // Handle the bound array buffers.
Jamie Madillc3755fc2018-04-05 08:39:13 -0400392 for (size_t attribIndex : activeAttribsMask)
Jamie Madillbd159f02017-10-09 19:39:06 -0400393 {
Frank Henigman17448952017-01-05 15:48:26 -0500394 if (mCurrentArrayBufferResources[attribIndex])
Jamie Madill316c6062018-05-29 10:49:45 -0400395 mCurrentArrayBufferResources[attribIndex]->addReadDependency(drawFramebuffer);
Jamie Madillda854a22017-11-30 17:24:21 -0500396 }
Jamie Madillc3755fc2018-04-05 08:39:13 -0400397}
Jamie Madillda854a22017-11-30 17:24:21 -0500398
Jamie Madill316c6062018-05-29 10:49:45 -0400399void VertexArrayVk::updateElementArrayBufferReadDependency(
400 vk::CommandGraphResource *drawFramebuffer,
401 Serial serial)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400402{
Jamie Madillda854a22017-11-30 17:24:21 -0500403 // Handle the bound element array buffer.
Jamie Madillc3755fc2018-04-05 08:39:13 -0400404 if (mCurrentElementArrayBufferResource)
Jamie Madillda854a22017-11-30 17:24:21 -0500405 {
Jamie Madill316c6062018-05-29 10:49:45 -0400406 mCurrentElementArrayBufferResource->addReadDependency(drawFramebuffer);
Jamie Madillbd159f02017-10-09 19:39:06 -0400407 }
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400408}
409
Frank Henigman419acc82018-06-24 19:57:31 -0400410void VertexArrayVk::getPackedInputDescriptions(vk::PipelineDesc *pipelineDesc)
Jamie Madillebf72992017-10-13 14:09:45 -0400411{
Frank Henigman419acc82018-06-24 19:57:31 -0400412 updatePackedInputDescriptions();
Jamie Madill112a3a82018-01-23 13:04:06 -0500413 pipelineDesc->updateVertexInputInfo(mPackedInputBindings, mPackedInputAttributes);
Jamie Madillebf72992017-10-13 14:09:45 -0400414}
415
Frank Henigman419acc82018-06-24 19:57:31 -0400416void VertexArrayVk::updatePackedInputDescriptions()
Jamie Madillebf72992017-10-13 14:09:45 -0400417{
Jamie Madill112a3a82018-01-23 13:04:06 -0500418 if (!mDirtyPackedInputs.any())
Jamie Madillebf72992017-10-13 14:09:45 -0400419 {
420 return;
421 }
422
423 const auto &attribs = mState.getVertexAttributes();
424 const auto &bindings = mState.getVertexBindings();
425
Jamie Madill112a3a82018-01-23 13:04:06 -0500426 for (auto attribIndex : mDirtyPackedInputs)
Jamie Madillebf72992017-10-13 14:09:45 -0400427 {
428 const auto &attrib = attribs[attribIndex];
429 const auto &binding = bindings[attrib.bindingIndex];
430 if (attrib.enabled)
431 {
Frank Henigman419acc82018-06-24 19:57:31 -0400432 updatePackedInputInfo(static_cast<uint32_t>(attribIndex), binding, attrib);
Jamie Madillebf72992017-10-13 14:09:45 -0400433 }
434 else
435 {
Jamie Madill5a4c9322018-07-16 11:01:58 -0400436 vk::PackedVertexInputBindingDesc &bindingDesc = mPackedInputBindings[attribIndex];
437 bindingDesc.stride = 0;
438 bindingDesc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
439
440 vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
441 attribDesc.format = static_cast<uint16_t>(VK_FORMAT_R32G32B32A32_SFLOAT);
442 attribDesc.location = static_cast<uint16_t>(attribIndex);
443 attribDesc.offset = 0;
Jamie Madillebf72992017-10-13 14:09:45 -0400444 }
445 }
446
Jamie Madill112a3a82018-01-23 13:04:06 -0500447 mDirtyPackedInputs.reset();
448}
449
Frank Henigman419acc82018-06-24 19:57:31 -0400450void VertexArrayVk::updatePackedInputInfo(uint32_t attribIndex,
Jamie Madill112a3a82018-01-23 13:04:06 -0500451 const gl::VertexBinding &binding,
452 const gl::VertexAttribute &attrib)
453{
454 vk::PackedVertexInputBindingDesc &bindingDesc = mPackedInputBindings[attribIndex];
455
Frank Henigman419acc82018-06-24 19:57:31 -0400456 bindingDesc.stride = static_cast<uint16_t>(mCurrentArrayBufferStrides[attribIndex]);
Jamie Madill112a3a82018-01-23 13:04:06 -0500457 bindingDesc.inputRate = static_cast<uint16_t>(
458 binding.getDivisor() > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX);
459
Frank Henigman419acc82018-06-24 19:57:31 -0400460 VkFormat vkFormat = mCurrentArrayBufferFormats[attribIndex]->vkBufferFormat;
Jamie Madill112a3a82018-01-23 13:04:06 -0500461 ASSERT(vkFormat <= std::numeric_limits<uint16_t>::max());
Frank Henigman8c379f32018-06-21 19:55:05 -0400462 if (vkFormat == VK_FORMAT_UNDEFINED)
463 {
464 // TODO(fjhenigman): Add support for vertex data format. anglebug.com/2405
465 UNIMPLEMENTED();
466 }
Jamie Madill112a3a82018-01-23 13:04:06 -0500467
468 vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
469 attribDesc.format = static_cast<uint16_t>(vkFormat);
470 attribDesc.location = static_cast<uint16_t>(attribIndex);
Luc Ferronfa5d84b2018-06-28 10:40:04 -0400471 attribDesc.offset = static_cast<uint32_t>(attrib.relativeOffset);
Jamie Madillebf72992017-10-13 14:09:45 -0400472}
473
Jamie Madillc3755fc2018-04-05 08:39:13 -0400474gl::Error VertexArrayVk::drawArrays(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400475 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400476 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400477 bool newCommandBuffer)
478{
Jamie Madillc3755fc2018-04-05 08:39:13 -0400479 ASSERT(commandBuffer->valid());
480
Jamie Madill21061022018-07-12 23:56:30 -0400481 ContextVk *contextVk = vk::GetImpl(context);
482
483 ANGLE_TRY(onDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400484
Jamie Madill18e323a2018-05-11 16:54:17 -0400485 // Note: Vertex indexes can be arbitrarily large.
486 uint32_t clampedVertexCount = drawCallParams.getClampedVertexCount<uint32_t>();
487
Jamie Madill493f9572018-05-24 19:52:15 -0400488 if (drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400489 {
Jamie Madill18e323a2018-05-11 16:54:17 -0400490 commandBuffer->draw(clampedVertexCount, 1, drawCallParams.firstVertex(), 0);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400491 return gl::NoError();
492 }
493
494 // Handle GL_LINE_LOOP drawArrays.
Jamie Madill18e323a2018-05-11 16:54:17 -0400495 size_t lastVertex = static_cast<size_t>(drawCallParams.firstVertex() + clampedVertexCount);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400496 if (!mLineLoopBufferFirstIndex.valid() || !mLineLoopBufferLastIndex.valid() ||
497 mLineLoopBufferFirstIndex != drawCallParams.firstVertex() ||
498 mLineLoopBufferLastIndex != lastVertex)
499 {
Jamie Madill21061022018-07-12 23:56:30 -0400500 ANGLE_TRY(mLineLoopHelper.getIndexBufferForDrawArrays(contextVk, drawCallParams,
Jamie Madill22f12fe2018-04-08 14:23:40 -0400501 &mCurrentElementArrayBufferHandle,
502 &mCurrentElementArrayBufferOffset));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400503
504 mLineLoopBufferFirstIndex = drawCallParams.firstVertex();
505 mLineLoopBufferLastIndex = lastVertex;
506 }
507
508 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
509 mCurrentElementArrayBufferOffset, VK_INDEX_TYPE_UINT32);
510
Jamie Madill18e323a2018-05-11 16:54:17 -0400511 vk::LineLoopHelper::Draw(clampedVertexCount, commandBuffer);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400512
513 return gl::NoError();
514}
515
516gl::Error VertexArrayVk::drawElements(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400517 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400518 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400519 bool newCommandBuffer)
520{
Jamie Madillc3755fc2018-04-05 08:39:13 -0400521 ASSERT(commandBuffer->valid());
522
Jamie Madill21061022018-07-12 23:56:30 -0400523 ContextVk *contextVk = vk::GetImpl(context);
524
Jamie Madill493f9572018-05-24 19:52:15 -0400525 if (drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400526 {
Jamie Madill21061022018-07-12 23:56:30 -0400527 ANGLE_TRY(onIndexedDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400528 commandBuffer->drawIndexed(drawCallParams.indexCount(), 1, 0, 0, 0);
529 return gl::NoError();
530 }
531
532 // Handle GL_LINE_LOOP drawElements.
Jamie Madillb8e39662018-04-04 11:41:42 -0400533 if (mDirtyLineLoopTranslation)
534 {
Luc Ferrona9120462018-04-12 13:11:03 -0400535 gl::Buffer *elementArrayBuffer = mState.getElementArrayBuffer().get();
536 VkIndexType indexType = gl_vk::GetIndexType(drawCallParams.type());
537
538 if (!elementArrayBuffer)
539 {
540 ANGLE_TRY(mLineLoopHelper.getIndexBufferForClientElementArray(
Jamie Madill21061022018-07-12 23:56:30 -0400541 contextVk, drawCallParams, &mCurrentElementArrayBufferHandle,
Luc Ferron3e313802018-06-11 14:44:33 -0400542 &mCurrentElementArrayBufferOffset));
Luc Ferrona9120462018-04-12 13:11:03 -0400543 }
544 else
545 {
Luc Ferrona4fa9c22018-04-13 07:00:56 -0400546 // When using an element array buffer, 'indices' is an offset to the first element.
547 intptr_t offset = reinterpret_cast<intptr_t>(drawCallParams.indices());
Luc Ferrona9120462018-04-12 13:11:03 -0400548 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
549 ANGLE_TRY(mLineLoopHelper.getIndexBufferForElementArrayBuffer(
Jamie Madill21061022018-07-12 23:56:30 -0400550 contextVk, elementArrayBufferVk, indexType, drawCallParams.indexCount(), offset,
Luc Ferrona9120462018-04-12 13:11:03 -0400551 &mCurrentElementArrayBufferHandle, &mCurrentElementArrayBufferOffset));
552 }
Jamie Madillb8e39662018-04-04 11:41:42 -0400553 }
Jamie Madillc3755fc2018-04-05 08:39:13 -0400554
Jamie Madill21061022018-07-12 23:56:30 -0400555 ANGLE_TRY(onIndexedDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Jamie Madill22f12fe2018-04-08 14:23:40 -0400556 vk::LineLoopHelper::Draw(drawCallParams.indexCount(), commandBuffer);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400557
558 return gl::NoError();
559}
560
561gl::Error VertexArrayVk::onDraw(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400562 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400563 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400564 bool newCommandBuffer)
565{
Jamie Madill21061022018-07-12 23:56:30 -0400566 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400567 const gl::State &state = context->getGLState();
568 const gl::Program *programGL = state.getProgram();
Jamie Madilldc358af2018-07-31 11:22:13 -0400569 const gl::AttributesMask &clientAttribs = context->getStateCache().getActiveClientAttribsMask();
Jamie Madillc3755fc2018-04-05 08:39:13 -0400570 uint32_t maxAttrib = programGL->getState().getMaxActiveAttribLocation();
571
Jamie Madillbcef3222018-04-13 15:19:11 -0400572 if (clientAttribs.any())
Jamie Madillc3755fc2018-04-05 08:39:13 -0400573 {
Jamie Madilldc358af2018-07-31 11:22:13 -0400574 ANGLE_TRY(drawCallParams.ensureIndexRangeResolved(context));
575 ANGLE_TRY(streamVertexData(contextVk, clientAttribs, drawCallParams));
576 commandBuffer->bindVertexBuffers(0, maxAttrib, mCurrentArrayBufferHandles.data(),
577 mCurrentArrayBufferOffsets.data());
Jamie Madillc3755fc2018-04-05 08:39:13 -0400578 }
579 else if (mVertexBuffersDirty || newCommandBuffer)
580 {
Luc Ferron44162472018-04-06 13:20:45 -0400581 if (maxAttrib > 0)
582 {
Luc Ferron44162472018-04-06 13:20:45 -0400583 commandBuffer->bindVertexBuffers(0, maxAttrib, mCurrentArrayBufferHandles.data(),
584 mCurrentArrayBufferOffsets.data());
Jamie Madill316c6062018-05-29 10:49:45 -0400585
Jamie Madilldc358af2018-07-31 11:22:13 -0400586 const gl::AttributesMask &bufferedAttribs =
587 context->getStateCache().getActiveBufferedAttribsMask();
588
Jamie Madill316c6062018-05-29 10:49:45 -0400589 vk::CommandGraphResource *drawFramebuffer = vk::GetImpl(state.getDrawFramebuffer());
Jamie Madilldc358af2018-07-31 11:22:13 -0400590 updateArrayBufferReadDependencies(drawFramebuffer, bufferedAttribs,
Jamie Madill21061022018-07-12 23:56:30 -0400591 contextVk->getRenderer()->getCurrentQueueSerial());
Luc Ferron44162472018-04-06 13:20:45 -0400592 }
Luc Ferronc1e02682018-04-11 11:02:55 -0400593
Jamie Madillc3755fc2018-04-05 08:39:13 -0400594 mVertexBuffersDirty = false;
Luc Ferronc1e02682018-04-11 11:02:55 -0400595
596 // This forces the binding to happen if we follow a drawElement call from a drawArrays call.
597 mIndexBufferDirty = true;
Luc Ferron983c4292018-04-10 13:05:45 -0400598
599 // If we've had a drawElements call with a line loop before, we want to make sure this is
600 // invalidated the next time drawElements is called since we use the same index buffer for
601 // both calls.
602 mDirtyLineLoopTranslation = true;
Jamie Madillc3755fc2018-04-05 08:39:13 -0400603 }
604
605 return gl::NoError();
606}
607
608gl::Error VertexArrayVk::onIndexedDraw(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400609 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400610 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400611 bool newCommandBuffer)
612{
Jamie Madill21061022018-07-12 23:56:30 -0400613 ContextVk *contextVk = vk::GetImpl(context);
614 ANGLE_TRY(onDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Frank Henigman419acc82018-06-24 19:57:31 -0400615 bool isLineLoop = drawCallParams.mode() == gl::PrimitiveMode::LineLoop;
Luc Ferron6ed167a2018-06-13 13:45:55 -0400616 gl::Buffer *glBuffer = mState.getElementArrayBuffer().get();
617 uintptr_t offset =
618 glBuffer && !isLineLoop ? reinterpret_cast<uintptr_t>(drawCallParams.indices()) : 0;
Jamie Madillc3755fc2018-04-05 08:39:13 -0400619
Luc Ferron6ed167a2018-06-13 13:45:55 -0400620 if (!glBuffer && !isLineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400621 {
622 ANGLE_TRY(drawCallParams.ensureIndexRangeResolved(context));
Jamie Madill21061022018-07-12 23:56:30 -0400623 ANGLE_TRY(streamIndexData(contextVk, drawCallParams));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400624 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
625 mCurrentElementArrayBufferOffset,
626 gl_vk::GetIndexType(drawCallParams.type()));
627 }
Luc Ferron49aacad2018-06-12 08:33:59 -0400628 else if (mIndexBufferDirty || newCommandBuffer || offset != mLastIndexBufferOffset)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400629 {
Luc Ferron3e313802018-06-11 14:44:33 -0400630 if (drawCallParams.type() == GL_UNSIGNED_BYTE &&
631 drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400632 {
Luc Ferron6ed167a2018-06-13 13:45:55 -0400633 // Unsigned bytes don't have direct support in Vulkan so we have to expand the
634 // memory to a GLushort.
635 BufferVk *bufferVk = vk::GetImpl(glBuffer);
636 void *srcDataMapping = nullptr;
637 ASSERT(!glBuffer->isMapped());
Jamie Madill21061022018-07-12 23:56:30 -0400638 ANGLE_TRY(bufferVk->mapImpl(contextVk, &srcDataMapping));
Rafael Cintron05a449a2018-06-20 18:08:04 -0700639 uint8_t *srcData = static_cast<uint8_t *>(srcDataMapping);
Luc Ferron6ed167a2018-06-13 13:45:55 -0400640 intptr_t offsetIntoSrcData = reinterpret_cast<intptr_t>(drawCallParams.indices());
641 srcData += offsetIntoSrcData;
642
643 // Allocate a new buffer that's double the size of the buffer provided by the user to
644 // go from unsigned byte to unsigned short.
645 uint8_t *allocatedData = nullptr;
646 bool newBufferAllocated = false;
647 uint32_t expandedDataOffset = 0;
Jamie Madilleebe2192018-07-11 09:01:18 -0400648 ANGLE_TRY(mTranslatedByteIndexData.allocate(
Jamie Madill21061022018-07-12 23:56:30 -0400649 contextVk, static_cast<size_t>(bufferVk->getSize()) * 2, &allocatedData,
Jamie Madilleebe2192018-07-11 09:01:18 -0400650 &mCurrentElementArrayBufferHandle, &expandedDataOffset, &newBufferAllocated));
Luc Ferron6ed167a2018-06-13 13:45:55 -0400651 mCurrentElementArrayBufferOffset = static_cast<VkDeviceSize>(expandedDataOffset);
652
653 // Expand the source into the destination
654 ASSERT(!context->getGLState().isPrimitiveRestartEnabled());
655 uint16_t *expandedDst = reinterpret_cast<uint16_t *>(allocatedData);
656 for (GLsizei index = 0; index < bufferVk->getSize() - offsetIntoSrcData; index++)
657 {
658 expandedDst[index] = static_cast<GLushort>(srcData[index]);
659 }
660
661 // Make sure our writes are available.
Jamie Madill21061022018-07-12 23:56:30 -0400662 ANGLE_TRY(mTranslatedByteIndexData.flush(contextVk));
Luc Ferron6ed167a2018-06-13 13:45:55 -0400663 GLboolean result = false;
664 ANGLE_TRY(bufferVk->unmap(context, &result));
665
666 // We do not add the offset from the drawCallParams here because we've already copied
667 // the source starting at the offset requested.
668 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
669 mCurrentElementArrayBufferOffset,
670 gl_vk::GetIndexType(drawCallParams.type()));
671 }
672 else
673 {
674 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
675 mCurrentElementArrayBufferOffset + offset,
676 gl_vk::GetIndexType(drawCallParams.type()));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400677 }
678
Luc Ferron49aacad2018-06-12 08:33:59 -0400679 mLastIndexBufferOffset = offset;
Jamie Madill316c6062018-05-29 10:49:45 -0400680
681 const gl::State &glState = context->getGLState();
682 vk::CommandGraphResource *drawFramebuffer = vk::GetImpl(glState.getDrawFramebuffer());
Jamie Madill21061022018-07-12 23:56:30 -0400683 updateElementArrayBufferReadDependency(drawFramebuffer,
684 contextVk->getRenderer()->getCurrentQueueSerial());
Jamie Madillc3755fc2018-04-05 08:39:13 -0400685 mIndexBufferDirty = false;
Luc Ferron983c4292018-04-10 13:05:45 -0400686
687 // If we've had a drawArrays call with a line loop before, we want to make sure this is
688 // invalidated the next time drawArrays is called since we use the same index buffer for
689 // both calls.
690 mLineLoopBufferFirstIndex.reset();
691 mLineLoopBufferLastIndex.reset();
Jamie Madillc3755fc2018-04-05 08:39:13 -0400692 }
693
694 return gl::NoError();
695}
Jamie Madill5a4c9322018-07-16 11:01:58 -0400696
697void VertexArrayVk::updateDefaultAttrib(RendererVk *renderer,
698 size_t attribIndex,
699 VkBuffer bufferHandle,
700 uint32_t offset)
701{
702 if (!mState.getEnabledAttributesMask().test(attribIndex))
703 {
704 mCurrentArrayBufferHandles[attribIndex] = bufferHandle;
705 mCurrentArrayBufferOffsets[attribIndex] = offset;
706 mCurrentArrayBufferResources[attribIndex] = nullptr;
707 mCurrentArrayBufferStrides[attribIndex] = 0;
708 mCurrentArrayBufferFormats[attribIndex] =
Jamie Madillba365932018-07-18 17:23:46 -0400709 &renderer->getFormat(angle::FormatID::R32G32B32A32_FIXED);
Jamie Madill5a4c9322018-07-16 11:01:58 -0400710 mDirtyPackedInputs.set(attribIndex);
711 }
712}
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400713} // namespace rx