mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 18:21:16 +02:00
Trying to separate the vertex format and vertex buffer assignment for GL45Backend
This commit is contained in:
parent
a31c76f4e1
commit
ab26f54c91
6 changed files with 27 additions and 145 deletions
|
@ -196,7 +196,7 @@ protected:
|
||||||
virtual void initInput() final;
|
virtual void initInput() final;
|
||||||
virtual void killInput() final;
|
virtual void killInput() final;
|
||||||
virtual void syncInputStateCache() final;
|
virtual void syncInputStateCache() final;
|
||||||
virtual void resetInputStage() final;
|
virtual void resetInputStage();
|
||||||
virtual void updateInput();
|
virtual void updateInput();
|
||||||
|
|
||||||
struct InputStageState {
|
struct InputStageState {
|
||||||
|
|
|
@ -97,122 +97,6 @@ void GLBackend::syncInputStateCache() {
|
||||||
|
|
||||||
|
|
||||||
void GLBackend::updateInput() {
|
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 || _input._invalidBuffers.any()) {
|
||||||
|
|
||||||
if (_input._invalidFormat) {
|
if (_input._invalidFormat) {
|
||||||
|
@ -303,20 +187,8 @@ void GLBackend::updateInput() {
|
||||||
// everything format related should be in sync now
|
// everything format related should be in sync now
|
||||||
_input._invalidFormat = false;
|
_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() {
|
void GLBackend::resetInputStage() {
|
||||||
// Reset index buffer
|
// Reset index buffer
|
||||||
_input._indexBufferType = UINT32;
|
_input._indexBufferType = UINT32;
|
||||||
|
@ -325,22 +197,6 @@ void GLBackend::resetInputStage() {
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
(void) CHECK_GL_ERROR();
|
(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
|
// Reset vertex buffer and format
|
||||||
_input._format.reset();
|
_input._format.reset();
|
||||||
_input._formatKey.clear();
|
_input._formatKey.clear();
|
||||||
|
@ -355,6 +211,7 @@ void GLBackend::resetInputStage() {
|
||||||
}
|
}
|
||||||
_input._invalidBuffers.reset();
|
_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) {
|
void GLBackend::do_setIndexBuffer(Batch& batch, size_t paramOffset) {
|
||||||
|
|
|
@ -76,6 +76,7 @@ protected:
|
||||||
void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override;
|
void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override;
|
||||||
|
|
||||||
// Input Stage
|
// Input Stage
|
||||||
|
void resetInputStage() override;
|
||||||
void updateInput() override;
|
void updateInput() override;
|
||||||
|
|
||||||
// Synchronize the state cache of this Backend with the actual real state of the GL Context
|
// Synchronize the state cache of this Backend with the actual real state of the GL Context
|
||||||
|
|
|
@ -13,6 +13,17 @@
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
using namespace gpu::gl41;
|
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() {
|
void GL41Backend::updateInput() {
|
||||||
if (_input._invalidFormat || _input._invalidBuffers.any()) {
|
if (_input._invalidFormat || _input._invalidBuffers.any()) {
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ protected:
|
||||||
void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override;
|
void do_multiDrawIndexedIndirect(Batch& batch, size_t paramOffset) override;
|
||||||
|
|
||||||
// Input Stage
|
// Input Stage
|
||||||
|
void resetInputStage() override;
|
||||||
void updateInput() override;
|
void updateInput() override;
|
||||||
|
|
||||||
// Synchronize the state cache of this Backend with the actual real state of the GL Context
|
// Synchronize the state cache of this Backend with the actual real state of the GL Context
|
||||||
|
|
|
@ -14,6 +14,18 @@
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
using namespace gpu::gl45;
|
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() {
|
void GL45Backend::updateInput() {
|
||||||
|
|
||||||
if (_input._invalidFormat) {
|
if (_input._invalidFormat) {
|
||||||
|
|
Loading…
Reference in a new issue