diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index e39f9a1dff..73c8ca7657 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.h @@ -196,7 +196,7 @@ protected: virtual void initInput() final; virtual void killInput() final; virtual void syncInputStateCache() final; - virtual void resetInputStage() final; + virtual void resetInputStage(); virtual void updateInput(); struct InputStageState { diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackendInput.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackendInput.cpp index d390a1e29d..1074833841 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackendInput.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackendInput.cpp @@ -97,122 +97,6 @@ void GLBackend::syncInputStateCache() { void GLBackend::updateInput() { -#if defined(SUPPORT_VERTEX_ATTRIB_FORMAT) - if (_input._invalidFormat) { - - InputStageState::ActivationCache newActivation; - - // Assign the vertex format required - if (_input._format) { -<<<<<<< HEAD - _input._attribBindingBuffers.reset(); - - const Stream::Format::AttributeMap& attributes = _input._format->getAttributes(); - auto& inputChannels = _input._format->getChannels(); - for (auto& channelIt : inputChannels) { - auto bufferChannelNum = (channelIt).first; - const Stream::Format::ChannelMap::value_type::second_type& channel = (channelIt).second; - _input._attribBindingBuffers.set(bufferChannelNum); - - GLuint frequency = 0; - for (unsigned int i = 0; i < channel._slots.size(); i++) { - const Stream::Attribute& attrib = attributes.at(channel._slots[i]); - - GLuint slot = attrib._slot; - GLuint count = attrib._element.getLocationScalarCount(); - uint8_t locationCount = attrib._element.getLocationCount(); - GLenum type = _elementTypeToGLType[attrib._element.getType()]; - - GLuint offset = (GLuint)attrib._offset;; - GLboolean isNormalized = attrib._element.isNormalized(); - - GLenum perLocationSize = attrib._element.getLocationSize(); - for (GLuint locNum = 0; locNum < locationCount; ++locNum) { - GLuint attriNum = (GLuint)(slot + locNum); - newActivation.set(attriNum); - if (!_input._attributeActivation[attriNum]) { - _input._attributeActivation.set(attriNum); - glEnableVertexAttribArray(attriNum); - } - glVertexAttribFormat(attriNum, count, type, isNormalized, offset + locNum * perLocationSize); - // TODO: Support properly the IAttrib version - glVertexAttribBinding(attriNum, attrib._channel); - } - - if (i == 0) { - frequency = attrib._frequency; - } else { - assert(frequency == attrib._frequency); - } - - (void)CHECK_GL_ERROR(); -======= - for (auto& it : _input._format->getAttributes()) { - const Stream::Attribute& attrib = (it).second; - - GLuint slot = attrib._slot; - GLuint count = attrib._element.getLocationScalarCount(); - uint8_t locationCount = attrib._element.getLocationCount(); - GLenum type = _elementTypeToGL41Type[attrib._element.getType()]; - GLuint offset = attrib._offset;; - GLboolean isNormalized = attrib._element.isNormalized(); - - GLenum perLocationSize = attrib._element.getLocationSize(); - - for (size_t locNum = 0; locNum < locationCount; ++locNum) { - newActivation.set(slot + locNum); - glVertexAttribFormat(slot + locNum, count, type, isNormalized, offset + locNum * perLocationSize); - glVertexAttribBinding(slot + locNum, attrib._channel); ->>>>>>> 592a50356bf598a4ca49d45c0c30525477831c6d - } - glVertexBindingDivisor(bufferChannelNum, frequency); - } -<<<<<<< HEAD -======= - (void)CHECK_GL_ERROR(); - } ->>>>>>> 592a50356bf598a4ca49d45c0c30525477831c6d - - // Manage Activation what was and what is expected now - // This should only disable VertexAttribs since the one in use have been disabled above - for (GLuint i = 0; i < (GLuint)newActivation.size(); i++) { - bool newState = newActivation[i]; - if (newState != _input._attributeActivation[i]) { - if (newState) { - glEnableVertexAttribArray(i); - } else { - glDisableVertexAttribArray(i); - } - _input._attributeActivation.flip(i); - } - } - (void)CHECK_GL_ERROR(); - } -<<<<<<< HEAD - -======= - (void)CHECK_GL_ERROR(); ->>>>>>> 592a50356bf598a4ca49d45c0c30525477831c6d - - _input._invalidFormat = false; - _stats._ISNumFormatChanges++; - } - - if (_input._invalidBuffers.any()) { - auto vbo = _input._bufferVBOs.data(); - auto offset = _input._bufferOffsets.data(); - auto stride = _input._bufferStrides.data(); - - for (GLuint buffer = 0; buffer < _input._buffers.size(); buffer++, vbo++, offset++, stride++) { - if (_input._invalidBuffers.test(buffer)) { - glBindVertexBuffer(buffer, (*vbo), (*offset), (GLsizei)(*stride)); - } - } - - _input._invalidBuffers.reset(); - (void)CHECK_GL_ERROR(); - } -#else if (_input._invalidFormat || _input._invalidBuffers.any()) { if (_input._invalidFormat) { @@ -303,20 +187,8 @@ void GLBackend::updateInput() { // everything format related should be in sync now _input._invalidFormat = false; } -#endif } -// Core 41 doesn't expose the features to really separate the vertex format from the vertex buffers binding -// Core 43 does :) -// FIXME crashing problem with glVertexBindingDivisor / glVertexAttribFormat -// Once resolved, break this up into the GL 4.1 and 4.5 backends -#if 1 || (GPU_INPUT_PROFILE == GPU_CORE_41) -#define NO_SUPPORT_VERTEX_ATTRIB_FORMAT -#else -#define SUPPORT_VERTEX_ATTRIB_FORMAT -#endif - - void GLBackend::resetInputStage() { // Reset index buffer _input._indexBufferType = UINT32; @@ -325,22 +197,6 @@ void GLBackend::resetInputStage() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); (void) CHECK_GL_ERROR(); -#if defined(SUPPORT_VERTEX_ATTRIB_FORMAT) - glBindBuffer(GL_ARRAY_BUFFER, 0); - for (uint32_t i = 0; i < _input._attributeActivation.size(); i++) { - glDisableVertexAttribArray(i); - } - for (uint32_t i = 0; i < _input._attribBindingBuffers.size(); i++) { - glBindVertexBuffer(i, 0, 0, 0); - } -#else - glBindBuffer(GL_ARRAY_BUFFER, 0); - for (uint32_t i = 0; i < _input._attributeActivation.size(); i++) { - glDisableVertexAttribArray(i); - glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, 0, 0); - } -#endif - // Reset vertex buffer and format _input._format.reset(); _input._formatKey.clear(); @@ -355,6 +211,7 @@ void GLBackend::resetInputStage() { } _input._invalidBuffers.reset(); + // THe vertex array binding MUST be reset in the specific Backend versions as they use different techniques } void GLBackend::do_setIndexBuffer(Batch& batch, size_t paramOffset) { diff --git a/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h b/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h index 5695ba080e..d9be107052 100644 --- a/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h +++ b/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h @@ -76,6 +76,7 @@ protected: void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override; // Input Stage + void resetInputStage() override; void updateInput() override; // Synchronize the state cache of this Backend with the actual real state of the GL Context diff --git a/libraries/gpu-gl/src/gpu/gl41/GL41BackendInput.cpp b/libraries/gpu-gl/src/gpu/gl41/GL41BackendInput.cpp index 59c4050af1..376b9e1c2f 100644 --- a/libraries/gpu-gl/src/gpu/gl41/GL41BackendInput.cpp +++ b/libraries/gpu-gl/src/gpu/gl41/GL41BackendInput.cpp @@ -13,6 +13,17 @@ using namespace gpu; using namespace gpu::gl41; + +void GL41Backend::resetInputStage() { + Parent::resetInputStage(); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + for (uint32_t i = 0; i < _input._attributeActivation.size(); i++) { + glDisableVertexAttribArray(i); + glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, 0, 0); + } +} + void GL41Backend::updateInput() { if (_input._invalidFormat || _input._invalidBuffers.any()) { diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h b/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h index d0dfbd0e41..a43b9d56b5 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h +++ b/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h @@ -65,6 +65,7 @@ protected: void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override; // Input Stage + void resetInputStage() override; void updateInput() override; // Synchronize the state cache of this Backend with the actual real state of the GL Context diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendInput.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendInput.cpp index 0fdd14dc84..9c5303e71f 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendInput.cpp +++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendInput.cpp @@ -14,6 +14,18 @@ using namespace gpu; using namespace gpu::gl45; +void GL45Backend::resetInputStage() { + Parent::resetInputStage(); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + for (uint32_t i = 0; i < _input._attributeActivation.size(); i++) { + glDisableVertexAttribArray(i); + } + for (uint32_t i = 0; i < _input._attribBindingBuffers.size(); i++) { + glBindVertexBuffer(i, 0, 0, 0); + } +} + void GL45Backend::updateInput() { if (_input._invalidFormat) {