Path: blob/master/libmupen64plus/mupen64plus-video-z64/src/glshader.cpp
2 views
/*1* z642*3* Copyright (C) 2007 ziggy4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License along16* with this program; if not, write to the Free Software Foundation, Inc.,17* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.18*19**/2021#include <stdlib.h>22#include <stdio.h>23#include <string.h>24#include "rgl_assert.h"25#include <glew.h>26#if defined(__MACOSX__)27#include <OpenGL/gl.h>28#include <OpenGL/glext.h>29#elif defined(__MACOS__)30#include <gl.h>31#include <glext.h>32#else33#include <GL/gl.h>34#ifndef WIN3235#include <GL/glext.h>36#endif37#endif38#include "glshader.h"3940static void printInfoLog(GLhandleARB obj, const char * src)41{42int infologLength = 0;43int charsWritten = 0;44char *infoLog;4546glGetObjectParameterivARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB,47&infologLength);4849if (infologLength > 0)50{51infoLog = (char *)malloc(infologLength);52glGetInfoLogARB(obj, infologLength, &charsWritten, infoLog);53if (*infoLog)54rdp_log(M64MSG_INFO, "%s\n%s", src, infoLog);55free(infoLog);56}57}5859//#define rglAssert(...)60rglShader_t * rglCreateShader(const char * vsrc, const char * fsrc)61{62GLhandleARB vs, fs, prog;6364//printf("Compiling shader :\n%s", fsrc);6566vs = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);67rglAssert(glGetError() == GL_NO_ERROR);68fs = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);69rglAssert(glGetError() == GL_NO_ERROR);7071glShaderSourceARB(vs, 1, &vsrc,NULL);72rglAssert(glGetError() == GL_NO_ERROR);73glShaderSourceARB(fs, 1, &fsrc,NULL);74rglAssert(glGetError() == GL_NO_ERROR);75glCompileShaderARB(vs);76rglAssert(glGetError() == GL_NO_ERROR);77glCompileShaderARB(fs);78rglAssert(glGetError() == GL_NO_ERROR);79printInfoLog(vs, vsrc);80printInfoLog(fs, fsrc);81prog = glCreateProgramObjectARB();82glAttachObjectARB(prog, fs);83rglAssert(glGetError() == GL_NO_ERROR);84glAttachObjectARB(prog, vs);85rglAssert(glGetError() == GL_NO_ERROR);8687glLinkProgramARB(prog);88rglAssert(glGetError() == GL_NO_ERROR);8990rglShader_t * s = (rglShader_t *) malloc(sizeof(rglShader_t));91s->vs = vs;92s->fs = fs;93s->prog = prog;94//LOG("Creating shader %d %d %d\n", s->vs, s->fs, s->prog);95#ifdef RDP_DEBUG96s->vsrc = strdup(vsrc);97s->fsrc = strdup(fsrc);98#endif99return s;100}101102void rglUseShader(rglShader_t * shader)103{104if (!shader)105glUseProgramObjectARB(0);106else107glUseProgramObjectARB(shader->prog);108}109110void rglDeleteShader(rglShader_t * shader)111{112//LOG("Deleting shader %d %d %d\n", shader->vs, shader->fs, shader->prog);113glDeleteObjectARB(shader->prog);114rglAssert(glGetError() == GL_NO_ERROR);115glDeleteObjectARB(shader->vs);116rglAssert(glGetError() == GL_NO_ERROR);117glDeleteObjectARB(shader->fs);118rglAssert(glGetError() == GL_NO_ERROR);119free(shader);120}121122123