Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-z64/src/glshader.cpp
2 views
1
/*
2
* z64
3
*
4
* Copyright (C) 2007 ziggy
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License along
17
* with this program; if not, write to the Free Software Foundation, Inc.,
18
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
*
20
**/
21
22
#include <stdlib.h>
23
#include <stdio.h>
24
#include <string.h>
25
#include "rgl_assert.h"
26
#include <glew.h>
27
#if defined(__MACOSX__)
28
#include <OpenGL/gl.h>
29
#include <OpenGL/glext.h>
30
#elif defined(__MACOS__)
31
#include <gl.h>
32
#include <glext.h>
33
#else
34
#include <GL/gl.h>
35
#ifndef WIN32
36
#include <GL/glext.h>
37
#endif
38
#endif
39
#include "glshader.h"
40
41
static void printInfoLog(GLhandleARB obj, const char * src)
42
{
43
int infologLength = 0;
44
int charsWritten = 0;
45
char *infoLog;
46
47
glGetObjectParameterivARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB,
48
&infologLength);
49
50
if (infologLength > 0)
51
{
52
infoLog = (char *)malloc(infologLength);
53
glGetInfoLogARB(obj, infologLength, &charsWritten, infoLog);
54
if (*infoLog)
55
rdp_log(M64MSG_INFO, "%s\n%s", src, infoLog);
56
free(infoLog);
57
}
58
}
59
60
//#define rglAssert(...)
61
rglShader_t * rglCreateShader(const char * vsrc, const char * fsrc)
62
{
63
GLhandleARB vs, fs, prog;
64
65
//printf("Compiling shader :\n%s", fsrc);
66
67
vs = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
68
rglAssert(glGetError() == GL_NO_ERROR);
69
fs = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
70
rglAssert(glGetError() == GL_NO_ERROR);
71
72
glShaderSourceARB(vs, 1, &vsrc,NULL);
73
rglAssert(glGetError() == GL_NO_ERROR);
74
glShaderSourceARB(fs, 1, &fsrc,NULL);
75
rglAssert(glGetError() == GL_NO_ERROR);
76
glCompileShaderARB(vs);
77
rglAssert(glGetError() == GL_NO_ERROR);
78
glCompileShaderARB(fs);
79
rglAssert(glGetError() == GL_NO_ERROR);
80
printInfoLog(vs, vsrc);
81
printInfoLog(fs, fsrc);
82
prog = glCreateProgramObjectARB();
83
glAttachObjectARB(prog, fs);
84
rglAssert(glGetError() == GL_NO_ERROR);
85
glAttachObjectARB(prog, vs);
86
rglAssert(glGetError() == GL_NO_ERROR);
87
88
glLinkProgramARB(prog);
89
rglAssert(glGetError() == GL_NO_ERROR);
90
91
rglShader_t * s = (rglShader_t *) malloc(sizeof(rglShader_t));
92
s->vs = vs;
93
s->fs = fs;
94
s->prog = prog;
95
//LOG("Creating shader %d %d %d\n", s->vs, s->fs, s->prog);
96
#ifdef RDP_DEBUG
97
s->vsrc = strdup(vsrc);
98
s->fsrc = strdup(fsrc);
99
#endif
100
return s;
101
}
102
103
void rglUseShader(rglShader_t * shader)
104
{
105
if (!shader)
106
glUseProgramObjectARB(0);
107
else
108
glUseProgramObjectARB(shader->prog);
109
}
110
111
void rglDeleteShader(rglShader_t * shader)
112
{
113
//LOG("Deleting shader %d %d %d\n", shader->vs, shader->fs, shader->prog);
114
glDeleteObjectARB(shader->prog);
115
rglAssert(glGetError() == GL_NO_ERROR);
116
glDeleteObjectARB(shader->vs);
117
rglAssert(glGetError() == GL_NO_ERROR);
118
glDeleteObjectARB(shader->fs);
119
rglAssert(glGetError() == GL_NO_ERROR);
120
free(shader);
121
}
122
123