blob: 3d884f9bab43da83f5d4e01b90febdd1129ea8e7 [file] [log] [blame]
/*
* 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;
}