mirror of https://github.com/alibaba/MNN.git
105 lines
2.8 KiB
C++
105 lines
2.8 KiB
C++
//
|
|
// GLProgram.cpp
|
|
// MNN
|
|
//
|
|
// Created by MNN on 2019/01/31.
|
|
// Copyright © 2018, Alibaba Group Holding Limited
|
|
//
|
|
|
|
#include "backend/opengl/GLProgram.hpp"
|
|
#include <string.h>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include "backend/opengl/GLDebug.hpp"
|
|
using namespace std;
|
|
|
|
namespace MNN {
|
|
namespace OpenGL {
|
|
GLProgram::~GLProgram() {
|
|
glDeleteShader(mShaderId);
|
|
glDeleteProgram(mProgramId);
|
|
OPENGL_CHECK_ERROR;
|
|
}
|
|
bool GLProgram::compileShader(GLuint s) {
|
|
GLint status;
|
|
glCompileShader(s);
|
|
glGetShaderiv(s, GL_COMPILE_STATUS, &status);
|
|
if (!status) {
|
|
int len;
|
|
glGetShaderiv(s, GL_INFO_LOG_LENGTH, &len);
|
|
if (0 >= len) {
|
|
glGetShaderInfoLog(s, 0, &len, NULL);
|
|
}
|
|
char* buffer = new char[len + 1];
|
|
glGetShaderInfoLog(s, len, NULL, buffer);
|
|
buffer[len] = 0;
|
|
FUNC_PRINT_ALL(buffer, s);
|
|
delete[] buffer;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int GLProgram::getAttribLocation(const char* name) const {
|
|
GLASSERT(NULL != name && 0 != mProgramId);
|
|
return glGetAttribLocation(mProgramId, name);
|
|
}
|
|
int GLProgram::getUniformLocation(const char* name) const {
|
|
GLASSERT(NULL != name && 0 != mProgramId);
|
|
return glGetUniformLocation(mProgramId, name);
|
|
}
|
|
|
|
void GLProgram::useProgram() {
|
|
glUseProgram(mProgramId);
|
|
OPENGL_CHECK_ERROR;
|
|
}
|
|
|
|
GLProgram::GLProgram(const std::string& computeShader) {
|
|
/*Create Shader*/
|
|
mShaderId = glCreateShader(GL_COMPUTE_SHADER);
|
|
OPENGL_CHECK_ERROR;
|
|
const char* _ver[1];
|
|
_ver[0] = computeShader.c_str();
|
|
glShaderSource(mShaderId, 1, _ver, NULL);
|
|
OPENGL_CHECK_ERROR;
|
|
/*TODO move GLASSERT to be log*/
|
|
bool res = compileShader(mShaderId);
|
|
// if (!res) FUNC_PRINT_ALL(mVertex.c_str(), s);
|
|
GLASSERT(res);
|
|
/*Create Program*/
|
|
mProgramId = glCreateProgram();
|
|
OPENGL_CHECK_ERROR;
|
|
glAttachShader(mProgramId, mShaderId);
|
|
OPENGL_CHECK_ERROR;
|
|
glLinkProgram(mProgramId);
|
|
OPENGL_CHECK_ERROR;
|
|
GLint linked;
|
|
glGetProgramiv(mProgramId, GL_LINK_STATUS, &linked);
|
|
if (!linked) {
|
|
// FUNC_PRINT(linked);
|
|
GLsizei len;
|
|
glGetProgramiv(mProgramId, GL_INFO_LOG_LENGTH , &len);
|
|
if (len <= 0) {
|
|
glGetProgramInfoLog(mProgramId, 0, &len, NULL);
|
|
}
|
|
if (len > 0) {
|
|
char* buffer = new char[len + 1];
|
|
buffer[len] = '\0';
|
|
glGetProgramInfoLog(mProgramId, len, NULL, buffer);
|
|
FUNC_PRINT_ALL(buffer, s);
|
|
delete[] buffer;
|
|
}
|
|
}
|
|
}
|
|
|
|
std::string GLProgram::getHead(std::string imageFormat) {
|
|
std::ostringstream headOs;
|
|
headOs << "#version 310 es\n";
|
|
headOs << "#define PRECISION mediump\n";
|
|
headOs << "precision PRECISION float;\n";
|
|
headOs << "#define FORMAT " << imageFormat << "\n";
|
|
return headOs.str();
|
|
}
|
|
} // namespace OpenGL
|
|
} // namespace MNN
|