Moving all the variables for the Input stage cache into a struct just like for transformStage

This commit is contained in:
Sam Gateau 2014-11-13 12:32:48 -08:00
parent 420118e9db
commit 5c9c78e62b
2 changed files with 60 additions and 51 deletions

View file

@ -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 {

View file

@ -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);