GL4Shader load from binary support
This commit is contained in:
parent
1066362ada
commit
e9dd0ce9de
|
@ -51,6 +51,37 @@ bool GL4Shader::Prepare() {
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GL4Shader::LoadFromBinary(const uint8_t* blob, GLenum binary_format,
|
||||||
|
size_t length) {
|
||||||
|
program_ = glCreateProgram();
|
||||||
|
glProgramBinary(program_, binary_format, blob, GLsizei(length));
|
||||||
|
|
||||||
|
GLint link_status = 0;
|
||||||
|
glGetProgramiv(program_, GL_LINK_STATUS, &link_status);
|
||||||
|
if (!link_status) {
|
||||||
|
// Failed to link. Not fatal - just clean up so we can get generated later.
|
||||||
|
XELOGD("GL4Shader::LoadFromBinary failed. Log:\n%s",
|
||||||
|
GetProgramInfoLog().c_str());
|
||||||
|
glDeleteProgram(program_);
|
||||||
|
program_ = 0;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build static vertex array descriptor.
|
||||||
|
if (!PrepareVertexArrayObject()) {
|
||||||
|
XELOGE("Unable to prepare vertex shader array object");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success!
|
||||||
|
host_binary_ = GetBinary();
|
||||||
|
host_disassembly_ = GetHostDisasmNV(host_binary_);
|
||||||
|
|
||||||
|
is_valid_ = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool GL4Shader::PrepareVertexArrayObject() {
|
bool GL4Shader::PrepareVertexArrayObject() {
|
||||||
glCreateVertexArrays(1, &vao_);
|
glCreateVertexArrays(1, &vao_);
|
||||||
|
|
||||||
|
@ -211,7 +242,7 @@ std::string GL4Shader::GetProgramInfoLog() {
|
||||||
return log;
|
return log;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint8_t> GL4Shader::GetBinary() {
|
std::vector<uint8_t> GL4Shader::GetBinary(GLenum* binary_format) {
|
||||||
std::vector<uint8_t> binary;
|
std::vector<uint8_t> binary;
|
||||||
|
|
||||||
// Get program binary, if it's available.
|
// Get program binary, if it's available.
|
||||||
|
@ -219,9 +250,13 @@ std::vector<uint8_t> GL4Shader::GetBinary() {
|
||||||
glGetProgramiv(program_, GL_PROGRAM_BINARY_LENGTH, &binary_length);
|
glGetProgramiv(program_, GL_PROGRAM_BINARY_LENGTH, &binary_length);
|
||||||
if (binary_length) {
|
if (binary_length) {
|
||||||
binary.resize(binary_length);
|
binary.resize(binary_length);
|
||||||
GLenum binary_format;
|
GLenum binary_format_tmp = 0;
|
||||||
glGetProgramBinary(program_, binary_length, &binary_length, &binary_format,
|
glGetProgramBinary(program_, binary_length, &binary_length,
|
||||||
binary.data());
|
&binary_format_tmp, binary.data());
|
||||||
|
|
||||||
|
if (binary_format) {
|
||||||
|
*binary_format = binary_format_tmp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return binary;
|
return binary;
|
||||||
|
|
|
@ -29,7 +29,9 @@ class GL4Shader : public Shader {
|
||||||
GLuint shader() const { return shader_; }
|
GLuint shader() const { return shader_; }
|
||||||
GLuint vao() const { return vao_; }
|
GLuint vao() const { return vao_; }
|
||||||
|
|
||||||
bool Prepare() override;
|
bool Prepare();
|
||||||
|
bool LoadFromBinary(const uint8_t* blob, GLenum binary_format, size_t length);
|
||||||
|
std::vector<uint8_t> GetBinary(GLenum* binary_format = nullptr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool PrepareVertexArrayObject();
|
bool PrepareVertexArrayObject();
|
||||||
|
@ -38,7 +40,6 @@ class GL4Shader : public Shader {
|
||||||
|
|
||||||
std::string GetShaderInfoLog();
|
std::string GetShaderInfoLog();
|
||||||
std::string GetProgramInfoLog();
|
std::string GetProgramInfoLog();
|
||||||
std::vector<uint8_t> GetBinary();
|
|
||||||
static std::string GetHostDisasmNV(const std::vector<uint8_t>& binary);
|
static std::string GetHostDisasmNV(const std::vector<uint8_t>& binary);
|
||||||
|
|
||||||
GLuint program_ = 0;
|
GLuint program_ = 0;
|
||||||
|
|
Loading…
Reference in New Issue