blob: f27f898d2cb28d1bb77398d359eb7290bc7ddf50 [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;
Frank Henigman419acc82018-06-24 19:57:31 -0400125 ANGLE_TRY(mDynamicVertexData.allocate(contextVk, bytesAllocated, &dst,
Jamie Madill4c310832018-08-29 13:43:17 -0400126 &mCurrentArrayBufferHandles[attribIndex],
127 &mCurrentArrayBufferOffsets[attribIndex], nullptr));
Frank Henigman419acc82018-06-24 19:57:31 -0400128 dst += drawCallParams.firstVertex() * mCurrentArrayBufferStrides[attribIndex];
Frank Henigman419acc82018-06-24 19:57:31 -0400129 mCurrentArrayBufferFormats[attribIndex]->vertexLoadFunction(
130 src, binding.getStride(), drawCallParams.vertexCount(), dst);
Frank Henigman17448952017-01-05 15:48:26 -0500131 }
132
Jamie Madill21061022018-07-12 23:56:30 -0400133 ANGLE_TRY(mDynamicVertexData.flush(contextVk));
134 mDynamicVertexData.releaseRetainedBuffers(contextVk->getRenderer());
135 return angle::Result::Continue();
Jamie Madillc3755fc2018-04-05 08:39:13 -0400136}
137
Jamie Madill21061022018-07-12 23:56:30 -0400138angle::Result VertexArrayVk::streamIndexData(ContextVk *contextVk,
139 const gl::DrawCallParams &drawCallParams)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400140{
141 ASSERT(!mState.getElementArrayBuffer().get());
142
Jamie Madillc3755fc2018-04-05 08:39:13 -0400143 const GLsizei amount = sizeof(GLushort) * drawCallParams.indexCount();
144 GLubyte *dst = nullptr;
145
Jamie Madill21061022018-07-12 23:56:30 -0400146 ANGLE_TRY(mDynamicIndexData.allocate(contextVk, amount, &dst, &mCurrentElementArrayBufferHandle,
Jamie Madill4c310832018-08-29 13:43:17 -0400147 &mCurrentElementArrayBufferOffset, nullptr));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400148 if (drawCallParams.type() == GL_UNSIGNED_BYTE)
149 {
150 // Unsigned bytes don't have direct support in Vulkan so we have to expand the
151 // memory to a GLushort.
152 const GLubyte *in = static_cast<const GLubyte *>(drawCallParams.indices());
153 GLushort *expandedDst = reinterpret_cast<GLushort *>(dst);
154 for (GLsizei index = 0; index < drawCallParams.indexCount(); index++)
155 {
156 expandedDst[index] = static_cast<GLushort>(in[index]);
157 }
158 }
159 else
160 {
161 memcpy(dst, drawCallParams.indices(), amount);
162 }
Jamie Madill21061022018-07-12 23:56:30 -0400163 ANGLE_TRY(mDynamicIndexData.flush(contextVk));
164 mDynamicIndexData.releaseRetainedBuffers(contextVk->getRenderer());
Jamie Madill21061022018-07-12 23:56:30 -0400165 return angle::Result::Continue();
Frank Henigman17448952017-01-05 15:48:26 -0500166}
167
Frank Henigmane4523822018-07-19 16:10:53 -0400168// We assume the buffer is completely full of the same kind of data and convert
169// and/or align it as we copy it to a DynamicBuffer. The assumption could be wrong
170// but the alternative of copying it piecemeal on each draw would have a lot more
171// overhead.
172angle::Result VertexArrayVk::convertVertexBuffer(ContextVk *context,
173 BufferVk *srcBuffer,
174 const gl::VertexBinding &binding,
175 size_t attribIndex)
176{
177
178 // Preparation for mapping source buffer.
179 ANGLE_TRY(context->getRenderer()->finish(context));
180
181 unsigned srcFormatSize = mCurrentArrayBufferFormats[attribIndex]->angleFormat().pixelBytes;
182 unsigned dstFormatSize = mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
183
184 // Bytes usable for vertex data.
185 GLint64 bytes = srcBuffer->getSize() - binding.getOffset();
186 if (bytes < srcFormatSize)
187 return angle::Result::Continue();
188
189 // Count the last vertex. It may occupy less than a full stride.
190 size_t numVertices = 1;
191 bytes -= srcFormatSize;
192
193 // Count how many strides fit remaining space.
194 if (bytes > 0)
195 numVertices += static_cast<size_t>(bytes) / binding.getStride();
196
197 void *src = nullptr;
198 uint8_t *dst = nullptr;
Frank Henigmane4523822018-07-19 16:10:53 -0400199
200 ANGLE_TRY(mCurrentArrayBufferConversion[attribIndex].allocate(
201 context, numVertices * dstFormatSize, &dst, &mCurrentArrayBufferHandles[attribIndex],
Jamie Madill4c310832018-08-29 13:43:17 -0400202 &mCurrentArrayBufferOffsets[attribIndex], nullptr));
Frank Henigmane4523822018-07-19 16:10:53 -0400203 ANGLE_TRY(srcBuffer->mapImpl(context, &src));
204 mCurrentArrayBufferFormats[attribIndex]->vertexLoadFunction(
205 static_cast<const uint8_t *>(src) + binding.getOffset(), binding.getStride(), numVertices,
206 dst);
207 ANGLE_TRY(srcBuffer->unmapImpl(context));
208 ANGLE_TRY(mCurrentArrayBufferConversion[attribIndex].flush(context));
209
210 mCurrentArrayBufferConversionCanRelease[attribIndex] = true;
Frank Henigmane4523822018-07-19 16:10:53 -0400211 mCurrentArrayBufferStrides[attribIndex] = dstFormatSize;
212
213 return angle::Result::Continue();
214}
215
216void VertexArrayVk::ensureConversionReleased(RendererVk *renderer, size_t attribIndex)
217{
218 if (mCurrentArrayBufferConversionCanRelease[attribIndex])
219 {
220 mCurrentArrayBufferConversion[attribIndex].release(renderer);
221 mCurrentArrayBufferConversionCanRelease[attribIndex] = false;
222 }
223}
224
225#define ANGLE_VERTEX_DIRTY_ATTRIB_FUNC(INDEX) \
226 case gl::VertexArray::DIRTY_BIT_ATTRIB_0 + INDEX: \
227 ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
228 bindings[attribs[INDEX].bindingIndex], INDEX)); \
229 invalidatePipeline = true; \
Jamie Madilla56467e2018-04-11 16:19:41 -0400230 break;
231
Frank Henigmane4523822018-07-19 16:10:53 -0400232#define ANGLE_VERTEX_DIRTY_BINDING_FUNC(INDEX) \
233 case gl::VertexArray::DIRTY_BIT_BINDING_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_BUFFER_DATA_FUNC(INDEX) \
240 case gl::VertexArray::DIRTY_BIT_BUFFER_DATA_0 + INDEX: \
241 ANGLE_TRY(syncDirtyAttrib(contextVk, attribs[INDEX], \
242 bindings[attribs[INDEX].bindingIndex], INDEX)); \
Jamie Madilla56467e2018-04-11 16:19:41 -0400243 break;
244
Frank Henigman0af5b862018-03-27 20:19:33 -0400245gl::Error VertexArrayVk::syncState(const gl::Context *context,
246 const gl::VertexArray::DirtyBits &dirtyBits,
247 const gl::VertexArray::DirtyAttribBitsArray &attribBits,
248 const gl::VertexArray::DirtyBindingBitsArray &bindingBits)
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400249{
250 ASSERT(dirtyBits.any());
Jamie Madill72106562017-03-24 14:18:50 -0400251
Jamie Madillc3755fc2018-04-05 08:39:13 -0400252 bool invalidatePipeline = false;
253
Jamie Madill5a4c9322018-07-16 11:01:58 -0400254 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madillbd159f02017-10-09 19:39:06 -0400255
256 // Rebuild current attribute buffers cache. This will fail horribly if the buffer changes.
257 // TODO(jmadill): Handle buffer storage changes.
258 const auto &attribs = mState.getVertexAttributes();
259 const auto &bindings = mState.getVertexBindings();
260
Jamie Madill09463932018-04-04 05:26:59 -0400261 for (size_t dirtyBit : dirtyBits)
Jamie Madillbd159f02017-10-09 19:39:06 -0400262 {
Jamie Madill09463932018-04-04 05:26:59 -0400263 switch (dirtyBit)
Jamie Madillda854a22017-11-30 17:24:21 -0500264 {
Jamie Madill09463932018-04-04 05:26:59 -0400265 case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER:
Jamie Madillda854a22017-11-30 17:24:21 -0500266 {
Jamie Madill09463932018-04-04 05:26:59 -0400267 gl::Buffer *bufferGL = mState.getElementArrayBuffer().get();
268 if (bufferGL)
269 {
Jamie Madillc3755fc2018-04-05 08:39:13 -0400270 BufferVk *bufferVk = vk::GetImpl(bufferGL);
271 mCurrentElementArrayBufferResource = bufferVk;
272 mCurrentElementArrayBufferHandle = bufferVk->getVkBuffer().getHandle();
Jamie Madill09463932018-04-04 05:26:59 -0400273 }
274 else
275 {
276 mCurrentElementArrayBufferResource = nullptr;
Jamie Madillc3755fc2018-04-05 08:39:13 -0400277 mCurrentElementArrayBufferHandle = VK_NULL_HANDLE;
Jamie Madill09463932018-04-04 05:26:59 -0400278 }
Luc Ferron387b3b32018-05-28 10:11:57 -0400279
280 mCurrentElementArrayBufferOffset = 0;
281 mLineLoopBufferFirstIndex.reset();
282 mLineLoopBufferLastIndex.reset();
Jamie Madillb8e39662018-04-04 11:41:42 -0400283 mIndexBufferDirty = true;
284 mDirtyLineLoopTranslation = true;
Jamie Madill09463932018-04-04 05:26:59 -0400285 break;
Jamie Madillda854a22017-11-30 17:24:21 -0500286 }
Jamie Madill09463932018-04-04 05:26:59 -0400287
288 case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA:
Jamie Madillc3755fc2018-04-05 08:39:13 -0400289 mLineLoopBufferFirstIndex.reset();
290 mLineLoopBufferLastIndex.reset();
Jamie Madillb8e39662018-04-04 11:41:42 -0400291 mDirtyLineLoopTranslation = true;
Jamie Madill09463932018-04-04 05:26:59 -0400292 break;
293
Jamie Madilla56467e2018-04-11 16:19:41 -0400294 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_ATTRIB_FUNC);
295 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_BINDING_FUNC);
296 ANGLE_VERTEX_INDEX_CASES(ANGLE_VERTEX_DIRTY_BUFFER_DATA_FUNC);
297
Jamie Madill09463932018-04-04 05:26:59 -0400298 default:
Jamie Madilla56467e2018-04-11 16:19:41 -0400299 UNREACHABLE();
Jamie Madill09463932018-04-04 05:26:59 -0400300 break;
Jamie Madillbd159f02017-10-09 19:39:06 -0400301 }
302 }
Frank Henigman0af5b862018-03-27 20:19:33 -0400303
Jamie Madillc3755fc2018-04-05 08:39:13 -0400304 if (invalidatePipeline)
305 {
306 mVertexBuffersDirty = true;
307 contextVk->invalidateCurrentPipeline();
308 }
309
Frank Henigman0af5b862018-03-27 20:19:33 -0400310 return gl::NoError();
Jamie Madillbd159f02017-10-09 19:39:06 -0400311}
312
Frank Henigmane4523822018-07-19 16:10:53 -0400313angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
314 const gl::VertexAttribute &attrib,
315 const gl::VertexBinding &binding,
316 size_t attribIndex)
Jamie Madilla56467e2018-04-11 16:19:41 -0400317{
318 // Invalidate the input description for pipelines.
319 mDirtyPackedInputs.set(attribIndex);
320
Frank Henigman67c388e2018-07-19 19:16:11 -0400321 RendererVk *renderer = contextVk->getRenderer();
Frank Henigmane4523822018-07-19 16:10:53 -0400322 bool releaseConversion = true;
Jamie Madill5a4c9322018-07-16 11:01:58 -0400323
Jamie Madilla56467e2018-04-11 16:19:41 -0400324 if (attrib.enabled)
325 {
Frank Henigman67c388e2018-07-19 19:16:11 -0400326 gl::Buffer *bufferGL = binding.getBuffer().get();
Frank Henigman419acc82018-06-24 19:57:31 -0400327 mCurrentArrayBufferFormats[attribIndex] = &renderer->getFormat(GetVertexFormatID(attrib));
Frank Henigmane4523822018-07-19 16:10:53 -0400328
Jamie Madilla56467e2018-04-11 16:19:41 -0400329 if (bufferGL)
330 {
Frank Henigmane4523822018-07-19 16:10:53 -0400331 BufferVk *bufferVk = vk::GetImpl(bufferGL);
332 unsigned componentSize =
333 mCurrentArrayBufferFormats[attribIndex]->angleFormat().pixelBytes / attrib.size;
Frank Henigman419acc82018-06-24 19:57:31 -0400334
Frank Henigmane4523822018-07-19 16:10:53 -0400335 if (mCurrentArrayBufferFormats[attribIndex]->vertexLoadRequiresConversion ||
336 !BindingIsAligned(binding, componentSize))
337 {
338 ANGLE_TRY(convertVertexBuffer(contextVk, bufferVk, binding, attribIndex));
339
340 mCurrentArrayBufferConversion[attribIndex].releaseRetainedBuffers(renderer);
341 mCurrentArrayBufferResources[attribIndex] = nullptr;
342 releaseConversion = false;
343 }
344 else
345 {
346 mCurrentArrayBufferResources[attribIndex] = bufferVk;
347 mCurrentArrayBufferHandles[attribIndex] = bufferVk->getVkBuffer().getHandle();
348 mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
349 mCurrentArrayBufferStrides[attribIndex] = binding.getStride();
350 }
Jamie Madilla56467e2018-04-11 16:19:41 -0400351 }
352 else
353 {
354 mCurrentArrayBufferResources[attribIndex] = nullptr;
355 mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
Luc Ferronfa5d84b2018-06-28 10:40:04 -0400356 mCurrentArrayBufferOffsets[attribIndex] = 0;
Frank Henigman419acc82018-06-24 19:57:31 -0400357 mCurrentArrayBufferStrides[attribIndex] =
Frank Henigmane4523822018-07-19 16:10:53 -0400358 mCurrentArrayBufferFormats[attribIndex]->bufferFormat().pixelBytes;
Jamie Madilla56467e2018-04-11 16:19:41 -0400359 }
Jamie Madilla56467e2018-04-11 16:19:41 -0400360 }
361 else
362 {
Jamie Madill5a4c9322018-07-16 11:01:58 -0400363 contextVk->invalidateDefaultAttribute(attribIndex);
364
365 // These will be filled out by the ContextVk.
366 mCurrentArrayBufferResources[attribIndex] = nullptr;
367 mCurrentArrayBufferHandles[attribIndex] = VK_NULL_HANDLE;
368 mCurrentArrayBufferOffsets[attribIndex] = 0;
369 mCurrentArrayBufferStrides[attribIndex] = 0;
370 mCurrentArrayBufferFormats[attribIndex] =
Jamie Madillba365932018-07-18 17:23:46 -0400371 &renderer->getFormat(angle::FormatID::R32G32B32A32_FLOAT);
Jamie Madilla56467e2018-04-11 16:19:41 -0400372 }
Frank Henigmane4523822018-07-19 16:10:53 -0400373
374 if (releaseConversion)
375 ensureConversionReleased(renderer, attribIndex);
376
377 return angle::Result::Continue();
Jamie Madilla56467e2018-04-11 16:19:41 -0400378}
379
Jamie Madill316c6062018-05-29 10:49:45 -0400380void VertexArrayVk::updateArrayBufferReadDependencies(vk::CommandGraphResource *drawFramebuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400381 const gl::AttributesMask &activeAttribsMask,
382 Serial serial)
Jamie Madillbd159f02017-10-09 19:39:06 -0400383{
Jamie Madillda854a22017-11-30 17:24:21 -0500384 // Handle the bound array buffers.
Jamie Madillc3755fc2018-04-05 08:39:13 -0400385 for (size_t attribIndex : activeAttribsMask)
Jamie Madillbd159f02017-10-09 19:39:06 -0400386 {
Frank Henigman17448952017-01-05 15:48:26 -0500387 if (mCurrentArrayBufferResources[attribIndex])
Jamie Madill316c6062018-05-29 10:49:45 -0400388 mCurrentArrayBufferResources[attribIndex]->addReadDependency(drawFramebuffer);
Jamie Madillda854a22017-11-30 17:24:21 -0500389 }
Jamie Madillc3755fc2018-04-05 08:39:13 -0400390}
Jamie Madillda854a22017-11-30 17:24:21 -0500391
Jamie Madill316c6062018-05-29 10:49:45 -0400392void VertexArrayVk::updateElementArrayBufferReadDependency(
393 vk::CommandGraphResource *drawFramebuffer,
394 Serial serial)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400395{
Jamie Madillda854a22017-11-30 17:24:21 -0500396 // Handle the bound element array buffer.
Jamie Madillc3755fc2018-04-05 08:39:13 -0400397 if (mCurrentElementArrayBufferResource)
Jamie Madillda854a22017-11-30 17:24:21 -0500398 {
Jamie Madill316c6062018-05-29 10:49:45 -0400399 mCurrentElementArrayBufferResource->addReadDependency(drawFramebuffer);
Jamie Madillbd159f02017-10-09 19:39:06 -0400400 }
Jamie Madilldd43e6c2017-03-24 14:18:49 -0400401}
402
Frank Henigman419acc82018-06-24 19:57:31 -0400403void VertexArrayVk::getPackedInputDescriptions(vk::PipelineDesc *pipelineDesc)
Jamie Madillebf72992017-10-13 14:09:45 -0400404{
Frank Henigman419acc82018-06-24 19:57:31 -0400405 updatePackedInputDescriptions();
Jamie Madill112a3a82018-01-23 13:04:06 -0500406 pipelineDesc->updateVertexInputInfo(mPackedInputBindings, mPackedInputAttributes);
Jamie Madillebf72992017-10-13 14:09:45 -0400407}
408
Frank Henigman419acc82018-06-24 19:57:31 -0400409void VertexArrayVk::updatePackedInputDescriptions()
Jamie Madillebf72992017-10-13 14:09:45 -0400410{
Jamie Madill112a3a82018-01-23 13:04:06 -0500411 if (!mDirtyPackedInputs.any())
Jamie Madillebf72992017-10-13 14:09:45 -0400412 {
413 return;
414 }
415
416 const auto &attribs = mState.getVertexAttributes();
417 const auto &bindings = mState.getVertexBindings();
418
Jamie Madill112a3a82018-01-23 13:04:06 -0500419 for (auto attribIndex : mDirtyPackedInputs)
Jamie Madillebf72992017-10-13 14:09:45 -0400420 {
421 const auto &attrib = attribs[attribIndex];
422 const auto &binding = bindings[attrib.bindingIndex];
423 if (attrib.enabled)
424 {
Frank Henigman419acc82018-06-24 19:57:31 -0400425 updatePackedInputInfo(static_cast<uint32_t>(attribIndex), binding, attrib);
Jamie Madillebf72992017-10-13 14:09:45 -0400426 }
427 else
428 {
Jamie Madill5a4c9322018-07-16 11:01:58 -0400429 vk::PackedVertexInputBindingDesc &bindingDesc = mPackedInputBindings[attribIndex];
430 bindingDesc.stride = 0;
431 bindingDesc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
432
433 vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
434 attribDesc.format = static_cast<uint16_t>(VK_FORMAT_R32G32B32A32_SFLOAT);
435 attribDesc.location = static_cast<uint16_t>(attribIndex);
436 attribDesc.offset = 0;
Jamie Madillebf72992017-10-13 14:09:45 -0400437 }
438 }
439
Jamie Madill112a3a82018-01-23 13:04:06 -0500440 mDirtyPackedInputs.reset();
441}
442
Frank Henigman419acc82018-06-24 19:57:31 -0400443void VertexArrayVk::updatePackedInputInfo(uint32_t attribIndex,
Jamie Madill112a3a82018-01-23 13:04:06 -0500444 const gl::VertexBinding &binding,
445 const gl::VertexAttribute &attrib)
446{
447 vk::PackedVertexInputBindingDesc &bindingDesc = mPackedInputBindings[attribIndex];
448
Frank Henigman419acc82018-06-24 19:57:31 -0400449 bindingDesc.stride = static_cast<uint16_t>(mCurrentArrayBufferStrides[attribIndex]);
Jamie Madill112a3a82018-01-23 13:04:06 -0500450 bindingDesc.inputRate = static_cast<uint16_t>(
451 binding.getDivisor() > 0 ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX);
452
Frank Henigman419acc82018-06-24 19:57:31 -0400453 VkFormat vkFormat = mCurrentArrayBufferFormats[attribIndex]->vkBufferFormat;
Jamie Madill112a3a82018-01-23 13:04:06 -0500454 ASSERT(vkFormat <= std::numeric_limits<uint16_t>::max());
Frank Henigman8c379f32018-06-21 19:55:05 -0400455 if (vkFormat == VK_FORMAT_UNDEFINED)
456 {
457 // TODO(fjhenigman): Add support for vertex data format. anglebug.com/2405
458 UNIMPLEMENTED();
459 }
Jamie Madill112a3a82018-01-23 13:04:06 -0500460
461 vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
462 attribDesc.format = static_cast<uint16_t>(vkFormat);
463 attribDesc.location = static_cast<uint16_t>(attribIndex);
Luc Ferronfa5d84b2018-06-28 10:40:04 -0400464 attribDesc.offset = static_cast<uint32_t>(attrib.relativeOffset);
Jamie Madillebf72992017-10-13 14:09:45 -0400465}
466
Jamie Madillc3755fc2018-04-05 08:39:13 -0400467gl::Error VertexArrayVk::drawArrays(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400468 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400469 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400470 bool newCommandBuffer)
471{
Jamie Madillc3755fc2018-04-05 08:39:13 -0400472 ASSERT(commandBuffer->valid());
473
Jamie Madill21061022018-07-12 23:56:30 -0400474 ContextVk *contextVk = vk::GetImpl(context);
475
476 ANGLE_TRY(onDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400477
Jamie Madill18e323a2018-05-11 16:54:17 -0400478 // Note: Vertex indexes can be arbitrarily large.
479 uint32_t clampedVertexCount = drawCallParams.getClampedVertexCount<uint32_t>();
480
Jamie Madill493f9572018-05-24 19:52:15 -0400481 if (drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400482 {
Jamie Madill18e323a2018-05-11 16:54:17 -0400483 commandBuffer->draw(clampedVertexCount, 1, drawCallParams.firstVertex(), 0);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400484 return gl::NoError();
485 }
486
487 // Handle GL_LINE_LOOP drawArrays.
Jamie Madill18e323a2018-05-11 16:54:17 -0400488 size_t lastVertex = static_cast<size_t>(drawCallParams.firstVertex() + clampedVertexCount);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400489 if (!mLineLoopBufferFirstIndex.valid() || !mLineLoopBufferLastIndex.valid() ||
490 mLineLoopBufferFirstIndex != drawCallParams.firstVertex() ||
491 mLineLoopBufferLastIndex != lastVertex)
492 {
Jamie Madill21061022018-07-12 23:56:30 -0400493 ANGLE_TRY(mLineLoopHelper.getIndexBufferForDrawArrays(contextVk, drawCallParams,
Jamie Madill22f12fe2018-04-08 14:23:40 -0400494 &mCurrentElementArrayBufferHandle,
495 &mCurrentElementArrayBufferOffset));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400496
497 mLineLoopBufferFirstIndex = drawCallParams.firstVertex();
498 mLineLoopBufferLastIndex = lastVertex;
499 }
500
501 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
502 mCurrentElementArrayBufferOffset, VK_INDEX_TYPE_UINT32);
503
Jamie Madill18e323a2018-05-11 16:54:17 -0400504 vk::LineLoopHelper::Draw(clampedVertexCount, commandBuffer);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400505
506 return gl::NoError();
507}
508
509gl::Error VertexArrayVk::drawElements(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400510 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400511 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400512 bool newCommandBuffer)
513{
Jamie Madillc3755fc2018-04-05 08:39:13 -0400514 ASSERT(commandBuffer->valid());
515
Jamie Madill21061022018-07-12 23:56:30 -0400516 ContextVk *contextVk = vk::GetImpl(context);
517
Jamie Madill493f9572018-05-24 19:52:15 -0400518 if (drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400519 {
Jamie Madill21061022018-07-12 23:56:30 -0400520 ANGLE_TRY(onIndexedDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400521 commandBuffer->drawIndexed(drawCallParams.indexCount(), 1, 0, 0, 0);
522 return gl::NoError();
523 }
524
525 // Handle GL_LINE_LOOP drawElements.
Jamie Madillb8e39662018-04-04 11:41:42 -0400526 if (mDirtyLineLoopTranslation)
527 {
Luc Ferrona9120462018-04-12 13:11:03 -0400528 gl::Buffer *elementArrayBuffer = mState.getElementArrayBuffer().get();
529 VkIndexType indexType = gl_vk::GetIndexType(drawCallParams.type());
530
531 if (!elementArrayBuffer)
532 {
533 ANGLE_TRY(mLineLoopHelper.getIndexBufferForClientElementArray(
Jamie Madill21061022018-07-12 23:56:30 -0400534 contextVk, drawCallParams, &mCurrentElementArrayBufferHandle,
Luc Ferron3e313802018-06-11 14:44:33 -0400535 &mCurrentElementArrayBufferOffset));
Luc Ferrona9120462018-04-12 13:11:03 -0400536 }
537 else
538 {
Luc Ferrona4fa9c22018-04-13 07:00:56 -0400539 // When using an element array buffer, 'indices' is an offset to the first element.
540 intptr_t offset = reinterpret_cast<intptr_t>(drawCallParams.indices());
Luc Ferrona9120462018-04-12 13:11:03 -0400541 BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer);
542 ANGLE_TRY(mLineLoopHelper.getIndexBufferForElementArrayBuffer(
Jamie Madill21061022018-07-12 23:56:30 -0400543 contextVk, elementArrayBufferVk, indexType, drawCallParams.indexCount(), offset,
Luc Ferrona9120462018-04-12 13:11:03 -0400544 &mCurrentElementArrayBufferHandle, &mCurrentElementArrayBufferOffset));
545 }
Jamie Madillb8e39662018-04-04 11:41:42 -0400546 }
Jamie Madillc3755fc2018-04-05 08:39:13 -0400547
Jamie Madill21061022018-07-12 23:56:30 -0400548 ANGLE_TRY(onIndexedDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Jamie Madill22f12fe2018-04-08 14:23:40 -0400549 vk::LineLoopHelper::Draw(drawCallParams.indexCount(), commandBuffer);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400550
551 return gl::NoError();
552}
553
554gl::Error VertexArrayVk::onDraw(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400555 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400556 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400557 bool newCommandBuffer)
558{
Jamie Madill21061022018-07-12 23:56:30 -0400559 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madillc3755fc2018-04-05 08:39:13 -0400560 const gl::State &state = context->getGLState();
561 const gl::Program *programGL = state.getProgram();
Jamie Madilldc358af2018-07-31 11:22:13 -0400562 const gl::AttributesMask &clientAttribs = context->getStateCache().getActiveClientAttribsMask();
Jamie Madillc3755fc2018-04-05 08:39:13 -0400563 uint32_t maxAttrib = programGL->getState().getMaxActiveAttribLocation();
564
Jamie Madillbcef3222018-04-13 15:19:11 -0400565 if (clientAttribs.any())
Jamie Madillc3755fc2018-04-05 08:39:13 -0400566 {
Jamie Madilldc358af2018-07-31 11:22:13 -0400567 ANGLE_TRY(drawCallParams.ensureIndexRangeResolved(context));
568 ANGLE_TRY(streamVertexData(contextVk, clientAttribs, drawCallParams));
569 commandBuffer->bindVertexBuffers(0, maxAttrib, mCurrentArrayBufferHandles.data(),
570 mCurrentArrayBufferOffsets.data());
Jamie Madillc3755fc2018-04-05 08:39:13 -0400571 }
572 else if (mVertexBuffersDirty || newCommandBuffer)
573 {
Luc Ferron44162472018-04-06 13:20:45 -0400574 if (maxAttrib > 0)
575 {
Luc Ferron44162472018-04-06 13:20:45 -0400576 commandBuffer->bindVertexBuffers(0, maxAttrib, mCurrentArrayBufferHandles.data(),
577 mCurrentArrayBufferOffsets.data());
Jamie Madill316c6062018-05-29 10:49:45 -0400578
Jamie Madilldc358af2018-07-31 11:22:13 -0400579 const gl::AttributesMask &bufferedAttribs =
580 context->getStateCache().getActiveBufferedAttribsMask();
581
Jamie Madill316c6062018-05-29 10:49:45 -0400582 vk::CommandGraphResource *drawFramebuffer = vk::GetImpl(state.getDrawFramebuffer());
Jamie Madilldc358af2018-07-31 11:22:13 -0400583 updateArrayBufferReadDependencies(drawFramebuffer, bufferedAttribs,
Jamie Madill21061022018-07-12 23:56:30 -0400584 contextVk->getRenderer()->getCurrentQueueSerial());
Luc Ferron44162472018-04-06 13:20:45 -0400585 }
Luc Ferronc1e02682018-04-11 11:02:55 -0400586
Jamie Madillc3755fc2018-04-05 08:39:13 -0400587 mVertexBuffersDirty = false;
Luc Ferronc1e02682018-04-11 11:02:55 -0400588
589 // This forces the binding to happen if we follow a drawElement call from a drawArrays call.
590 mIndexBufferDirty = true;
Luc Ferron983c4292018-04-10 13:05:45 -0400591
592 // If we've had a drawElements call with a line loop before, we want to make sure this is
593 // invalidated the next time drawElements is called since we use the same index buffer for
594 // both calls.
595 mDirtyLineLoopTranslation = true;
Jamie Madillc3755fc2018-04-05 08:39:13 -0400596 }
597
598 return gl::NoError();
599}
600
601gl::Error VertexArrayVk::onIndexedDraw(const gl::Context *context,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400602 const gl::DrawCallParams &drawCallParams,
Jamie Madill316c6062018-05-29 10:49:45 -0400603 vk::CommandBuffer *commandBuffer,
Jamie Madillc3755fc2018-04-05 08:39:13 -0400604 bool newCommandBuffer)
605{
Jamie Madill21061022018-07-12 23:56:30 -0400606 ContextVk *contextVk = vk::GetImpl(context);
607 ANGLE_TRY(onDraw(context, drawCallParams, commandBuffer, newCommandBuffer));
Frank Henigman419acc82018-06-24 19:57:31 -0400608 bool isLineLoop = drawCallParams.mode() == gl::PrimitiveMode::LineLoop;
Luc Ferron6ed167a2018-06-13 13:45:55 -0400609 gl::Buffer *glBuffer = mState.getElementArrayBuffer().get();
610 uintptr_t offset =
611 glBuffer && !isLineLoop ? reinterpret_cast<uintptr_t>(drawCallParams.indices()) : 0;
Jamie Madillc3755fc2018-04-05 08:39:13 -0400612
Luc Ferron6ed167a2018-06-13 13:45:55 -0400613 if (!glBuffer && !isLineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400614 {
615 ANGLE_TRY(drawCallParams.ensureIndexRangeResolved(context));
Jamie Madill21061022018-07-12 23:56:30 -0400616 ANGLE_TRY(streamIndexData(contextVk, drawCallParams));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400617 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
618 mCurrentElementArrayBufferOffset,
619 gl_vk::GetIndexType(drawCallParams.type()));
620 }
Luc Ferron49aacad2018-06-12 08:33:59 -0400621 else if (mIndexBufferDirty || newCommandBuffer || offset != mLastIndexBufferOffset)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400622 {
Luc Ferron3e313802018-06-11 14:44:33 -0400623 if (drawCallParams.type() == GL_UNSIGNED_BYTE &&
624 drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
Jamie Madillc3755fc2018-04-05 08:39:13 -0400625 {
Luc Ferron6ed167a2018-06-13 13:45:55 -0400626 // Unsigned bytes don't have direct support in Vulkan so we have to expand the
627 // memory to a GLushort.
628 BufferVk *bufferVk = vk::GetImpl(glBuffer);
629 void *srcDataMapping = nullptr;
630 ASSERT(!glBuffer->isMapped());
Jamie Madill21061022018-07-12 23:56:30 -0400631 ANGLE_TRY(bufferVk->mapImpl(contextVk, &srcDataMapping));
Rafael Cintron05a449a2018-06-20 18:08:04 -0700632 uint8_t *srcData = static_cast<uint8_t *>(srcDataMapping);
Luc Ferron6ed167a2018-06-13 13:45:55 -0400633 intptr_t offsetIntoSrcData = reinterpret_cast<intptr_t>(drawCallParams.indices());
634 srcData += offsetIntoSrcData;
635
636 // Allocate a new buffer that's double the size of the buffer provided by the user to
637 // go from unsigned byte to unsigned short.
638 uint8_t *allocatedData = nullptr;
639 bool newBufferAllocated = false;
Jamie Madilleebe2192018-07-11 09:01:18 -0400640 ANGLE_TRY(mTranslatedByteIndexData.allocate(
Jamie Madill21061022018-07-12 23:56:30 -0400641 contextVk, static_cast<size_t>(bufferVk->getSize()) * 2, &allocatedData,
Jamie Madill4c310832018-08-29 13:43:17 -0400642 &mCurrentElementArrayBufferHandle, &mCurrentElementArrayBufferOffset,
643 &newBufferAllocated));
Luc Ferron6ed167a2018-06-13 13:45:55 -0400644
645 // Expand the source into the destination
646 ASSERT(!context->getGLState().isPrimitiveRestartEnabled());
647 uint16_t *expandedDst = reinterpret_cast<uint16_t *>(allocatedData);
648 for (GLsizei index = 0; index < bufferVk->getSize() - offsetIntoSrcData; index++)
649 {
650 expandedDst[index] = static_cast<GLushort>(srcData[index]);
651 }
652
653 // Make sure our writes are available.
Jamie Madill21061022018-07-12 23:56:30 -0400654 ANGLE_TRY(mTranslatedByteIndexData.flush(contextVk));
Luc Ferron6ed167a2018-06-13 13:45:55 -0400655 GLboolean result = false;
656 ANGLE_TRY(bufferVk->unmap(context, &result));
657
658 // We do not add the offset from the drawCallParams here because we've already copied
659 // the source starting at the offset requested.
660 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
661 mCurrentElementArrayBufferOffset,
662 gl_vk::GetIndexType(drawCallParams.type()));
663 }
664 else
665 {
666 commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
667 mCurrentElementArrayBufferOffset + offset,
668 gl_vk::GetIndexType(drawCallParams.type()));
Jamie Madillc3755fc2018-04-05 08:39:13 -0400669 }
670
Luc Ferron49aacad2018-06-12 08:33:59 -0400671 mLastIndexBufferOffset = offset;
Jamie Madill316c6062018-05-29 10:49:45 -0400672
673 const gl::State &glState = context->getGLState();
674 vk::CommandGraphResource *drawFramebuffer = vk::GetImpl(glState.getDrawFramebuffer());
Jamie Madill21061022018-07-12 23:56:30 -0400675 updateElementArrayBufferReadDependency(drawFramebuffer,
676 contextVk->getRenderer()->getCurrentQueueSerial());
Jamie Madillc3755fc2018-04-05 08:39:13 -0400677 mIndexBufferDirty = false;
Luc Ferron983c4292018-04-10 13:05:45 -0400678
679 // If we've had a drawArrays call with a line loop before, we want to make sure this is
680 // invalidated the next time drawArrays is called since we use the same index buffer for
681 // both calls.
682 mLineLoopBufferFirstIndex.reset();
683 mLineLoopBufferLastIndex.reset();
Jamie Madillc3755fc2018-04-05 08:39:13 -0400684 }
685
686 return gl::NoError();
687}
Jamie Madill5a4c9322018-07-16 11:01:58 -0400688
689void VertexArrayVk::updateDefaultAttrib(RendererVk *renderer,
690 size_t attribIndex,
691 VkBuffer bufferHandle,
692 uint32_t offset)
693{
694 if (!mState.getEnabledAttributesMask().test(attribIndex))
695 {
696 mCurrentArrayBufferHandles[attribIndex] = bufferHandle;
697 mCurrentArrayBufferOffsets[attribIndex] = offset;
698 mCurrentArrayBufferResources[attribIndex] = nullptr;
699 mCurrentArrayBufferStrides[attribIndex] = 0;
700 mCurrentArrayBufferFormats[attribIndex] =
Jamie Madillba365932018-07-18 17:23:46 -0400701 &renderer->getFormat(angle::FormatID::R32G32B32A32_FIXED);
Jamie Madill5a4c9322018-07-16 11:01:58 -0400702 mDirtyPackedInputs.set(attribIndex);
703 }
704}
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400705} // namespace rx