summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/opengl/gl_shader_tool.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/opengl/gl_shader_tool.h')
-rw-r--r--src/osd/modules/opengl/gl_shader_tool.h221
1 files changed, 117 insertions, 104 deletions
diff --git a/src/osd/modules/opengl/gl_shader_tool.h b/src/osd/modules/opengl/gl_shader_tool.h
index 2e0160cf85d..50845bd590f 100644
--- a/src/osd/modules/opengl/gl_shader_tool.h
+++ b/src/osd/modules/opengl/gl_shader_tool.h
@@ -7,7 +7,8 @@
* Copyright (c) 2007, Sven Gothel
* Copyright (c) 2007, MAME Team
*
- * GPL version 2
+ * 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:
*
@@ -17,10 +18,14 @@
* GL_ARB_fragment_shader
*
*/
+#ifndef MAME_OSD_OPENGL_GL_SHADER_TOOL_H
+#define MAME_OSD_OPENGL_GL_SHADER_TOOL_H
+#pragma once
-#ifndef _GL_SHADER_TOOL_
-#define _GL_SHADER_TOOL_
+#include "osd_opengl.h"
+
+#include <stdint.h>
#ifdef __cplusplus
extern "C" {
@@ -36,14 +41,10 @@ extern "C" {
*
*/
-#include <stdint.h>
-
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES 1
#endif
-#include "osd_opengl.h"
-
#if defined(SDLMAME_MACOSX)
#ifndef APIENTRY
@@ -55,80 +56,6 @@ extern "C" {
#endif
-typedef void * (APIENTRYP PFNGLGETPROCADDRESSOS)(const char *procName);
-
-/**
- * YOU HAVE TO CALL THIS FUNCTION ONCE !
- * @return 0 - ok .. all shader ARB functions loaded
- * otherwise !=0
- */
-int gl_shader_loadExtention(osd_gl_context *gl_ctx);
-
-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 */
-};
-
-#define GL_CHECK_ERROR_VERBOSE() gl_check_error(CHECK_ALWAYS_VERBOSE,__FILE__,__LINE__)
-#define GL_CHECK_ERROR_NORMAL() gl_check_error(CHECK_VERBOSE,__FILE__,__LINE__)
-#define GL_CHECK_ERROR_QUIET() gl_check_error(CHECK_QUIET,__FILE__,__LINE__)
-#define GL_CHECK_ERROR(m) gl_check_error(m,__FILE__,__LINE__)
-
-#define GL_SHADER_CHECK_ERROR_VERBOSE(o,q) gl_shader_check_error(o,q,CHECK_ALWAYS_VERBOSE,__FILE__,__LINE__)
-#define GL_SHADER_CHECK_ERROR_NORMAL(o,q) gl_shader_check_error(o,q,CHECK_VERBOSE,__FILE__,__LINE__)
-#define GL_SHADER_CHECK_ERROR_QUIET(o,q) gl_shader_check_error(o,q,CHECK_QUIET,__FILE__,__LINE__)
-#define GL_SHADER_CHECK_ERROR(o,q,m) gl_shader_check_error(o,q,m,__FILE__,__LINE__)
-
-#ifdef GL_SHADER_TOOL_DEBUG
- #define GL_SHADER_CHECK(o,q) GL_SHADER_CHECK_ERROR_VERBOSE(o,q)
- #define GL_CHECK() GL_CHECK_ERROR_VERBOSE()
-#else
- #define GL_SHADER_CHECK(o,q) GL_SHADER_CHECK_ERROR_NORMAL(o,q)
- #define GL_CHECK() GL_CHECK_ERROR_NORMAL()
-#endif
-
-int gl_check_error(GLSLCheckMode m, const char *file, const int line);
-
-int gl_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,
- int verbose);
-
-int gl_round_to_pow2(int v);
-
-/**
- * @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 gl_shader_check_error(GLhandleARB obj, GLenum obj_query, GLSLCheckMode m, const char *file, const int line);
-
-int gl_compile_shader_file ( GLhandleARB *shader, GLenum type, const char * shader_file, int verbose );
-int gl_compile_shader_source( GLhandleARB *shader, GLenum type, const char * shader_source, int verbose );
-
-/**
- * you can pass either a valid shader_file, or a precompiled vertex_shader,
- * this is true for both, vertex and fragment shaders.
- */
-int gl_compile_shader_files( GLhandleARB *program, GLhandleARB *vertex_shader, GLhandleARB *fragment_shader,
- const char * vertex_shader_file,
- const char * fragment_shader_file,
- int verbose
- );
-
-/**
- * you can pass either a valid shader_file, or a precompiled vertex_shader,
- * this is true for both, vertex and fragment shaders.
- */
-int gl_compile_shader_sources( GLhandleARB *program, GLhandleARB *vertex_shader, GLhandleARB *fragment_shader,
- const GLcharARB * vertex_shader_source,
- const GLcharARB * fragment_shader_source
- );
-
-int gl_delete_shader( GLhandleARB *program, GLhandleARB *vertex_shader, GLhandleARB *fragment_shader );
-
#if defined(SDLMAME_MACOSX)
#ifndef GL_ARB_shader_objects
typedef char GLcharARB;
@@ -158,32 +85,118 @@ typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count,
typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value);
#endif
-extern PFNGLGETOBJECTPARAMETERIVARBPROC pfn_glGetObjectParameterivARB;
-extern PFNGLGETINFOLOGARBPROC pfn_glGetInfoLogARB;
-extern PFNGLDELETEOBJECTARBPROC pfn_glDeleteObjectARB;
-extern PFNGLCREATESHADEROBJECTARBPROC pfn_glCreateShaderObjectARB;
-extern PFNGLSHADERSOURCEARBPROC pfn_glShaderSourceARB;
-extern PFNGLCOMPILESHADERARBPROC pfn_glCompileShaderARB;
-extern PFNGLCREATEPROGRAMOBJECTARBPROC pfn_glCreateProgramObjectARB;
-extern PFNGLATTACHOBJECTARBPROC pfn_glAttachObjectARB;
-extern PFNGLLINKPROGRAMARBPROC pfn_glLinkProgramARB;
-extern PFNGLVALIDATEPROGRAMARBPROC pfn_glValidateProgramARB;
-extern PFNGLUSEPROGRAMOBJECTARBPROC pfn_glUseProgramObjectARB;
-extern PFNGLGETUNIFORMLOCATIONARBPROC pfn_glGetUniformLocationARB;
-extern PFNGLUNIFORM1FARBPROC pfn_glUniform1fARB;
-extern PFNGLUNIFORM1IARBPROC pfn_glUniform1iARB;
-extern PFNGLUNIFORM1FVARBPROC pfn_glUniform1fvARB;
-extern PFNGLUNIFORM2FVARBPROC pfn_glUniform2fvARB;
-extern PFNGLUNIFORM3FVARBPROC pfn_glUniform3fvARB;
-extern PFNGLUNIFORM4FVARBPROC pfn_glUniform4fvARB;
-extern PFNGLUNIFORM1IVARBPROC pfn_glUniform1ivARB;
-extern PFNGLUNIFORM2IVARBPROC pfn_glUniform2ivARB;
-extern PFNGLUNIFORM3IVARBPROC pfn_glUniform3ivARB;
-extern PFNGLUNIFORM4IVARBPROC pfn_glUniform4ivARB;
-
+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