Commit 0b4bc585 by Ben Clayton

Style: clang-format the tests source too

Move the `.clang-format` rule up one level from `./src` to `.`. Add a `.clang-format` file to `./third_party` that disables formatting. Update `./src/clang-format-all.sh` to include `./tests`. Format all source files in `./tests`. Bug: b/144825072 Change-Id: I01c7ae37a7b1fe8d63ee143107da8acefba20e76 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/39873 Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAntonio Maiorano <amaiorano@google.com> Tested-by: 's avatarBen Clayton <bclayton@google.com>
parent 4be96b5f
SRC_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
ROOT_DIR="$( cd "${SRC_DIR}/.." >/dev/null 2>&1 && pwd )"
TESTS_DIR="$( cd "${ROOT_DIR}/tests" >/dev/null 2>&1 && pwd )"
CLANG_FORMAT=${CLANG_FORMAT:-clang-format}
for DIR in "Device" "Pipeline" "Reactor" "System" "Vulkan" "WSI"
for DIR in "${SRC_DIR}/Device" "${SRC_DIR}/Pipeline" "${SRC_DIR}/Reactor" "${SRC_DIR}/System" "${SRC_DIR}/Vulkan" "${SRC_DIR}/WSI" "${TESTS_DIR}"
do
# Double clang-format, as it seems that one pass isn't always enough
find ${SRC_DIR}/${DIR} -iname "*.hpp" -o -iname "*.cpp" -o -iname "*.inl" | xargs ${CLANG_FORMAT} -i -style=file
find ${SRC_DIR}/${DIR} -iname "*.hpp" -o -iname "*.cpp" -o -iname "*.inl" | xargs ${CLANG_FORMAT} -i -style=file
find ${DIR} -iname "*.hpp" -o -iname "*.cpp" -o -iname "*.inl" | xargs ${CLANG_FORMAT} -i -style=file
find ${DIR} -iname "*.hpp" -o -iname "*.cpp" -o -iname "*.inl" | xargs ${CLANG_FORMAT} -i -style=file
done
......@@ -15,18 +15,18 @@
// OpenGL ES unit tests that provide coverage for functionality not tested by
// the dEQP test suite. Also used as a smoke test.
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <EGL/egl.h>
#include <GL/glcorearb.h>
#include <GL/glext.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES3/gl3.h>
#include <GL/glcorearb.h>
#include <GL/glext.h>
#if defined(_WIN32)
#include <Windows.h>
# include <Windows.h>
#endif
#include <string.h>
......@@ -42,7 +42,7 @@ class SwiftShaderTest : public testing::Test
protected:
void SetUp() override
{
#if defined(_WIN32) && !defined(STANDALONE)
#if defined(_WIN32) && !defined(STANDALONE)
// The DLLs are delay loaded (see BUILD.gn), so we can load
// the correct ones from Chrome's swiftshader subdirectory.
HMODULE libEGL = LoadLibraryA("swiftshader\\libEGL.dll");
......@@ -50,7 +50,7 @@ protected:
HMODULE libGLESv2 = LoadLibraryA("swiftshader\\libGLESv2.dll");
EXPECT_NE((HMODULE)NULL, libGLESv2);
#endif
#endif
}
void expectFramebufferColor(const unsigned char referenceColor[4], GLint x = 0, GLint y = 0)
......@@ -113,8 +113,7 @@ protected:
eglBindAPI(EGL_OPENGL_ES_API);
EXPECT_NO_EGL_ERROR();
const EGLint configAttributes[] =
{
const EGLint configAttributes[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_ALPHA_SIZE, 8,
......@@ -145,8 +144,7 @@ protected:
EXPECT_TRUE(surfaceType & EGL_WINDOW_BIT);
}
EGLint surfaceAttributes[] =
{
EGLint surfaceAttributes[] = {
EGL_WIDTH, 1920,
EGL_HEIGHT, 1080,
EGL_NONE
......@@ -156,8 +154,7 @@ protected:
EXPECT_NO_EGL_ERROR();
EXPECT_NE(EGL_NO_SURFACE, surface);
EGLint contextAttributes[] =
{
EGLint contextAttributes[] = {
EGL_CONTEXT_CLIENT_VERSION, version,
EGL_NONE
};
......@@ -248,7 +245,8 @@ protected:
GLint compileStatus = 0;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
glGetShaderInfoLog(shader, sizeof(buf), nullptr, buf);
EXPECT_EQ(compileStatus, GL_TRUE) << "Compile status: " << std::endl << buf;
EXPECT_EQ(compileStatus, GL_TRUE) << "Compile status: " << std::endl
<< buf;
return shader;
}
......@@ -275,13 +273,13 @@ protected:
GLint linkStatus = 0;
glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
glGetProgramInfoLog(program, sizeof(buf), nullptr, buf);
EXPECT_NE(linkStatus, 0) << "Link status: " << std::endl << buf;
EXPECT_NE(linkStatus, 0) << "Link status: " << std::endl
<< buf;
EXPECT_NO_GL_ERROR();
}
ProgramHandles createProgram(const std::string& vs, const std::string& fs)
ProgramHandles createProgram(const std::string &vs, const std::string &fs)
{
ProgramHandles ph;
ph.vertexShader = MakeShader(vs, GL_VERTEX_SHADER);
......@@ -292,7 +290,7 @@ protected:
return ph;
}
void deleteProgram(const ProgramHandles& ph)
void deleteProgram(const ProgramHandles &ph)
{
glDeleteShader(ph.fragmentShader);
glDeleteShader(ph.vertexShader);
......@@ -301,7 +299,7 @@ protected:
EXPECT_NO_GL_ERROR();
}
void drawQuad(GLuint program, const char* textureName = nullptr)
void drawQuad(GLuint program, const char *textureName = nullptr)
{
GLint prevProgram = 0;
glGetIntegerv(GL_CURRENT_PROGRAM, &prevProgram);
......@@ -337,10 +335,11 @@ protected:
EXPECT_NO_GL_ERROR();
}
std::string replace(std::string str, const std::string& substr, const std::string& replacement)
std::string replace(std::string str, const std::string &substr, const std::string &replacement)
{
size_t pos = 0;
while((pos = str.find(substr, pos)) != std::string::npos) {
while((pos = str.find(substr, pos)) != std::string::npos)
{
str.replace(pos, substr.length(), replacement);
pos += replacement.length();
}
......@@ -486,16 +485,16 @@ TEST_F(SwiftShaderTest, Initalization)
const GLubyte *glVendor = glGetString(GL_VENDOR);
EXPECT_NO_GL_ERROR();
EXPECT_STREQ("Google Inc.", (const char*)glVendor);
EXPECT_STREQ("Google Inc.", (const char *)glVendor);
const GLubyte *glRenderer = glGetString(GL_RENDERER);
EXPECT_NO_GL_ERROR();
EXPECT_STREQ("Google SwiftShader", (const char*)glRenderer);
EXPECT_STREQ("Google SwiftShader", (const char *)glRenderer);
// SwiftShader return an OpenGL ES 3.0 context when a 2.0 context is requested, as allowed by the spec.
const GLubyte *glVersion = glGetString(GL_VERSION);
EXPECT_NO_GL_ERROR();
EXPECT_THAT((const char*)glVersion, testing::HasSubstr("OpenGL ES 3.0 SwiftShader "));
EXPECT_THAT((const char *)glVersion, testing::HasSubstr("OpenGL ES 3.0 SwiftShader "));
Uninitialize();
}
......@@ -964,14 +963,14 @@ TEST_F(SwiftShaderTest, CopyTexImageFromPixelBuffer)
glGenTextures(1, &texture);
EXPECT_NO_GL_ERROR();
GLuint tex_data[4][4] = {
{red, red, red, red},
{red, red, red, red},
{red, red, red, red},
{red, red, red, red}
{ red, red, red, red },
{ red, red, red, red },
{ red, red, red, red },
{ red, red, red, red }
};
glBindTexture(GL_TEXTURE_2D, texture);
EXPECT_NO_GL_ERROR();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void *) tex_data[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void *)tex_data[0]);
EXPECT_NO_GL_ERROR();
// Set up Pixel Buffer Object
GLuint pixelBuffer = 0;
......@@ -982,12 +981,12 @@ TEST_F(SwiftShaderTest, CopyTexImageFromPixelBuffer)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
EXPECT_NO_GL_ERROR();
GLuint pixel_data[4][4] = {
{blue, blue, green, green},
{blue, blue, green, green},
{blue, blue, green, green},
{blue, blue, green, green},
{ blue, blue, green, green },
{ blue, blue, green, green },
{ blue, blue, green, green },
{ blue, blue, green, green },
};
glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(pixel_data), (void *) pixel_data, GL_STREAM_DRAW);
glBufferData(GL_PIXEL_UNPACK_BUFFER, sizeof(pixel_data), (void *)pixel_data, GL_STREAM_DRAW);
// Should set the 2-rightmost columns of the currently bound texture to the
// 2-rightmost columns of the PBO;
GLintptr offset = 2 * sizeof(GLuint);
......@@ -1000,24 +999,24 @@ TEST_F(SwiftShaderTest, CopyTexImageFromPixelBuffer)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
EXPECT_NO_GL_ERROR();
unsigned int color[4][4] = {
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }
};
glReadPixels(0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, &color);
EXPECT_NO_GL_ERROR();
bool allEqual = true;
for (int i = 0; i < 4; i++)
for(int i = 0; i < 4; i++)
{
for (int j = 0; j < 2; j++)
for(int j = 0; j < 2; j++)
{
allEqual = allEqual && (color[i][j] == tex_data[i][j]);
allEqual = allEqual && (color[i][j+2] == pixel_data[i][j+2]);
if (!allEqual)
allEqual = allEqual && (color[i][j + 2] == pixel_data[i][j + 2]);
if(!allEqual)
break;
}
if (!allEqual)
if(!allEqual)
break;
}
EXPECT_EQ(allEqual, true);
......@@ -1286,12 +1285,24 @@ TEST_F(SwiftShaderTest, TransformFeedback_BadViewport)
GLint positionLocation = glGetAttribLocation(program, "a_position");
GLfloat quadVertices[] = {
-1.0f, 1.0f, 0.5f,
-1.0f, -1.0f, 0.5f,
1.0f, -1.0f, 0.5f,
-1.0f, 1.0f, 0.5f,
1.0f, -1.0f, 0.5f,
1.0f, 1.0f, 0.5f,
-1.0f,
1.0f,
0.5f,
-1.0f,
-1.0f,
0.5f,
1.0f,
-1.0f,
0.5f,
-1.0f,
1.0f,
0.5f,
1.0f,
-1.0f,
0.5f,
1.0f,
1.0f,
0.5f,
};
glBindBuffer(GL_ARRAY_BUFFER, 0);
......@@ -1345,8 +1356,7 @@ TEST_F(SwiftShaderTest, OutOfMemory)
TEST_F(SwiftShaderTest, ViewportBounds)
{
auto doRenderWithViewportSettings = [&](GLint x, GLint y, GLsizei w, GLsizei h)
{
auto doRenderWithViewportSettings = [&](GLint x, GLint y, GLsizei w, GLsizei h) {
Initialize(3, false);
std::string vs =
......@@ -1808,21 +1818,21 @@ TEST_F(SwiftShaderTest, BlitTest)
{
Initialize(3, false);
GLuint fbos[] = {0, 0};
GLuint fbos[] = { 0, 0 };
glGenFramebuffers(2, fbos);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbos[0]);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbos[1]);
GLuint textures[] = {0, 0};
GLuint textures[] = { 0, 0 };
glGenTextures(2, textures);
glBindTexture(GL_TEXTURE_2D, textures[0]);
unsigned char red[4][4] = {
{255, 0, 0, 255},
{255, 0, 0, 255},
{255, 0, 0, 255},
{255, 0, 0, 255}
{ 255, 0, 0, 255 },
{ 255, 0, 0, 255 },
{ 255, 0, 0, 255 },
{ 255, 0, 0, 255 }
};
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, red);
EXPECT_NO_GL_ERROR();
......@@ -1832,10 +1842,10 @@ TEST_F(SwiftShaderTest, BlitTest)
glBindTexture(GL_TEXTURE_2D, textures[1]);
unsigned char black[4][4] = {
{0, 0, 0, 255},
{0, 0, 0, 255},
{0, 0, 0, 255},
{0, 0, 0, 255}
{ 0, 0, 0, 255 },
{ 0, 0, 0, 255 },
{ 0, 0, 0, 255 },
{ 0, 0, 0, 255 }
};
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, black);
EXPECT_NO_GL_ERROR();
......@@ -1847,34 +1857,34 @@ TEST_F(SwiftShaderTest, BlitTest)
EXPECT_EQ(red[0][1], black[0][1]);
// Check that glBlitFramebuffer doesn't crash with ugly input.
const int big = (int) 2e9;
const int big = (int)2e9;
const int small = 200;
const int neg_small = -small;
const int neg_big = -big;
int max = 0x7fffffff;
int data[][8] = {
// sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1
{0, 0, 0, 0, 0, 0, 0, 0},
{-1, -1, -1, -1, -1, -1, -1, -1},
{1, 1, 1, 1, 1, 1, 1, 1},
{-1, -1, 1, 1, -1, -1, 1, 1},
{0, 0, 127, (int) 2e9, 10, 10, 200, 200},
{-2, -2, 127, 2147483470, 10, 10, 200, 200},
{big, small, small, big, big, big, small, small},
{neg_small, small, neg_small, neg_small, neg_small, big, small},
{big, big-1, big-2, big-3, big-4, big-5, big-6, big-7},
{big, neg_big, neg_big, big, small, big, 0, neg_small},
{323479648, 21931, 1769809195, 32733, 0, 0, -161640504, 32766},
{0, 0, max, max, 0, 0, 8, 8},
{0, 0, 8, 8, 0, 0, max, max},
{0, 0, max, max, 0, 0, max, max},
{-1, -1, max, max, 0, 0, 8, 8},
{0, 0, 8, 8, -1, -1, max, max},
{-1, -1, max, max, -1, -1, max, max},
{-max-1, -max-1, max, max, -max-1, -max-1, max, max}
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, -1, -1 },
{ 1, 1, 1, 1, 1, 1, 1, 1 },
{ -1, -1, 1, 1, -1, -1, 1, 1 },
{ 0, 0, 127, (int)2e9, 10, 10, 200, 200 },
{ -2, -2, 127, 2147483470, 10, 10, 200, 200 },
{ big, small, small, big, big, big, small, small },
{ neg_small, small, neg_small, neg_small, neg_small, big, small },
{ big, big - 1, big - 2, big - 3, big - 4, big - 5, big - 6, big - 7 },
{ big, neg_big, neg_big, big, small, big, 0, neg_small },
{ 323479648, 21931, 1769809195, 32733, 0, 0, -161640504, 32766 },
{ 0, 0, max, max, 0, 0, 8, 8 },
{ 0, 0, 8, 8, 0, 0, max, max },
{ 0, 0, max, max, 0, 0, max, max },
{ -1, -1, max, max, 0, 0, 8, 8 },
{ 0, 0, 8, 8, -1, -1, max, max },
{ -1, -1, max, max, -1, -1, max, max },
{ -max - 1, -max - 1, max, max, -max - 1, -max - 1, max, max }
};
for (int i = 0; i < (int) (sizeof(data)/sizeof(data[0])); i++)
for(int i = 0; i < (int)(sizeof(data) / sizeof(data[0])); i++)
{
glBlitFramebuffer(
data[i][0], data[i][1], data[i][2], data[i][3],
......@@ -1923,20 +1933,19 @@ TEST_F(SwiftShaderTest, InvalidEnum_TexImage2D)
TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedIfs)
{
std::string body = "return 1.0;";
for (int i = 0; i < 16; i++)
for(int i = 0; i < 16; i++)
{
body = " if (f > " + std::to_string(i * 0.1f) + ") {\n" + body + "}\n";
}
checkCompiles(
"float F(float f) {\n" + body + " return 0.0f;\n}\n"
);
"float F(float f) {\n" + body + " return 0.0f;\n}\n");
}
TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedSwitches)
{
std::string body = "return 1.0;";
for (int i = 0; i < 16; i++)
for(int i = 0; i < 16; i++)
{
body = " switch (int(f)) {\n case 1:\n f *= 2.0;\n" + body + "}\n";
}
......@@ -1947,7 +1956,7 @@ TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedSwitches)
TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedLoops)
{
std::string loops = "f = f + f * 2.0;";
for (int i = 0; i < 16; i++)
for(int i = 0; i < 16; i++)
{
auto it = "l" + std::to_string(i);
loops = " for (int " + it + " = 0; " + it + " < i; " + it + "++) {\n" + loops + "}\n";
......@@ -1955,17 +1964,17 @@ TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedLoops)
checkCompiles(
"float F(float f) {\n"
" int i = (f > 0.0) ? 1 : 0;\n" + loops +
" int i = (f > 0.0) ? 1 : 0;\n" +
loops +
" return f;\n"
"}\n"
);
"}\n");
}
TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedCalls)
{
std::string funcs = "float E(float f) { return f * 2.0f; }\n";
std::string last = "E";
for (int i = 0; i < 16; i++)
for(int i = 0; i < 16; i++)
{
std::string f = "C" + std::to_string(i);
funcs += "float " + f + "(float f) { return " + last + "(f) + 1.0f; }\n";
......@@ -1973,29 +1982,28 @@ TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedCalls)
}
checkCompiles(funcs +
"float F(float f) { return " + last + "(f); }\n"
);
"float F(float f) { return " + last + "(f); }\n");
}
TEST_F(SwiftShaderTest, CompilerLimits_ManyCallSites)
{
std::string calls;
for (int i = 0; i < 256; i++)
for(int i = 0; i < 256; i++)
{
calls += " f += C(f);\n";
}
checkCompiles(
"float C(float f) { return f * 2.0f; }\n"
"float F(float f) {\n" + calls + " return f;\n}\n"
);
"float F(float f) {\n" +
calls + " return f;\n}\n");
}
TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedCallsInUnusedFunction)
{
std::string funcs = "float E(float f) { return f * 2.0f; }\n";
std::string last = "E";
for (int i = 0; i < 16; i++)
for(int i = 0; i < 16; i++)
{
std::string f = "C" + std::to_string(i);
funcs += "float " + f + "(float f) { return " + last + "(f) + 1.0f; }\n";
......@@ -2003,8 +2011,7 @@ TEST_F(SwiftShaderTest, CompilerLimits_DeepNestedCallsInUnusedFunction)
}
checkCompiles(funcs +
"float F(float f) { return f; }\n"
);
"float F(float f) { return f; }\n");
}
// Test that the compiler correctly handles functions being stripped.
......@@ -2019,8 +2026,7 @@ TEST_F(SwiftShaderTest, CompilerLimits_SparseLabels)
void Dead3() {}
void Dead4() {}
void Dead5() { Dead1(); Dead2(); Dead3(); Dead4(); }
float F(float f) { for(int i = 0; i < -1; ++i) { Dead5(); } return f; })"
);
float F(float f) { for(int i = 0; i < -1; ++i) { Dead5(); } return f; })");
}
// Test that the compiler doesn't compile arrays larger than
......@@ -2041,51 +2047,45 @@ TEST_F(SwiftShaderTest, BadNegation)
{
checkCompileFails(
R"(uniform samplerCube m;
float F (float f) { vec4 ret = texture(-m, vec3(f)); return ret.x; })"
);
float F (float f) { vec4 ret = texture(-m, vec3(f)); return ret.x; })");
checkCompileFails(
R"(uniform sampler2D m[9];
vec4 G (sampler2D X[9]) { return texture(X[0], vec2(0.0f)); }
float F (float f) { vec4 ret = G(-m); return ret.x; })"
);
float F (float f) { vec4 ret = G(-m); return ret.x; })");
checkCompileFails(
R"(struct structType { int a; float b; };
uniform structType m;
float F (float f) { structType n = -m; return f; })"
);
float F (float f) { structType n = -m; return f; })");
checkCompileFails(
R"(struct structType { int a; float b; };
uniform structType m[4];
float F (float f) { structType n[4] = -m; return f; })"
);
float F (float f) { structType n[4] = -m; return f; })");
checkCompileFails(
R"(uniform float m[4];
float G (float f[4]) { return f[0]; }
float F (float f) { return G(-m); })"
);
float F (float f) { return G(-m); })");
}
#ifndef EGL_ANGLE_iosurface_client_buffer
#define EGL_ANGLE_iosurface_client_buffer 1
#define EGL_IOSURFACE_ANGLE 0x3454
#define EGL_IOSURFACE_PLANE_ANGLE 0x345A
#define EGL_TEXTURE_RECTANGLE_ANGLE 0x345B
#define EGL_TEXTURE_TYPE_ANGLE 0x345C
#define EGL_TEXTURE_INTERNAL_FORMAT_ANGLE 0x345D
# define EGL_ANGLE_iosurface_client_buffer 1
# define EGL_IOSURFACE_ANGLE 0x3454
# define EGL_IOSURFACE_PLANE_ANGLE 0x345A
# define EGL_TEXTURE_RECTANGLE_ANGLE 0x345B
# define EGL_TEXTURE_TYPE_ANGLE 0x345C
# define EGL_TEXTURE_INTERNAL_FORMAT_ANGLE 0x345D
#endif /* EGL_ANGLE_iosurface_client_buffer */
#if defined(__APPLE__)
#include <CoreFoundation/CoreFoundation.h>
#include <IOSurface/IOSurface.h>
# include <CoreFoundation/CoreFoundation.h>
# include <IOSurface/IOSurface.h>
namespace
namespace {
void AddIntegerValue(CFMutableDictionaryRef dictionary, const CFStringRef key, int32_t value)
{
void AddIntegerValue(CFMutableDictionaryRef dictionary, const CFStringRef key, int32_t value)
{
CFNumberRef number = CFNumberCreate(nullptr, kCFNumberSInt32Type, &value);
CFDictionaryAddValue(dictionary, key, number);
CFRelease(number);
}
}
} // anonymous namespace
class EGLClientBufferWrapper
......@@ -2121,10 +2121,10 @@ public:
return ioSurface;
}
const unsigned char* lockColor()
const unsigned char *lockColor()
{
IOSurfaceLock(ioSurface, kIOSurfaceLockReadOnly, nullptr);
return reinterpret_cast<const unsigned char*>(IOSurfaceGetBaseAddress(ioSurface));
return reinterpret_cast<const unsigned char *>(IOSurfaceGetBaseAddress(ioSurface));
}
void unlockColor()
......@@ -2132,13 +2132,14 @@ public:
IOSurfaceUnlock(ioSurface, kIOSurfaceLockReadOnly, nullptr);
}
void writeColor(void* data, size_t dataSize)
void writeColor(void *data, size_t dataSize)
{
// Write the data to the IOSurface
IOSurfaceLock(ioSurface, 0, nullptr);
memcpy(IOSurfaceGetBaseAddress(ioSurface), data, dataSize);
IOSurfaceUnlock(ioSurface, 0, nullptr);
}
private:
IOSurfaceRef ioSurface;
};
......@@ -2163,7 +2164,7 @@ public:
return clientBuffer;
}
const unsigned char* lockColor()
const unsigned char *lockColor()
{
return clientBuffer;
}
......@@ -2172,12 +2173,13 @@ public:
{
}
void writeColor(void* data, size_t dataSize)
void writeColor(void *data, size_t dataSize)
{
memcpy(clientBuffer, data, dataSize);
}
private:
unsigned char* clientBuffer;
unsigned char *clientBuffer;
};
#endif
......@@ -2189,14 +2191,22 @@ protected:
{
// Make a PBuffer from it using the EGL_ANGLE_iosurface_client_buffer extension
const EGLint attribs[] = {
EGL_WIDTH, width,
EGL_HEIGHT, height,
EGL_IOSURFACE_PLANE_ANGLE, plane,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, (EGLint)internalFormat,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, (EGLint)type,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
width,
EGL_HEIGHT,
height,
EGL_IOSURFACE_PLANE_ANGLE,
plane,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
(EGLint)internalFormat,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
(EGLint)type,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, buffer, getConfig(), attribs);
......@@ -2235,7 +2245,7 @@ protected:
}
}
void doClearTest(EGLClientBufferWrapper& clientBufferWrapper, GLenum internalFormat, GLenum type, void *data, size_t dataSize)
void doClearTest(EGLClientBufferWrapper &clientBufferWrapper, GLenum internalFormat, GLenum type, void *data, size_t dataSize)
{
ASSERT_TRUE(dataSize <= 4);
......@@ -2260,10 +2270,10 @@ protected:
EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
EXPECT_NO_EGL_ERROR();
const unsigned char* color = clientBufferWrapper.lockColor();
const unsigned char *color = clientBufferWrapper.lockColor();
for(size_t i = 0; i < dataSize; ++i)
{
EXPECT_EQ(color[i], reinterpret_cast<unsigned char*>(data)[i]);
EXPECT_EQ(color[i], reinterpret_cast<unsigned char *>(data)[i]);
}
result = eglDestroySurface(getDisplay(), pbuffer);
......@@ -2271,7 +2281,7 @@ protected:
EXPECT_NO_EGL_ERROR();
}
void doSampleTest(EGLClientBufferWrapper& clientBufferWrapper, GLenum internalFormat, GLenum type, void *data, size_t dataSize)
void doSampleTest(EGLClientBufferWrapper &clientBufferWrapper, GLenum internalFormat, GLenum type, void *data, size_t dataSize)
{
ASSERT_TRUE(dataSize <= 4);
......@@ -2313,10 +2323,10 @@ protected:
EXPECT_EQ((EGLBoolean)EGL_TRUE, result);
EXPECT_NO_EGL_ERROR();
const unsigned char* color = clientBufferWrapper.lockColor();
const unsigned char *color = clientBufferWrapper.lockColor();
for(size_t i = 0; i < dataSize; ++i)
{
EXPECT_EQ(color[i], reinterpret_cast<unsigned char*>(data)[i]);
EXPECT_EQ(color[i], reinterpret_cast<unsigned char *>(data)[i]);
}
clientBufferWrapper.unlockColor();
}
......@@ -2474,14 +2484,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// Success case
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2495,13 +2513,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// Missing EGL_WIDTH
{
const EGLint attribs[] = {
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2512,13 +2537,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// Missing EGL_HEIGHT
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2529,13 +2561,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// Missing EGL_IOSURFACE_PLANE_ANGLE
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2547,13 +2586,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// eglCreatePbufferFromClientBuffer
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2564,13 +2610,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// Missing EGL_TEXTURE_INTERNAL_FORMAT_ANGLE
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2582,13 +2635,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// eglCreatePbufferFromClientBuffer
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2599,13 +2659,20 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationMissingAttributes)
// Missing EGL_TEXTURE_TYPE_ANGLE
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2628,14 +2695,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// Success case
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2649,14 +2724,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_TEXTURE_FORMAT must be EGL_TEXTURE_RGBA
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGB,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2667,14 +2750,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_WIDTH must be at least 1
{
const EGLint attribs[] = {
EGL_WIDTH, 0,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
0,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2685,14 +2776,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_HEIGHT must be at least 1
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 0,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
0,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2704,14 +2803,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_WIDTH must be at most the width of the IOSurface
{
const EGLint attribs[] = {
EGL_WIDTH, 11,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
11,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2722,14 +2829,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_HEIGHT must be at most the height of the IOSurface
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 11,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
11,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2740,14 +2855,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_IOSURFACE_PLANE_ANGLE must less than the number of planes of the IOSurface
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 1,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
1,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2759,14 +2882,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_TEXTURE_FORMAT must be at EGL_TEXTURE_RECTANGLE_ANGLE
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_2D,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2777,14 +2908,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// EGL_IOSURFACE_PLANE_ANGLE must be at least 0
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, -1,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_BGRA_EXT,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
-1,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_BGRA_EXT,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2795,14 +2934,22 @@ TEST_F(IOSurfaceClientBufferTest, NegativeValidationBadAttributes)
// The internal format / type most be listed in the table
{
const EGLint attribs[] = {
EGL_WIDTH, 10,
EGL_HEIGHT, 10,
EGL_IOSURFACE_PLANE_ANGLE, 0,
EGL_TEXTURE_TARGET, EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_RGBA,
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE, GL_UNSIGNED_BYTE,
EGL_NONE, EGL_NONE,
EGL_WIDTH,
10,
EGL_HEIGHT,
10,
EGL_IOSURFACE_PLANE_ANGLE,
0,
EGL_TEXTURE_TARGET,
EGL_TEXTURE_RECTANGLE_ANGLE,
EGL_TEXTURE_INTERNAL_FORMAT_ANGLE,
GL_RGBA,
EGL_TEXTURE_FORMAT,
EGL_TEXTURE_RGBA,
EGL_TEXTURE_TYPE_ANGLE,
GL_UNSIGNED_BYTE,
EGL_NONE,
EGL_NONE,
};
EGLSurface pbuffer = eglCreatePbufferFromClientBuffer(getDisplay(), EGL_IOSURFACE_ANGLE, clientBufferWrapper.getClientBuffer(), getConfig(), attribs);
......@@ -2831,4 +2978,3 @@ TEST_F(IOSurfaceClientBufferTest, MakeCurrentAllowed)
Uninitialize();
}
......@@ -14,8 +14,8 @@
#include "System/Half.hpp"
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <cstdlib>
......
......@@ -14,34 +14,37 @@
#include "System/Memory.hpp"
#ifdef __linux__
#include "System/Linux/MemFd.hpp"
# include "System/Linux/MemFd.hpp"
#endif
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <cstdlib>
using namespace sw;
#ifdef __linux__
TEST(MemFd, DefaultConstructor) {
TEST(MemFd, DefaultConstructor)
{
LinuxMemFd memfd;
ASSERT_FALSE(memfd.isValid());
ASSERT_EQ(-1, memfd.exportFd());
}
TEST(MemFd, AllocatingConstructor) {
TEST(MemFd, AllocatingConstructor)
{
const size_t kRegionSize = sw::memoryPageSize() * 8;
LinuxMemFd memfd("test-region", kRegionSize);
ASSERT_TRUE(memfd.isValid());
ASSERT_GE(memfd.fd(), 0);
void* addr = memfd.mapReadWrite(0, kRegionSize);
void *addr = memfd.mapReadWrite(0, kRegionSize);
ASSERT_TRUE(addr);
memfd.unmap(addr, kRegionSize);
}
TEST(MemFd, ExplicitAllocation) {
TEST(MemFd, ExplicitAllocation)
{
const size_t kRegionSize = sw::memoryPageSize() * 8;
LinuxMemFd memfd;
ASSERT_FALSE(memfd.isValid());
......@@ -50,7 +53,8 @@ TEST(MemFd, ExplicitAllocation) {
ASSERT_TRUE(memfd.isValid());
}
TEST(MemFd, Close) {
TEST(MemFd, Close)
{
const size_t kRegionSize = sw::memoryPageSize() * 8;
LinuxMemFd memfd("test-region", kRegionSize);
ASSERT_TRUE(memfd.isValid());
......@@ -61,12 +65,13 @@ TEST(MemFd, Close) {
::close(fd);
}
TEST(MemFd, ExportImportFd) {
TEST(MemFd, ExportImportFd)
{
const size_t kRegionSize = sw::memoryPageSize() * 8;
LinuxMemFd memfd("test-region1", kRegionSize);
auto* addr = reinterpret_cast<uint8_t*>(memfd.mapReadWrite(0, kRegionSize));
auto *addr = reinterpret_cast<uint8_t *>(memfd.mapReadWrite(0, kRegionSize));
ASSERT_TRUE(addr);
for (size_t n = 0; n < kRegionSize; ++n)
for(size_t n = 0; n < kRegionSize; ++n)
{
addr[n] = static_cast<uint8_t>(n);
}
......@@ -77,9 +82,9 @@ TEST(MemFd, ExportImportFd) {
LinuxMemFd memfd2;
memfd2.importFd(fd);
ASSERT_TRUE(memfd2.isValid());
addr = reinterpret_cast<uint8_t*>(memfd2.mapReadWrite(0, kRegionSize));
addr = reinterpret_cast<uint8_t *>(memfd2.mapReadWrite(0, kRegionSize));
ASSERT_TRUE(addr);
for (size_t n = 0; n < kRegionSize; ++n)
for(size_t n = 0; n < kRegionSize; ++n)
{
ASSERT_EQ(addr[n], static_cast<uint8_t>(n)) << "# " << n;
}
......
......@@ -16,29 +16,34 @@
#include "Driver.hpp"
Device::Device()
: driver(nullptr),
device(nullptr),
physicalDevice(nullptr),
queueFamilyIndex(0) {}
: driver(nullptr)
, device(nullptr)
, physicalDevice(nullptr)
, queueFamilyIndex(0)
{}
Device::Device(
Driver const *driver, VkDevice device, VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex)
: driver(driver),
device(device),
physicalDevice(physicalDevice),
queueFamilyIndex(queueFamilyIndex) {}
: driver(driver)
, device(device)
, physicalDevice(physicalDevice)
, queueFamilyIndex(queueFamilyIndex)
{}
Device::~Device()
{
if (device != nullptr)
if(device != nullptr)
{
driver->vkDeviceWaitIdle(device);
driver->vkDestroyDevice(device, nullptr);
}
}
bool Device::IsValid() const { return device != nullptr; }
bool Device::IsValid() const
{
return device != nullptr;
}
VkResult Device::CreateComputeDevice(
Driver const *driver, VkInstance instance, std::unique_ptr<Device> &out)
......@@ -48,16 +53,16 @@ VkResult Device::CreateComputeDevice(
// Gather all physical devices
std::vector<VkPhysicalDevice> physicalDevices;
result = GetPhysicalDevices(driver, instance, physicalDevices);
if (result != VK_SUCCESS)
if(result != VK_SUCCESS)
{
return result;
}
// Inspect each physical device's queue families for compute support.
for (auto physicalDevice : physicalDevices)
for(auto physicalDevice : physicalDevices)
{
int queueFamilyIndex = GetComputeQueueFamilyIndex(driver, physicalDevice);
if (queueFamilyIndex < 0)
if(queueFamilyIndex < 0)
{
continue;
}
......@@ -87,7 +92,7 @@ VkResult Device::CreateComputeDevice(
VkDevice device;
result = driver->vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device);
if (result != VK_SUCCESS)
if(result != VK_SUCCESS)
{
return result;
}
......@@ -103,9 +108,9 @@ int Device::GetComputeQueueFamilyIndex(
Driver const *driver, VkPhysicalDevice device)
{
auto properties = GetPhysicalDeviceQueueFamilyProperties(driver, device);
for (uint32_t i = 0; i < properties.size(); i++)
for(uint32_t i = 0; i < properties.size(); i++)
{
if ((properties[i].queueFlags & VK_QUEUE_COMPUTE_BIT) != 0)
if((properties[i].queueFlags & VK_QUEUE_COMPUTE_BIT) != 0)
{
return static_cast<int>(i);
}
......@@ -114,7 +119,7 @@ int Device::GetComputeQueueFamilyIndex(
}
std::vector<VkQueueFamilyProperties>
Device::GetPhysicalDeviceQueueFamilyProperties(
Device::GetPhysicalDeviceQueueFamilyProperties(
Driver const *driver, VkPhysicalDevice device)
{
std::vector<VkQueueFamilyProperties> out;
......@@ -126,12 +131,12 @@ std::vector<VkQueueFamilyProperties>
}
VkResult Device::GetPhysicalDevices(
const Driver* driver, VkInstance instance,
std::vector<VkPhysicalDevice>& out)
const Driver *driver, VkInstance instance,
std::vector<VkPhysicalDevice> &out)
{
uint32_t count = 0;
VkResult result = driver->vkEnumeratePhysicalDevices(instance, &count, 0);
if (result != VK_SUCCESS)
if(result != VK_SUCCESS)
{
return result;
}
......@@ -141,7 +146,7 @@ VkResult Device::GetPhysicalDevices(
VkResult Device::CreateStorageBuffer(
VkDeviceMemory memory, VkDeviceSize size,
VkDeviceSize offset, VkBuffer* out) const
VkDeviceSize offset, VkBuffer *out) const
{
const VkBufferCreateInfo info = {
VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, // sType
......@@ -156,13 +161,13 @@ VkResult Device::CreateStorageBuffer(
VkBuffer buffer;
VkResult result = driver->vkCreateBuffer(device, &info, 0, &buffer);
if (result != VK_SUCCESS)
if(result != VK_SUCCESS)
{
return result;
}
result = driver->vkBindBufferMemory(device, buffer, memory, offset);
if (result != VK_SUCCESS)
if(result != VK_SUCCESS)
{
return result;
}
......@@ -177,7 +182,7 @@ void Device::DestroyBuffer(VkBuffer buffer) const
}
VkResult Device::CreateShaderModule(
const std::vector<uint32_t>& spirv, VkShaderModule* out) const
const std::vector<uint32_t> &spirv, VkShaderModule *out) const
{
VkShaderModuleCreateInfo info = {
VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, // sType
......@@ -195,8 +200,8 @@ void Device::DestroyShaderModule(VkShaderModule shaderModule) const
}
VkResult Device::CreateDescriptorSetLayout(
const std::vector<VkDescriptorSetLayoutBinding>& bindings,
VkDescriptorSetLayout* out) const
const std::vector<VkDescriptorSetLayoutBinding> &bindings,
VkDescriptorSetLayout *out) const
{
VkDescriptorSetLayoutCreateInfo info = {
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, // sType
......@@ -215,7 +220,7 @@ void Device::DestroyDescriptorSetLayout(VkDescriptorSetLayout descriptorSetLayou
}
VkResult Device::CreatePipelineLayout(
VkDescriptorSetLayout layout, VkPipelineLayout* out) const
VkDescriptorSetLayout layout, VkPipelineLayout *out) const
{
VkPipelineLayoutCreateInfo info = {
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType
......@@ -237,7 +242,7 @@ void Device::DestroyPipelineLayout(VkPipelineLayout pipelineLayout) const
VkResult Device::CreateComputePipeline(
VkShaderModule module, VkPipelineLayout pipelineLayout,
VkPipeline* out) const
VkPipeline *out) const
{
VkComputePipelineCreateInfo info = {
VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // sType
......@@ -267,7 +272,7 @@ void Device::DestroyPipeline(VkPipeline pipeline) const
}
VkResult Device::CreateStorageBufferDescriptorPool(uint32_t descriptorCount,
VkDescriptorPool* out) const
VkDescriptorPool *out) const
{
VkDescriptorPoolSize size = {
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // type
......@@ -293,7 +298,7 @@ void Device::DestroyDescriptorPool(VkDescriptorPool descriptorPool) const
VkResult Device::AllocateDescriptorSet(
VkDescriptorPool pool, VkDescriptorSetLayout layout,
VkDescriptorSet* out) const
VkDescriptorSet *out) const
{
VkDescriptorSetAllocateInfo info = {
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, // sType
......@@ -308,11 +313,11 @@ VkResult Device::AllocateDescriptorSet(
void Device::UpdateStorageBufferDescriptorSets(
VkDescriptorSet descriptorSet,
const std::vector<VkDescriptorBufferInfo>& bufferInfos) const
const std::vector<VkDescriptorBufferInfo> &bufferInfos) const
{
std::vector<VkWriteDescriptorSet> writes;
writes.reserve(bufferInfos.size());
for (uint32_t i = 0; i < bufferInfos.size(); i++)
for(uint32_t i = 0; i < bufferInfos.size(); i++)
{
writes.push_back(VkWriteDescriptorSet{
VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, // sType
......@@ -331,19 +336,19 @@ void Device::UpdateStorageBufferDescriptorSets(
driver->vkUpdateDescriptorSets(device, writes.size(), writes.data(), 0, nullptr);
}
VkResult Device::AllocateMemory(size_t size, VkMemoryPropertyFlags flags, VkDeviceMemory* out) const
VkResult Device::AllocateMemory(size_t size, VkMemoryPropertyFlags flags, VkDeviceMemory *out) const
{
VkPhysicalDeviceMemoryProperties properties;
driver->vkGetPhysicalDeviceMemoryProperties(physicalDevice, &properties);
for(uint32_t type = 0; type < properties.memoryTypeCount; type++)
{
if ((flags & properties.memoryTypes[type].propertyFlags) == 0)
if((flags & properties.memoryTypes[type].propertyFlags) == 0)
{
continue; // Type mismatch
}
if (size > properties.memoryHeaps[properties.memoryTypes[type].heapIndex].size)
if(size > properties.memoryHeaps[properties.memoryTypes[type].heapIndex].size)
{
continue; // Too small.
}
......@@ -377,7 +382,7 @@ void Device::UnmapMemory(VkDeviceMemory memory) const
driver->vkUnmapMemory(device, memory);
}
VkResult Device::CreateCommandPool(VkCommandPool* out) const
VkResult Device::CreateCommandPool(VkCommandPool *out) const
{
VkCommandPoolCreateInfo info = {
VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType
......@@ -394,7 +399,7 @@ void Device::DestroyCommandPool(VkCommandPool commandPool) const
}
VkResult Device::AllocateCommandBuffer(
VkCommandPool pool, VkCommandBuffer* out) const
VkCommandPool pool, VkCommandBuffer *out) const
{
VkCommandBufferAllocateInfo info = {
VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType
......@@ -442,7 +447,7 @@ VkResult Device::QueueSubmitAndWait(VkCommandBuffer commandBuffer) const
};
VkResult result = driver->vkQueueSubmit(queue, 1, &info, 0);
if (result != VK_SUCCESS)
if(result != VK_SUCCESS)
{
return result;
}
......
......@@ -35,7 +35,7 @@ public:
// returned (as there was no Vulkan error), but calling Device::IsValid()
// on this device will return false.
static VkResult CreateComputeDevice(
Driver const *driver, VkInstance instance, std::unique_ptr<Device>& out);
Driver const *driver, VkInstance instance, std::unique_ptr<Device> &out);
// IsValid returns true if the Device is initialized and can be used.
bool IsValid() const;
......@@ -105,7 +105,7 @@ public:
// given flag bits set.
// If memory could not be allocated from any heap then
// VK_ERROR_OUT_OF_DEVICE_MEMORY is returned.
VkResult AllocateMemory(size_t size, VkMemoryPropertyFlags flags, VkDeviceMemory* out) const;
VkResult AllocateMemory(size_t size, VkMemoryPropertyFlags flags, VkDeviceMemory *out) const;
// FreeMemory frees the VkDeviceMemory.
void FreeMemory(VkDeviceMemory memory) const;
......@@ -118,13 +118,13 @@ public:
void UnmapMemory(VkDeviceMemory memory) const;
// CreateCommandPool creates a new command pool.
VkResult CreateCommandPool(VkCommandPool* out) const;
VkResult CreateCommandPool(VkCommandPool *out) const;
// DestroyCommandPool destroys a VkCommandPool.
void DestroyCommandPool(VkCommandPool commandPool) const;
// AllocateCommandBuffer creates a new command buffer with a primary level.
VkResult AllocateCommandBuffer(VkCommandPool pool, VkCommandBuffer* out) const;
VkResult AllocateCommandBuffer(VkCommandPool pool, VkCommandBuffer *out) const;
// FreeCommandBuffer frees the VkCommandBuffer.
void FreeCommandBuffer(VkCommandPool pool, VkCommandBuffer buffer);
......@@ -146,7 +146,6 @@ public:
private:
Device(Driver const *driver, VkDevice device, VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);
static std::vector<VkQueueFamilyProperties>
GetPhysicalDeviceQueueFamilyProperties(
Driver const *driver, VkPhysicalDevice device);
......
......@@ -33,8 +33,9 @@
# error Unimplemented platform
#endif
Driver::Driver() : vk_icdGetInstanceProcAddr(nullptr), dll(nullptr)
{
Driver::Driver()
: vk_icdGetInstanceProcAddr(nullptr)
, dll(nullptr){
#define VK_GLOBAL(N, R, ...) N = nullptr
#include "VkGlobalFuncs.hpp"
#undef VK_GLOBAL
......@@ -42,9 +43,9 @@ Driver::Driver() : vk_icdGetInstanceProcAddr(nullptr), dll(nullptr)
#define VK_INSTANCE(N, R, ...) N = nullptr
#include "VkInstanceFuncs.hpp"
#undef VK_INSTANCE
}
}
Driver::~Driver()
Driver::~Driver()
{
unload();
}
......@@ -52,33 +53,33 @@ Driver::~Driver()
bool Driver::loadSwiftShader()
{
#if OS_WINDOWS
#if !defined(STANDALONE)
# if !defined(STANDALONE)
// The DLL is delay loaded (see BUILD.gn), so we can load
// the correct ones from Chrome's swiftshader subdirectory.
HMODULE libvulkan = LoadLibraryA("swiftshader\\libvulkan.dll");
EXPECT_NE((HMODULE)NULL, libvulkan);
return true;
#elif defined(NDEBUG)
#if defined(_WIN64)
# elif defined(NDEBUG)
# if defined(_WIN64)
return load("./build/Release_x64/vk_swiftshader.dll") ||
load("./build/Release/vk_swiftshader.dll") ||
load("./vk_swiftshader.dll");
#else
# else
return load("./build/Release_Win32/vk_swiftshader.dll") ||
load("./build/Release/vk_swiftshader.dll") ||
load("./vk_swiftshader.dll");
#endif
#else
#if defined(_WIN64)
# endif
# else
# if defined(_WIN64)
return load("./build/Debug_x64/vk_swiftshader.dll") ||
load("./build/Debug/vk_swiftshader.dll") ||
load("./vk_swiftshader.dll");
#else
# else
return load("./build/Debug_Win32/vk_swiftshader.dll") ||
load("./build/Debug/vk_swiftshader.dll") ||
load("./vk_swiftshader.dll");
#endif
#endif
# endif
# endif
#elif OS_MAC
return load("./build/Darwin/libvk_swiftshader.dylib") ||
load("swiftshader/libvk_swiftshader.dylib") ||
......@@ -91,7 +92,7 @@ bool Driver::loadSwiftShader()
#elif OS_ANDROID || OS_FUCHSIA
return load("libvk_swiftshader.so");
#else
#error Unimplemented platform
# error Unimplemented platform
#endif
}
......@@ -104,7 +105,7 @@ bool Driver::loadSystem()
#endif
}
bool Driver::load(const char* path)
bool Driver::load(const char *path)
{
#if OS_WINDOWS
dll = LoadLibraryA(path);
......@@ -148,7 +149,7 @@ void Driver::unload()
#if OS_WINDOWS
FreeLibrary((HMODULE)dll);
#elif (OS_LINUX || OS_FUCHSIA)
#elif(OS_LINUX || OS_FUCHSIA)
dlclose(dll);
#endif
......@@ -188,7 +189,7 @@ bool Driver::resolve(VkInstance instance)
return true;
}
void* Driver::lookup(const char* name)
void *Driver::lookup(const char *name)
{
#if OS_WINDOWS
return GetProcAddress((HMODULE)dll, name);
......
......@@ -33,7 +33,7 @@ public:
// load attempts to load the vulkan driver from the given path.
// returns true on success, false on failure.
bool load(const char* path);
bool load(const char *path);
// unloads the currently loaded driver.
// No-op if no driver is currently loaded.
......@@ -45,40 +45,40 @@ public:
// resolve all the functions for the given VkInstance.
bool resolve(VkInstance);
VKAPI_ATTR PFN_vkVoidFunction(VKAPI_CALL* vk_icdGetInstanceProcAddr)(VkInstance instance, const char* pName);
VKAPI_ATTR PFN_vkVoidFunction(VKAPI_CALL *vk_icdGetInstanceProcAddr)(VkInstance instance, const char *pName);
// Global vulkan function pointers.
#define VK_GLOBAL(N, R, ...) VKAPI_ATTR R (VKAPI_CALL *N)(__VA_ARGS__)
#define VK_GLOBAL(N, R, ...) VKAPI_ATTR R(VKAPI_CALL *N)(__VA_ARGS__)
#include "VkGlobalFuncs.hpp"
#undef VK_GLOBAL
// Per-instance vulkan function pointers.
#define VK_INSTANCE(N, R, ...) VKAPI_ATTR R (VKAPI_CALL *N)(__VA_ARGS__)
#define VK_INSTANCE(N, R, ...) VKAPI_ATTR R(VKAPI_CALL *N)(__VA_ARGS__)
#include "VkInstanceFuncs.hpp"
#undef VK_INSTANCE
private:
Driver(const Driver&) = delete;
Driver(Driver&&) = delete;
Driver& operator=(const Driver&) = delete;
Driver(const Driver &) = delete;
Driver(Driver &&) = delete;
Driver &operator=(const Driver &) = delete;
// lookup searches the loaded driver for a symbol with the given name,
// returning the address of this symbol if found, otherwise nullptr.
void* lookup(const char* name);
void *lookup(const char *name);
// Helper function to lookup a symbol and cast it to the appropriate type.
// Returns true if the symbol was found and assigned to ptr, otherwise
// returns false.
template<typename T>
inline bool lookup(T* ptr, const char* name);
inline bool lookup(T *ptr, const char *name);
void* dll;
void *dll;
};
template<typename T>
bool Driver::lookup(T* ptr, const char* name)
bool Driver::lookup(T *ptr, const char *name)
{
void* sym = lookup(name);
void *sym = lookup(name);
if(sym == nullptr)
{
return false;
......
......@@ -17,5 +17,5 @@
// TODO: Generate this list.
// VK_GLOBAL(<function name>, <return type>, <arguments>...)
VK_GLOBAL(vkCreateInstance, VkResult, const VkInstanceCreateInfo*, const VkAllocationCallbacks*, VkInstance*);
VK_GLOBAL(vkEnumerateInstanceVersion, VkResult, uint32_t*);
VK_GLOBAL(vkCreateInstance, VkResult, const VkInstanceCreateInfo *, const VkAllocationCallbacks *, VkInstance *);
VK_GLOBAL(vkEnumerateInstanceVersion, VkResult, uint32_t *);
......@@ -17,53 +17,53 @@
// TODO: Generate this list.
// VK_INSTANCE(<function name>, <return type>, <arguments>...)
VK_INSTANCE(vkAllocateCommandBuffers, VkResult, VkDevice, const VkCommandBufferAllocateInfo*, VkCommandBuffer*);
VK_INSTANCE(vkAllocateDescriptorSets, VkResult, VkDevice, const VkDescriptorSetAllocateInfo*, VkDescriptorSet*);
VK_INSTANCE(vkAllocateMemory, VkResult, VkDevice, const VkMemoryAllocateInfo*, const VkAllocationCallbacks*,
VkDeviceMemory*);
VK_INSTANCE(vkBeginCommandBuffer, VkResult, VkCommandBuffer, const VkCommandBufferBeginInfo*);
VK_INSTANCE(vkAllocateCommandBuffers, VkResult, VkDevice, const VkCommandBufferAllocateInfo *, VkCommandBuffer *);
VK_INSTANCE(vkAllocateDescriptorSets, VkResult, VkDevice, const VkDescriptorSetAllocateInfo *, VkDescriptorSet *);
VK_INSTANCE(vkAllocateMemory, VkResult, VkDevice, const VkMemoryAllocateInfo *, const VkAllocationCallbacks *,
VkDeviceMemory *);
VK_INSTANCE(vkBeginCommandBuffer, VkResult, VkCommandBuffer, const VkCommandBufferBeginInfo *);
VK_INSTANCE(vkBindBufferMemory, VkResult, VkDevice, VkBuffer, VkDeviceMemory, VkDeviceSize);
VK_INSTANCE(vkCmdBindDescriptorSets, void, VkCommandBuffer, VkPipelineBindPoint, VkPipelineLayout, uint32_t, uint32_t,
const VkDescriptorSet*, uint32_t, const uint32_t*);
const VkDescriptorSet *, uint32_t, const uint32_t *);
VK_INSTANCE(vkCmdBindPipeline, void, VkCommandBuffer, VkPipelineBindPoint, VkPipeline);
VK_INSTANCE(vkCmdDispatch, void, VkCommandBuffer, uint32_t, uint32_t, uint32_t);
VK_INSTANCE(vkCreateBuffer, VkResult, VkDevice, const VkBufferCreateInfo*, const VkAllocationCallbacks*, VkBuffer*);
VK_INSTANCE(vkCreateCommandPool, VkResult, VkDevice, const VkCommandPoolCreateInfo*, const VkAllocationCallbacks*,
VkCommandPool*);
VK_INSTANCE(vkCreateComputePipelines, VkResult, VkDevice, VkPipelineCache, uint32_t, const VkComputePipelineCreateInfo*,
const VkAllocationCallbacks*, VkPipeline*);
VK_INSTANCE(vkCreateDescriptorPool, VkResult, VkDevice, const VkDescriptorPoolCreateInfo*, const VkAllocationCallbacks*,
VkDescriptorPool*);
VK_INSTANCE(vkCreateDescriptorSetLayout, VkResult, VkDevice, const VkDescriptorSetLayoutCreateInfo*,
const VkAllocationCallbacks*, VkDescriptorSetLayout*);
VK_INSTANCE(vkCreateDevice, VkResult, VkPhysicalDevice, const VkDeviceCreateInfo*, const VkAllocationCallbacks*,
VkDevice*);
VK_INSTANCE(vkCreatePipelineLayout, VkResult, VkDevice, const VkPipelineLayoutCreateInfo*, const VkAllocationCallbacks*,
VkPipelineLayout*);
VK_INSTANCE(vkCreateShaderModule, VkResult, VkDevice, const VkShaderModuleCreateInfo*, const VkAllocationCallbacks*,
VkShaderModule*);
VK_INSTANCE(vkDestroyBuffer, void, VkDevice, VkBuffer, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyCommandPool, void, VkDevice, VkCommandPool, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyDescriptorPool, void, VkDevice, VkDescriptorPool, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyDescriptorSetLayout, void, VkDevice, VkDescriptorSetLayout, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyDevice, VkResult, VkDevice, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyInstance, void, VkInstance, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyPipeline, void, VkDevice, VkPipeline, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyPipelineLayout, void, VkDevice, VkPipelineLayout, const VkAllocationCallbacks*);
VK_INSTANCE(vkDestroyShaderModule, void, VkDevice, VkShaderModule, const VkAllocationCallbacks*);
VK_INSTANCE(vkCreateBuffer, VkResult, VkDevice, const VkBufferCreateInfo *, const VkAllocationCallbacks *, VkBuffer *);
VK_INSTANCE(vkCreateCommandPool, VkResult, VkDevice, const VkCommandPoolCreateInfo *, const VkAllocationCallbacks *,
VkCommandPool *);
VK_INSTANCE(vkCreateComputePipelines, VkResult, VkDevice, VkPipelineCache, uint32_t, const VkComputePipelineCreateInfo *,
const VkAllocationCallbacks *, VkPipeline *);
VK_INSTANCE(vkCreateDescriptorPool, VkResult, VkDevice, const VkDescriptorPoolCreateInfo *, const VkAllocationCallbacks *,
VkDescriptorPool *);
VK_INSTANCE(vkCreateDescriptorSetLayout, VkResult, VkDevice, const VkDescriptorSetLayoutCreateInfo *,
const VkAllocationCallbacks *, VkDescriptorSetLayout *);
VK_INSTANCE(vkCreateDevice, VkResult, VkPhysicalDevice, const VkDeviceCreateInfo *, const VkAllocationCallbacks *,
VkDevice *);
VK_INSTANCE(vkCreatePipelineLayout, VkResult, VkDevice, const VkPipelineLayoutCreateInfo *, const VkAllocationCallbacks *,
VkPipelineLayout *);
VK_INSTANCE(vkCreateShaderModule, VkResult, VkDevice, const VkShaderModuleCreateInfo *, const VkAllocationCallbacks *,
VkShaderModule *);
VK_INSTANCE(vkDestroyBuffer, void, VkDevice, VkBuffer, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyCommandPool, void, VkDevice, VkCommandPool, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyDescriptorPool, void, VkDevice, VkDescriptorPool, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyDescriptorSetLayout, void, VkDevice, VkDescriptorSetLayout, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyDevice, VkResult, VkDevice, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyInstance, void, VkInstance, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyPipeline, void, VkDevice, VkPipeline, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyPipelineLayout, void, VkDevice, VkPipelineLayout, const VkAllocationCallbacks *);
VK_INSTANCE(vkDestroyShaderModule, void, VkDevice, VkShaderModule, const VkAllocationCallbacks *);
VK_INSTANCE(vkEndCommandBuffer, VkResult, VkCommandBuffer);
VK_INSTANCE(vkEnumeratePhysicalDevices, VkResult, VkInstance, uint32_t*, VkPhysicalDevice*);
VK_INSTANCE(vkFreeCommandBuffers, void, VkDevice, VkCommandPool, uint32_t, const VkCommandBuffer*);
VK_INSTANCE(vkFreeMemory, void, VkDevice, VkDeviceMemory, const VkAllocationCallbacks*);
VK_INSTANCE(vkGetDeviceQueue, void, VkDevice, uint32_t, uint32_t, VkQueue*);
VK_INSTANCE(vkGetPhysicalDeviceMemoryProperties, void, VkPhysicalDevice, VkPhysicalDeviceMemoryProperties*);
VK_INSTANCE(vkGetPhysicalDeviceProperties, void, VkPhysicalDevice, VkPhysicalDeviceProperties*);
VK_INSTANCE(vkGetPhysicalDeviceProperties2, void, VkPhysicalDevice, VkPhysicalDeviceProperties2*);
VK_INSTANCE(vkGetPhysicalDeviceQueueFamilyProperties, void, VkPhysicalDevice, uint32_t*, VkQueueFamilyProperties*);
VK_INSTANCE(vkMapMemory, VkResult, VkDevice, VkDeviceMemory, VkDeviceSize, VkDeviceSize, VkMemoryMapFlags, void**);
VK_INSTANCE(vkQueueSubmit, VkResult, VkQueue, uint32_t, const VkSubmitInfo*, VkFence);
VK_INSTANCE(vkEnumeratePhysicalDevices, VkResult, VkInstance, uint32_t *, VkPhysicalDevice *);
VK_INSTANCE(vkFreeCommandBuffers, void, VkDevice, VkCommandPool, uint32_t, const VkCommandBuffer *);
VK_INSTANCE(vkFreeMemory, void, VkDevice, VkDeviceMemory, const VkAllocationCallbacks *);
VK_INSTANCE(vkGetDeviceQueue, void, VkDevice, uint32_t, uint32_t, VkQueue *);
VK_INSTANCE(vkGetPhysicalDeviceMemoryProperties, void, VkPhysicalDevice, VkPhysicalDeviceMemoryProperties *);
VK_INSTANCE(vkGetPhysicalDeviceProperties, void, VkPhysicalDevice, VkPhysicalDeviceProperties *);
VK_INSTANCE(vkGetPhysicalDeviceProperties2, void, VkPhysicalDevice, VkPhysicalDeviceProperties2 *);
VK_INSTANCE(vkGetPhysicalDeviceQueueFamilyProperties, void, VkPhysicalDevice, uint32_t *, VkQueueFamilyProperties *);
VK_INSTANCE(vkMapMemory, VkResult, VkDevice, VkDeviceMemory, VkDeviceSize, VkDeviceSize, VkMemoryMapFlags, void **);
VK_INSTANCE(vkQueueSubmit, VkResult, VkQueue, uint32_t, const VkSubmitInfo *, VkFence);
VK_INSTANCE(vkQueueWaitIdle, VkResult, VkQueue);
VK_INSTANCE(vkUnmapMemory, void, VkDevice, VkDeviceMemory);
VK_INSTANCE(vkUpdateDescriptorSets, void, VkDevice, uint32_t, const VkWriteDescriptorSet*, uint32_t,
const VkCopyDescriptorSet*);
VK_INSTANCE(vkUpdateDescriptorSets, void, VkDevice, uint32_t, const VkWriteDescriptorSet *, uint32_t,
const VkCopyDescriptorSet *);
VK_INSTANCE(vkDeviceWaitIdle, VkResult, VkDevice);
\ No newline at end of file
......@@ -15,23 +15,22 @@
// Vulkan unit tests that provide coverage for functionality not tested by
// the dEQP test suite. Also used as a smoke test.
#include "Driver.hpp"
#include "Device.hpp"
#include "Driver.hpp"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "spirv-tools/libspirv.hpp"
#include <sstream>
#include <cstring>
#include <sstream>
namespace
namespace {
size_t alignUp(size_t val, size_t alignment)
{
size_t alignUp(size_t val, size_t alignment)
{
return alignment * ((val + alignment - 1) / alignment);
}
}
} // anonymous namespace
class SwiftShaderVulkanTest : public testing::Test
......@@ -150,10 +149,10 @@ TEST_F(SwiftShaderVulkanTest, UnsupportedDeviceExtension)
EXPECT_EQ(result, VK_SUCCESS);
// Inspect each physical device's queue families for compute support.
for (auto physicalDevice : physicalDevices)
for(auto physicalDevice : physicalDevices)
{
int queueFamilyIndex = Device::GetComputeQueueFamilyIndex(&driver, physicalDevice);
if (queueFamilyIndex < 0)
if(queueFamilyIndex < 0)
{
continue;
}
......@@ -190,11 +189,11 @@ TEST_F(SwiftShaderVulkanTest, UnsupportedDeviceExtension)
driver.vkDestroyInstance(instance, nullptr);
}
std::vector<uint32_t> compileSpirv(const char* assembly)
std::vector<uint32_t> compileSpirv(const char *assembly)
{
spvtools::SpirvTools core(SPV_ENV_VULKAN_1_0);
core.SetMessageConsumer([](spv_message_level_t, const char*, const spv_position_t& p, const char* m) {
core.SetMessageConsumer([](spv_message_level_t, const char *, const spv_position_t &p, const char *m) {
FAIL() << p.line << ":" << p.column << ": " << m;
});
......@@ -207,27 +206,26 @@ std::vector<uint32_t> compileSpirv(const char* assembly)
// if the SSA names (%X) in the debugger do not match the source.
std::string disassembled;
core.Disassemble(spirv, &disassembled, SPV_BINARY_TO_TEXT_OPTION_NO_HEADER);
if (disassembled != assembly)
if(disassembled != assembly)
{
printf("-- WARNING: Disassembly does not match assembly: ---\n\n");
auto splitLines = [](const std::string& str) -> std::vector<std::string>
{
auto splitLines = [](const std::string &str) -> std::vector<std::string> {
std::stringstream ss(str);
std::vector<std::string> out;
std::string line;
while (std::getline(ss, line, '\n')) { out.push_back(line); }
while(std::getline(ss, line, '\n')) { out.push_back(line); }
return out;
};
auto srcLines = splitLines(std::string(assembly));
auto disLines = splitLines(disassembled);
for (size_t line = 0; line < srcLines.size() && line < disLines.size(); line++)
for(size_t line = 0; line < srcLines.size() && line < disLines.size(); line++)
{
auto srcLine = (line < srcLines.size()) ? srcLines[line] : "<missing>";
auto disLine = (line < disLines.size()) ? disLines[line] : "<missing>";
if (srcLine != disLine)
if(srcLine != disLine)
{
printf("%zu: '%s' != '%s'\n", line, srcLine.c_str(), disLine.c_str());
}
......@@ -247,13 +245,13 @@ struct ComputeParams
int localSizeY;
int localSizeZ;
friend std::ostream& operator<<(std::ostream& os, const ComputeParams& params) {
return os << "ComputeParams{" <<
"numElements: " << params.numElements << ", " <<
"localSizeX: " << params.localSizeX << ", " <<
"localSizeY: " << params.localSizeY << ", " <<
"localSizeZ: " << params.localSizeZ <<
"}";
friend std::ostream &operator<<(std::ostream &os, const ComputeParams &params)
{
return os << "ComputeParams{"
<< "numElements: " << params.numElements << ", "
<< "localSizeX: " << params.localSizeX << ", "
<< "localSizeY: " << params.localSizeY << ", "
<< "localSizeZ: " << params.localSizeZ << "}";
}
};
......@@ -262,13 +260,13 @@ struct ComputeParams
class SwiftShaderVulkanBufferToBufferComputeTest : public testing::TestWithParam<ComputeParams>
{
public:
void test(const std::string& shader,
void test(const std::string &shader,
std::function<uint32_t(uint32_t idx)> input,
std::function<uint32_t(uint32_t idx)> expected);
};
void SwiftShaderVulkanBufferToBufferComputeTest::test(
const std::string& shader,
const std::string &shader,
std::function<uint32_t(uint32_t idx)> input,
std::function<uint32_t(uint32_t idx)> expected)
{
......@@ -317,7 +315,7 @@ void SwiftShaderVulkanBufferToBufferComputeTest::test(
size_t magic0Offset = alignElements - 1;
size_t inOffset = 1 + magic0Offset;
size_t magic1Offset = numElements + inOffset;
size_t magic2Offset = alignUp(magic1Offset+1, alignElements) - 1;
size_t magic2Offset = alignUp(magic1Offset + 1, alignElements) - 1;
size_t outOffset = 1 + magic2Offset;
size_t magic3Offset = numElements + outOffset;
size_t buffersTotalElements = alignUp(1 + magic3Offset, alignElements);
......@@ -328,8 +326,8 @@ void SwiftShaderVulkanBufferToBufferComputeTest::test(
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
&memory));
uint32_t* buffers;
VK_ASSERT(device->MapMemory(memory, 0, buffersSize, 0, (void**)&buffers));
uint32_t *buffers;
VK_ASSERT(device->MapMemory(memory, 0, buffersSize, 0, (void **)&buffers));
buffers[magic0Offset] = magic0;
buffers[magic1Offset] = magic1;
......@@ -359,8 +357,7 @@ void SwiftShaderVulkanBufferToBufferComputeTest::test(
VkShaderModule shaderModule;
VK_ASSERT(device->CreateShaderModule(code, &shaderModule));
std::vector<VkDescriptorSetLayoutBinding> descriptorSetLayoutBindings =
{
std::vector<VkDescriptorSetLayoutBinding> descriptorSetLayoutBindings = {
{
0, // binding
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, // descriptorType
......@@ -392,8 +389,7 @@ void SwiftShaderVulkanBufferToBufferComputeTest::test(
VkDescriptorSet descriptorSet;
VK_ASSERT(device->AllocateDescriptorSet(descriptorPool, descriptorSetLayout, &descriptorSet));
std::vector<VkDescriptorBufferInfo> descriptorBufferInfos =
{
std::vector<VkDescriptorBufferInfo> descriptorBufferInfos = {
{
bufferIn, // buffer
0, // offset
......@@ -426,9 +422,9 @@ void SwiftShaderVulkanBufferToBufferComputeTest::test(
VK_ASSERT(device->QueueSubmitAndWait(commandBuffer));
VK_ASSERT(device->MapMemory(memory, 0, buffersSize, 0, (void**)&buffers));
VK_ASSERT(device->MapMemory(memory, 0, buffersSize, 0, (void **)&buffers));
for (size_t i = 0; i < numElements; ++i)
for(size_t i = 0; i < numElements; ++i)
{
auto got = buffers[i + outOffset];
EXPECT_EQ(expected(i), got) << "Unexpected output at " << i;
......@@ -457,18 +453,10 @@ void SwiftShaderVulkanBufferToBufferComputeTest::test(
driver.vkDestroyInstance(instance, nullptr);
}
INSTANTIATE_TEST_SUITE_P(ComputeParams, SwiftShaderVulkanBufferToBufferComputeTest, testing::Values(
ComputeParams{512, 1, 1, 1},
ComputeParams{512, 2, 1, 1},
ComputeParams{512, 4, 1, 1},
ComputeParams{512, 8, 1, 1},
ComputeParams{512, 16, 1, 1},
ComputeParams{512, 32, 1, 1},
INSTANTIATE_TEST_SUITE_P(ComputeParams, SwiftShaderVulkanBufferToBufferComputeTest, testing::Values(ComputeParams{ 512, 1, 1, 1 }, ComputeParams{ 512, 2, 1, 1 }, ComputeParams{ 512, 4, 1, 1 }, ComputeParams{ 512, 8, 1, 1 }, ComputeParams{ 512, 16, 1, 1 }, ComputeParams{ 512, 32, 1, 1 },
// Non-multiple of SIMD-lane.
ComputeParams{3, 1, 1, 1},
ComputeParams{2, 1, 1, 1}
));
ComputeParams{ 3, 1, 1, 1 }, ComputeParams{ 2, 1, 1, 1 }));
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, Memcpy)
{
......@@ -487,6 +475,7 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, Memcpy)
// {
// Out.Data[gl_GlobalInvocationID.x] = In.Data[gl_GlobalInvocationID.x];
// }
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -529,13 +518,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, Memcpy)
"OpStore %23 %22\n" // out.arr[gl_GlobalInvocationId.x] = in[gl_GlobalInvocationId.x]
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, GlobalInvocationId)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -587,14 +579,17 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, GlobalInvocationId)
"OpStore %32 %31\n" // out.arr[gl_GlobalInvocationId.x] = in[gl_GlobalInvocationId.x] + gl_GlobalInvocationId.y + gl_GlobalInvocationId.z
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
// gl_GlobalInvocationId.y and gl_GlobalInvocationId.z should both be zero.
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchSimple)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -647,13 +642,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchSimple)
"OpStore %23 %22\n"
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchDeclareSSA)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -707,13 +705,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchDeclareSSA)
"OpStore %23 %25\n" // use SSA value from previous block
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i * 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i * 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalSimple)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -767,13 +768,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalSimple)
"OpStore %25 %26\n" // use SSA value from previous block
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i%2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i % 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalTwoEmptyBlocks)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -831,14 +835,17 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalTwoEmptyBloc
"OpStore %25 %26\n" // use SSA value from previous block
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i%2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i % 2; });
}
// TODO: Test for parallel assignment
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalStore)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -897,13 +904,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalStore)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 1 : 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 1 : 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalReturnTrue)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -959,14 +969,17 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalReturnTrue)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 0 : 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 0 : 2; });
}
// TODO: Test for parallel assignment
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalPhi)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1025,13 +1038,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, BranchConditionalPhi)
"OpStore %26 %32\n"
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 1 : 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 1 : 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchEmptyCases)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1088,13 +1104,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchEmptyCases)
"OpStore %25 %26\n" // use SSA value from previous block
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i%2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i % 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchStore)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1152,13 +1171,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchStore)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 2 : 1; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 0 ? 2 : 1; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchCaseReturn)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1215,13 +1237,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchCaseReturn)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 0 : 1; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 0 : 1; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchDefaultReturn)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1278,13 +1303,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchDefaultReturn)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 1 : 0; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 1 : 0; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchCaseFallthrough)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1345,13 +1373,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchCaseFallthrough)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchDefaultFallthrough)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1414,13 +1445,16 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchDefaultFallthrough)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchPhi)
{
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"OpMemoryModel Logical GLSL450\n"
......@@ -1478,8 +1512,10 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, SwitchPhi)
// End of branch logic
"OpReturn\n"
"OpFunctionEnd\n";
// clang-format on
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 1 : 2; });
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return (i % 2) == 1 ? 1 : 2; });
}
TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, LoopDivergentMergePhi)
......@@ -1509,6 +1545,7 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, LoopDivergentMergePhi)
// Out.Data[gl_GlobalInvocationID.x] = phi;
// }
std::stringstream src;
// clang-format off
src <<
"OpCapability Shader\n"
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
......@@ -1581,5 +1618,8 @@ TEST_P(SwiftShaderVulkanBufferToBufferComputeTest, LoopDivergentMergePhi)
"OpStore %42 %41\n"
"OpReturn\n"
"OpFunctionEnd\n";
test(src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
// clang-format on
test(
src.str(), [](uint32_t i) { return i; }, [](uint32_t i) { return i; });
}
......@@ -24,52 +24,60 @@
#include "Renderer/VertexProcessor.hpp"
#include "Shader/VertexProgram.hpp"
#include <cassert>
#include <cstdint>
#include <memory>
#include <cassert>
namespace {
// TODO(cwallez@google.com): Like in ANGLE, disable most of the pool allocator for fuzzing
// This is a helper class to make sure all the resources used by the compiler are initialized
class ScopedPoolAllocatorAndTLS {
public:
ScopedPoolAllocatorAndTLS() {
class ScopedPoolAllocatorAndTLS
{
public:
ScopedPoolAllocatorAndTLS()
{
InitializeParseContextIndex();
InitializePoolIndex();
SetGlobalPoolAllocator(&allocator);
}
~ScopedPoolAllocatorAndTLS() {
~ScopedPoolAllocatorAndTLS()
{
SetGlobalPoolAllocator(nullptr);
FreePoolIndex();
FreeParseContextIndex();
}
private:
private:
TPoolAllocator allocator;
};
// Trivial implementation of the glsl::Shader interface that fakes being an API-level
// shader object.
class FakeVS : public glsl::Shader {
public:
FakeVS(sw::VertexShader* bytecode) : bytecode(bytecode) {
class FakeVS : public glsl::Shader
{
public:
FakeVS(sw::VertexShader *bytecode)
: bytecode(bytecode)
{
}
sw::Shader *getShader() const override {
sw::Shader *getShader() const override
{
return bytecode;
}
sw::VertexShader *getVertexShader() const override {
sw::VertexShader *getVertexShader() const override
{
return bytecode;
}
private:
sw::VertexShader* bytecode;
private:
sw::VertexShader *bytecode;
};
} // anonymous namespace
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
// Data layout:
//
......@@ -125,8 +133,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
glslCompiler->Init(resources);
const char* glslSource = reinterpret_cast<const char*>(data + kHeaderSize);
if (!glslCompiler->compile(&glslSource, 1, SH_OBJECT_CODE))
const char *glslSource = reinterpret_cast<const char *>(data + kHeaderSize);
if(!glslCompiler->compile(&glslSource, 1, SH_OBJECT_CODE))
{
return 0;
}
......@@ -163,7 +171,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
for(int i = 0; i < sw::MAX_VERTEX_INPUTS; i++)
{
sw::StreamType type = (sw::StreamType)data[1 + 2 * i + 0];
Stream stream = (Stream&)data[1 + 2 * i + 1];
Stream stream = (Stream &)data[1 + 2 * i + 1];
if(type > sw::STREAMTYPE_LAST) return 0;
if(stream.count > MAX_ATTRIBUTE_COMPONENTS) return 0;
......@@ -206,7 +214,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
auto routine = program("VertexRoutine");
assert(routine);
const void *entry = routine->getEntry();
assert(entry); (void)entry;
assert(entry);
(void)entry;
return 0;
}
......@@ -219,7 +228,7 @@ int main(int argc, char *argv[])
fseek(file, 0L, SEEK_END);
long numbytes = ftell(file);
fseek(file, 0L, SEEK_SET);
uint8_t *buffer = (uint8_t*)calloc(numbytes, sizeof(uint8_t));
uint8_t *buffer = (uint8_t *)calloc(numbytes, sizeof(uint8_t));
fread(buffer, sizeof(char), numbytes, file);
fclose(file);
......
---
Language: Cpp
DisableFormat: true
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment