You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
5.8 KiB
227 lines
5.8 KiB
/*
|
|
* 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);
|
|
}
|