static inline Eina_Bool _program_build(E3D_Program *program, const char *vert_src, const char *frag_src) { GLint ok; /* Create OpenGL vertex & fragment shader object. */ program->vert = glCreateShader(GL_VERTEX_SHADER); program->frag = glCreateShader(GL_FRAGMENT_SHADER); /* Commpile vertex shader. */ if (!_shader_compile(program->vert, vert_src)) { ERR("Faield to compile vertex shader."); return EINA_FALSE; } /* Compile fragment shader. */ if (!_shader_compile(program->frag, frag_src)) { ERR("Failed to compile fragment shader."); return EINA_FALSE; } /* Create OpenGL program object. */ program->prog = glCreateProgram(); /* Attach shaders. */ glAttachShader(program->prog, program->vert); glAttachShader(program->prog, program->frag); /* Link program. */ glLinkProgram(program->prog); /* Check link status. */ glGetProgramiv(program->prog, GL_LINK_STATUS, &ok); if (!ok) { GLchar *log_str; GLint len; GLsizei info_len; glGetProgramiv(program->prog, GL_INFO_LOG_LENGTH, &len); log_str = (GLchar *)malloc(len); glGetProgramInfoLog(program->prog, len, &info_len, log_str); ERR("Shader link failed.\n%s", log_str); free(log_str); return EINA_FALSE; } return EINA_TRUE; }
Shader_t *shader_load(const char *aVertSrc, const char *aFragSrc) { Shader_t *out = obj_create_autoreleased(&Class_Shader); out->activationCallback = NULL; out->deactivationCallback = NULL; for(int i = 0; i < kShader_MaxUniforms; ++i) out->uniforms[i] = -1; for(int i = 0; i < kShader_MaxAttributes; ++i) out->attributes[i] = -1; out->program = glCreateProgram(); bool success; GLuint vertexShader = _shader_compile(aVertSrc, GL_VERTEX_SHADER, &success); dynamo_assert(success, "Couldn't compile vertex shader"); GLuint fragmentShader = _shader_compile(aFragSrc, GL_FRAGMENT_SHADER, &success); dynamo_assert(success, "Couldn't compile fragment shader"); glAttachShader(out->program, vertexShader); out->vertexShader = vertexShader; glAttachShader(out->program, fragmentShader); out->fragmentShader = fragmentShader; success = _shader_link(out->program); glError() dynamo_assert(success, "Couldn't link shader program"); // Hook up the default uniforms&attributes if available out->uniforms[kShader_worldMatrixUniform] = shader_getUniformLocation(out, kShader_UniformNames[kShader_worldMatrixUniform]); out->uniforms[kShader_projectionMatrixUniform] = shader_getUniformLocation(out, kShader_UniformNames[kShader_projectionMatrixUniform]); out->uniforms[kShader_colormap0Uniform] = shader_getUniformLocation(out, kShader_UniformNames[kShader_colormap0Uniform]); out->attributes[kShader_positionAttribute] = shader_getAttributeLocation(out, kShader_AttributeNames[kShader_positionAttribute]); out->attributes[kShader_texCoord0Attribute] = shader_getAttributeLocation(out, kShader_AttributeNames[kShader_texCoord0Attribute]); return out; }