diff --git a/data/glslcompiler_sgx535 b/data/glslcompiler_sgx535 new file mode 100755 index 0000000000..f595f45d90 Binary files /dev/null and b/data/glslcompiler_sgx535 differ diff --git a/drape/drape.pro b/drape/drape.pro index bf7c580ead..b5ee1fe177 100644 --- a/drape/drape.pro +++ b/drape/drape.pro @@ -11,6 +11,7 @@ CONFIG += staticlib warn_on DEPENDENCIES = base ROOT_DIR = .. +SHADER_COMPILE_ARGS = $$PWD/shaders shader_index.txt shader_def include($$ROOT_DIR/common.pri) DRAPE_DIR = . diff --git a/drape/drape_common.pri b/drape/drape_common.pri index 2389503146..b298e2476c 100644 --- a/drape/drape_common.pri +++ b/drape/drape_common.pri @@ -1,4 +1,4 @@ -CMDRES = $$system(python ../tools/autobuild/shader_preprocessor.py $$PWD/shaders shader_index.txt shader_def) +CMDRES = $$system(python ../tools/autobuild/shader_preprocessor.py $$SHADER_COMPILE_ARGS) message($$CMDRES) SOURCES += \ diff --git a/drape/drape_tests/compile_shaders_test.cpp b/drape/drape_tests/compile_shaders_test.cpp new file mode 100644 index 0000000000..f5676de60c --- /dev/null +++ b/drape/drape_tests/compile_shaders_test.cpp @@ -0,0 +1,85 @@ +#include "../../testing/testing.hpp" + +#include "enum_shaders.hpp" + +#include "../../platform/platform.hpp" +#include "../../std/sstream.hpp" + +#include +#include + +string DebugPrint(QString const & s) +{ + return s.toStdString(); +} + +UNIT_TEST(CompileShaders_Test) +{ + Platform & platform = GetPlatform(); + string glslCompilerPath = platform.ResourcesDir() + "glslcompiler_sgx535"; + if (!platform.IsFileExistsByFullPath(glslCompilerPath)) + { + glslCompilerPath = platform.WritableDir() + "glslcompiler_sgx535"; + if (!platform.IsFileExistsByFullPath(glslCompilerPath)) + TEST_EQUAL(false, true, ("GLSL compiler not found")); + } + + bool isPass = true; + QString errorLog; + QTextStream ss(&errorLog); + + gpu_test::InitEnumeration(); + for (size_t i = 0; i < gpu_test::VertexEnum.size(); ++i) + { + QProcess p; + p.setProcessChannelMode(QProcess::MergedChannels); + QStringList args; + args << QString::fromStdString(gpu_test::VertexEnum[i]) + << QString::fromStdString(gpu_test::VertexEnum[i] + ".bin") + << "-v"; + p.start(QString::fromStdString(glslCompilerPath), args, QIODevice::ReadOnly); + + if (!p.waitForStarted()) + TEST_EQUAL(false, true, ("GLSL compiler not started")); + + if (!p.waitForFinished()) + TEST_EQUAL(false, true, ("GLSL compiler not finished in time")); + + QString result = p.readAllStandardOutput(); + if (result.indexOf("Success") == -1) + { + ss << "\n" << QString("SHADER COMPILE ERROR\n"); + ss << QString::fromStdString(gpu_test::VertexEnum[i]) << "\n"; + ss << result.trimmed() << "\n"; + isPass = false; + } + } + + for (size_t i = 0; i < gpu_test::FragmentEnum.size(); ++i) + { + QProcess p; + p.setProcessChannelMode(QProcess::MergedChannels); + QStringList args; + args << QString::fromStdString(gpu_test::FragmentEnum[i]) + << QString::fromStdString(gpu_test::FragmentEnum[i] + ".bin") + << "-f"; + p.start(QString::fromStdString(glslCompilerPath), args, QIODevice::ReadOnly); + + if (!p.waitForStarted()) + TEST_EQUAL(false, true, ("GLSL compiler not started")); + + if (!p.waitForFinished()) + TEST_EQUAL(false, true, ("GLSL compiler not finished in time")); + + QString result = p.readAllStandardOutput(); + if (result.indexOf("Succes") == -1) + { + ss << "\n" << QString("SHADER COMPILE ERROR\n"); + ss << QString::fromStdString(gpu_test::FragmentEnum[i]) << "\n"; + ss << result.trimmed() << "\n"; + isPass = false; + } + } + + TEST_EQUAL(isPass, true, (errorLog)); +} diff --git a/drape/drape_tests/drape_tests.pro b/drape/drape_tests/drape_tests.pro index e90ec4e2a0..e32eb123c1 100644 --- a/drape/drape_tests/drape_tests.pro +++ b/drape/drape_tests/drape_tests.pro @@ -10,15 +10,22 @@ CONFIG -= app_bundle TEMPLATE = app DEFINES += OGL_TEST_ENABLED GTEST_DONT_DEFINE_TEST -DEPENDENCIES = base gmock +DEPENDENCIES = platform base gmock ROOT_DIR = ../.. +SHADER_COMPILE_ARGS = $$PWD/../shaders shader_index.txt shader_def $$PWD/enum_shaders.hpp include($$ROOT_DIR/common.pri) +QT += core + DRAPE_DIR = .. include($$DRAPE_DIR/drape_common.pri) INCLUDEPATH += $$ROOT_DIR/3party/gmock/include $$ROOT_DIR/3party/gmock/gtest/include +macx-* { + LIBS *= "-framework CoreLocation" "-framework Foundation" +} + SOURCES += \ glfunctions.cpp \ testingmain.cpp \ @@ -26,7 +33,9 @@ SOURCES += \ glmock_functions.cpp \ buffer_tests.cpp \ uniform_value_tests.cpp \ - attribute_provides_tests.cpp + attribute_provides_tests.cpp \ + compile_shaders_test.cpp HEADERS += \ - glmock_functions.hpp + glmock_functions.hpp \ + enum_shaders.hpp diff --git a/drape/drape_tests/enum_shaders.hpp b/drape/drape_tests/enum_shaders.hpp new file mode 100644 index 0000000000..d5fdde7bf4 --- /dev/null +++ b/drape/drape_tests/enum_shaders.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "../../std/vector.hpp" +#include "../../std/string.hpp" + +namespace gpu_test +{ + vector VertexEnum; + vector FragmentEnum; + + void InitEnumeration() + { + VertexEnum.push_back("/Users/ExMix/develop/omim/drape/shaders/simple_vertex_shader.vsh"); + VertexEnum.push_back("/Users/ExMix/develop/omim/drape/shaders/texturing_vertex_shader.vsh"); + FragmentEnum.push_back("/Users/ExMix/develop/omim/drape/shaders/solid_area_fragment_shader.fsh"); + FragmentEnum.push_back("/Users/ExMix/develop/omim/drape/shaders/texturing_fragment_shader.fsh"); + } +} diff --git a/tools/autobuild/shader_preprocessor.py b/tools/autobuild/shader_preprocessor.py index 77ae7f5b0e..9ed70d9d4c 100644 --- a/tools/autobuild/shader_preprocessor.py +++ b/tools/autobuild/shader_preprocessor.py @@ -172,6 +172,31 @@ def validateDocumentation(shaders, shaderDir): print "no documentation for shaders:", undocumentedShaders exit(20) +def writeEnumerationFile(shaderDir, shaders, outputFile): + file = open(outputFile, 'w') + vertexShaders = [s for s in shaders if s.endswith(".vsh")] + fragmentShaders = [s for s in shaders if s.endswith(".fsh")] + + file.write("#pragma once\n\n") + file.write("#include \"../../std/vector.hpp\"\n") + file.write("#include \"../../std/string.hpp\"\n\n") + file.write("namespace gpu_test\n") + file.write("{\n") + + file.write(" vector VertexEnum;\n") + file.write(" vector FragmentEnum;\n\n") + + file.write(" void InitEnumeration()\n") + file.write(" {\n") + + for s in vertexShaders: + file.write(" VertexEnum.push_back(\"%s\");\n" % (os.path.abspath(os.path.join(shaderDir, s)))) + for s in fragmentShaders: + file.write(" FragmentEnum.push_back(\"%s\");\n" % (os.path.abspath(os.path.join(shaderDir, s)))) + + file.write(" }\n") + file.write("}\n") + if len(sys.argv) < 4: print "Usage : " + sys.argv[0] + " " exit(1) @@ -193,3 +218,6 @@ else: print "No need to update definition file" writeImplementationFile(programDefinition, programIndex, shaderIndex, shaderDir, implFile, definesFile) validateDocumentation(shaders, shaderDir) + +if len(sys.argv) > 4: + writeEnumerationFile(shaderDir, shaders, sys.argv[4])