Browse Source

Fixes: docs, tests

pull/576/head
Vladislav Oleshko 4 years ago
parent
commit
1a1c045ef3
  1. 6
      src/Magnum/GL/AbstractShaderProgram.h
  2. 4
      src/Magnum/GL/Shader.h
  3. 20
      src/Magnum/GL/Test/AbstractShaderProgramGLTest.cpp
  4. 80
      src/Magnum/GL/Test/ShaderGLTest.cpp
  5. 45
      src/Magnum/Shaders/Test/FlatGLTest.cpp

6
src/Magnum/GL/AbstractShaderProgram.h

@ -1260,7 +1260,13 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject {
/**
* @brief Non-blocking linking status check
* @return @cpp true @ce if linking finished, @cpp false @ce otherwise
*
* On some drivers this might return false even after
* @ref checkLink() reported successful linking.
*
* @see @fn_gl_keyword{GetProgram} with
* @def_gl_extension{COMPLETION_STATUS,KHR,parallel_shader_compile}
*/
bool isLinkFinished();

4
src/Magnum/GL/Shader.h

@ -661,6 +661,10 @@ class MAGNUM_GL_EXPORT Shader: public AbstractObject {
/**
* @brief Non-blocking compilation status check
* @return @cpp true @ce if shader compilation finished, @cpp false @ce otherwise
*
* @see @fn_gl_keyword{GetProgram} with
* @def_gl_extension{COMPLETION_STATUS,KHR,parallel_shader_compile}
*
*/
bool isCompileFinished();

20
src/Magnum/GL/Test/AbstractShaderProgramGLTest.cpp

@ -30,6 +30,7 @@
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Resource.h>
#include <Corrade/Utility/System.h>
#include "Magnum/Image.h"
#include "Magnum/ImageView.h"
@ -265,8 +266,10 @@ void AbstractShaderProgramGLTest::create() {
MAGNUM_VERIFY_NO_GL_ERROR();
CORRADE_VERIFY(linked);
// TODO: decide on this.
//CORRADE_VERIFY(program.isLinkFinished());
// Some drivers need a bit of time to update this result
Utility::System::sleep(200);
CORRADE_VERIFY(program.isLinkFinished());
{
#if defined(CORRADE_TARGET_APPLE) && !defined(MAGNUM_TARGET_GLES)
CORRADE_EXPECT_FAIL("macOS drivers need insane amount of state to validate properly.");
@ -329,7 +332,11 @@ void AbstractShaderProgramGLTest::createAsync() {
program.bindAttributeLocation(0, "position");
program.submitLink();
while(!program.isLinkFinished())
Utility::System::sleep(100);
CORRADE_VERIFY(program.checkLink());
CORRADE_VERIFY(program.isLinkFinished());
const bool valid = program.validate().first;
MAGNUM_VERIFY_NO_GL_ERROR();
@ -486,6 +493,9 @@ void AbstractShaderProgramGLTest::linkFailure() {
MyPublicShader program;
program.attachShaders({shader});
CORRADE_VERIFY(!program.link());
Utility::System::sleep(200);
CORRADE_VERIFY(program.isLinkFinished());
}
void AbstractShaderProgramGLTest::linkFailureAsync() {
@ -512,11 +522,15 @@ void AbstractShaderProgramGLTest::linkFailureAsync() {
std::ostringstream out;
Error redirectError{&out};
program.submitLink();
while(!program.isLinkFinished())
Utility::System::sleep(100);
CORRADE_VERIFY(out.str().empty());
CORRADE_VERIFY(!program.checkLink());
CORRADE_VERIFY(program.isLinkFinished());
CORRADE_COMPARE_AS(out.str(), "GL::AbstractShaderProgram::link(): linking failed with the following message:",
TestSuite::Compare::StringHasPrefix);
}

80
src/Magnum/GL/Test/ShaderGLTest.cpp

@ -27,6 +27,7 @@
#include <Corrade/Containers/StringStl.h> /** @todo remove once Shader is <string>-free */
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/System.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/GL/Context.h"
@ -42,18 +43,6 @@
namespace Magnum { namespace GL { namespace Test { namespace {
constexpr GL::Version shaderCompileGLVersion =
#ifndef MAGNUM_TARGET_GLES
#ifndef CORRADE_TARGET_APPLE
Version::GL210
#else
Version::GL310
#endif
;
#else
Version::GLES200;
#endif
struct ShaderGLTest: OpenGLTester {
explicit ShaderGLTest();
@ -282,7 +271,19 @@ void ShaderGLTest::addFile() {
}
void ShaderGLTest::compile() {
Shader shader(shaderCompileGLVersion, Shader::Type::Fragment);
#ifndef MAGNUM_TARGET_GLES
constexpr Version v =
#ifndef CORRADE_TARGET_APPLE
Version::GL210
#else
Version::GL310
#endif
;
#else
constexpr Version v = Version::GLES200;
#endif
Shader shader(v, Shader::Type::Fragment);
shader.addSource("void main() {}\n");
CORRADE_VERIFY(shader.compile());
@ -290,7 +291,19 @@ void ShaderGLTest::compile() {
}
void ShaderGLTest::compileFailure() {
Shader shader(shaderCompileGLVersion, Shader::Type::Fragment);
#ifndef MAGNUM_TARGET_GLES
constexpr Version v =
#ifndef CORRADE_TARGET_APPLE
Version::GL210
#else
Version::GL310
#endif
;
#else
constexpr Version v = Version::GLES200;
#endif
Shader shader(v, Shader::Type::Fragment);
shader.addSource("[fu] bleh error #:! stuff\n");
CORRADE_VERIFY(!shader.compile());
@ -298,23 +311,56 @@ void ShaderGLTest::compileFailure() {
}
void ShaderGLTest::compileAsync() {
Shader shader(shaderCompileGLVersion, Shader::Type::Fragment);
#ifndef MAGNUM_TARGET_GLES
constexpr Version v =
#ifndef CORRADE_TARGET_APPLE
Version::GL210
#else
Version::GL310
#endif
;
#else
constexpr Version v = Version::GLES200;
#endif
Shader shader(v, Shader::Type::Fragment);
shader.addSource("void main() {}\n");
shader.submitCompile();
while(!shader.isCompileFinished())
Utility::System::sleep(100);
CORRADE_VERIFY(shader.checkCompile());
CORRADE_VERIFY(shader.isCompileFinished());
}
void ShaderGLTest::compileAsyncFailure() {
Shader shader(shaderCompileGLVersion, Shader::Type::Fragment);
#ifndef MAGNUM_TARGET_GLES
constexpr Version v =
#ifndef CORRADE_TARGET_APPLE
Version::GL210
#else
Version::GL310
#endif
;
#else
constexpr Version v = Version::GLES200;
#endif
Shader shader(v, Shader::Type::Fragment);
shader.addSource("[fu] bleh error #:! stuff\n");
shader.submitCompile();
std::ostringstream out;
Error redirectError{&out};
shader.submitCompile();
while(!shader.isCompileFinished())
Utility::System::sleep(100);
CORRADE_VERIFY(out.str().empty());
CORRADE_VERIFY(!shader.checkCompile());
CORRADE_VERIFY(shader.isCompileFinished());
CORRADE_COMPARE_AS(out.str(), "GL::Shader::compile(): compilation of fragment shader failed with the following message:",
TestSuite::Compare::StringHasPrefix);
}

45
src/Magnum/Shaders/Test/FlatGLTest.cpp

@ -31,6 +31,7 @@
#include <Corrade/PluginManager/Manager.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/FormatStl.h>
#include <Corrade/Utility/System.h>
#include <Corrade/Utility/Path.h>
#ifdef CORRADE_TARGET_APPLE
@ -599,19 +600,22 @@ constexpr struct {
FlatGLTest::FlatGLTest() {
addInstancedTests<FlatGLTest>({
&FlatGLTest::construct<2>,
&FlatGLTest::construct<3>,
&FlatGLTest::constructAsync<2>,
&FlatGLTest::constructAsync<3>},
&FlatGLTest::construct<3>},
Containers::arraySize(ConstructData));
addTests<FlatGLTest>({
&FlatGLTest::constructAsync<2>,
&FlatGLTest::constructAsync<3>});
#ifndef MAGNUM_TARGET_GLES2
addInstancedTests<FlatGLTest>({
&FlatGLTest::constructUniformBuffers<2>,
&FlatGLTest::constructUniformBuffers<3>,
&FlatGLTest::constructUniformBuffersAsync<2>,
&FlatGLTest::constructUniformBuffersAsync<3>},
&FlatGLTest::constructUniformBuffers<3>},
Containers::arraySize(ConstructUniformBuffersData));
addTests<FlatGLTest>({
&FlatGLTest::constructUniformBuffersAsync<2>,
&FlatGLTest::constructUniformBuffersAsync<3>});
#endif
addTests<FlatGLTest>({
@ -863,7 +867,14 @@ template<UnsignedInt dimensions> void FlatGLTest::construct() {
template<UnsignedInt dimensions> void FlatGLTest::constructAsync() {
setTestCaseTemplateName(Utility::format("{}", dimensions));
auto&& data = ConstructData[testCaseInstanceId()];
constexpr struct {
const char* name;
FlatGL2D::Flags flags;
} data {
"textured + texture transformation",
FlatGL2D::Flag::Textured|FlatGL2D::Flag::TextureTransformation
};
setTestCaseDescription(data.name);
#ifndef MAGNUM_TARGET_GLES
@ -876,10 +887,12 @@ template<UnsignedInt dimensions> void FlatGLTest::constructAsync() {
auto compileState = FlatGL<dimensions>::compile(data.flags);
CORRADE_COMPARE(compileState.flags(), data.flags);
while(!compileState.isLinkFinished())
Utility::System::sleep(100);
FlatGL<dimensions> shader{std::move(compileState)};
CORRADE_COMPARE(shader.flags(), data.flags);
// TODO: decide on this.
// CORRADE_VERIFY(shader.isLinkFinished());
CORRADE_VERIFY(shader.id());
{
#if defined(CORRADE_TARGET_APPLE) && !defined(MAGNUM_TARGET_GLES)
@ -938,7 +951,16 @@ template<UnsignedInt dimensions> void FlatGLTest::constructUniformBuffers() {
template<UnsignedInt dimensions> void FlatGLTest::constructUniformBuffersAsync() {
setTestCaseTemplateName(Utility::format("{}", dimensions));
auto&& data = ConstructUniformBuffersData[testCaseInstanceId()];
constexpr struct {
const char* name;
FlatGL2D::Flags flags;
UnsignedInt materialCount, drawCount;
} data {
"alpha mask",
FlatGL2D::Flag::UniformBuffers|FlatGL2D::Flag::AlphaMask,
1, 1
};
setTestCaseDescription(data.name);
#ifndef MAGNUM_TARGET_GLES
@ -968,6 +990,9 @@ template<UnsignedInt dimensions> void FlatGLTest::constructUniformBuffersAsync()
CORRADE_COMPARE(compileState.materialCount(), data.materialCount);
CORRADE_COMPARE(compileState.drawCount(), data.drawCount);
while(!compileState.isLinkFinished())
Utility::System::sleep(100);
FlatGL<dimensions> shader{std::move(compileState)};
CORRADE_COMPARE(shader.flags(), data.flags);
CORRADE_COMPARE(shader.materialCount(), data.materialCount);

Loading…
Cancel
Save