mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 04:37:48 +02:00
Moving all the variables for the Input stage cache into a struct just like for transformStage
This commit is contained in:
parent
420118e9db
commit
5c9c78e62b
2 changed files with 60 additions and 51 deletions
|
@ -113,15 +113,7 @@ static const GLenum _elementTypeToGLType[NUM_TYPES]= {
|
||||||
|
|
||||||
|
|
||||||
GLBackend::GLBackend() :
|
GLBackend::GLBackend() :
|
||||||
_needInputFormatUpdate(true),
|
_input(),
|
||||||
_inputFormat(0),
|
|
||||||
_inputBuffersState(0),
|
|
||||||
_inputBuffers(_inputBuffersState.size(), BufferPointer(0)),
|
|
||||||
_inputBufferOffsets(_inputBuffersState.size(), 0),
|
|
||||||
_inputBufferStrides(_inputBuffersState.size(), 0),
|
|
||||||
_indexBuffer(0),
|
|
||||||
_indexBufferOffset(0),
|
|
||||||
_inputAttributeActivation(0),
|
|
||||||
_transform()
|
_transform()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -203,9 +195,9 @@ void GLBackend::do_drawIndexed(Batch& batch, uint32 paramOffset) {
|
||||||
uint32 numIndices = batch._params[paramOffset + 1]._uint;
|
uint32 numIndices = batch._params[paramOffset + 1]._uint;
|
||||||
uint32 startIndex = batch._params[paramOffset + 0]._uint;
|
uint32 startIndex = batch._params[paramOffset + 0]._uint;
|
||||||
|
|
||||||
GLenum glType = _elementTypeToGLType[_indexBufferType];
|
GLenum glType = _elementTypeToGLType[_input._indexBufferType];
|
||||||
|
|
||||||
glDrawElements(mode, numIndices, glType, reinterpret_cast<GLvoid*>(startIndex + _indexBufferOffset));
|
glDrawElements(mode, numIndices, glType, reinterpret_cast<GLvoid*>(startIndex + _input._indexBufferOffset));
|
||||||
CHECK_GL_ERROR();
|
CHECK_GL_ERROR();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,9 +212,9 @@ void GLBackend::do_drawIndexedInstanced(Batch& batch, uint32 paramOffset) {
|
||||||
void GLBackend::do_setInputFormat(Batch& batch, uint32 paramOffset) {
|
void GLBackend::do_setInputFormat(Batch& batch, uint32 paramOffset) {
|
||||||
Stream::FormatPointer format = batch._streamFormats.get(batch._params[paramOffset]._uint);
|
Stream::FormatPointer format = batch._streamFormats.get(batch._params[paramOffset]._uint);
|
||||||
|
|
||||||
if (format != _inputFormat) {
|
if (format != _input._format) {
|
||||||
_inputFormat = format;
|
_input._format = format;
|
||||||
_needInputFormatUpdate = true;
|
_input._invalidFormat = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,10 +225,10 @@ void GLBackend::do_setInputBuffer(Batch& batch, uint32 paramOffset) {
|
||||||
uint32 channel = batch._params[paramOffset + 3]._uint;
|
uint32 channel = batch._params[paramOffset + 3]._uint;
|
||||||
|
|
||||||
if (channel < getNumInputBuffers()) {
|
if (channel < getNumInputBuffers()) {
|
||||||
_inputBuffers[channel] = buffer;
|
_input._buffers[channel] = buffer;
|
||||||
_inputBufferOffsets[channel] = offset;
|
_input._bufferOffsets[channel] = offset;
|
||||||
_inputBufferStrides[channel] = stride;
|
_input._bufferStrides[channel] = stride;
|
||||||
_inputBuffersState.set(channel);
|
_input._buffersState.set(channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,14 +244,14 @@ static const GLenum attributeSlotToClassicAttribName[NUM_CLASSIC_ATTRIBS] = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void GLBackend::updateInput() {
|
void GLBackend::updateInput() {
|
||||||
if (_needInputFormatUpdate || _inputBuffersState.any()) {
|
if (_input._invalidFormat || _input._buffersState.any()) {
|
||||||
|
|
||||||
if (_needInputFormatUpdate) {
|
if (_input._invalidFormat) {
|
||||||
InputActivationCache newActivation;
|
InputStageState::ActivationCache newActivation;
|
||||||
|
|
||||||
// Check expected activation
|
// Check expected activation
|
||||||
if (_inputFormat) {
|
if (_input._format) {
|
||||||
const Stream::Format::AttributeMap& attributes = _inputFormat->getAttributes();
|
const Stream::Format::AttributeMap& attributes = _input._format->getAttributes();
|
||||||
for (Stream::Format::AttributeMap::const_iterator it = attributes.begin(); it != attributes.end(); it++) {
|
for (Stream::Format::AttributeMap::const_iterator it = attributes.begin(); it != attributes.end(); it++) {
|
||||||
const Stream::Attribute& attrib = (*it).second;
|
const Stream::Attribute& attrib = (*it).second;
|
||||||
newActivation.set(attrib._slot);
|
newActivation.set(attrib._slot);
|
||||||
|
@ -269,7 +261,7 @@ void GLBackend::updateInput() {
|
||||||
// Manage Activation what was and what is expected now
|
// Manage Activation what was and what is expected now
|
||||||
for (unsigned int i = 0; i < newActivation.size(); i++) {
|
for (unsigned int i = 0; i < newActivation.size(); i++) {
|
||||||
bool newState = newActivation[i];
|
bool newState = newActivation[i];
|
||||||
if (newState != _inputAttributeActivation[i]) {
|
if (newState != _input._attributeActivation[i]) {
|
||||||
#if defined(SUPPORT_LEGACY_OPENGL)
|
#if defined(SUPPORT_LEGACY_OPENGL)
|
||||||
if (i < NUM_CLASSIC_ATTRIBS) {
|
if (i < NUM_CLASSIC_ATTRIBS) {
|
||||||
if (newState) {
|
if (newState) {
|
||||||
|
@ -290,31 +282,31 @@ void GLBackend::updateInput() {
|
||||||
}
|
}
|
||||||
CHECK_GL_ERROR();
|
CHECK_GL_ERROR();
|
||||||
|
|
||||||
_inputAttributeActivation.flip(i);
|
_input._attributeActivation.flip(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now we need to bind the buffers and assign the attrib pointers
|
// now we need to bind the buffers and assign the attrib pointers
|
||||||
if (_inputFormat) {
|
if (_input._format) {
|
||||||
const Buffers& buffers = _inputBuffers;
|
const Buffers& buffers = _input._buffers;
|
||||||
const Offsets& offsets = _inputBufferOffsets;
|
const Offsets& offsets = _input._bufferOffsets;
|
||||||
const Offsets& strides = _inputBufferStrides;
|
const Offsets& strides = _input._bufferStrides;
|
||||||
|
|
||||||
const Stream::Format::AttributeMap& attributes = _inputFormat->getAttributes();
|
const Stream::Format::AttributeMap& attributes = _input._format->getAttributes();
|
||||||
|
|
||||||
for (Stream::Format::ChannelMap::const_iterator channelIt = _inputFormat->getChannels().begin();
|
for (Stream::Format::ChannelMap::const_iterator channelIt = _input._format->getChannels().begin();
|
||||||
channelIt != _inputFormat->getChannels().end();
|
channelIt != _input._format->getChannels().end();
|
||||||
channelIt++) {
|
channelIt++) {
|
||||||
const Stream::Format::ChannelMap::value_type::second_type& channel = (*channelIt).second;
|
const Stream::Format::ChannelMap::value_type::second_type& channel = (*channelIt).second;
|
||||||
if ((*channelIt).first < buffers.size()) {
|
if ((*channelIt).first < buffers.size()) {
|
||||||
int bufferNum = (*channelIt).first;
|
int bufferNum = (*channelIt).first;
|
||||||
|
|
||||||
if (_inputBuffersState.test(bufferNum) || _needInputFormatUpdate) {
|
if (_input._buffersState.test(bufferNum) || _input._invalidFormat) {
|
||||||
GLuint vbo = gpu::GLBackend::getBufferID((*buffers[bufferNum]));
|
GLuint vbo = gpu::GLBackend::getBufferID((*buffers[bufferNum]));
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
CHECK_GL_ERROR();
|
CHECK_GL_ERROR();
|
||||||
_inputBuffersState[bufferNum] = false;
|
_input._buffersState[bufferNum] = false;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < channel._slots.size(); i++) {
|
for (unsigned int i = 0; i < channel._slots.size(); i++) {
|
||||||
const Stream::Attribute& attrib = attributes.at(channel._slots[i]);
|
const Stream::Attribute& attrib = attributes.at(channel._slots[i]);
|
||||||
|
@ -354,7 +346,7 @@ void GLBackend::updateInput() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// everything format related should be in sync now
|
// everything format related should be in sync now
|
||||||
_needInputFormatUpdate = false;
|
_input._invalidFormat = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Fancy version GL4.4
|
/* TODO: Fancy version GL4.4
|
||||||
|
@ -415,10 +407,10 @@ void GLBackend::updateInput() {
|
||||||
|
|
||||||
|
|
||||||
void GLBackend::do_setIndexBuffer(Batch& batch, uint32 paramOffset) {
|
void GLBackend::do_setIndexBuffer(Batch& batch, uint32 paramOffset) {
|
||||||
_indexBufferType = (Type) batch._params[paramOffset + 2]._uint;
|
_input._indexBufferType = (Type) batch._params[paramOffset + 2]._uint;
|
||||||
BufferPointer indexBuffer = batch._buffers.get(batch._params[paramOffset + 1]._uint);
|
BufferPointer indexBuffer = batch._buffers.get(batch._params[paramOffset + 1]._uint);
|
||||||
_indexBufferOffset = batch._params[paramOffset + 0]._uint;
|
_input._indexBufferOffset = batch._params[paramOffset + 0]._uint;
|
||||||
_indexBuffer = indexBuffer;
|
_input._indexBuffer = indexBuffer;
|
||||||
if (indexBuffer) {
|
if (indexBuffer) {
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, getBufferID(*indexBuffer));
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, getBufferID(*indexBuffer));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
static const int MAX_NUM_ATTRIBUTES = Stream::NUM_INPUT_SLOTS;
|
static const int MAX_NUM_ATTRIBUTES = Stream::NUM_INPUT_SLOTS;
|
||||||
static const int MAX_NUM_INPUT_BUFFERS = 16;
|
static const int MAX_NUM_INPUT_BUFFERS = 16;
|
||||||
|
|
||||||
uint32 getNumInputBuffers() const { return _inputBuffersState.size(); }
|
uint32 getNumInputBuffers() const { return _input._buffersState.size(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -62,22 +62,39 @@ protected:
|
||||||
void do_setInputFormat(Batch& batch, uint32 paramOffset);
|
void do_setInputFormat(Batch& batch, uint32 paramOffset);
|
||||||
void do_setInputBuffer(Batch& batch, uint32 paramOffset);
|
void do_setInputBuffer(Batch& batch, uint32 paramOffset);
|
||||||
void do_setIndexBuffer(Batch& batch, uint32 paramOffset);
|
void do_setIndexBuffer(Batch& batch, uint32 paramOffset);
|
||||||
|
|
||||||
void updateInput();
|
void updateInput();
|
||||||
bool _needInputFormatUpdate;
|
struct InputStageState {
|
||||||
Stream::FormatPointer _inputFormat;
|
bool _invalidFormat;
|
||||||
typedef std::bitset<MAX_NUM_INPUT_BUFFERS> InputBuffersState;
|
Stream::FormatPointer _format;
|
||||||
InputBuffersState _inputBuffersState;
|
|
||||||
|
|
||||||
Buffers _inputBuffers;
|
typedef std::bitset<MAX_NUM_INPUT_BUFFERS> BuffersState;
|
||||||
Offsets _inputBufferOffsets;
|
BuffersState _buffersState;
|
||||||
Offsets _inputBufferStrides;
|
|
||||||
|
|
||||||
BufferPointer _indexBuffer;
|
Buffers _buffers;
|
||||||
Offset _indexBufferOffset;
|
Offsets _bufferOffsets;
|
||||||
Type _indexBufferType;
|
Offsets _bufferStrides;
|
||||||
|
|
||||||
typedef std::bitset<MAX_NUM_ATTRIBUTES> InputActivationCache;
|
BufferPointer _indexBuffer;
|
||||||
InputActivationCache _inputAttributeActivation;
|
Offset _indexBufferOffset;
|
||||||
|
Type _indexBufferType;
|
||||||
|
|
||||||
|
typedef std::bitset<MAX_NUM_ATTRIBUTES> ActivationCache;
|
||||||
|
ActivationCache _attributeActivation;
|
||||||
|
|
||||||
|
InputStageState() :
|
||||||
|
_invalidFormat(true),
|
||||||
|
_format(0),
|
||||||
|
_buffersState(0),
|
||||||
|
_buffers(_buffersState.size(), BufferPointer(0)),
|
||||||
|
_bufferOffsets(_buffersState.size(), 0),
|
||||||
|
_bufferStrides(_buffersState.size(), 0),
|
||||||
|
_indexBuffer(0),
|
||||||
|
_indexBufferOffset(0),
|
||||||
|
_indexBufferType(UINT32),
|
||||||
|
_attributeActivation(0)
|
||||||
|
{}
|
||||||
|
} _input;
|
||||||
|
|
||||||
// Transform Stage
|
// Transform Stage
|
||||||
void do_setModelTransform(Batch& batch, uint32 paramOffset);
|
void do_setModelTransform(Batch& batch, uint32 paramOffset);
|
||||||
|
|
Loading…
Reference in a new issue