Use packed enum for DrawElementsType.
The packing and unpacking take a few extra instructions. But it
completely obviates the need for any switches in the validation code.
Speed is slightly faster or the similar depending on the back-end.
Also add gl_angle_ext.xml to GL entry point generator inputs. This was
missing and would cause the code generation to miss certain changes.
Bug: angleproject:2985
Change-Id: I1ea41a71db71135000166ead8305ec42d22ff7b3
Reviewed-on: https://chromium-review.googlesource.com/c/1351729
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 20783fe..26ac068 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -114,7 +114,7 @@
mDrawFramebuffer(nullptr),
mProgram(nullptr),
mLastIndexBufferOffset(0),
- mCurrentDrawElementsType(GL_NONE),
+ mCurrentDrawElementsType(gl::DrawElementsType::InvalidEnum),
mClearColorMask(kAllColorChannelsMask),
mFlipYForCurrentSurface(false),
mDriverUniformsBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, sizeof(DriverUniforms) * 16, true),
@@ -264,7 +264,7 @@
gl::PrimitiveMode mode,
GLint firstVertex,
GLsizei vertexOrIndexCount,
- GLenum indexTypeOrNone,
+ gl::DrawElementsType indexTypeOrNone,
const void *indices,
DirtyBits dirtyBitMask,
vk::CommandBuffer **commandBufferOut)
@@ -313,7 +313,7 @@
angle::Result ContextVk::setupIndexedDraw(const gl::Context *context,
gl::PrimitiveMode mode,
GLsizei indexCount,
- GLenum indexType,
+ gl::DrawElementsType indexType,
const void *indices,
vk::CommandBuffer **commandBufferOut)
{
@@ -338,7 +338,7 @@
mVertexArray->updateCurrentElementArrayBufferOffset(mLastIndexBufferOffset);
}
- if (indexType == GL_UNSIGNED_BYTE && mDirtyBits[DIRTY_BIT_INDEX_BUFFER])
+ if (indexType == gl::DrawElementsType::UnsignedByte && mDirtyBits[DIRTY_BIT_INDEX_BUFFER])
{
ANGLE_TRY(mVertexArray->updateIndexTranslation(this, indexCount, indexType, indices));
}
@@ -352,15 +352,17 @@
gl::PrimitiveMode mode,
GLint firstVertex,
GLsizei vertexOrIndexCount,
- GLenum indexTypeOrNone,
+ gl::DrawElementsType indexTypeOrInvalid,
const void *indices,
vk::CommandBuffer **commandBufferOut)
{
- ANGLE_TRY(mVertexArray->handleLineLoop(this, firstVertex, vertexOrIndexCount, indexTypeOrNone,
- indices));
+ ANGLE_TRY(mVertexArray->handleLineLoop(this, firstVertex, vertexOrIndexCount,
+ indexTypeOrInvalid, indices));
mDirtyBits.set(DIRTY_BIT_INDEX_BUFFER);
- mCurrentDrawElementsType = indexTypeOrNone != GL_NONE ? indexTypeOrNone : GL_UNSIGNED_INT;
- return setupDraw(context, mode, firstVertex, vertexOrIndexCount, indexTypeOrNone, indices,
+ mCurrentDrawElementsType = indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum
+ ? indexTypeOrInvalid
+ : gl::DrawElementsType::UnsignedInt;
+ return setupDraw(context, mode, firstVertex, vertexOrIndexCount, indexTypeOrInvalid, indices,
mIndexedDirtyBitsMask, commandBufferOut);
}
@@ -444,7 +446,7 @@
{
commandBuffer->bindIndexBuffer(mVertexArray->getCurrentElementArrayBufferHandle(),
mVertexArray->getCurrentElementArrayBufferOffset(),
- gl_vk::GetIndexType(mCurrentDrawElementsType));
+ gl_vk::kIndexTypeMap[mCurrentDrawElementsType]);
vk::BufferHelper *elementArrayBuffer = mVertexArray->getCurrentElementArrayBuffer();
if (elementArrayBuffer)
@@ -491,13 +493,14 @@
if (mode == gl::PrimitiveMode::LineLoop)
{
- ANGLE_TRY(setupLineLoopDraw(context, mode, first, count, GL_NONE, nullptr, &commandBuffer));
+ ANGLE_TRY(setupLineLoopDraw(context, mode, first, count, gl::DrawElementsType::InvalidEnum,
+ nullptr, &commandBuffer));
vk::LineLoopHelper::Draw(clampedVertexCount, commandBuffer);
}
else
{
- ANGLE_TRY(setupDraw(context, mode, first, count, GL_NONE, nullptr, mNonIndexedDirtyBitsMask,
- &commandBuffer));
+ ANGLE_TRY(setupDraw(context, mode, first, count, gl::DrawElementsType::InvalidEnum, nullptr,
+ mNonIndexedDirtyBitsMask, &commandBuffer));
commandBuffer->draw(clampedVertexCount, 1, first, 0);
}
@@ -517,7 +520,7 @@
angle::Result ContextVk::drawElements(const gl::Context *context,
gl::PrimitiveMode mode,
GLsizei count,
- GLenum type,
+ gl::DrawElementsType type,
const void *indices)
{
vk::CommandBuffer *commandBuffer = nullptr;
@@ -538,7 +541,7 @@
angle::Result ContextVk::drawElementsInstanced(const gl::Context *context,
gl::PrimitiveMode mode,
GLsizei count,
- GLenum type,
+ gl::DrawElementsType type,
const void *indices,
GLsizei instances)
{
@@ -551,7 +554,7 @@
GLuint start,
GLuint end,
GLsizei count,
- GLenum type,
+ gl::DrawElementsType type,
const void *indices)
{
ANGLE_VK_UNREACHABLE(this);
@@ -573,7 +576,7 @@
angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
gl::PrimitiveMode mode,
- GLenum type,
+ gl::DrawElementsType type,
const void *indirect)
{
ANGLE_VK_UNREACHABLE(this);
@@ -1159,9 +1162,9 @@
static_cast<float>(mDrawFramebuffer->getState().getDimensions().height) * 0.5f;
// Allocate a new region in the dynamic buffer.
- uint8_t *ptr = nullptr;
- VkBuffer buffer = VK_NULL_HANDLE;
- VkDeviceSize offset = 0;
+ uint8_t *ptr = nullptr;
+ VkBuffer buffer = VK_NULL_HANDLE;
+ VkDeviceSize offset = 0;
ANGLE_TRY(mDriverUniformsBuffer.allocate(this, sizeof(DriverUniforms), &ptr, &buffer, &offset,
nullptr));
float scaleY = isViewportFlipEnabledForDrawFBO() ? -1.0f : 1.0f;