/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "TransformFeedbackData.h" #include "GLcommon/GLEScontext.h" #include "GLcommon/GLSnapshotSerializers.h" TransformFeedbackData::TransformFeedbackData(android::base::Stream* stream) : ObjectData(stream) { if (stream) { loadContainer(stream, m_indexedTransformFeedbackBuffers); } } void TransformFeedbackData::setMaxSize(int maxSize) { m_indexedTransformFeedbackBuffers.resize(maxSize); } void TransformFeedbackData::onSave(android::base::Stream* stream, unsigned int globalName) const { ObjectData::onSave(stream, globalName); saveContainer(stream, m_indexedTransformFeedbackBuffers); } void TransformFeedbackData::restore(ObjectLocalName localName, const getGlobalName_t& getGlobalName) { ObjectData::restore(localName, getGlobalName); int globalName = getGlobalName(NamedObjectType::TRANSFORM_FEEDBACK, localName); GLDispatch& dispatcher = GLEScontext::dispatcher(); dispatcher.glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, globalName); for (unsigned int i = 0; i < m_indexedTransformFeedbackBuffers.size(); i++) { auto& bufferBinding = m_indexedTransformFeedbackBuffers[i]; if (!bufferBinding.buffer) continue; auto bufferName = getGlobalName(NamedObjectType::VERTEXBUFFER, bufferBinding.buffer); if (bufferBinding.isBindBase) { dispatcher.glBindBufferBase(GL_TRANSFORM_FEEDBACK, i, bufferName); } else { dispatcher.glBindBufferRange(GL_TRANSFORM_FEEDBACK, i, bufferName, bufferBinding.offset, bufferBinding.size); } } } void TransformFeedbackData::bindIndexedBuffer(GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size, GLintptr stride, bool isBindBase) { if (index >= m_indexedTransformFeedbackBuffers.size()) { return; } auto& bufferBinding = m_indexedTransformFeedbackBuffers[index]; bufferBinding.buffer = buffer; bufferBinding.offset = offset; bufferBinding.size = size; bufferBinding.stride = stride; bufferBinding.isBindBase = isBindBase; } void TransformFeedbackData::unbindBuffer(GLuint buffer) { for (auto& bufferBinding : m_indexedTransformFeedbackBuffers) { if (bufferBinding.buffer == buffer) { bufferBinding = {}; } } } GLuint TransformFeedbackData::getIndexedBuffer(GLuint index) { return m_indexedTransformFeedbackBuffers[index].buffer; }