use unordered_dense to mitigate __next_prime overflow error

This commit is contained in:
2025-05-07 10:57:26 +08:00
parent 96774ef3da
commit b082e2e06b
9 changed files with 2142 additions and 34 deletions
+3 -3
View File
@@ -8,13 +8,13 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w -fvisibility=hidden -funwind-tables -g -D_THREAD_SAFE -fPIC -stdlib=libc++") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w -fvisibility=hidden -funwind-tables -g -D_THREAD_SAFE -fPIC")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w -g -std=gnu99 -funwind-tables -O3 -fvisibility=hidden") #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w -g -std=gnu99 -funwind-tables -O3 -fvisibility=hidden")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++") #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++")
set(CMAKE_ANDROID_STL_TYPE c++_static) #set(CMAKE_ANDROID_STL_TYPE c++_static)
#set(CMAKE_BUILD_TYPE Release) #set(CMAKE_BUILD_TYPE Release)
+1
View File
@@ -108,6 +108,7 @@
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include "GLES3/gl32.h" #include "GLES3/gl32.h"
#include <ankerl/unordered_dense.h>
#include "MG_Include/UncertainBool.hpp" #include "MG_Include/UncertainBool.hpp"
+14 -11
View File
@@ -13,25 +13,21 @@ VertexArrayState::VertexArrayState() {
GLenum VertexArrayState::Create(GLuint* array) { GLenum VertexArrayState::Create(GLuint* array) {
if (array == nullptr) return GL_INVALID_VALUE; if (array == nullptr) return GL_INVALID_VALUE;
GLuint id = freeIds_.empty() ? ++lastId_ : *freeIds_.begin(); GLuint id = freeId_.empty() ? lastId_++ : freeId_.back();
if (!freeIds_.empty()) { if (!freeId_.empty()) {
freeIds_.erase(freeIds_.begin()); freeId_.pop_back();
} }
*array = id; *array = id;
// vaos_[id].generated = true; vaos_[id] = { .generated = false };
return GL_NO_ERROR; return GL_NO_ERROR;
} }
GLenum VertexArrayState::CreateN(GLsizei n, GLuint* arrays) { GLenum VertexArrayState::CreateN(GLsizei n, GLuint* arrays) {
if (n < 0) { if (n <= 0 || arrays == nullptr) {
return GL_INVALID_VALUE; return GL_INVALID_VALUE;
} }
if (n > 0 && arrays == nullptr) {
return GL_INVALID_VALUE;
}
for (GLsizei i = 0; i < n; ++i) { for (GLsizei i = 0; i < n; ++i) {
if (GLenum error = Create(&arrays[i]); error != GL_NO_ERROR) { if (GLenum error = Create(&arrays[i]); error != GL_NO_ERROR) {
return error; return error;
@@ -41,7 +37,9 @@ GLenum VertexArrayState::CreateN(GLsizei n, GLuint* arrays) {
} }
GLenum VertexArrayState::Bind(GLuint array) { GLenum VertexArrayState::Bind(GLuint array) {
if (array != 0 && vaos_.find(array) == vaos_.end()) return GL_INVALID_OPERATION; if (array != 0 && vaos_.find(array) == vaos_.end())
return GL_INVALID_OPERATION;
currentVao_ = array; currentVao_ = array;
GetCurrentVAO()->generated = true; GetCurrentVAO()->generated = true;
return GL_NO_ERROR; return GL_NO_ERROR;
@@ -92,5 +90,10 @@ GLuint VertexArrayState::GetBoundElementBuffer() {
VertexArrayObject* VertexArrayState::GetCurrentVAO() { VertexArrayObject* VertexArrayState::GetCurrentVAO() {
auto it = vaos_.find(currentVao_); auto it = vaos_.find(currentVao_);
return (it != vaos_.end()) ? &it->second : &vaos_.at(0); if (it != vaos_.end())
return &it->second;
else {
MG_Util::Debug::LogD("%s: VAO not found, currentVao_ = %u !", __func__, currentVao_);
return nullptr;
}
} }
@@ -45,8 +45,9 @@ public:
public: // TODO public: // TODO
std::unordered_map<GLuint, VertexArrayObject> vaos_; std::unordered_map<GLuint, VertexArrayObject> vaos_;
std::set<GLuint> freeIds_; // std::set<GLuint> freeIds_;
GLuint lastId_ = 0; std::vector<GLuint> freeId_;
GLuint lastId_ = 1; // reserve 0 for default vao
GLuint currentVao_ = 0; GLuint currentVao_ = 0;
}; };
+8 -9
View File
@@ -280,8 +280,8 @@ namespace MG_RHI::GLES {
SyncAllBuffersToGLES(bufferState); SyncAllBuffersToGLES(bufferState);
// VAO // VAO
GLuint mgVAO = vaState->currentVao_; GLuint mgVAOId = vaState->currentVao_;
VertexArrayObject* vao = &vaState->vaos_[vaState->currentVao_]; VertexArrayObject* vao = &vaState->vaos_[mgVAOId];
for (auto& [mgVAOId, mgVAO] : vaState->vaos_) { for (auto& [mgVAOId, mgVAO] : vaState->vaos_) {
MG_Util::Debug::LogD("Uploading VAO: %d", mgVAOId); MG_Util::Debug::LogD("Uploading VAO: %d", mgVAOId);
if (!mgVAO.generated) continue; if (!mgVAO.generated) continue;
@@ -290,6 +290,7 @@ namespace MG_RHI::GLES {
GLuint glVAO; GLuint glVAO;
if (vaoMap_.find(mgVAOId) == vaoMap_.end()) { if (vaoMap_.find(mgVAOId) == vaoMap_.end()) {
MGL_TRY(::GLES::glGenVertexArrays(1, &glVAO);) MGL_TRY(::GLES::glGenVertexArrays(1, &glVAO);)
MG_Util::Debug::LogD("Saving VAO: %d -> %d", mgVAOId, glVAO);
vaoMap_[mgVAOId] = glVAO; vaoMap_[mgVAOId] = glVAO;
} else { } else {
glVAO = vaoMap_[mgVAOId]; glVAO = vaoMap_[mgVAOId];
@@ -301,7 +302,7 @@ namespace MG_RHI::GLES {
} }
for (auto& [index, attrib] : mgVAO.attribs) { for (auto& [index, attrib] : mgVAO.attribs) {
MG_Util::Debug::LogD("attrib #%s, type = %s, size = %d, stride = %d, pointer = %p", MG_Util::Debug::LogD("attrib #%d, type = %s, size = %d, stride = %d, pointer = %p",
index, MG_Util::Debug::GLEnumToString(attrib.type), attrib.size, attrib.stride, attrib.pointer); index, MG_Util::Debug::GLEnumToString(attrib.type), attrib.size, attrib.stride, attrib.pointer);
if (attrib.buffer != 0 && bufferMap_.count(attrib.buffer)) { if (attrib.buffer != 0 && bufferMap_.count(attrib.buffer)) {
MGL_TRY(::GLES::glBindBuffer(GL_ARRAY_BUFFER, bufferMap_[attrib.buffer]);) MGL_TRY(::GLES::glBindBuffer(GL_ARRAY_BUFFER, bufferMap_[attrib.buffer]);)
@@ -329,11 +330,11 @@ namespace MG_RHI::GLES {
MGL_TRY(::GLES::glBindVertexArray(0);) MGL_TRY(::GLES::glBindVertexArray(0);)
//} //}
} }
GLuint currentMgVAO = vaState->currentVao_; // GLuint currentMgVAO = vaState->currentVao_;
if (vaoMap_.count(currentMgVAO)) { if (vaoMap_.find(mgVAOId) != vaoMap_.end()) {
MGL_TRY(::GLES::glBindVertexArray(vaoMap_[currentMgVAO]);) MGL_TRY(::GLES::glBindVertexArray(vaoMap_[mgVAOId]);)
VertexArrayObject& currentVAO = vaState->vaos_[currentMgVAO]; VertexArrayObject& currentVAO = vaState->vaos_[mgVAOId];
for (auto& [index, attrib] : currentVAO.attribs) { for (auto& [index, attrib] : currentVAO.attribs) {
if (attrib.enabled) { if (attrib.enabled) {
MGL_TRY(::GLES::glEnableVertexAttribArray(index);) MGL_TRY(::GLES::glEnableVertexAttribArray(index);)
@@ -623,8 +624,6 @@ namespace MG_RHI::GLES {
lastBoundFBO = currentFBO; lastBoundFBO = currentFBO;
} }
} }
} }
} }
+10 -7
View File
@@ -8,6 +8,9 @@
#include "../../Includes.h" #include "../../Includes.h"
namespace MG_RHI::GLES { namespace MG_RHI::GLES {
template <typename K, typename V>
using unordered_map = ankerl::unordered_dense::map<K, V>;
enum class State { enum class State {
None, None,
DrawArrays, DrawArrays,
@@ -30,14 +33,14 @@ namespace MG_RHI::GLES {
private: private:
State currentState_ = State::None; State currentState_ = State::None;
std::unordered_map<GLuint, GLuint> textureMap_; unordered_map<GLuint, GLuint> textureMap_;
std::unordered_map<GLuint, std::unordered_map<GLint, bool>> textureLevelUploaded_; unordered_map<GLuint, GLuint> bufferMap_;
std::unordered_map<GLuint, GLuint> bufferMap_; unordered_map<GLuint, GLuint> vaoMap_;
std::array<GLuint, 32> lastBoundTextures { 0 }; unordered_map<GLuint, GLuint> programMap_;
std::unordered_map<GLuint, GLuint> vaoMap_; unordered_map<GLuint, GLuint> framebufferMap_;
std::unordered_map<GLuint, GLuint> programMap_; unordered_map<GLuint, unordered_map<GLint, bool>> textureLevelUploaded_;
std::unordered_map<GLuint, GLuint> framebufferMap_; std::array<GLuint, 32> lastBoundTextures { 0 };
GLuint lastBoundVAO = 0; GLuint lastBoundVAO = 0;
GLuint lastBoundProgram = 0; GLuint lastBoundProgram = 0;
+1 -1
View File
@@ -7,7 +7,7 @@
#include "../../Includes.h" #include "../../Includes.h"
#define FORCE_SYNC_WITH_LOG_FILE 0 #define FORCE_SYNC_WITH_LOG_FILE 1
namespace MG_Util { namespace MG_Util {
namespace Debug { namespace Debug {
+1 -1
View File
@@ -8,7 +8,7 @@ android {
minSdk 26 minSdk 26
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndkVersion '27.1.12297006' ndkVersion '27.2.12479018'
} }
buildTypes { buildTypes {
File diff suppressed because it is too large Load Diff