[Fix] (GL_Drawing.cpp): realize glBindAttribLocation, and other misc fixes

This commit is contained in:
2025-05-07 23:25:46 +08:00
parent a50856dea0
commit f98f877e07
5 changed files with 62 additions and 36 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ project("MobileGL")
enable_language(CXX) enable_language(CXX)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
+1
View File
@@ -102,6 +102,7 @@
#include <optional> #include <optional>
#include <unordered_map> #include <unordered_map>
#include <queue> #include <queue>
#include <format>
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include <glslang/Public/ShaderLang.h> #include <glslang/Public/ShaderLang.h>
#include <glslang/Include/Types.h> #include <glslang/Include/Types.h>
@@ -42,7 +42,7 @@ namespace MG_GL::GL {
if (buffer != 0 && if (buffer != 0 &&
MG_State::ValidateGeneratedName(buffer) && MG_State::ValidateGeneratedName(buffer) &&
!MG_State::ValidateAllocatedBufferHandle(buffer)) { !MG_State::ValidateAllocatedBufferHandle(buffer)) {
MG_Util::Debug::LogE("Actually creating buffer: %u", buffer); MG_Util::Debug::LogD("Actually creating buffer: %u", buffer);
GLenum result = MG_State::CreateBuffer(buffer); GLenum result = MG_State::CreateBuffer(buffer);
} }
@@ -702,31 +702,43 @@ namespace MG_GL::GL {
// Buffer // Buffer
SyncAllBuffersToGLES(bufferState); SyncAllBuffersToGLES(bufferState);
GLuint vbo = MG_State_T::bufferState->GetCurrentBinding(GL_ARRAY_BUFFER);
CallAndCheck(::GLES::glBindBuffer(GL_ARRAY_BUFFER, s_bufferMap[vbo]);)
// 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& [mgid, vao] : vaState->vaos_) {
if (!mgVAO.generated) continue; if (!vao.generated)
continue;
MG_Util::Debug::LogD("Creating MG VAO: %d", mgid);
// TODO: Check is the VAO changes rather than always update it. // TODO: Check is the VAO changes rather than always update it.
//if (!s_vaoMap.count(mgVAOId)) { //if (!s_vaoMap.count(mgVAOId)) {
GLuint glVAO; GLuint glVAO;
if (!s_vaoMap.count(mgVAOId)) { if (s_vaoMap.find(mgid) == s_vaoMap.end()) {
CallAndCheck(::GLES::glGenVertexArrays(1, &glVAO);) CallAndCheck(::GLES::glGenVertexArrays(1, &glVAO);)
s_vaoMap[mgVAOId] = glVAO; s_vaoMap[mgid] = glVAO;
} else { } else {
glVAO = s_vaoMap[mgVAOId]; glVAO = s_vaoMap[mgid];
} }
CallAndCheck(::GLES::glBindVertexArray(glVAO);) CallAndCheck(::GLES::glBindVertexArray(glVAO);)
MG_Util::Debug::LogD("Bind VAO (MG -> ES): %d -> %d", mgid, glVAO);
if (mgVAO.elementBuffer != 0 && s_bufferMap.count(mgVAO.elementBuffer)) { std::string name = std::format("MG VAO {}", mgid);
CallAndCheck(::GLES::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_bufferMap[mgVAO.elementBuffer]);) ::GLES::glObjectLabel(GL_VERTEX_ARRAY, mgid, name.length(), name.c_str());
if (vao.elementBuffer != 0 && s_bufferMap.find(vao.elementBuffer) != s_bufferMap.end()) {
CallAndCheck(::GLES::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_bufferMap[vao.elementBuffer]);)
} }
MG_Util::Debug::LogD("VAO has %d attributes:", vao.attribs.size());
for (auto& [index, attrib] : mgVAO.attribs) { for (auto& [index, attrib] : vao.attribs) {
if (attrib.buffer != 0 && s_bufferMap.count(attrib.buffer)) { // if (attrib.buffer != 0 && s_bufferMap.find(attrib.buffer) != s_bufferMap.end()) {
CallAndCheck(::GLES::glBindBuffer(GL_ARRAY_BUFFER, s_bufferMap[attrib.buffer]);) MG_Util::Debug::LogD("attrib #%d: size=%d, type=%s, stride=%d, pointer=%d, %s, isInt=%s",
index, attrib.size, MG_Util::Debug::GLEnumToString(attrib.type), attrib.stride, attrib.pointer,
(attrib.enabled ? "enabled" : "disabled"), (attrib.isInteger ? "true" : "false"));
if (attrib.isInteger) { if (attrib.isInteger) {
CallAndCheck(::GLES::glVertexAttribIPointer( CallAndCheck(::GLES::glVertexAttribIPointer(
@@ -746,31 +758,34 @@ namespace MG_GL::GL {
} else { } else {
CallAndCheck(::GLES::glDisableVertexAttribArray(index);) CallAndCheck(::GLES::glDisableVertexAttribArray(index);)
} }
} // }
} }
CallAndCheck(::GLES::glBindVertexArray(0);) CallAndCheck(::GLES::glBindVertexArray(0);)
//} //}
} }
GLuint currentMgVAO = vaState->currentVao_; GLuint currentMgVAO = vaState->currentVao_;
if (s_vaoMap.count(currentMgVAO)) { MG_Util::Debug::LogD("Now binding to VAO %d...", currentMgVAO);
if (s_vaoMap.find(currentMgVAO) != s_vaoMap.end()) {
CallAndCheck(::GLES::glBindVertexArray(s_vaoMap[currentMgVAO]);) CallAndCheck(::GLES::glBindVertexArray(s_vaoMap[currentMgVAO]);)
VertexArrayObject& currentVAO = vaState->vaos_[currentMgVAO]; // VertexArrayObject& currentVAO = vaState->vaos_[currentMgVAO];
for (auto& [index, attrib] : currentVAO.attribs) { // for (auto& [index, attrib] : currentVAO.attribs) {
if (attrib.enabled) { // if (attrib.enabled) {
CallAndCheck(::GLES::glEnableVertexAttribArray(index);) // CallAndCheck(::GLES::glEnableVertexAttribArray(index);)
} else { // } else {
CallAndCheck(::GLES::glDisableVertexAttribArray(index);) // CallAndCheck(::GLES::glDisableVertexAttribArray(index);)
} // }
} // }
} else { } else {
CallAndCheck(::GLES::glBindVertexArray(0);) CallAndCheck(::GLES::glBindVertexArray(0);)
} }
// EBO // EBO
if (vao->elementBuffer != 0) { GLuint curVaoId = vaState->currentVao_;
if (s_bufferMap.count(vao->elementBuffer)) { VertexArrayObject* curvao = &vaState->vaos_[curVaoId];
CallAndCheck(::GLES::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_bufferMap[vao->elementBuffer]);) if (curvao->elementBuffer != 0) {
if (s_bufferMap.find(curvao->elementBuffer) != s_bufferMap.end()) {
CallAndCheck(::GLES::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s_bufferMap[curvao->elementBuffer]);)
} }
} else if (indices != nullptr) { } else if (indices != nullptr) {
static GLuint dynamicIBO = 0; static GLuint dynamicIBO = 0;
@@ -797,10 +812,21 @@ namespace MG_GL::GL {
GLuint glProgram = ::GLES::glCreateProgram(); GLuint glProgram = ::GLES::glCreateProgram();
ProgramObject& mgProgram = programState->programs_[currentProgram]; ProgramObject& mgProgram = programState->programs_[currentProgram];
std::string name = std::format("MG Program {}", currentProgram);
::GLES::glObjectLabel(GL_PROGRAM, glProgram, name.length(), name.c_str());
// Attribute Names
// before vertex shader attach
for (auto& [name, idx]: mgProgram.attribLocations) {
MG_Util::Debug::LogD("%s: location = %d", name.c_str(), idx);
CallAndCheck(::GLES::glBindAttribLocation(glProgram, idx, name.c_str());)
}
// Shader // Shader
for (GLuint shaderId : mgProgram.attachedShaders) { for (GLuint shaderId : mgProgram.attachedShaders) {
ShaderObject& mgShader = programState->shaders_[shaderId]; ShaderObject& mgShader = programState->shaders_[shaderId];
GLuint glShader = ::GLES::glCreateShader(mgShader.type); GLuint glShader = ::GLES::glCreateShader(mgShader.type);
std::string source = MG_Util::Program::CompileSPIRVToGLSL(mgShader.compiledSpirv, 320, true); std::string source = MG_Util::Program::CompileSPIRVToGLSL(mgShader.compiledSpirv, 320, true);
// Post-processing ESSL // Post-processing ESSL
source = removeLayoutBinding(source); source = removeLayoutBinding(source);
@@ -1066,7 +1092,7 @@ namespace MG_GL::GL {
if (vao->elementBuffer != 0 || indices != nullptr) { if (curvao->elementBuffer != 0 || indices != nullptr) {
CallAndCheck(::GLES::glDrawElements( CallAndCheck(::GLES::glDrawElements(
mode, mode,
count, count,
+1 -2
View File
@@ -8,7 +8,6 @@ android {
minSdk 26 minSdk 26
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndkVersion '27.2.12479018'
} }
buildTypes { buildTypes {
@@ -33,5 +32,5 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
ndkVersion '26.1.10909125' ndkVersion '27.2.12479018'
} }