[Misc] (All): Run format_code.sh

This commit is contained in:
BZLZHH
2025-10-02 15:11:38 +08:00
parent 69fe996e15
commit ee971306ca
26 changed files with 1355 additions and 1492 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
#endif
#ifdef _WIN32
# ifndef NOMINMAX
#ifndef NOMINMAX
#define NOMINMAX 1 // prevent Windows.h from defining min and max macros
#endif
#endif
+35 -32
View File
@@ -7,16 +7,17 @@ namespace MobileGL {
namespace MG_Backend {
namespace Unknown {
const RendererInfo RendererInfoUnknown = {
"<unknown renderer of MobileGL>", // Renderer Name
"<unknown backend>", // Backend Name
", <unknown>", // Extra vendor
{ // OpenGL Info
{3, 3, 0}, // Target OpenGL Version
{4, 6, 0}, // Target Shading Language Version
{ }, // OpenGL Extensions
false // Is Compatibility Profile
},
{ } // Backend Capability
"<unknown renderer of MobileGL>", // Renderer Name
"<unknown backend>", // Backend Name
", <unknown>", // Extra vendor
{
// OpenGL Info
{3, 3, 0}, // Target OpenGL Version
{4, 6, 0}, // Target Shading Language Version
{}, // OpenGL Extensions
false // Is Compatibility Profile
},
{} // Backend Capability
};
}
@@ -27,31 +28,33 @@ namespace MobileGL {
};
const RendererInfo RendererInfoVulkan = {
"MobileGlued-vk", // Renderer Name
"Diligent Engine (Vulkan)", // Backend Name
Nullopt, // Extra vendor
{ // OpenGL Info
{3, 3, 0}, // Target OpenGL Version
{4, 6, 0}, // Target Shading Language Version
{V_OpenGL30, V_OpenGL31, V_OpenGL32, // OpenGL Extensions
V_OpenGL33},
false // Is Compatibility Profile
},
{ } // Backend Capability
"MobileGlued-vk", // Renderer Name
"Diligent Engine (Vulkan)", // Backend Name
Nullopt, // Extra vendor
{
// OpenGL Info
{3, 3, 0}, // Target OpenGL Version
{4, 6, 0}, // Target Shading Language Version
{V_OpenGL30, V_OpenGL31, V_OpenGL32, // OpenGL Extensions
V_OpenGL33},
false // Is Compatibility Profile
},
{} // Backend Capability
};
const RendererInfo RendererInfoMetal = {
"MobileGlued-mtl", // Renderer Name
"Diligent Engine (Metal)", // Backend Name
Nullopt, // Extra vendor
{ // OpenGL Info
{3, 3, 0}, // Target OpenGL Version
{4, 6, 0}, // Target Shading Language Version
{V_OpenGL30, V_OpenGL31, V_OpenGL32, // OpenGL Extensions
V_OpenGL33},
false // Is Compatibility Profile
},
{ } // Backend Capability
"MobileGlued-mtl", // Renderer Name
"Diligent Engine (Metal)", // Backend Name
Nullopt, // Extra vendor
{
// OpenGL Info
{3, 3, 0}, // Target OpenGL Version
{4, 6, 0}, // Target Shading Language Version
{V_OpenGL30, V_OpenGL31, V_OpenGL32, // OpenGL Extensions
V_OpenGL33},
false // Is Compatibility Profile
},
{} // Backend Capability
};
} // namespace Diligent
@@ -92,11 +92,11 @@ static void BM_CompileVertexShader(benchmark::State& state) {
GLuint vs = CreateShader(GL_VERTEX_SHADER);
ShaderSource(vs, 1, &vsSrc, NULL);
CompileShader(vs);
// Cleanup
DeleteShader(vs);
}
// Set the counter for Compiles/Second
state.counters["VS_Compiles/Second"] = state.iterations();
state.counters["VS_Bytes/Second"] = state.iterations() * vsLen;
@@ -117,11 +117,11 @@ static void BM_CompileFragmentShader(benchmark::State& state) {
GLuint fs = CreateShader(GL_FRAGMENT_SHADER);
ShaderSource(fs, 1, &fsSrc, NULL);
CompileShader(fs);
// Cleanup
DeleteShader(fs);
}
// Set the counter for Compiles/Second
state.counters["FS_Compiles/Second"] = state.iterations();
state.counters["FS_Bytes/Second"] = state.iterations() * fsLen;
@@ -142,17 +142,17 @@ static void BM_CompileBothShaders(benchmark::State& state) {
GLuint vs = CreateShader(GL_VERTEX_SHADER);
ShaderSource(vs, 1, &vsSrc, NULL);
CompileShader(vs);
// Create and compile fragment shader
GLuint fs = CreateShader(GL_FRAGMENT_SHADER);
ShaderSource(fs, 1, &fsSrc, NULL);
CompileShader(fs);
// Cleanup
DeleteShader(vs);
DeleteShader(fs);
}
// Set the counter for Compiles/Second
state.counters["VS_Compiles/Second"] = state.iterations();
state.counters["FS_Compiles/Second"] = state.iterations();
@@ -227,7 +227,6 @@ static void BM_CompileAndLink(benchmark::State& state) {
DeleteShader(fs);
}
// Set the counter for Compiles/Second
state.counters["VS_Compiles/Second"] = state.iterations();
state.counters["FS_Compiles/Second"] = state.iterations();
+4 -7
View File
@@ -10,11 +10,9 @@ static void Sanity_VectorResize(benchmark::State& state) {
v[i] = i;
}
}
state.SetBytesProcessed(int64_t(state.iterations()) *
int64_t(state.range(0)));
state.SetBytesProcessed(int64_t(state.iterations()) * int64_t(state.range(0)));
}
BENCHMARK(Sanity_VectorResize)->Arg(2<<5)->Arg(2<<10)->Arg(2<<20);
BENCHMARK(Sanity_VectorResize)->Arg(2 << 5)->Arg(2 << 10)->Arg(2 << 20);
static void Sanity_memcpy(benchmark::State& state) {
char* src = new char[state.range(0)];
@@ -22,11 +20,10 @@ static void Sanity_memcpy(benchmark::State& state) {
memset(src, 'x', state.range(0));
for (auto _ : state)
memcpy(dst, src, state.range(0));
state.SetBytesProcessed(int64_t(state.iterations()) *
int64_t(state.range(0)));
state.SetBytesProcessed(int64_t(state.iterations()) * int64_t(state.range(0)));
delete[] src;
delete[] dst;
}
BENCHMARK(Sanity_memcpy)->Range(8, 8<<10);
BENCHMARK(Sanity_memcpy)->Range(8, 8 << 10);
BENCHMARK_MAIN();
+180 -221
View File
@@ -17,15 +17,13 @@ namespace MobileGL {
}
static SharedPtr<MG_State::GLState::ShaderObject> TryToGetShaderObject(Uint shader) {
if (!CheckShaderNameValidity(shader))
return nullptr;
if (!CheckShaderNameValidity(shader)) return nullptr;
auto shaderObject = MG_State::pGLContext->GetShaderObject(shader);
if (!shaderObject) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`shader` is not a shader object."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`shader` is not a shader object."));
return nullptr;
}
return shaderObject;
@@ -43,24 +41,21 @@ namespace MobileGL {
}
static SharedPtr<MG_State::GLState::ProgramObject> TryToGetProgramObject(GLuint program) {
if (!CheckProgramNameValidity(program))
return nullptr;
if (!CheckProgramNameValidity(program)) return nullptr;
auto programObject = MG_State::pGLContext->GetProgramObject(program);
if (!programObject) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`program` is not a program object."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`program` is not a program object."));
return nullptr;
}
return programObject;
}
void CopyStr(GLsizei bufSize, GLsizei *length, GLchar *dst, const char* src, GLsizei srcLength) {
void CopyStr(GLsizei bufSize, GLsizei* length, GLchar* dst, const char* src, GLsizei srcLength) {
auto sz = std::min(bufSize - 1, srcLength);
if (length)
*length = sz;
if (length) *length = sz;
if (bufSize == 0) return;
@@ -70,11 +65,9 @@ namespace MobileGL {
void AttachShader_State(GLuint program, GLuint shader) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
if (!programObject->AttachShader(shaderObject)) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
@@ -87,31 +80,29 @@ namespace MobileGL {
void BindAttribLocation_State(GLuint program, GLuint index, const GLchar* name) {
if (index >= MG_State::GLState::VertexArrayObject::MAX_VERTEX_ATTRIBS) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`index` is greater than or equal to `GL_MAX_VERTEX_ATTRIBS`."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`index` is greater than or equal to `GL_MAX_VERTEX_ATTRIBS`."));
return;
}
if (strncmp(name, "gl_", 3) == 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`name` starts with the reserved prefix `gl_`."));
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`name` starts with the reserved prefix `gl_`."));
return;
}
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
programObject->SetExplicitAttribLocation(index, name);
}
void CompileShader_State(GLuint shader) {
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
shaderObject->Compile();
}
@@ -120,43 +111,38 @@ namespace MobileGL {
}
GLuint CreateShader_State(GLenum type) {
auto shaderId = MG_State::pGLContext->CreateShader(MG_State::GLState::ConvertMGLShaderStageByGLShaderType(type));
auto shaderId =
MG_State::pGLContext->CreateShader(MG_State::GLState::ConvertMGLShaderStageByGLShaderType(type));
if (shaderId == 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`shaderType` is not an accepted value."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`shaderType` is not an accepted value."));
return 0;
}
return shaderId;
}
void DeleteProgram_State(GLuint program) {
if (!CheckProgramNameValidity(program))
return;
if (!CheckProgramNameValidity(program)) return;
MG_State::pGLContext->MarkProgramForDeletion(program);
}
void DeleteShader_State(GLuint shader) {
if (!CheckProgramNameValidity(shader))
return;
if (!CheckProgramNameValidity(shader)) return;
MG_State::pGLContext->MarkShaderForDeletion(shader);
}
void DetachShader_State(GLuint program, GLuint shader) {
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
auto count = programObject->DetachShader(shaderObject);
if (count <= 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"Shader is not attached to program."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "Shader is not attached to program."));
return;
}
}
@@ -165,24 +151,22 @@ namespace MobileGL {
GLenum* type, GLchar* name) {
if (bufSize < 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`bufSize` is less than 0."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`bufSize` is less than 0."));
return;
}
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
auto attribCount = programObject->GetActiveAttributesCount();
if (index >= attribCount) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`index` is greater than or equal to the number of active attribute variables in `program`."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>(
"MG_Impl/GLImpl", __func__,
"`index` is greater than or equal to the number of active attribute variables in `program`."));
return;
}
if (type != nullptr)
*type = programObject->GetAttribType(index);
if (type != nullptr) *type = programObject->GetAttribType(index);
if (bufSize == 0) return;
auto& attribName = programObject->GetAttribName(index);
CopyStr(bufSize, length, name, attribName.c_str(), attribName.length());
@@ -192,25 +176,23 @@ namespace MobileGL {
GLenum* type, GLchar* name) {
if (bufSize < 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`bufSize` is less than 0."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`bufSize` is less than 0."));
return;
}
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
auto uniformCount = programObject->GetUniformCount();
if (index >= uniformCount) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`index` is greater than or equal to the number of active uniform variables in `program`."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>(
"MG_Impl/GLImpl", __func__,
"`index` is greater than or equal to the number of active uniform variables in `program`."));
return;
}
if (type != nullptr)
*type = programObject->GetUniformType(index);
if (type != nullptr) *type = programObject->GetUniformType(index);
if (bufSize == 0) return;
auto& uniformName = programObject->GetUniformName(index);
CopyStr(bufSize, length, name, uniformName.c_str(), uniformName.length());
@@ -219,18 +201,15 @@ namespace MobileGL {
void GetAttachedShaders_State(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) {
if (maxCount < 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`maxCount` is less than 0."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`maxCount` is less than 0."));
return;
}
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
const auto& s = programObject->GetAttachedShaders();
GLsizei c = std::min((GLsizei)s.size(), maxCount);
if (count)
*count = c;
if (count) *count = c;
for (GLsizei i = 0; i < c; ++i) {
shaders[i] = s[i]->GetId();
}
@@ -238,84 +217,78 @@ namespace MobileGL {
GLint GetAttribLocation_State(GLuint program, const GLchar* name) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return -1;
if (strncmp(name, "gl_", 3) == 0)
return -1;
if (!programObject->GetLinkStatus())
return -1;
if (!programObject) return -1;
if (strncmp(name, "gl_", 3) == 0) return -1;
if (!programObject->GetLinkStatus()) return -1;
return programObject->GetAttributeLocation(name);
}
void GetProgramiv_State(GLuint program, GLenum pname, GLint* params) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
switch (pname) {
case GL_DELETE_STATUS:
*params = programObject->GetDeleteStatus();
break;
case GL_LINK_STATUS:
*params = programObject->GetLinkStatus();
break;
case GL_VALIDATE_STATUS:
*params = programObject->GetValidateStatus();
break;
case GL_INFO_LOG_LENGTH: {
const auto& log = programObject->GetInfoLog();
*params = log.length();
break;
}
case GL_ATTACHED_SHADERS: {
const auto& attachedShaders = programObject->GetAttachedShaders();
*params = attachedShaders.size();
break;
}
case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
*params = programObject->GetActiveAtomicCounterCount();
break;
case GL_ACTIVE_ATTRIBUTES:
*params = programObject->GetActiveAttributesCount();
break;
case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
*params = programObject->GetActiveAttributesMaxLength();
break;
case GL_ACTIVE_UNIFORMS:
*params = programObject->GetUniformCount();
break;
case GL_ACTIVE_UNIFORM_MAX_LENGTH:
*params = programObject->GetUniformMaxLength();
break;
case GL_ACTIVE_UNIFORM_BLOCKS: // GL >= 3.1
*params = programObject->GetActiveUniformBlocksCount();
break;
case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: // ditto.
*params = programObject->GetActiveUniformBlocksMaxNameLength();
break;
case GL_COMPUTE_WORK_GROUP_SIZE: // GL >= 4.3
case GL_DELETE_STATUS:
*params = programObject->GetDeleteStatus();
break;
case GL_LINK_STATUS:
*params = programObject->GetLinkStatus();
break;
case GL_VALIDATE_STATUS:
*params = programObject->GetValidateStatus();
break;
case GL_INFO_LOG_LENGTH: {
const auto& log = programObject->GetInfoLog();
*params = log.length();
break;
}
case GL_ATTACHED_SHADERS: {
const auto& attachedShaders = programObject->GetAttachedShaders();
*params = attachedShaders.size();
break;
}
case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
*params = programObject->GetActiveAtomicCounterCount();
break;
case GL_ACTIVE_ATTRIBUTES:
*params = programObject->GetActiveAttributesCount();
break;
case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
*params = programObject->GetActiveAttributesMaxLength();
break;
case GL_ACTIVE_UNIFORMS:
*params = programObject->GetUniformCount();
break;
case GL_ACTIVE_UNIFORM_MAX_LENGTH:
*params = programObject->GetUniformMaxLength();
break;
case GL_ACTIVE_UNIFORM_BLOCKS: // GL >= 3.1
*params = programObject->GetActiveUniformBlocksCount();
break;
case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: // ditto.
*params = programObject->GetActiveUniformBlocksMaxNameLength();
break;
case GL_COMPUTE_WORK_GROUP_SIZE: // GL >= 4.3
case GL_PROGRAM_BINARY_LENGTH:
case GL_PROGRAM_BINARY_LENGTH:
case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
case GL_TRANSFORM_FEEDBACK_VARYINGS:
case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
case GL_GEOMETRY_VERTICES_OUT:
case GL_GEOMETRY_INPUT_TYPE:
case GL_GEOMETRY_OUTPUT_TYPE:
default:
MG_State::pGLContext->RecordError(
ErrorCode::InvalidEnum,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`pname` is not an accepted value."));
return;
case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
case GL_TRANSFORM_FEEDBACK_VARYINGS:
case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
case GL_GEOMETRY_VERTICES_OUT:
case GL_GEOMETRY_INPUT_TYPE:
case GL_GEOMETRY_OUTPUT_TYPE:
default:
MG_State::pGLContext->RecordError(
ErrorCode::InvalidEnum,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`pname` is not an accepted value."));
return;
}
}
void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
const auto& log = programObject->GetInfoLog();
CopyStr(bufSize, length, infoLog, log.c_str(), log.length());
@@ -323,38 +296,35 @@ namespace MobileGL {
void GetShaderiv_State(GLuint shader, GLenum pname, GLint* params) {
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
switch (pname) {
case GL_SHADER_TYPE:
*params = ConvertGLShaderTypeByMGLShaderStage(shaderObject->GetShaderStage());
break;
case GL_DELETE_STATUS:
*params = shaderObject->GetDeleteStatus();
break;
case GL_COMPILE_STATUS:
*params = shaderObject->GetCompileStatus();
break;
case GL_INFO_LOG_LENGTH:
*params = shaderObject->GetInfoLog().length();
break;
case GL_SHADER_SOURCE_LENGTH:
*params = shaderObject->GetShaderSource().length();
break;
default:
MG_State::pGLContext->RecordError(
ErrorCode::InvalidEnum,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`pname` is not an accepted value."));
return;
case GL_SHADER_TYPE:
*params = ConvertGLShaderTypeByMGLShaderStage(shaderObject->GetShaderStage());
break;
case GL_DELETE_STATUS:
*params = shaderObject->GetDeleteStatus();
break;
case GL_COMPILE_STATUS:
*params = shaderObject->GetCompileStatus();
break;
case GL_INFO_LOG_LENGTH:
*params = shaderObject->GetInfoLog().length();
break;
case GL_SHADER_SOURCE_LENGTH:
*params = shaderObject->GetShaderSource().length();
break;
default:
MG_State::pGLContext->RecordError(
ErrorCode::InvalidEnum,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`pname` is not an accepted value."));
return;
}
}
void GetShaderInfoLog_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
const auto& log = shaderObject->GetInfoLog();
CopyStr(bufSize, length, infoLog, log.c_str(), log.length());
@@ -363,14 +333,12 @@ namespace MobileGL {
void GetShaderSource_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) {
if (bufSize < 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`bufSize` is less than 0."));
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`bufSize` is less than 0."));
}
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
auto& src = shaderObject->GetShaderSource();
CopyStr(bufSize, length, source, src.c_str(), src.length());
@@ -378,30 +346,29 @@ namespace MobileGL {
GLint GetUniformLocation_State(GLuint program, const GLchar* name) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return -1;
if (!programObject) return -1;
return programObject->GetUniformLocation(name);
}
void GetUniform_State(GLuint program, GLint location, void* params) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
if (!programObject->GetLinkStatus()) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`program` has not been successfully linked."));
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`program` has not been successfully linked."));
return;
}
// Check if location is valid
if (location < 0 || location > programObject->GetMaxUniformLocation()) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` does not correspond to a valid uniform variable location for the specified program object."));
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` does not correspond to a valid uniform variable location "
"for the specified program object."));
return;
}
@@ -409,9 +376,10 @@ namespace MobileGL {
const auto& uniformName = programObject->GetUniformName(location);
if (uniformName.empty()) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` does not correspond to a valid uniform variable location for the specified program object."));
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` does not correspond to a valid uniform variable location "
"for the specified program object."));
return;
}
@@ -438,7 +406,7 @@ namespace MobileGL {
/* FIXME: Handle situations that:
* A program object marked for deletion with glDeleteProgram but still in use as part of current
* rendering state is still considered a program object and glIsProgram will return GL_TRUE.
*/
*/
return CheckProgramNameValidity(program);
}
@@ -446,14 +414,13 @@ namespace MobileGL {
/* FIXME: Handle situations that:
* A shader object marked for deletion with glDeleteShader but still attached to a program object is still
* considered a shader object and glIsShader will return GL_TRUE.
*/
*/
return CheckShaderNameValidity(shader);
}
void LinkProgram_State(GLuint program) {
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
programObject->Link();
}
@@ -461,19 +428,16 @@ namespace MobileGL {
if (count < 0) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidValue,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`count` is less than 0."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "`count` is less than 0."));
return;
}
auto shaderObject = TryToGetShaderObject(shader);
if (!shaderObject)
return;
if (!shaderObject) return;
std::string src;
for (GLsizei i = 0; i < count; i++) {
src +=
(length == nullptr || length[i] <= 0) ? string[i] : std::string(string[i], length[i]);
src += (length == nullptr || length[i] <= 0) ? string[i] : std::string(string[i], length[i]);
}
shaderObject->SetShaderSource(Move(src));
}
@@ -485,8 +449,7 @@ namespace MobileGL {
}
auto programObject = TryToGetProgramObject(program);
if (!programObject)
return;
if (!programObject) return;
MG_State::pGLContext->UseProgram(program);
}
@@ -500,15 +463,13 @@ namespace MobileGL {
template <GLsizei VecCount, typename T>
void Uniformv_State(GLint location, GLsizei count, T* value) {
if (location == -1)
return;
if (location == -1) return;
auto programObject = MG_State::pGLContext->GetCurrentProgram();
if (programObject == nullptr) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"There is no current program object."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
return;
}
@@ -516,7 +477,8 @@ namespace MobileGL {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` is an invalid uniform location for the current program object and `location` is not equal to -1."));
"`location` is an invalid uniform location for the current program "
"object and `location` is not equal to -1."));
return;
}
@@ -530,14 +492,14 @@ namespace MobileGL {
// Input matrix is in column-major order (OpenGL default)
// [0 2]
// [1 3]
//
//
// Output matrix should be in row-major order if transpose is true
// [0 1]
// [2 3]
output[0] = input[0]; // 0,0 element stays the same
output[1] = input[2]; // 0,1 element becomes 1,0
output[2] = input[1]; // 1,0 element becomes 0,1
output[3] = input[3]; // 1,1 element stays the same
output[0] = input[0]; // 0,0 element stays the same
output[1] = input[2]; // 0,1 element becomes 1,0
output[2] = input[1]; // 1,0 element becomes 0,1
output[3] = input[3]; // 1,1 element stays the same
}
// Helper function to transpose a 3x3 matrix
@@ -546,20 +508,20 @@ namespace MobileGL {
// [0 3 6]
// [1 4 7]
// [2 5 8]
//
//
// Output matrix should be in row-major order if transpose is true
// [0 1 2]
// [3 4 5]
// [6 7 8]
output[0] = input[0]; // 0,0 element stays the same
output[1] = input[3]; // 0,1 element becomes 1,0
output[2] = input[6]; // 0,2 element becomes 2,0
output[3] = input[1]; // 1,0 element becomes 0,1
output[4] = input[4]; // 1,1 element stays the same
output[5] = input[7]; // 1,2 element becomes 2,1
output[6] = input[2]; // 2,0 element becomes 0,2
output[7] = input[5]; // 2,1 element becomes 1,2
output[8] = input[8]; // 2,2 element stays the same
output[0] = input[0]; // 0,0 element stays the same
output[1] = input[3]; // 0,1 element becomes 1,0
output[2] = input[6]; // 0,2 element becomes 2,0
output[3] = input[1]; // 1,0 element becomes 0,1
output[4] = input[4]; // 1,1 element stays the same
output[5] = input[7]; // 1,2 element becomes 2,1
output[6] = input[2]; // 2,0 element becomes 0,2
output[7] = input[5]; // 2,1 element becomes 1,2
output[8] = input[8]; // 2,2 element stays the same
}
// Helper function to transpose a 4x4 matrix
@@ -569,7 +531,7 @@ namespace MobileGL {
// [1 5 9 13]
// [2 6 10 14]
// [3 7 11 15]
//
//
// Output matrix should be in row-major order if transpose is true
// [0 1 2 3]
// [4 5 6 7]
@@ -628,15 +590,13 @@ namespace MobileGL {
void UniformMatrix2fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
// For 2x2 matrices, we have 4 elements per matrix
// If transpose is GL_TRUE, we need to transpose the matrix data
if (location == -1)
return;
if (location == -1) return;
auto programObject = MG_State::pGLContext->GetCurrentProgram();
if (programObject == nullptr) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"There is no current program object."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
return;
}
@@ -644,7 +604,8 @@ namespace MobileGL {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` is an invalid uniform location for the current program object and `location` is not equal to -1."));
"`location` is an invalid uniform location for the current program "
"object and `location` is not equal to -1."));
return;
}
@@ -665,15 +626,13 @@ namespace MobileGL {
void UniformMatrix3fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
// For 3x3 matrices, we have 9 elements per matrix
// If transpose is GL_TRUE, we need to transpose the matrix data
if (location == -1)
return;
if (location == -1) return;
auto programObject = MG_State::pGLContext->GetCurrentProgram();
if (programObject == nullptr) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"There is no current program object."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
return;
}
@@ -681,7 +640,8 @@ namespace MobileGL {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` is an invalid uniform location for the current program object and `location` is not equal to -1."));
"`location` is an invalid uniform location for the current program "
"object and `location` is not equal to -1."));
return;
}
@@ -702,15 +662,13 @@ namespace MobileGL {
void UniformMatrix4fv_State(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
// For 4x4 matrices, we have 16 elements per matrix
// If transpose is GL_TRUE, we need to transpose the matrix data
if (location == -1)
return;
if (location == -1) return;
auto programObject = MG_State::pGLContext->GetCurrentProgram();
if (programObject == nullptr) {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"There is no current program object."));
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__, "There is no current program object."));
return;
}
@@ -718,7 +676,8 @@ namespace MobileGL {
MG_State::pGLContext->RecordError(
ErrorCode::InvalidOperation,
MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
"`location` is an invalid uniform location for the current program object and `location` is not equal to -1."));
"`location` is an invalid uniform location for the current program "
"object and `location` is not equal to -1."));
return;
}
@@ -820,7 +779,7 @@ namespace MobileGL {
void GetUniformiv(GLuint program, GLint location, GLint* params) {
GetUniformiv_State(program, location, params);
}
GLboolean IsProgram(GLuint program) {
return IsProgram_State(program);
}
@@ -11,4 +11,4 @@ namespace MobileGL {
StackUnderflow,
StackOverflow
};
}
} // namespace MobileGL
@@ -90,7 +90,7 @@ namespace MobileGL {
auto location = uniform.layoutLocation();
m_uniformNames[location] = uniform.name;
m_uniformTypes[location] = uniform.glDefineType;
m_uniformIsOpaqueType[location] = uniform.getType()->isOpaque();
m_uniformIsOpaqueType[location] = uniform.getType()->isOpaque();
m_uniformArraySizes[location] = uniform.size;
}
@@ -108,12 +108,11 @@ namespace MobileGL {
m_attribTypes[location] = inVar.glDefineType;
}
// Implement glBindAttribLocation semantics
for (auto& [name, location]: m_explicitAttribLocations) {
for (auto& [name, location] : m_explicitAttribLocations) {
assert(location < m_attribs.size());
if (m_attribs[location] != name) {
auto it = std::find(m_attribs.begin(), m_attribs.end(), name);
if (it == m_attribs.end())
continue;
if (it == m_attribs.end()) continue;
std::swap(m_attribs[location], m_attribs[std::distance(m_attribs.begin(), it)]);
std::swap(m_attribTypes[location], m_attribTypes[std::distance(m_attribs.begin(), it)]);
}
@@ -139,24 +138,21 @@ namespace MobileGL {
for (SizeT i = 0; i < m_shaders.size(); i++) {
auto shaderType = ConvertGLShaderTypeByMGLShaderStage(m_shaders[i]->GetShaderStage());
shaderTypes[i] = shaderType;
ShaderAttrib attrib {
.shaderType = shaderType,
.sourceStr = m_shaders[i]->GetShaderSource(),
.flags = 0
};
ShaderAttrib attrib{
.shaderType = shaderType, .sourceStr = m_shaders[i]->GetShaderSource(), .flags = 0};
auto res = ShaderCompiler::CompileShader(attrib);
assert(res);
shaders[i] = res.value();
}
ProgramAttrib attrib {
ProgramAttrib attrib{
.shaders = Move(shaders),
};
auto programResult = ShaderCompiler::LinkProgram(attrib);
assert(programResult);
auto program = programResult.value();
ProgramBinaryAttrib binaryAttrib {
ProgramBinaryAttrib binaryAttrib{
.shaderTypes = shaderTypes,
.program = *program,
};
@@ -187,10 +183,9 @@ namespace MobileGL {
// assert(m_uniformSizesInBytes.size() == GetUniformCount());
}
void ProgramObject::WaitUntilGenerationCompleted() {
}
void ProgramObject::WaitUntilGenerationCompleted() {}
void ProgramObject::SetExplicitAttribLocation(Uint index, const char *name) {
void ProgramObject::SetExplicitAttribLocation(Uint index, const char* name) {
m_explicitAttribLocations[name] = index;
}
@@ -257,35 +252,35 @@ namespace MobileGL {
// }
//
// void ProgramObject::PostLink() {
// if (m_programBinary.empty()) {
// assert(false);
// return;
// }
// MG_Util::ShaderTranspiler::SpvcSession session(m_programBinary[0]);
// const char* src = nullptr; // we don't care the source atm
// auto result = session.Compile(&src);
// if (result != SPVC_SUCCESS) {
// assert(false);
// return;
// }
// m_metadata = session.GetMetadata();
// auto& uniformOffsets = m_metadata.plainUniformOffsetsInUBO;
// for (const auto& [name, offset] : uniformOffsets) {
// assert(m_uniforms.find(name) != m_uniforms.end());
// assert(m_uniforms[name] < m_uniformOffsets.size());
// m_uniformOffsets[m_uniforms[name]] = offset;
// }
// m_uboScratch.resize(m_metadata.uboSize, 0);
//
// auto& types = m_metadata.plainUniformMemberTypes;
//
// assert(types.size() == m_uniformOffsets.size());
// m_uniformTypes.resize(m_uniformOffsets.size());
// for (const auto& [name, type] : types) {
// auto gltype = MG_Util::ConvertSpvcTypeToGLEnum(type);
// auto location = m_uniforms[name];
// m_uniformTypes[location] = gltype;
// }
// if (m_programBinary.empty()) {
// assert(false);
// return;
// }
// MG_Util::ShaderTranspiler::SpvcSession session(m_programBinary[0]);
// const char* src = nullptr; // we don't care the source atm
// auto result = session.Compile(&src);
// if (result != SPVC_SUCCESS) {
// assert(false);
// return;
// }
// m_metadata = session.GetMetadata();
// auto& uniformOffsets = m_metadata.plainUniformOffsetsInUBO;
// for (const auto& [name, offset] : uniformOffsets) {
// assert(m_uniforms.find(name) != m_uniforms.end());
// assert(m_uniforms[name] < m_uniformOffsets.size());
// m_uniformOffsets[m_uniforms[name]] = offset;
// }
// m_uboScratch.resize(m_metadata.uboSize, 0);
//
// auto& types = m_metadata.plainUniformMemberTypes;
//
// assert(types.size() == m_uniformOffsets.size());
// m_uniformTypes.resize(m_uniformOffsets.size());
// for (const auto& [name, type] : types) {
// auto gltype = MG_Util::ConvertSpvcTypeToGLEnum(type);
// auto location = m_uniforms[name];
// m_uniformTypes[location] = gltype;
// }
// }
} // namespace GLState
} // namespace MG_State
@@ -9,7 +9,7 @@ namespace MobileGL {
namespace GLState {
class ProgramObject {
public:
ProgramObject(const Uint id): m_id(id) {}
ProgramObject(const Uint id) : m_id(id) {}
bool ShaderIsAttached(SharedPtr<ShaderObject> shader);
bool AttachShader(SharedPtr<ShaderObject> shader);
SizeT DetachShader(SharedPtr<ShaderObject> shader);
@@ -27,20 +27,12 @@ namespace MobileGL {
const auto it = m_uniformLocations.find(name);
return (it == m_uniformLocations.end()) ? -1 : (Int)it->second;
}
GLenum GetUniformType(Uint index) const {
return m_uniformTypes[index];
}
GLenum GetUniformType(Uint index) const { return m_uniformTypes[index]; }
Bool IsUniformOpaqueAtLocation(Uint location) const {
return m_uniformIsOpaqueType[location];
}
Bool IsUniformOpaqueAtLocation(Uint location) const { return m_uniformIsOpaqueType[location]; }
const String& GetUniformName(Uint index) const {
return m_uniformNames[index];
}
Uint GetUniformOffset(Uint location) const {
return m_uniformOffsets[location];
}
const String& GetUniformName(Uint index) const { return m_uniformNames[index]; }
Uint GetUniformOffset(Uint location) const { return m_uniformOffsets[location]; }
Uint GetUniformSizesInBytes(Uint location) const {
return MG_Util::GetGLTypeSize(m_uniformTypes[location]);
}
@@ -49,15 +41,9 @@ namespace MobileGL {
const auto it = std::find(m_attribs.begin(), m_attribs.end(), name);
return (it == m_attribs.end()) ? -1 : std::distance(m_attribs.begin(), it);
}
GLenum GetAttribType(Uint index) const {
return m_attribTypes[index];
}
const String& GetAttribName(Uint index) const {
return m_attribs[index];
}
void* MapUBO() {
return m_uboScratch.data();
}
GLenum GetAttribType(Uint index) const { return m_attribTypes[index]; }
const String& GetAttribName(Uint index) const { return m_attribs[index]; }
void* MapUBO() { return m_uboScratch.data(); }
Bool GetDeleteStatus() const { return m_deleteStatus; }
Bool GetLinkStatus() const { return m_linkStatus; }
@@ -67,6 +53,7 @@ namespace MobileGL {
Int GetActiveUniformBlocksCount() const { return m_program->getNumUniformBlocks(); }
Int GetActiveAttributesMaxLength() const { return m_attribInNameMaxLength; }
Int GetActiveUniformBlocksMaxNameLength() const { return m_uniformBlockNameMaxLength; }
private:
void DoReflection();
void GenerateBinary();
@@ -8,8 +8,7 @@ namespace MobileGL {
m_programIndexGenerator.Generate(1, &programId);
EnsureIndexAvail(programId, m_programObjects);
auto programObject = MakeShared<ProgramObject>(programId);
if (programObject == nullptr)
return 0;
if (programObject == nullptr) return 0;
m_programObjects[programId] = programObject;
return programId;
}
@@ -34,8 +33,7 @@ namespace MobileGL {
}
void ProgramState::UseProgram(Uint program) {
if (program == 0)
m_currentProgram.reset();
if (program == 0) m_currentProgram.reset();
if (!CheckIndexAvail(program, m_programObjects)) return;
m_currentProgram = m_programObjects[program];
@@ -46,8 +44,7 @@ namespace MobileGL {
m_shaderIndexGenerator.Generate(1, &shaderId);
EnsureIndexAvail(shaderId, m_shaderObjects);
auto shaderObject = MakeShared<ShaderObject>(stage, shaderId);
if (shaderObject == nullptr)
return 0;
if (shaderObject == nullptr) return 0;
m_shaderObjects[shaderId] = shaderObject;
return shaderId;
}
@@ -22,9 +22,8 @@ namespace MobileGL {
void MarkShaderObjectForDeletion(Uint shader);
Bool ValidateShaderObject(Uint shader) const;
SharedPtr<ProgramObject> GetCurrentProgram() const {
return m_currentProgram;
}
SharedPtr<ProgramObject> GetCurrentProgram() const { return m_currentProgram; }
private:
template <typename T>
static Bool CheckIndexAvail(const SizeT idx, const Vector<T>& vec) {
@@ -10,7 +10,7 @@ namespace MobileGL {
m_source = source;
}
void ShaderObject::SetShaderSource(String &&source) {
void ShaderObject::SetShaderSource(String&& source) {
m_source = Move(source);
}
@@ -24,11 +24,9 @@ namespace MobileGL {
// Compile for OpenGL here, so that we can do validation and link
// like a real OpenGL driver at linking stage
// Will compile for other backends later.
ShaderAttrib attrib{
.shaderType = ConvertGLShaderTypeByMGLShaderStage(m_stage),
.sourceStr = m_source,
.flags = ShaderCompileBits::CompileForOpenGL
};
ShaderAttrib attrib{.shaderType = ConvertGLShaderTypeByMGLShaderStage(m_stage),
.sourceStr = m_source,
.flags = ShaderCompileBits::CompileForOpenGL};
auto result = ShaderCompiler::CompileShader(attrib);
if (result) {
@@ -36,21 +36,21 @@ namespace MobileGL {
inline static ShaderStage ConvertMGLShaderStageByGLShaderType(GLenum type) {
switch (type) {
case GL_VERTEX_SHADER:
return ShaderStage::Vertex;
case GL_TESS_CONTROL_SHADER:
return ShaderStage::TessControl;
case GL_TESS_EVALUATION_SHADER:
return ShaderStage::TessEval;
case GL_GEOMETRY_SHADER:
return ShaderStage::Geometry;
case GL_FRAGMENT_SHADER:
return ShaderStage::Fragment;
case GL_COMPUTE_SHADER:
return ShaderStage::Compute;
default:
assert(false);
return ShaderStage::Unknown;
case GL_VERTEX_SHADER:
return ShaderStage::Vertex;
case GL_TESS_CONTROL_SHADER:
return ShaderStage::TessControl;
case GL_TESS_EVALUATION_SHADER:
return ShaderStage::TessEval;
case GL_GEOMETRY_SHADER:
return ShaderStage::Geometry;
case GL_FRAGMENT_SHADER:
return ShaderStage::Fragment;
case GL_COMPUTE_SHADER:
return ShaderStage::Compute;
default:
assert(false);
return ShaderStage::Unknown;
}
}
@@ -70,6 +70,7 @@ namespace MobileGL {
const UnorderedMap<String, Uint>& GetUniformLocations() const { return m_uniforms; }
Bool GetCompileStatus() const { return m_compileStatus; }
Bool GetDeleteStatus() const { return m_deleteStatus; }
private:
// bool DoReflection();
const Uint m_id = 0;
+52 -82
View File
@@ -50,12 +50,12 @@ TEST_F(BufferTest, PingPong) {
auto bufWrite = writeSlot.GetBoundObject();
Vector<Int> data { 1, 2, 3, 4, 5 };
Vector<Int> data{1, 2, 3, 4, 5};
SizeT byteSize = data.size() * sizeof(Int);
// Write data
bufWrite->Resize(byteSize);
DataPtr ptr { .data = data.data(), .size = byteSize };
DataPtr ptr{.data = data.data(), .size = byteSize};
bufWrite->UploadData(ptr, 0);
// Readback
@@ -70,20 +70,20 @@ TEST_F(BufferTest, PingPong) {
}
TEST_F(BufferTest, GenerateManyNames_NoPrematureCreation) {
const SizeT largeCount = 100000; // generate tons of buffer names
const SizeT largeCount = 100000; // generate tons of buffer names
auto names = glContext.GenBufferNames(largeCount);
std::vector<SizeT> indices = { 0, 600, 5000, 32768, 99999 }; // only create a few buffer objects
std::vector<SizeT> indices = {0, 600, 5000, 32768, 99999}; // only create a few buffer objects
for (SizeT idx : indices) {
GLuint name = names[idx];
auto bufObj = glContext.CreateBufferObject(name);
auto& slot = glContext.GetBufferBindingSlot(BufferTarget::Uniform);
slot.Bind(bufObj);
Vector<Int> data = { static_cast<Int>(idx + 1), static_cast<Int>(idx + 2) };
Vector<Int> data = {static_cast<Int>(idx + 1), static_cast<Int>(idx + 2)};
SizeT byteSize = data.size() * sizeof(Int);
bufObj->Resize(byteSize);
DataPtr ptr{ .data = data.data(), .size = byteSize };
DataPtr ptr{.data = data.data(), .size = byteSize};
bufObj->UploadData(ptr, 0);
Vector<Int> actual(data.size());
@@ -98,10 +98,10 @@ TEST_F(BufferTest, AcquireMemory) {
auto bufferNames = glContext.GenBufferNames(1);
auto bufObj = glContext.CreateBufferObject(bufferNames[0]);
slot.Bind(bufObj);
Vector<Int> initData{ 10, 20, 30, 40, 50 };
Vector<Int> initData{10, 20, 30, 40, 50};
SizeT byteSize = initData.size() * sizeof(Int);
bufObj->Resize(byteSize);
DataPtr ptr{ .data = initData.data(), .size = byteSize };
DataPtr ptr{.data = initData.data(), .size = byteSize};
bufObj->UploadData(ptr, 0);
bufObj->ClearDirty();
Int* mappedPtr = static_cast<Int*>(bufObj->AcquireMemory(true, true, true));
@@ -109,7 +109,7 @@ TEST_F(BufferTest, AcquireMemory) {
mappedPtr[1] = 200;
mappedPtr[2] = 300;
bufObj->ReleaseMemory();
Vector<Int> expected{ 100, 200, 300, 40, 50 };
Vector<Int> expected{100, 200, 300, 40, 50};
Vector<Int> actual(5);
void* p = bufObj->AcquireMemory(false, true, false);
memcpy(actual.data(), p, byteSize);
@@ -117,7 +117,7 @@ TEST_F(BufferTest, AcquireMemory) {
auto dirty = bufObj->GetDirtyRange();
ASSERT_EQ(dirty.start, 0);
ASSERT_EQ(dirty.end, sizeof(Int) * 5);
ASSERT_EQ(dirty.end, sizeof(Int) * 5);
}
TEST_F(BufferTest, AcquireMemoryRangeWithoutExplicit) {
@@ -125,32 +125,26 @@ TEST_F(BufferTest, AcquireMemoryRangeWithoutExplicit) {
auto bufferNames = glContext.GenBufferNames(1);
auto bufObj = glContext.CreateBufferObject(bufferNames[0]);
slot.Bind(bufObj);
Vector<Int> initData{ 10, 20, 30, 40, 50 };
Vector<Int> initData{10, 20, 30, 40, 50};
SizeT byteSize = initData.size() * sizeof(Int);
bufObj->Resize(byteSize);
DataPtr ptr{ .data = initData.data(), .size = byteSize };
DataPtr ptr{.data = initData.data(), .size = byteSize};
bufObj->UploadData(ptr, 0);
bufObj->ClearDirty();
Range1D mapRange{
.start = sizeof(Int),
.end = sizeof(Int) * 4
};
Int* mappedPtr = static_cast<Int*>(bufObj->AcquireMemoryRange(
mapRange,
BufferMappingAccessBit::Write
));
Range1D mapRange{.start = sizeof(Int), .end = sizeof(Int) * 4};
Int* mappedPtr = static_cast<Int*>(bufObj->AcquireMemoryRange(mapRange, BufferMappingAccessBit::Write));
mappedPtr[0] = 200;
mappedPtr[1] = 300;
bufObj->ReleaseMemory();
Vector<Int> expected{ 10, 200, 300, 40, 50 };
Vector<Int> expected{10, 200, 300, 40, 50};
Vector<Int> actual(5);
void* p = bufObj->AcquireMemory(false, true, false);
memcpy(actual.data(), p, byteSize);
ASSERT_EQ(actual, expected);
auto dirty = bufObj->GetDirtyRange();
ASSERT_EQ(dirty.start, sizeof(Int));
ASSERT_EQ(dirty.end, sizeof(Int) * 4);
ASSERT_EQ(dirty.end, sizeof(Int) * 4);
}
TEST_F(BufferTest, AcquireMemoryRangeWithExplicit) {
@@ -159,30 +153,25 @@ TEST_F(BufferTest, AcquireMemoryRangeWithExplicit) {
auto bufObj = glContext.CreateBufferObject(bufferNames[0]);
slot.Bind(bufObj);
Vector<Int> initData{ 10, 20, 30, 40, 50 };
Vector<Int> initData{10, 20, 30, 40, 50};
SizeT byteSize = initData.size() * sizeof(Int);
bufObj->Resize(byteSize);
DataPtr ptr{ .data = initData.data(), .size = byteSize };
DataPtr ptr{.data = initData.data(), .size = byteSize};
bufObj->UploadData(ptr, 0);
bufObj->ClearDirty();
Range1D mapRange{
.start = sizeof(Int),
.end = sizeof(Int) * 4
};
Int* mappedPtr = static_cast<Int*>(bufObj->AcquireMemoryRange(
mapRange,
BufferMappingAccessBit::Write | BufferMappingAccessBit::FlushExplicit
));
Range1D mapRange{.start = sizeof(Int), .end = sizeof(Int) * 4};
Int* mappedPtr = static_cast<Int*>(
bufObj->AcquireMemoryRange(mapRange, BufferMappingAccessBit::Write | BufferMappingAccessBit::FlushExplicit));
mappedPtr[0] = 200;
mappedPtr[1] = 300;
bufObj->FlushMemoryRange(0, sizeof(Int));
auto dirty = bufObj->GetDirtyRange();
ASSERT_EQ(dirty.start, sizeof(Int));
ASSERT_EQ(dirty.end, sizeof(Int) * 2);
ASSERT_EQ(dirty.start, sizeof(Int));
ASSERT_EQ(dirty.end, sizeof(Int) * 2);
bufObj->ReleaseMemory();
@@ -190,7 +179,7 @@ TEST_F(BufferTest, AcquireMemoryRangeWithExplicit) {
ASSERT_EQ(dirty.start, sizeof(Int));
ASSERT_EQ(dirty.end, sizeof(Int) * 2);
Vector<Int> expected{ 10, 200, 30, 40, 50 };
Vector<Int> expected{10, 200, 30, 40, 50};
Vector<Int> actual(5);
void* p = bufObj->AcquireMemory(false, true, false);
memcpy(actual.data(), p, byteSize);
@@ -198,7 +187,7 @@ TEST_F(BufferTest, AcquireMemoryRangeWithExplicit) {
dirty = bufObj->GetDirtyRange();
ASSERT_EQ(dirty.start, sizeof(Int));
ASSERT_EQ(dirty.end, sizeof(Int) * 2);
ASSERT_EQ(dirty.end, sizeof(Int) * 2);
}
TEST_F(BufferTest, CopyBufferSubData) {
@@ -209,10 +198,10 @@ TEST_F(BufferTest, CopyBufferSubData) {
auto srcObj = glContext.CreateBufferObject(srcNames[0]);
srcSlot.Bind(srcObj);
Vector<Int> srcData{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Vector<Int> srcData{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
SizeT srcSize = srcData.size() * sizeof(Int);
srcObj->Resize(srcSize);
DataPtr srcPtr{ .data = srcData.data(), .size = srcSize };
DataPtr srcPtr{.data = srcData.data(), .size = srcSize};
srcObj->UploadData(srcPtr, 0);
auto dstNames = glContext.GenBufferNames(1);
@@ -222,22 +211,15 @@ TEST_F(BufferTest, CopyBufferSubData) {
Vector<Int> dstData(15, 0);
SizeT dstSize = dstData.size() * sizeof(Int);
dstObj->Resize(dstSize);
DataPtr dstPtr{ .data = dstData.data(), .size = dstSize };
DataPtr dstPtr{.data = dstData.data(), .size = dstSize};
dstObj->UploadData(dstPtr, 0);
srcObj->ClearDirty();
dstObj->ClearDirty();
dstObj->CopyDataFrom(srcObj,
2 * sizeof(Int),
5 * sizeof(Int),
4 * sizeof(Int));
dstObj->CopyDataFrom(srcObj, 2 * sizeof(Int), 5 * sizeof(Int), 4 * sizeof(Int));
Vector<Int> expected{
0, 0, 0, 0, 0,
3, 4, 5, 6,
0, 0, 0, 0, 0, 0
};
Vector<Int> expected{0, 0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0};
Vector<Int> actual(15);
void* p = dstObj->AcquireMemory(false, true, false);
@@ -268,7 +250,7 @@ TEST_F(BufferTest, WriteWhileMapped) {
bufObj->ReleaseMemory();
Vector<Int> expected{ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
Vector<Int> expected{0, 10, 20, 30, 40, 50, 60, 70, 80, 90};
Vector<Int> actual(10);
void* p = bufObj->AcquireMemory(false, true, false);
memcpy(actual.data(), p, byteSize);
@@ -286,20 +268,17 @@ TEST_F(BufferTest, PartialUpdate) {
auto bufObj = glContext.CreateBufferObject(bufferNames[0]);
slot.Bind(bufObj);
Vector<Int> initData{ 100, 200, 300, 400, 500 };
Vector<Int> initData{100, 200, 300, 400, 500};
SizeT byteSize = initData.size() * sizeof(Int);
bufObj->Resize(byteSize);
DataPtr ptr{ .data = initData.data(), .size = byteSize };
DataPtr ptr{.data = initData.data(), .size = byteSize};
bufObj->UploadData(ptr, 0);
bufObj->ClearDirty();
bufObj->ClearDirty();
Vector<Int> update{ 999, 888 };
bufObj->UploadSubData(
{ (void*)(update.data()), (SizeT)(update.size() * sizeof(Int)) },
sizeof(Int)
);
Vector<Int> update{999, 888};
bufObj->UploadSubData({(void*)(update.data()), (SizeT)(update.size() * sizeof(Int))}, sizeof(Int));
Vector<Int> expected{ 100, 999, 888, 400, 500 };
Vector<Int> expected{100, 999, 888, 400, 500};
Vector<Int> actual(5);
void* p = bufObj->AcquireMemory(false, true, false);
memcpy(actual.data(), p, byteSize);
@@ -326,9 +305,7 @@ using namespace MobileGL::MG_Impl::GLImpl;
class GeneralBufferTest : public ::testing::Test {
protected:
void SetUp() override {
MG_State::pGLContext = new MG_State::GLState::GLContext();
}
void SetUp() override { MG_State::pGLContext = new MG_State::GLState::GLContext(); }
GLuint CreateBoundBuffer(GLenum target, GLsizeiptr size, GLenum usage) {
GLuint buffer;
@@ -361,7 +338,7 @@ TEST_F(GeneralBufferTest, General_BufferLifecycle) {
TEST_F(GeneralBufferTest, General_BufferDataOperations) {
GLuint buffer = CreateBoundBuffer(GL_ARRAY_BUFFER, 100, GL_STATIC_DRAW);
const char initData[100] = { 0 };
const char initData[100] = {0};
char readBack[100];
void* mapped = MapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
ASSERT_NE(mapped, nullptr);
@@ -414,16 +391,14 @@ TEST_F(GeneralBufferTest, General_BufferMapping) {
strcpy((char*)fullMap, " Full mapping test");
EXPECT_TRUE(UnmapBuffer(GL_ARRAY_BUFFER));
void* partialMap = MapBufferRange(GL_ARRAY_BUFFER, 0, 30,
GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
void* partialMap = MapBufferRange(GL_ARRAY_BUFFER, 0, 30, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
ASSERT_NE(partialMap, nullptr);
strcpy((char*)partialMap, "Partial (not valid value)");
FlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 7);
EXPECT_TRUE(UnmapBuffer(GL_ARRAY_BUFFER));
partialMap = MapBufferRange(GL_ARRAY_BUFFER, 20, 40,
GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
partialMap = MapBufferRange(GL_ARRAY_BUFFER, 20, 40, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
ASSERT_NE(partialMap, nullptr);
strcpy((char*)partialMap, ": modified data (not valid value)");
@@ -465,8 +440,7 @@ TEST_F(GeneralBufferTest, General_MapFlags) {
EXPECT_TRUE(UnmapBuffer(GL_ARRAY_BUFFER));
void* nosyncMap = MapBufferRange(GL_ARRAY_BUFFER, 0, 100,
GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
void* nosyncMap = MapBufferRange(GL_ARRAY_BUFFER, 0, 100, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
ASSERT_NE(nosyncMap, nullptr);
memset(nosyncMap, 0xAA, 100);
EXPECT_TRUE(UnmapBuffer(GL_ARRAY_BUFFER));
@@ -484,37 +458,33 @@ TEST_F(GeneralBufferTest, General_GeneralTest_1) {
BindBuffer(GL_ARRAY_BUFFER, vbo);
BufferData(GL_ARRAY_BUFFER, 64, nullptr, GL_STATIC_DRAW);
const float vertexData[] = { 0.1f, 0.2f, 0.3f, 1.0f };
const float vertexData[] = {0.1f, 0.2f, 0.3f, 1.0f};
BufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertexData), vertexData);
BindBuffer(GL_UNIFORM_BUFFER, ibo);
const uint16_t indexData[] = { 0, 1, 2, 3, 0 };
const uint16_t indexData[] = {0, 1, 2, 3, 0};
BufferData(GL_UNIFORM_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
const uint16_t newIndices[] = { 4, 5 };
BufferSubData(GL_UNIFORM_BUFFER, 2 * sizeof(uint16_t),
sizeof(newIndices), newIndices);
const uint16_t newIndices[] = {4, 5};
BufferSubData(GL_UNIFORM_BUFFER, 2 * sizeof(uint16_t), sizeof(newIndices), newIndices);
BindBuffer(GL_COPY_READ_BUFFER, staging);
const char stagingData[] = "StagingBufferData";
BufferData(GL_COPY_READ_BUFFER, sizeof(stagingData), stagingData, GL_STREAM_COPY);
CopyBufferSubData(GL_COPY_READ_BUFFER, GL_ARRAY_BUFFER,
0, 40, sizeof(stagingData));
CopyBufferSubData(GL_COPY_READ_BUFFER, GL_ARRAY_BUFFER, 0, 40, sizeof(stagingData));
BindBuffer(GL_UNIFORM_BUFFER, ibo);
void* fullMap = MapBuffer(GL_UNIFORM_BUFFER, GL_READ_WRITE);
ASSERT_NE(fullMap, nullptr);
uint16_t* indices = static_cast<uint16_t*>(fullMap);
indices[0] = 10;
indices[0] = 10;
EXPECT_TRUE(UnmapBuffer(GL_UNIFORM_BUFFER));
BindBuffer(GL_ARRAY_BUFFER, vbo);
void* partialMap = MapBufferRange(GL_ARRAY_BUFFER, 20, 8,
GL_MAP_WRITE_BIT |
GL_MAP_FLUSH_EXPLICIT_BIT);
void* partialMap = MapBufferRange(GL_ARRAY_BUFFER, 20, 8, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
ASSERT_NE(partialMap, nullptr);
const char partialWriteData[] = "PARTIAL"; // 7 chars + '\0' = 8 bytes
@@ -552,8 +522,8 @@ TEST_F(GeneralBufferTest, General_GeneralTest_1) {
GLenum err = GetError();
EXPECT_EQ(err, GL_INVALID_OPERATION);
GLuint toDelete[] = { vbo, ibo };
DeleteBuffers(2, toDelete);
GLuint toDelete[] = {vbo, ibo};
DeleteBuffers(2, toDelete);
EXPECT_EQ(GetError(), GL_NO_ERROR);
}
+43 -63
View File
@@ -8,13 +8,9 @@ using namespace MobileGL::MG_Impl::GLImpl;
class ProgramTest : public ::testing::Test {
protected:
void SetUp() override {
MG_State::pGLContext = new MG_State::GLState::GLContext();
}
void SetUp() override { MG_State::pGLContext = new MG_State::GLState::GLContext(); }
void TearDown() override {
delete MG_State::pGLContext;
}
void TearDown() override { delete MG_State::pGLContext; }
};
TEST_F(ProgramTest, Sanity) {
@@ -94,7 +90,6 @@ void main() {
fragColor = vec4(OutColor, float(intVal));
})";
TEST_F(ProgramTest, CompileVertex) {
GLuint vs = CreateShader(GL_VERTEX_SHADER);
ShaderSource(vs, 1, &vsSrc, NULL);
@@ -215,32 +210,24 @@ TEST_F(ProgramTest, UniformMatrixFunctions) {
// Test UniformMatrix2fv
auto locProjMat = GetUniformLocation(program, "ProjMat");
ASSERT_NE(locProjMat, -1);
// 4x4 matrix (16 elements) - identity matrix
GLfloat matrix4x4[16] = {
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
GLfloat matrix4x4[16] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
// Test UniformMatrix4fv with count = 1 and transpose = GL_FALSE
UniformMatrix4fv(locProjMat, 1, GL_FALSE, matrix4x4);
// Test UniformMatrix4fv with count = 1 and transpose = GL_TRUE
UniformMatrix4fv(locProjMat, 1, GL_TRUE, matrix4x4);
// Test with a non-identity matrix
GLfloat nonIdentityMatrix[16] = {
1.0f, 2.0f, 3.0f, 4.0f,
5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f,
13.0f, 14.0f, 15.0f, 16.0f
};
GLfloat nonIdentityMatrix[16] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f};
// Test with transpose = GL_FALSE
UniformMatrix4fv(locProjMat, 1, GL_FALSE, nonIdentityMatrix);
// Test with transpose = GL_TRUE
UniformMatrix4fv(locProjMat, 1, GL_TRUE, nonIdentityMatrix);
}
@@ -288,8 +275,8 @@ TEST_F(ProgramTest, UniformMatrixTranspose) {
// [1 3]
// [2 4]
GLfloat matrix2x2[4] = {
1.0f, 2.0f, // First column
3.0f, 4.0f // Second column
1.0f, 2.0f, // First column
3.0f, 4.0f // Second column
};
// Expected values when transpose = GL_FALSE (no transpose):
@@ -318,7 +305,7 @@ TEST_F(ProgramTest, UniformMatrixTranspose) {
for (int i = 0; i < 4; i++) {
EXPECT_FLOAT_EQ(result2x2_transpose[i], expected2x2_transpose[i]);
}
// Test 3x3 matrix transpose
auto locMat3 = GetUniformLocation(program, "TestMat3");
ASSERT_NE(locMat3, -1);
@@ -327,9 +314,9 @@ TEST_F(ProgramTest, UniformMatrixTranspose) {
// [2 5 8]
// [3 6 9]
GLfloat matrix3x3[9] = {
1.0f, 2.0f, 3.0f, // First column
4.0f, 5.0f, 6.0f, // Second column
7.0f, 8.0f, 9.0f // Third column
1.0f, 2.0f, 3.0f, // First column
4.0f, 5.0f, 6.0f, // Second column
7.0f, 8.0f, 9.0f // Third column
};
// Expected values when transpose = GL_FALSE (no transpose):
@@ -360,40 +347,40 @@ TEST_F(ProgramTest, UniformMatrixTranspose) {
for (int i = 0; i < 9; i++) {
EXPECT_FLOAT_EQ(result3x3_transpose[i], expected3x3_transpose[i]);
}
// Test 4x4 matrix transpose
auto locProjMat = GetUniformLocation(program, "ProjMat");
ASSERT_NE(locProjMat, -1);
// Test matrix (column-major as expected by OpenGL):
// [1 5 9 13]
// [2 6 10 14]
// [3 7 11 15]
// [4 8 12 16]
GLfloat matrix4x4[16] = {
1.0f, 2.0f, 3.0f, 4.0f, // First column
5.0f, 6.0f, 7.0f, 8.0f, // Second column
9.0f, 10.0f, 11.0f, 12.0f, // Third column
13.0f, 14.0f, 15.0f, 16.0f // Fourth column
1.0f, 2.0f, 3.0f, 4.0f, // First column
5.0f, 6.0f, 7.0f, 8.0f, // Second column
9.0f, 10.0f, 11.0f, 12.0f, // Third column
13.0f, 14.0f, 15.0f, 16.0f // Fourth column
};
// Expected values when transpose = GL_FALSE (no transpose):
// [1 5 9 13]
// [2 6 10 14]
// [3 7 11 15]
// [4 8 12 16]
GLfloat expected4x4_no_transpose[16] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f};
GLfloat expected4x4_no_transpose[16] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f};
// Expected values when transpose = GL_TRUE (transposed):
// [1 2 3 4]
// [5 6 7 8]
// [9 10 11 12]
// [13 14 15 16]
// Stored in column-major order
GLfloat expected4x4_transpose[16] = {1.0f, 5.0f, 9.0f, 13.0f, 2.0f, 6.0f, 10.0f, 14.0f,
3.0f, 7.0f, 11.0f, 15.0f, 4.0f, 8.0f, 12.0f, 16.0f};
GLfloat expected4x4_transpose[16] = {1.0f, 5.0f, 9.0f, 13.0f, 2.0f, 6.0f, 10.0f, 14.0f,
3.0f, 7.0f, 11.0f, 15.0f, 4.0f, 8.0f, 12.0f, 16.0f};
// Test with transpose = GL_FALSE
UniformMatrix4fv(locProjMat, 1, GL_FALSE, matrix4x4);
GLfloat result4x4_no_transpose[16];
@@ -401,7 +388,7 @@ TEST_F(ProgramTest, UniformMatrixTranspose) {
for (int i = 0; i < 16; i++) {
EXPECT_FLOAT_EQ(result4x4_no_transpose[i], expected4x4_no_transpose[i]);
}
// Test with transpose = GL_TRUE
UniformMatrix4fv(locProjMat, 1, GL_TRUE, matrix4x4);
GLfloat result4x4_transpose[16];
@@ -444,29 +431,25 @@ TEST_F(ProgramTest, UniformLocationGaps) {
// Test that uniform locations are correctly assigned even with gaps
// ProjMat is at location 0
ASSERT_EQ(GetUniformLocation(program, "ProjMat"), 0);
// TestMat3 is at location 10 (gap from 1-9)
ASSERT_EQ(GetUniformLocation(program, "TestMat3"), 10);
// TestMat2 is at location 20 (gap from 11-19)
ASSERT_EQ(GetUniformLocation(program, "TestMat2"), 20);
// Gray is at location 1 (no gap)
ASSERT_EQ(GetUniformLocation(program, "Gray"), 1);
// Saturation is at location 6 (gap from 2-5)
ASSERT_EQ(GetUniformLocation(program, "Saturation"), 6);
// Verify that locations in gaps correctly return -1
ASSERT_EQ(GetUniformLocation(program, "NonExistentUniform"), -1);
// Test uniform operations on locations with gaps
GLfloat matrix3[9] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
};
GLfloat matrix3[9] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
// Test setting and getting uniform at location 10 (TestMat3)
UniformMatrix3fv(10, 1, GL_FALSE, matrix3);
GLfloat result[9];
@@ -474,19 +457,16 @@ TEST_F(ProgramTest, UniformLocationGaps) {
for (int i = 0; i < 9; i++) {
EXPECT_FLOAT_EQ(result[i], matrix3[i]);
}
// Test setting and getting uniform at location 20 (TestMat2)
GLfloat matrix2[4] = {
1.0f, 0.0f,
0.0f, 1.0f
};
GLfloat matrix2[4] = {1.0f, 0.0f, 0.0f, 1.0f};
UniformMatrix2fv(20, 1, GL_FALSE, matrix2);
GLfloat result2[4];
GetUniformfv(program, 20, result2);
for (int i = 0; i < 4; i++) {
EXPECT_FLOAT_EQ(result2[i], matrix2[i]);
}
// Test that accessing a gap location (e.g., 5) doesn't cause issues
// This should not crash or cause undefined behavior
Uniform1i(5, 114514); // Just to make sure we don't crash
+20 -50
View File
@@ -41,10 +41,7 @@ void main(){
TEST_F(ProgramUtilTest, CompileSimpleVertexShader) {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib attrib {
.shaderType = GL_VERTEX_SHADER,
.sourceStr = vs
};
ShaderAttrib attrib{.shaderType = GL_VERTEX_SHADER, .sourceStr = vs};
auto res = ShaderCompiler::CompileShader(attrib);
if (!res) {
ASSERT_NE(res.error().errc, 0);
@@ -93,10 +90,7 @@ void main() {
TEST_F(ProgramUtilTest, CompileSimpleFragmentShader) {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib attrib {
.shaderType = GL_FRAGMENT_SHADER,
.sourceStr = fs
};
ShaderAttrib attrib{.shaderType = GL_FRAGMENT_SHADER, .sourceStr = fs};
auto res = ShaderCompiler::CompileShader(attrib);
if (!res) {
ASSERT_NE(res.error().errc, 0);
@@ -122,20 +116,15 @@ void main() {
TEST_F(ProgramUtilTest, CompileFragmentShaderWithDiscard) {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib attrib {
.shaderType = GL_FRAGMENT_SHADER,
.sourceStr = position_color_fsh
};
ShaderAttrib attrib{.shaderType = GL_FRAGMENT_SHADER, .sourceStr = position_color_fsh};
auto res = ShaderCompiler::CompileShader(attrib);
if (!res) {
ASSERT_NE(res.error().errc, 0);
FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log;
}
ProgramAttrib programAttrib {
// .shaderTypes = { GL_FRAGMENT_SHADER },
.shaders = { res.value() }
};
ProgramAttrib programAttrib{// .shaderTypes = { GL_FRAGMENT_SHADER },
.shaders = {res.value()}};
auto program_res = ShaderCompiler::LinkProgram(programAttrib);
if (!program_res) {
@@ -145,8 +134,8 @@ TEST_F(ProgramUtilTest, CompileFragmentShaderWithDiscard) {
auto program = program_res.value();
ProgramBinaryAttrib binaryAttrib {
.shaderTypes = { GL_FRAGMENT_SHADER },
ProgramBinaryAttrib binaryAttrib{
.shaderTypes = {GL_FRAGMENT_SHADER},
.program = *program,
};
auto bin_res = ShaderCompiler::GetSpirvBinaryFromProgram(binaryAttrib);
@@ -196,11 +185,8 @@ void main(){
TEST_F(ProgramUtilTest, CompileVertexShaderWithLocation) {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib attrib {
.shaderType = GL_VERTEX_SHADER,
.sourceStr = vs_location,
.flags = ShaderCompileBits::CompileForOpenGL
};
ShaderAttrib attrib{
.shaderType = GL_VERTEX_SHADER, .sourceStr = vs_location, .flags = ShaderCompileBits::CompileForOpenGL};
auto res = ShaderCompiler::CompileShader(attrib);
if (!res) {
ASSERT_NE(res.error().errc, 0);
@@ -224,30 +210,22 @@ TEST_F(ProgramUtilTest, CompileVertexShaderWithLocation) {
TEST_F(ProgramUtilTest, CompileAndLinkProgram) {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib vs_attrib {
.shaderType = GL_VERTEX_SHADER,
.sourceStr = vs
};
ShaderAttrib vs_attrib{.shaderType = GL_VERTEX_SHADER, .sourceStr = vs};
auto vs_res = ShaderCompiler::CompileShader(vs_attrib);
if (!vs_res) {
ASSERT_NE(vs_res.error().errc, 0);
FAIL() << "errc: " << vs_res.error().errc << "\nlog: " << vs_res.error().log;
}
ShaderAttrib fs_attrib {
.shaderType = GL_FRAGMENT_SHADER,
.sourceStr = fs
};
ShaderAttrib fs_attrib{.shaderType = GL_FRAGMENT_SHADER, .sourceStr = fs};
auto fs_res = ShaderCompiler::CompileShader(fs_attrib);
if (!fs_res) {
ASSERT_NE(fs_res.error().errc, 0);
FAIL() << "errc: " << fs_res.error().errc << "\nlog: " << fs_res.error().log;
}
ProgramAttrib programAttrib {
// .shaderTypes = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER },
.shaders = { vs_res.value(), fs_res.value() }
};
ProgramAttrib programAttrib{// .shaderTypes = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER },
.shaders = {vs_res.value(), fs_res.value()}};
auto program_res = ShaderCompiler::LinkProgram(programAttrib);
if (!program_res) {
@@ -258,30 +236,22 @@ TEST_F(ProgramUtilTest, CompileAndLinkProgram) {
TEST_F(ProgramUtilTest, DecompProgram) {
using namespace MG_Util::ShaderTranspiler;
ShaderAttrib vs_attrib {
.shaderType = GL_VERTEX_SHADER,
.sourceStr = vs
};
ShaderAttrib vs_attrib{.shaderType = GL_VERTEX_SHADER, .sourceStr = vs};
auto vs_res = ShaderCompiler::CompileShader(vs_attrib);
if (!vs_res) {
ASSERT_NE(vs_res.error().errc, 0);
FAIL() << "errc: " << vs_res.error().errc << "\nlog: " << vs_res.error().log;
}
ShaderAttrib fs_attrib {
.shaderType = GL_FRAGMENT_SHADER,
.sourceStr = fs
};
ShaderAttrib fs_attrib{.shaderType = GL_FRAGMENT_SHADER, .sourceStr = fs};
auto fs_res = ShaderCompiler::CompileShader(fs_attrib);
if (!fs_res) {
ASSERT_NE(fs_res.error().errc, 0);
FAIL() << "errc: " << fs_res.error().errc << "\nlog: " << fs_res.error().log;
}
ProgramAttrib programAttrib {
// .shaderTypes = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER },
.shaders = { vs_res.value(), fs_res.value() }
};
ProgramAttrib programAttrib{// .shaderTypes = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER },
.shaders = {vs_res.value(), fs_res.value()}};
auto program_res = ShaderCompiler::LinkProgram(programAttrib);
if (!program_res) {
@@ -289,8 +259,8 @@ TEST_F(ProgramUtilTest, DecompProgram) {
FAIL() << "errc: " << program_res.error().errc << "\nlog: " << program_res.error().log;
}
ProgramBinaryAttrib binaryAttrib {
.shaderTypes = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER },
ProgramBinaryAttrib binaryAttrib{
.shaderTypes = {GL_VERTEX_SHADER, GL_FRAGMENT_SHADER},
.program = *program_res.value(),
};
auto bin_res = ShaderCompiler::GetSpirvBinaryFromProgram(binaryAttrib);
@@ -322,7 +292,7 @@ TEST_F(ProgramUtilTest, DecompProgram) {
for (size_t i = 0; i < vs_outputs.size(); ++i) {
EXPECT_EQ(vs_outputs[i].location, fs_inputs[i].location);
}
auto vs_uniforms = sessions[0].GetShaderInterface(SPVC_RESOURCE_TYPE_GL_PLAIN_UNIFORM);
auto fs_uniforms = sessions[1].GetShaderInterface(SPVC_RESOURCE_TYPE_GL_PLAIN_UNIFORM);
+4 -4
View File
@@ -1,8 +1,8 @@
#include <gtest/gtest.h>
TEST(Sanity, BasicAssertions) {
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
}
@@ -19,106 +19,111 @@ namespace MobileGL {
if (matCol > 1) {
switch (baseType) {
case GL_FLOAT:
if (vecSize == 4 && matCol == 4) return GL_FLOAT_MAT4;
if (vecSize == 3 && matCol == 3) return GL_FLOAT_MAT3;
if (vecSize == 2 && matCol == 2) return GL_FLOAT_MAT2;
if (vecSize == 2 && matCol == 3) return GL_FLOAT_MAT3x2;
if (vecSize == 2 && matCol == 4) return GL_FLOAT_MAT4x2;
if (vecSize == 3 && matCol == 2) return GL_FLOAT_MAT2x3;
if (vecSize == 3 && matCol == 4) return GL_FLOAT_MAT4x3;
if (vecSize == 4 && matCol == 2) return GL_FLOAT_MAT2x4;
if (vecSize == 4 && matCol == 3) return GL_FLOAT_MAT3x4;
break;
case GL_DOUBLE:
if (vecSize == 4 && matCol == 4) return GL_DOUBLE_MAT4;
if (vecSize == 3 && matCol == 3) return GL_DOUBLE_MAT3;
if (vecSize == 2 && matCol == 2) return GL_DOUBLE_MAT2;
if (vecSize == 2 && matCol == 3) return GL_DOUBLE_MAT3x2;
if (vecSize == 2 && matCol == 4) return GL_DOUBLE_MAT4x2;
if (vecSize == 3 && matCol == 2) return GL_DOUBLE_MAT2x3;
if (vecSize == 3 && matCol == 4) return GL_DOUBLE_MAT4x3;
if (vecSize == 4 && matCol == 2) return GL_DOUBLE_MAT2x4;
if (vecSize == 4 && matCol == 3) return GL_DOUBLE_MAT3x4;
break;
default:
return GL_FALSE;
case GL_FLOAT:
if (vecSize == 4 && matCol == 4) return GL_FLOAT_MAT4;
if (vecSize == 3 && matCol == 3) return GL_FLOAT_MAT3;
if (vecSize == 2 && matCol == 2) return GL_FLOAT_MAT2;
if (vecSize == 2 && matCol == 3) return GL_FLOAT_MAT3x2;
if (vecSize == 2 && matCol == 4) return GL_FLOAT_MAT4x2;
if (vecSize == 3 && matCol == 2) return GL_FLOAT_MAT2x3;
if (vecSize == 3 && matCol == 4) return GL_FLOAT_MAT4x3;
if (vecSize == 4 && matCol == 2) return GL_FLOAT_MAT2x4;
if (vecSize == 4 && matCol == 3) return GL_FLOAT_MAT3x4;
break;
case GL_DOUBLE:
if (vecSize == 4 && matCol == 4) return GL_DOUBLE_MAT4;
if (vecSize == 3 && matCol == 3) return GL_DOUBLE_MAT3;
if (vecSize == 2 && matCol == 2) return GL_DOUBLE_MAT2;
if (vecSize == 2 && matCol == 3) return GL_DOUBLE_MAT3x2;
if (vecSize == 2 && matCol == 4) return GL_DOUBLE_MAT4x2;
if (vecSize == 3 && matCol == 2) return GL_DOUBLE_MAT2x3;
if (vecSize == 3 && matCol == 4) return GL_DOUBLE_MAT4x3;
if (vecSize == 4 && matCol == 2) return GL_DOUBLE_MAT2x4;
if (vecSize == 4 && matCol == 3) return GL_DOUBLE_MAT3x4;
break;
default:
return GL_FALSE;
}
}
else if (matCol == 1) {
switch (baseType) {
case GL_BOOL:
switch (vecSize) {
case 4: return GL_BOOL_VEC4;
case 3: return GL_BOOL_VEC3;
case 2: return GL_BOOL_VEC2;
}
case GL_FLOAT:
return GL_FLOAT_VEC2 + (vecSize - 2); // GL_FLOAT_VEC* is contiguous
case GL_DOUBLE:
switch (vecSize) {
case 4: return GL_DOUBLE_VEC4;
case 3: return GL_DOUBLE_VEC3;
case 2: return GL_DOUBLE_VEC2;
}
break;
case GL_INT:
return GL_INT_VEC2 + (vecSize - 2); // GL_INT_VEC* is contiguous
case GL_UNSIGNED_INT:
return GL_UNSIGNED_INT_VEC2 + (vecSize - 2); // GL_UNSIGNED_INT_VEC* is contiguous
case GL_BOOL:
switch (vecSize) {
case 4:
return GL_BOOL_VEC4;
case 3:
return GL_BOOL_VEC3;
case 2:
return GL_BOOL_VEC2;
}
case GL_FLOAT:
return GL_FLOAT_VEC2 + (vecSize - 2); // GL_FLOAT_VEC* is contiguous
case GL_DOUBLE:
switch (vecSize) {
case 4:
return GL_DOUBLE_VEC4;
case 3:
return GL_DOUBLE_VEC3;
case 2:
return GL_DOUBLE_VEC2;
}
break;
case GL_INT:
return GL_INT_VEC2 + (vecSize - 2); // GL_INT_VEC* is contiguous
case GL_UNSIGNED_INT:
return GL_UNSIGNED_INT_VEC2 + (vecSize - 2); // GL_UNSIGNED_INT_VEC* is contiguous
}
}
return GL_FALSE;
}
GLenum ConvertSpvcTypeToGLEnum(const ShaderTranspiler::SpvcType& spvcType) {
switch (spvcType.basetype) {
case SPVC_BASETYPE_BOOLEAN:
return ConvertBaseTypeToType(GL_BOOL, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_INT8:
return ConvertBaseTypeToType(GL_BYTE, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_BOOLEAN:
return ConvertBaseTypeToType(GL_BOOL, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_INT8:
return ConvertBaseTypeToType(GL_BYTE, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_INT16:
case SPVC_BASETYPE_INT32:
case SPVC_BASETYPE_INT64:
return ConvertBaseTypeToType(GL_INT, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_INT16:
case SPVC_BASETYPE_INT32:
case SPVC_BASETYPE_INT64:
return ConvertBaseTypeToType(GL_INT, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_UINT8:
return ConvertBaseTypeToType(GL_UNSIGNED_BYTE, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_UINT8:
return ConvertBaseTypeToType(GL_UNSIGNED_BYTE, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_UINT16:
case SPVC_BASETYPE_UINT32:
case SPVC_BASETYPE_UINT64:
return ConvertBaseTypeToType(GL_UNSIGNED_INT, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_UINT16:
case SPVC_BASETYPE_UINT32:
case SPVC_BASETYPE_UINT64:
return ConvertBaseTypeToType(GL_UNSIGNED_INT, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_ATOMIC_COUNTER:
return GL_UNSIGNED_INT_ATOMIC_COUNTER;
case SPVC_BASETYPE_ATOMIC_COUNTER:
return GL_UNSIGNED_INT_ATOMIC_COUNTER;
case SPVC_BASETYPE_FP16:
case SPVC_BASETYPE_FP32:
return ConvertBaseTypeToType(GL_FLOAT, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_FP16:
case SPVC_BASETYPE_FP32:
return ConvertBaseTypeToType(GL_FLOAT, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_FP64:
return ConvertBaseTypeToType(GL_DOUBLE, spvcType.vectorSize, spvcType.matCol);
case SPVC_BASETYPE_FP64:
return ConvertBaseTypeToType(GL_DOUBLE, spvcType.vectorSize, spvcType.matCol);
// FIXME: likely wrong conversions!
case SPVC_BASETYPE_IMAGE:
return GL_IMAGE_2D;
case SPVC_BASETYPE_SAMPLED_IMAGE:
return GL_IMAGE_2D;
case SPVC_BASETYPE_SAMPLER:
return GL_SAMPLER_2D;
// FIXME: likely wrong conversions!
case SPVC_BASETYPE_IMAGE:
return GL_IMAGE_2D;
case SPVC_BASETYPE_SAMPLED_IMAGE:
return GL_IMAGE_2D;
case SPVC_BASETYPE_SAMPLER:
return GL_SAMPLER_2D;
case SPVC_BASETYPE_STRUCT:
case SPVC_BASETYPE_VOID:
case SPVC_BASETYPE_UNKNOWN:
case SPVC_BASETYPE_ACCELERATION_STRUCTURE:
default:
return GL_FALSE;
case SPVC_BASETYPE_STRUCT:
case SPVC_BASETYPE_VOID:
case SPVC_BASETYPE_UNKNOWN:
case SPVC_BASETYPE_ACCELERATION_STRUCTURE:
default:
return GL_FALSE;
}
}
}
}
} // namespace MG_Util
} // namespace MobileGL
+6 -5
View File
@@ -20,7 +20,7 @@ namespace MobileGL {
}
std::string GetThreadName() {
char buffer[64] = { 0 };
char buffer[64] = {0};
#if defined(_WIN32) && !defined(__MINGW32__)
PWSTR desc = nullptr;
if (SUCCEEDED(GetThreadDescription(GetCurrentThread(), &desc))) {
@@ -37,7 +37,7 @@ namespace MobileGL {
using namespace std::chrono;
auto now = system_clock::now();
std::time_t tt = system_clock::to_time_t(now);
struct tm tm {};
struct tm tm{};
#if defined(_WIN32)
localtime_s(&tm, &tt);
#else
@@ -69,7 +69,8 @@ namespace MobileGL {
void Log(const char* levelTag, android_LogPriority androidLogLevel, const char* fmt, ...) {
std::lock_guard<std::mutex> lock(s_mutex);
std::string header = "[" + GetCurrentTime() + "] [" + GetOSName() + " " + GetThreadName() + "/" + levelTag + "]: ";
std::string header =
"[" + GetCurrentTime() + "] [" + GetOSName() + " " + GetThreadName() + "/" + levelTag + "]: ";
char buffer[1024];
va_list args;
@@ -98,5 +99,5 @@ namespace MobileGL {
}
#endif
}
}
}
} // namespace MG_Util::Debug
} // namespace MobileGL
File diff suppressed because it is too large Load Diff
+9 -9
View File
@@ -5,9 +5,9 @@
#include "BufferMetrics.h"
namespace MobileGL {
namespace MG_Util {
SizeT GetGLTypeSize(GLenum type) {
switch (type) {
namespace MG_Util {
SizeT GetGLTypeSize(GLenum type) {
switch (type) {
// Scalars
case GL_BYTE:
case GL_UNSIGNED_BYTE:
@@ -30,10 +30,10 @@ namespace MG_Util {
case GL_UNSIGNED_INT_5_9_9_9_REV:
return 4;
case GL_DOUBLE:
#ifdef GL_ARB_gpu_shader_int64
#ifdef GL_ARB_gpu_shader_int64
case GL_UNSIGNED_INT64_ARB:
case GL_INT64_ARB:
#endif
#endif
return 8;
// ---- Vector Types ----
@@ -72,7 +72,7 @@ namespace MG_Util {
return 3 * 3 * sizeof(GLfloat);
case GL_FLOAT_MAT4:
return 4 * 4 * sizeof(GLfloat);
// Float non-square
case GL_FLOAT_MAT2x3:
return 2 * 3 * sizeof(GLfloat);
@@ -111,7 +111,7 @@ namespace MG_Util {
default:
return -1;
}
}
}
}
}
} // namespace MG_Util
} // namespace MobileGL
+5 -5
View File
@@ -8,9 +8,9 @@
#include <Includes.h>
namespace MobileGL {
namespace MG_Util {
SizeT GetGLTypeSize(GLenum type);
}
}
namespace MG_Util {
SizeT GetGLTypeSize(GLenum type);
}
} // namespace MobileGL
#endif //BUFFERMETRICS_H
#endif // BUFFERMETRICS_H
@@ -139,7 +139,9 @@ namespace MobileGL {
tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450);
tshader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_3);
tshader->setEnvTarget(glslang::EShTargetSpv,
((attrib.flags & ShaderCompileBits::EmitDiscardAsDemote) ? glslang::EShTargetSpv_1_6 : glslang::EShTargetSpv_1_5));
((attrib.flags & ShaderCompileBits::EmitDiscardAsDemote)
? glslang::EShTargetSpv_1_6
: glslang::EShTargetSpv_1_5));
}
tshader->setAutoMapLocations(true);
tshader->setAutoMapBindings(true);
@@ -192,7 +194,8 @@ namespace MobileGL {
return program;
}
Result<Vector<Vector<unsigned>>> ShaderCompiler::GetSpirvBinaryFromProgram(const ProgramBinaryAttrib &attrib) {
Result<Vector<Vector<unsigned>>> ShaderCompiler::GetSpirvBinaryFromProgram(
const ProgramBinaryAttrib& attrib) {
glslang::SpvOptions spvOptions;
spvOptions.disableOptimizer = false;
@@ -93,7 +93,8 @@ namespace MobileGL {
SPVC_CHK_RESULT(spvc_compiler_type_struct_member_offset(compiler, type, j, &memberOffset);)
metadata.plainUniformOffsetsInUBO[memberName] = memberOffset;
SizeT memberSize = 0;
SPVC_CHK_RESULT(spvc_compiler_get_declared_struct_member_size(compiler, type, j, &memberSize);)
SPVC_CHK_RESULT(
spvc_compiler_get_declared_struct_member_size(compiler, type, j, &memberSize);)
metadata.plainUniformMemberSizesInBytes[memberName] = memberSize;
auto memberTypeId = spvc_type_get_member_type(type, j);
+17 -18
View File
@@ -26,26 +26,25 @@ namespace MobileGL {
static Uint32 getByteSizeOfBaseType(const spvc_basetype type) {
switch (type) {
case SPVC_BASETYPE_INT8:
case SPVC_BASETYPE_UINT8:
return 1;
case SPVC_BASETYPE_INT16:
case SPVC_BASETYPE_UINT16:
case SPVC_BASETYPE_FP16:
return 2;
case SPVC_BASETYPE_INT32:
case SPVC_BASETYPE_UINT32:
case SPVC_BASETYPE_FP32:
return 4;
case SPVC_BASETYPE_INT64:
case SPVC_BASETYPE_UINT64:
case SPVC_BASETYPE_FP64:
return 8;
default:
return 0;
case SPVC_BASETYPE_INT8:
case SPVC_BASETYPE_UINT8:
return 1;
case SPVC_BASETYPE_INT16:
case SPVC_BASETYPE_UINT16:
case SPVC_BASETYPE_FP16:
return 2;
case SPVC_BASETYPE_INT32:
case SPVC_BASETYPE_UINT32:
case SPVC_BASETYPE_FP32:
return 4;
case SPVC_BASETYPE_INT64:
case SPVC_BASETYPE_UINT64:
case SPVC_BASETYPE_FP64:
return 8;
default:
return 0;
}
}
};
struct SpvcMetadata {
@@ -5,36 +5,34 @@
#include "UniformTraverser.h"
namespace MobileGL {
namespace MG_Util {
namespace ShaderTranspiler {
void UniformTraverser::visitSymbol(glslang::TIntermSymbol *symbol) {
auto parent = getParentNode();
if (!parent)
return;
auto parentAgg = parent->getAsAggregate();
if (!parentAgg || parentAgg->getOp() != glslang::EOpLinkerObjects)
return;
namespace MG_Util {
namespace ShaderTranspiler {
void UniformTraverser::visitSymbol(glslang::TIntermSymbol* symbol) {
auto parent = getParentNode();
if (!parent) return;
auto parentAgg = parent->getAsAggregate();
if (!parentAgg || parentAgg->getOp() != glslang::EOpLinkerObjects) return;
const auto &type = symbol->getType();
if (symbol->getQualifier().isUniform() && type.getBasicType() != glslang::EbtSampler) {
m_collectedSymbols.emplace_back(symbol);
// auto& name = symbol->getName();
// auto qualifier = symbol->getQualifier();
//
// printf("layout(location = %d) uniform %s\n", qualifier.layoutLocation, name.c_str());
// auto &uniform = uniforms.emplace_back();
// uniform.name = name;
// uniform.storageQualifier = qualifier.storage;
// uniform.layoutLocation = qualifier.layoutLocation;
// uniform.layoutBinding = qualifier.layoutBinding;
// uniform.layoutPacking = qualifier.layoutPacking;
}
// else if (type.getBasicType() == glslang::EbtSampler) {
// auto &uniform = samplers.emplace_back();
// uniform.name = symbol->getName();
// uniform.sampler = type.getSampler();
// }
}
}
}
}
const auto& type = symbol->getType();
if (symbol->getQualifier().isUniform() && type.getBasicType() != glslang::EbtSampler) {
m_collectedSymbols.emplace_back(symbol);
// auto& name = symbol->getName();
// auto qualifier = symbol->getQualifier();
//
// printf("layout(location = %d) uniform %s\n", qualifier.layoutLocation, name.c_str());
// auto &uniform = uniforms.emplace_back();
// uniform.name = name;
// uniform.storageQualifier = qualifier.storage;
// uniform.layoutLocation = qualifier.layoutLocation;
// uniform.layoutBinding = qualifier.layoutBinding;
// uniform.layoutPacking = qualifier.layoutPacking;
}
// else if (type.getBasicType() == glslang::EbtSampler) {
// auto &uniform = samplers.emplace_back();
// uniform.name = symbol->getName();
// uniform.sampler = type.getSampler();
// }
}
} // namespace ShaderTranspiler
} // namespace MG_Util
} // namespace MobileGL
@@ -8,17 +8,18 @@
#include "Includes.h"
namespace MobileGL {
namespace MG_Util {
namespace ShaderTranspiler {
class UniformTraverser : public glslang::TIntermTraverser {
public:
void visitSymbol(glslang::TIntermSymbol *symbol) override;
Vector<glslang::TIntermSymbol*>& GetCollectedSymbols() { return m_collectedSymbols; }
private:
Vector<glslang::TIntermSymbol*> m_collectedSymbols;
};
}
}
}
namespace MG_Util {
namespace ShaderTranspiler {
class UniformTraverser : public glslang::TIntermTraverser {
public:
void visitSymbol(glslang::TIntermSymbol* symbol) override;
Vector<glslang::TIntermSymbol*>& GetCollectedSymbols() { return m_collectedSymbols; }
#endif //MOBILEGL_UNIFORMTRAVERSER_H
private:
Vector<glslang::TIntermSymbol*> m_collectedSymbols;
};
} // namespace ShaderTranspiler
} // namespace MG_Util
} // namespace MobileGL
#endif // MOBILEGL_UNIFORMTRAVERSER_H