1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
// license:BSD-3-Clause
// copyright-holders:Sven Gothel
/***
*
* GL Shader Tool - Convenient Basic Shader functionality
*
* Copyright (c) 2007, Sven Gothel
* Copyright (c) 2007, MAME Team
*
* May be distributed under the terms of the GNU General Public
* License, version 2.0, or the 3-Clause BSD License.
*
* OpenGL GLSL ARB extensions:
*
* GL_ARB_shader_objects
* GL_ARB_shading_language_100
* GL_ARB_vertex_shader
* GL_ARB_fragment_shader
*
*/
#ifndef MAME_OSD_OPENGL_GL_SHADER_TOOL_H
#define MAME_OSD_OPENGL_GL_SHADER_TOOL_H
#pragma once
#include "osd_opengl.h"
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/***
*
* OpenGL GLSL extensions:
GL_ARB_shader_objects
GL_ARB_shading_language_100
GL_ARB_vertex_shader
GL_ARB_fragment_shader
*
*/
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES 1
#endif
#if defined(SDLMAME_MACOSX)
#ifndef APIENTRY
#define APIENTRY
#endif
#ifndef APIENTRYP
#define APIENTRYP APIENTRY *
#endif
#endif
#if defined(SDLMAME_MACOSX)
#ifndef GL_ARB_shader_objects
typedef char GLcharARB;
typedef unsigned int GLhandleARB;
#endif
typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params);
typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog);
typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj);
typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType);
typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length);
typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj);
typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void);
typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj);
typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj);
typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj);
typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj);
typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name);
typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0);
typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0);
typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value);
typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value);
typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value);
typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value);
typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);
#endif
typedef void * (APIENTRYP PFNGLGETPROCADDRESSOS)(const char *procName);
#ifdef __cplusplus
}
#endif
class gl_shader_tool
{
public:
gl_shader_tool(
#if defined(USE_DISPATCH_GL)
osd_gl_dispatch *gld
#endif
);
PFNGLGETOBJECTPARAMETERIVARBPROC pfn_glGetObjectParameterivARB;
PFNGLGETINFOLOGARBPROC pfn_glGetInfoLogARB;
PFNGLDELETEOBJECTARBPROC pfn_glDeleteObjectARB;
PFNGLCREATESHADEROBJECTARBPROC pfn_glCreateShaderObjectARB;
PFNGLSHADERSOURCEARBPROC pfn_glShaderSourceARB;
PFNGLCOMPILESHADERARBPROC pfn_glCompileShaderARB;
PFNGLCREATEPROGRAMOBJECTARBPROC pfn_glCreateProgramObjectARB;
PFNGLATTACHOBJECTARBPROC pfn_glAttachObjectARB;
PFNGLLINKPROGRAMARBPROC pfn_glLinkProgramARB;
PFNGLVALIDATEPROGRAMARBPROC pfn_glValidateProgramARB;
PFNGLUSEPROGRAMOBJECTARBPROC pfn_glUseProgramObjectARB;
PFNGLGETUNIFORMLOCATIONARBPROC pfn_glGetUniformLocationARB;
PFNGLUNIFORM1FARBPROC pfn_glUniform1fARB;
PFNGLUNIFORM1IARBPROC pfn_glUniform1iARB;
PFNGLUNIFORM1FVARBPROC pfn_glUniform1fvARB;
PFNGLUNIFORM2FVARBPROC pfn_glUniform2fvARB;
PFNGLUNIFORM3FVARBPROC pfn_glUniform3fvARB;
PFNGLUNIFORM4FVARBPROC pfn_glUniform4fvARB;
PFNGLUNIFORM1IVARBPROC pfn_glUniform1ivARB;
PFNGLUNIFORM2IVARBPROC pfn_glUniform2ivARB;
PFNGLUNIFORM3IVARBPROC pfn_glUniform3ivARB;
PFNGLUNIFORM4IVARBPROC pfn_glUniform4ivARB;
/**
* YOU HAVE TO CALL THIS FUNCTION ONCE !
* @return true - ok .. all shader ARB functions loaded
* otherwise false
*/
bool load_extension(osd_gl_context &gl_ctx);
int texture_check_size(
GLenum target,
GLint level,
GLint internalFormat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
GLsizei *avail_width,
GLsizei *avail_height,
bool verbose);
protected:
int compile_file(GLhandleARB *shader, GLenum type, const char *shader_file, bool verbose);
int compile_source(GLhandleARB *shader, GLenum type, const char *shader_source, bool verbose);
/**
* you can pass either a valid shader_file, or a precompiled vertex_shader,
* this is true for both, vertex and fragment shaders.
*/
int compile_files(
GLhandleARB *program,
GLhandleARB *vertex_shader,
GLhandleARB *fragment_shader,
const char *vertex_shader_file,
const char *fragment_shader_file,
bool verbose);
/**
* you can pass either a valid shader_file, or a precompiled vertex_shader,
* this is true for both, vertex and fragment shaders.
*/
int compile_sources(
GLhandleARB *program,
GLhandleARB *vertex_shader,
GLhandleARB *fragment_shader,
const GLcharARB *vertex_shader_source,
const GLcharARB *fragment_shader_source);
int delete_shader(GLhandleARB *program, GLhandleARB *vertex_shader, GLhandleARB *fragment_shader);
#if defined(USE_DISPATCH_GL)
osd_gl_dispatch *const gl_dispatch; // name is magic, can't be changed
#endif
private:
enum GLSLCheckMode
{
CHECK_QUIET, // just return 0, if no error, otherwise the GL error code, no stderr output
CHECK_VERBOSE, // same as CHECK_QUIET, but in the case of an error, use stderr to be verbose
CHECK_ALWAYS_VERBOSE // always print out all information available
};
int check_error(GLSLCheckMode m, const char *file, const int line);
/**
* @param obj_query Can be either GL_OBJECT_TYPE_ARB, GL_OBJECT_DELETE_STATUS_ARB, GL_OBJECT_COMPILE_STATUS_ARB,
* GL_OBJECT_LINK_STATUS_ARB, GL_OBJECT_VALIDATE_STATUS_ARB
* Should be used after the referring action, i.e. GL_OBJECT_DELETE_STATUS_ARB after a
* glDeleteObjectARB call, etc.
*/
int check_error(GLhandleARB obj, GLenum obj_query, GLSLCheckMode m, const char *file, const int line);
int delete_shader_tool(GLhandleARB *program, GLhandleARB *vertex_shader, GLhandleARB *fragment_shader, bool externalcall);
};
int gl_round_to_pow2(int v);
#endif // MAME_OSD_OPENGL_GL_SHADER_TOOL_H
|