blob: 2113fc8ca62b1bbd9c486705f61e7dc019d77a61 [file] [log] [blame]
/*
* Copyright (C) 2011 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 "GLcommon/GLESpointer.h"
#include <stdlib.h>
#include <string.h>
GLenum GLESpointer::getType() const {
return m_type;
}
GLint GLESpointer::getSize() const {
return m_size;
}
GLsizei GLESpointer::getStride() const {
return m_stride;
}
const GLvoid* GLESpointer::getArrayData() const {
return m_data;
}
GLvoid* GLESpointer::getBufferData() const {
return m_buffer
? static_cast<unsigned char*>(m_buffer->getData()) +
m_buffOffset
: nullptr;
}
const GLfloat* GLESpointer::getValues() const {
return m_values;
}
unsigned int GLESpointer::getValueCount() const {
return m_valueCount;
}
const GLvoid* GLESpointer::getData() const {
switch (m_attribType) {
case ARRAY:
return getArrayData();
break;
case BUFFER:
return getBufferData();
break;
case VALUE:
return (GLvoid*)getValues();
break;
}
return nullptr;
}
void GLESpointer::redirectPointerData() {
m_ownData.resize(0);
m_data = getBufferData();
}
GLuint GLESpointer::getBufferName() const {
return m_bufferName;
}
unsigned int GLESpointer::getBufferOffset() const {
return m_buffOffset;
}
bool GLESpointer::isEnable() const {
return m_enabled;
}
bool GLESpointer::isNormalize() const {
return m_normalize;
}
GLESpointer::AttribType GLESpointer::getAttribType() const {
return m_attribType;
}
bool GLESpointer::isIntPointer() const {
return m_isInt;
}
void GLESpointer::enable(bool b) {
m_enabled = b;
}
void GLESpointer::setArray(GLint size,
GLenum type,
GLsizei stride,
const GLvoid* data,
GLsizei dataSize,
bool normalize,
bool isInt) {
m_ownData.clear();
m_size = size;
m_type = type;
m_stride = stride;
m_dataSize = dataSize;
m_data = data;
m_buffer = nullptr;
m_bufferName = 0;
m_buffOffset = 0;
m_normalize = normalize;
m_attribType = ARRAY;
m_isInt = isInt;
}
void GLESpointer::setBuffer(GLint size,
GLenum type,
GLsizei stride,
GLESbuffer* buf,
GLuint bufferName,
int offset,
bool normalize,
bool isInt) {
m_ownData.clear();
m_size = size;
m_type = type;
m_stride = stride;
m_dataSize = 0;
m_data = nullptr;
m_buffer = buf;
m_bufferName = bufferName;
m_buffOffset = offset;
m_normalize = normalize;
m_attribType = BUFFER;
m_isInt = isInt;
}
void GLESpointer::setValue(unsigned int count, const GLfloat* val) {
memcpy(m_values, val, sizeof(GLfloat) * count);
m_valueCount = count;
m_attribType = VALUE;
m_data = nullptr;
m_buffer = nullptr;
}
void GLESpointer::setDivisor(GLuint divisor) {
m_divisor = divisor;
}
void GLESpointer::setBindingIndex(GLuint index) {
m_bindingIndex = index;
}
void GLESpointer::setFormat(GLint size, GLenum type,
bool normalize,
GLuint reloffset,
bool isInt) {
m_size = size;
m_type = type;
m_normalize = normalize;
m_reloffset = reloffset;
m_isInt = isInt;
}
void GLESpointer::getBufferConversions(const RangeList& rl, RangeList& rlOut) {
m_buffer->getConversions(rl, rlOut);
}
GLESpointer::GLESpointer(android::base::Stream* stream) {
onLoad(stream);
}
void GLESpointer::restoreBufferObj(
std::function<GLESbuffer*(GLuint)> getBufferObj) {
if (m_attribType != BUFFER) return;
m_buffer = getBufferObj(m_bufferName);
}
void GLESpointer::onLoad(android::base::Stream* stream) {
m_size = stream->getBe32();
m_type = stream->getBe32();
m_stride = stream->getBe32();
m_enabled = stream->getByte();
m_normalize = stream->getByte();
m_attribType = (GLESpointer::AttribType)stream->getByte();
m_bufferName = stream->getBe32();
if (m_attribType == ARRAY) {
m_dataSize = stream->getBe32();
m_ownData.resize(m_dataSize);
stream->read(m_ownData.data(), m_dataSize);
m_data = m_ownData.data();
}
m_buffOffset = stream->getBe32();
m_isInt = stream->getByte();
m_divisor = stream->getBe32();
m_bindingIndex = stream->getBe32();
m_reloffset = stream->getBe32();
m_valueCount = stream->getBe32();
stream->read(m_values, sizeof(GLfloat) * m_valueCount);
}
void GLESpointer::onSave(android::base::Stream* stream) const {
stream->putBe32(m_size);
stream->putBe32(m_type);
stream->putBe32(m_stride);
stream->putByte(m_enabled);
stream->putByte(m_normalize);
stream->putByte(m_attribType);
stream->putBe32(m_bufferName);
if (m_attribType == ARRAY) {
stream->putBe32(m_dataSize);
stream->write(m_data, m_dataSize);
}
stream->putBe32(m_buffOffset);
stream->putByte(m_isInt);
stream->putBe32(m_divisor);
stream->putBe32(m_bindingIndex);
stream->putBe32(m_reloffset);
stream->putBe32(m_valueCount);
stream->write(m_values, sizeof(GLfloat) * m_valueCount);
}