| // |
| // Copyright 2017 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // params: |
| // Parameter wrapper structs for OpenGL ES. These helpers cache re-used values |
| // in entry point routines. |
| |
| #include "libANGLE/params.h" |
| |
| #include "common/utilities.h" |
| #include "libANGLE/Context.h" |
| #include "libANGLE/VertexArray.h" |
| |
| namespace gl |
| { |
| |
| // static |
| constexpr ParamTypeInfo ParamsBase::TypeInfo; |
| constexpr ParamTypeInfo HasIndexRange::TypeInfo; |
| |
| ParamsBase::ParamsBase(Context *context, ...) |
| { |
| } |
| |
| HasIndexRange::HasIndexRange(Context *context, GLsizei count, GLenum type, const void *indices) |
| : ParamsBase(context), mContext(context), mCount(count), mType(type), mIndices(indices) |
| { |
| } |
| |
| const Optional<IndexRange> &HasIndexRange::getIndexRange() const |
| { |
| if (mIndexRange.valid()) |
| { |
| return mIndexRange; |
| } |
| |
| const State &state = mContext->getGLState(); |
| |
| const gl::VertexArray *vao = state.getVertexArray(); |
| gl::Buffer *elementArrayBuffer = vao->getElementArrayBuffer().get(); |
| |
| if (elementArrayBuffer) |
| { |
| uintptr_t offset = reinterpret_cast<uintptr_t>(mIndices); |
| IndexRange indexRange; |
| Error error = |
| elementArrayBuffer->getIndexRange(mType, static_cast<size_t>(offset), mCount, |
| state.isPrimitiveRestartEnabled(), &indexRange); |
| if (error.isError()) |
| { |
| mContext->handleError(error); |
| return mIndexRange; |
| } |
| |
| mIndexRange = indexRange; |
| } |
| else |
| { |
| mIndexRange = ComputeIndexRange(mType, mIndices, mCount, state.isPrimitiveRestartEnabled()); |
| } |
| |
| return mIndexRange; |
| } |
| |
| } // namespace gl |