mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Chore] (MG_Util/Program): SpvcSession rule-of-three?
This commit is contained in:
@@ -218,9 +218,14 @@ TEST_F(ProgramTest, DecompProgram) {
|
|||||||
|
|
||||||
auto spirvs = program_res.value();
|
auto spirvs = program_res.value();
|
||||||
|
|
||||||
|
Vector<SpvcSession> sessions(spirvs.size());
|
||||||
|
for (SizeT i = 0; i < spirvs.size(); ++i) {
|
||||||
|
sessions[i] = SpvcSession(spirvs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
for (SizeT i = 0; i < spirvs.size(); ++i) {
|
for (SizeT i = 0; i < spirvs.size(); ++i) {
|
||||||
std::cout << "Decompiling " << MG_Util::ConvertGLEnumToString(programAttrib.shaderTypes[i]) << std::endl;
|
std::cout << "Decompiling " << MG_Util::ConvertGLEnumToString(programAttrib.shaderTypes[i]) << std::endl;
|
||||||
auto src = ShaderCompiler::DecompileShader(spirvs[i]);
|
auto src = ShaderCompiler::DecompileShader(sessions[i]);
|
||||||
if (!src) {
|
if (!src) {
|
||||||
ASSERT_NE(src.error().errc, 0);
|
ASSERT_NE(src.error().errc, 0);
|
||||||
FAIL() << "errc: " << src.error().errc << "\nlog: " << src.error().log;
|
FAIL() << "errc: " << src.error().errc << "\nlog: " << src.error().log;
|
||||||
|
|||||||
@@ -197,8 +197,7 @@ namespace MobileGL {
|
|||||||
return allSpirv;
|
return allSpirv;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<String> ShaderCompiler::DecompileShader(Vector<unsigned int> spirv) {
|
Result<String> ShaderCompiler::DecompileShader(SpvcSession& session) {
|
||||||
SpvcSession session(spirv);
|
|
||||||
spvc_compiler_options options;
|
spvc_compiler_options options;
|
||||||
session.CreateOptions(&options);
|
session.CreateOptions(&options);
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace ShaderTranspiler {
|
|||||||
public:
|
public:
|
||||||
static Result<SharedPtr<glslang::TShader>> CompileShader(const ShaderAttrib& attrib);
|
static Result<SharedPtr<glslang::TShader>> CompileShader(const ShaderAttrib& attrib);
|
||||||
static Result<Vector<Vector<unsigned>>> LinkProgram(const ProgramAttrib& attrib);
|
static Result<Vector<Vector<unsigned>>> LinkProgram(const ProgramAttrib& attrib);
|
||||||
static Result<String> DecompileShader(Vector<unsigned int> spirv);
|
static Result<String> DecompileShader(SpvcSession& session);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,11 @@ namespace MobileGL {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
using Result = std::expected<T, ResultInfo>;
|
using Result = std::expected<T, ResultInfo>;
|
||||||
|
|
||||||
struct SpvcSession {
|
class SpvcSession {
|
||||||
SpvcSession(Vector<unsigned int> spirv) {
|
public:
|
||||||
|
SpvcSession() {}
|
||||||
|
|
||||||
|
explicit SpvcSession(Vector<unsigned int> spirv) {
|
||||||
const SpvId *p_spirv = spirv.data();
|
const SpvId *p_spirv = spirv.data();
|
||||||
size_t word_count = spirv.size();
|
size_t word_count = spirv.size();
|
||||||
|
|
||||||
@@ -38,6 +41,25 @@ namespace MobileGL {
|
|||||||
spvc_context_create_compiler(context, SPVC_BACKEND_GLSL, ir, SPVC_CAPTURE_MODE_TAKE_OWNERSHIP, &compiler);
|
spvc_context_create_compiler(context, SPVC_BACKEND_GLSL, ir, SPVC_CAPTURE_MODE_TAKE_OWNERSHIP, &compiler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SpvcSession(SpvcSession&) = delete;
|
||||||
|
|
||||||
|
SpvcSession(SpvcSession&& that) {
|
||||||
|
std::swap(this->context, that.context);
|
||||||
|
std::swap(this->compiler, that.compiler);
|
||||||
|
std::swap(this->ir, that.ir);
|
||||||
|
std::swap(this->compiler_options, that.compiler_options);
|
||||||
|
}
|
||||||
|
|
||||||
|
SpvcSession& operator=(SpvcSession& session) = delete;
|
||||||
|
|
||||||
|
SpvcSession& operator=(SpvcSession&& that) {
|
||||||
|
std::swap(this->context, that.context);
|
||||||
|
std::swap(this->compiler, that.compiler);
|
||||||
|
std::swap(this->ir, that.ir);
|
||||||
|
std::swap(this->compiler_options, that.compiler_options);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
spvc_result CreateOptions(spvc_compiler_options *options) {
|
spvc_result CreateOptions(spvc_compiler_options *options) {
|
||||||
return spvc_compiler_create_compiler_options(compiler, options);
|
return spvc_compiler_create_compiler_options(compiler, options);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user