mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 05:38:31 +09:00
[Fix] (MG_State/VertexArray): use array to save attribs to maintain order and optimize performance
This commit is contained in:
@@ -33,7 +33,9 @@ namespace MG_Diligent {
|
||||
|
||||
auto& programObj = MG_State_T::programState->programs_[program];
|
||||
|
||||
for (const auto& [attribIndex, attrib] : vaState.vaos_[vaState.currentVao_].attribs) {
|
||||
// for (const auto& [attribIndex, attrib] : vaState.vaos_[vaState.currentVao_].attribs) {
|
||||
for (uint32_t attribIndex = 0; attribIndex < MG_Constants::VertexArray::MAX_VERTEX_ATTRIBS; ++attribIndex) {
|
||||
const auto& attrib = vaState.vaos_[vaState.currentVao_].attribs[attribIndex];
|
||||
if (!attrib.enabled) continue;
|
||||
|
||||
std::string attribName;
|
||||
@@ -124,15 +126,11 @@ namespace MG_Diligent {
|
||||
hash_combine(hash, capabilities[GL_STENCIL_TEST]);
|
||||
|
||||
auto *pVAO = vaState.GetCurrentVAO();
|
||||
|
||||
std::vector<uint32_t> attribIndices;
|
||||
for (const auto& [index, _] : pVAO->attribs)
|
||||
attribIndices.push_back(index);
|
||||
std::sort(attribIndices.begin(), attribIndices.end());
|
||||
for (auto index : attribIndices) {
|
||||
const auto& attrib = pVAO->attribs.at(index);
|
||||
|
||||
for (uint32_t i = 0; i < MG_Constants::VertexArray::MAX_VERTEX_ATTRIBS; ++i) {
|
||||
const auto& attrib = pVAO->attribs[i];
|
||||
if (attrib.enabled) {
|
||||
hash_combine(hash, index);
|
||||
hash_combine(hash, i);
|
||||
hash_combine(hash, attrib.size);
|
||||
hash_combine(hash, attrib.type);
|
||||
hash_combine(hash, attrib.normalized);
|
||||
|
||||
@@ -476,7 +476,9 @@ namespace MG_GL::GL {
|
||||
|
||||
std::unordered_map<GLuint, Diligent::IBuffer*> createdBuffers;
|
||||
|
||||
for (const auto& [attribIndex, attrib] : pVAO->attribs) {
|
||||
// for (const auto& [attribIndex, attrib] : pVAO->attribs) {
|
||||
for (uint32_t attribIndex = 0; attribIndex < MG_Constants::VertexArray::MAX_VERTEX_ATTRIBS; ++attribIndex) {
|
||||
const auto& attrib = pVAO->attribs[attribIndex];
|
||||
if (!attrib.enabled || attrib.buffer == 0) continue;
|
||||
|
||||
GLuint buffer = attrib.buffer;
|
||||
@@ -569,7 +571,8 @@ namespace MG_GL::GL {
|
||||
std::vector<Diligent::IBuffer*> vertexBuffers;
|
||||
std::vector<Diligent::Uint64> offsets;
|
||||
|
||||
for (const auto& [attribIndex, attrib] : pVAO->attribs) {
|
||||
for (uint32_t attribIndex = 0; attribIndex < MG_Constants::VertexArray::MAX_VERTEX_ATTRIBS; ++attribIndex) {
|
||||
const auto& attrib = pVAO->attribs[attribIndex];
|
||||
if (!attrib.enabled || attrib.buffer == 0) continue;
|
||||
|
||||
GLuint buffer = attrib.buffer;
|
||||
|
||||
@@ -379,7 +379,9 @@ namespace MG_GL::GL {
|
||||
auto* pVAO = MG_State_T::vertexArrayState->GetCurrentVAO();
|
||||
if (!pVAO) return;
|
||||
|
||||
for (const auto& [index, attrib] : pVAO->attribs) {
|
||||
// for (const auto& [index, attrib] : pVAO->attribs) {
|
||||
for (uint32_t index = 0; index < MG_Constants::VertexArray::MAX_VERTEX_ATTRIBS; ++index) {
|
||||
const auto& attrib = pVAO->attribs[index];
|
||||
if (attrib.enabled) {
|
||||
Diligent::LayoutElement elem;
|
||||
elem.InputIndex = index;
|
||||
|
||||
Reference in New Issue
Block a user