diff --git a/build/build-android.sh b/build/build-android.sh new file mode 100644 index 000000000..005684f36 --- /dev/null +++ b/build/build-android.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +export QT_INSTALL_DIR=~/Qt +export QT_VERSION=6.7.3 +export QTCREATOR_VERSION=13.0.1 +export QT_BIN=$QT_INSTALL_DIR/$QT_VERSION/clang_64/bin + +#./build/install-qt.sh -d $QT_INSTALL_DIR --version $QTCREATOR_VERSION qtcreator + +qbs --version +qbs setup-android --ndk-dir /d/Environment/Android/sdk/ndk/29.0.14206865 android +qbs setup-toolchains --detect +qbs config --list + +qbs build --all-products config:release qbs.toolchainType:clang profile:android diff --git a/build/build-osx.sh b/build/build-osx.sh index 541557955..0818dafa4 100644 --- a/build/build-osx.sh +++ b/build/build-osx.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash export QT_INSTALL_DIR=~/Qt -export QT_VERSION=5.12.10 -export QTCREATOR_VERSION=5.0.3 +export QT_VERSION=6.7.3 +export QTCREATOR_VERSION=13.0.1 export QT_BIN=$QT_INSTALL_DIR/$QT_VERSION/clang_64/bin export PATH="$QT_INSTALL_DIR/Qt Creator.app/Contents/MacOS:$QT_BIN:$PATH" -./build/install-qt.sh -d $QT_INSTALL_DIR --version $QT_VERSION qtbase qtmultimedia qtscript qtsvg qtimageformats qttools qtxmlpatterns qtdeclarative +./build/install-qt.sh -d $QT_INSTALL_DIR --version $QT_VERSION qtbase qtsvg qtimageformats qttools qtxmlpatterns qtdeclarative ./build/install-qt.sh -d $QT_INSTALL_DIR --version $QTCREATOR_VERSION qtcreator qbs --version diff --git a/build/build-win.sh b/build/build-win.sh index 1a6789f84..58705abbc 100644 --- a/build/build-win.sh +++ b/build/build-win.sh @@ -1,23 +1,18 @@ #!/usr/bin/env bash -export MSVC=2015 +export MSVC=2022 export QT_INSTALL_DIR=/c/Qt -export QT_VERSION=5.12.10 -export QTCREATOR_VERSION=5.0.3 +export QT_VERSION=6.7.3 +export QTCREATOR_VERSION=13.0.1 export QT_BIN=$QT_INSTALL_DIR/$QT_VERSION/clang_64/bin -export PATH="$QT_INSTALL_DIR/Qt Creator.app/Contents/MacOS:$QT_BIN:$PATH" +export PATH="$QT_BIN:$PATH" -./build/install-qt.sh -d $QT_INSTALL_DIR --version $QT_VERSION qtbase qtmultimedia qtscript qtsvg qtimageformats qttools qtxmlpatterns qtdeclarative +./build/install-qt.sh -d $QT_INSTALL_DIR --version $QT_VERSION qtbase qtsvg qtimageformats qttools qtxmlpatterns qtdeclarative ./build/install-qt.sh -d $QT_INSTALL_DIR --version $QTCREATOR_VERSION qtcreator qbs --version qbs setup-toolchains --detect -qbs config defaultProfile xcode +qbs setup-qt $QT_PATH/qmake.exe qt qbs config --list -qbs install --all-products config:release - -qbs resolve config:release profile:xcode-iphoneos-arm64 -qbs install --all-products config:release profile:xcode-iphoneos-arm64 -qbs resolve config:release profile:xcode-appletvos-arm64 -qbs install --all-products config:release profile:xcode-appletvos-arm64 +qbs install --all-products config:release profile:qt diff --git a/modules/renders/rendergl/includes/resources/materialgl.h b/modules/renders/rendergl/includes/resources/materialgl.h index d8f80046c..e8efdd744 100644 --- a/modules/renders/rendergl/includes/resources/materialgl.h +++ b/modules/renders/rendergl/includes/resources/materialgl.h @@ -64,14 +64,14 @@ class MaterialGL : public Material { public: void loadUserData(const VariantMap &data) override; - uint32_t getProgram(uint16_t type, int32_t &global, int32_t &local); + uint32_t getProgram(uint32_t type, int32_t &global, int32_t &local); Textures &textures() { return m_textures; } protected: uint32_t buildShader(uint16_t type, const TString &src = TString()); - uint32_t buildProgram(const std::vector &shaders, uint16_t vertex); + uint32_t buildProgram(const std::vector &shaders); bool checkShader(uint32_t shader); bool checkProgram(uint32_t program); diff --git a/modules/renders/rendergl/src/resources/materialgl.cpp b/modules/renders/rendergl/src/resources/materialgl.cpp index 9fc7ede62..11a20205f 100644 --- a/modules/renders/rendergl/src/resources/materialgl.cpp +++ b/modules/renders/rendergl/src/resources/materialgl.cpp @@ -11,11 +11,6 @@ const uint32_t gMaxUBO = 65536; -namespace { - const char *gInstanceData("InstanceData"); - const char *gGlobalData("Global"); -}; - void MaterialGL::loadUserData(const VariantMap &data) { Material::loadUserData(data); @@ -47,7 +42,7 @@ void MaterialGL::loadUserData(const VariantMap &data) { switchState(ToBeUpdated); } -uint32_t MaterialGL::getProgram(uint16_t type, int32_t &global, int32_t &local) { +uint32_t MaterialGL::getProgram(uint32_t type, int32_t &global, int32_t &local) { switch(state()) { case ToBeUpdated: { for(auto it : m_programs) { @@ -55,7 +50,7 @@ uint32_t MaterialGL::getProgram(uint16_t type, int32_t &global, int32_t &local) } m_programs.clear(); - for(uint16_t v = Static; v < VertexLast; v++) { + for(uint16_t v = VertexStatic; v < VertexLast; v++) { auto itv = m_shaderSources.find(v); if(itv != m_shaderSources.end()) { for(uint16_t f = FragmentDefault; f < FragmentLast; f++) { @@ -66,11 +61,24 @@ uint32_t MaterialGL::getProgram(uint16_t type, int32_t &global, int32_t &local) std::vector shaders = {vertex, fragment}; - uint32_t program = buildProgram(shaders, v); - m_programs[v * f] = program; + uint32_t hash = v; + Mathf::hashCombine(hash, f); + + uint32_t program = buildProgram(shaders); + m_programs[hash] = program; + #ifdef THUNDER_MOBILE - m_globals[v * f] = glGetUniformBlockIndex(program, gGlobalData); - m_locals[v * f] = glGetUniformBlockIndex(program, gInstanceData); + int32_t global = glGetUniformBlockIndex(program, "Global"); + if(global > -1) { + m_globals[hash] = global; + glUniformBlockBinding(program, global, global); + } + + int32_t instanceData = glGetUniformBlockIndex(program, "InstanceData"); + if(instanceData > -1) { + m_locals[hash] = instanceData; + glUniformBlockBinding(program, instanceData, instanceData); + } #endif } } @@ -137,7 +145,7 @@ uint32_t MaterialGL::buildShader(uint16_t type, const TString &src) { return shader; } -uint32_t MaterialGL::buildProgram(const std::vector &shaders, uint16_t vertex) { +uint32_t MaterialGL::buildProgram(const std::vector &shaders) { uint32_t result = glCreateProgram(); if(result) { #ifndef THUNDER_MOBILE @@ -345,9 +353,12 @@ bool MaterialInstanceGL::bind(CommandBufferGL *buffer, uint32_t layer, uint32_t MaterialGL *material = static_cast(m_material); + uint32_t hash = (m_surfaceType + 1); + Mathf::hashCombine(hash, type); + int32_t globalLocation = -1; int32_t instanceLocation = -1; - uint32_t program = material->getProgram((m_surfaceType + 1) * type, globalLocation, instanceLocation); + uint32_t program = material->getProgram(hash, globalLocation, instanceLocation); if(!program) { return false; } @@ -359,10 +370,6 @@ bool MaterialInstanceGL::bind(CommandBufferGL *buffer, uint32_t layer, uint32_t } if(globalLocation > -1 && index == 0) { - if(globalBuffer == 0) { - glBindBufferBase(GL_UNIFORM_BUFFER, globalLocation, globalBuffer); - glUniformBlockBinding(program, globalLocation, globalLocation); - } static uint32_t currentGlobal = 0; if(globalBuffer != currentGlobal) { glBindBufferBase(GL_UNIFORM_BUFFER, globalLocation, globalBuffer); @@ -377,11 +384,13 @@ bool MaterialInstanceGL::bind(CommandBufferGL *buffer, uint32_t layer, uint32_t static uint32_t instanceBuffer = 0; if(instanceBuffer != m_instanceBuffer) { + if(instanceLocation > -1) { #ifdef THUNDER_MOBILE - glBindBufferBase(GL_UNIFORM_BUFFER, instanceLocation, m_instanceBuffer); + glBindBufferBase(GL_UNIFORM_BUFFER, instanceLocation, m_instanceBuffer); #else - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, instanceLocation, m_instanceBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, instanceLocation, m_instanceBuffer); #endif + } instanceBuffer = m_instanceBuffer; } @@ -444,18 +453,16 @@ void MaterialInstanceGL::copyLocalData(uint32_t index, uint32_t program, int32_t if(m_instanceBuffer == 0) { glGenBuffers(1, &m_instanceBuffer); - int blockSize = -1; + int blockSize = 0; glGetActiveUniformBlockiv(program, instanceLocation, GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize); glBindBuffer(GL_UNIFORM_BUFFER, m_instanceBuffer); glBufferData(GL_UNIFORM_BUFFER, blockSize, nullptr, GL_DYNAMIC_DRAW); - - glBindBufferBase(GL_UNIFORM_BUFFER, instanceLocation, m_instanceBuffer); - glUniformBlockBinding(program, instanceLocation, instanceLocation); } uint32_t offset = index * gMaxUBO; int gpuBufferSize = MIN(gpuBuffer.size() - offset, gMaxUBO); + glBindBuffer(GL_UNIFORM_BUFFER, m_instanceBuffer); glBufferSubData(GL_UNIFORM_BUFFER, 0, gpuBufferSize, &gpuBuffer[offset]); glBindBuffer(GL_UNIFORM_BUFFER, 0);