Added ARB_get_program_binary extension.
This commit is contained in:
parent
d9a08e3f81
commit
28904d8c63
106
src/glimports.h
106
src/glimports.h
@ -4,56 +4,60 @@
|
||||
*/
|
||||
|
||||
#ifndef GL_IMPORT
|
||||
# error GL_IMPORT must be defined!
|
||||
# error GL_IMPORT(_optional, _proto, _func) must be defined!
|
||||
#endif // GL_IMPORT
|
||||
|
||||
GL_IMPORT(PFNGLACTIVETEXTUREPROC, glActiveTexture);
|
||||
GL_IMPORT(PFNGLCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2D);
|
||||
GL_IMPORT(PFNGLBINDBUFFERPROC, glBindBuffer);
|
||||
GL_IMPORT(PFNGLDELETEBUFFERSPROC, glDeleteBuffers);
|
||||
GL_IMPORT(PFNGLGENBUFFERSPROC, glGenBuffers);
|
||||
GL_IMPORT(PFNGLBUFFERDATAPROC, glBufferData);
|
||||
GL_IMPORT(PFNGLBUFFERSUBDATAPROC, glBufferSubData);
|
||||
GL_IMPORT(PFNGLCREATEPROGRAMPROC, glCreateProgram);
|
||||
GL_IMPORT(PFNGLCREATESHADERPROC, glCreateShader);
|
||||
GL_IMPORT(PFNGLDELETEPROGRAMPROC, glDeleteProgram);
|
||||
GL_IMPORT(PFNGLDELETESHADERPROC, glDeleteShader);
|
||||
GL_IMPORT(PFNGLATTACHSHADERPROC, glAttachShader);
|
||||
GL_IMPORT(PFNGLCOMPILESHADERPROC, glCompileShader);
|
||||
GL_IMPORT(PFNGLSHADERSOURCEPROC, glShaderSource);
|
||||
GL_IMPORT(PFNGLGETSHADERIVPROC, glGetShaderiv);
|
||||
GL_IMPORT(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog);
|
||||
GL_IMPORT(PFNGLLINKPROGRAMPROC, glLinkProgram);
|
||||
GL_IMPORT(PFNGLGETPROGRAMIVPROC, glGetProgramiv);
|
||||
GL_IMPORT(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog);
|
||||
GL_IMPORT(PFNGLUSEPROGRAMPROC, glUseProgram);
|
||||
GL_IMPORT(PFNGLGETACTIVEATTRIBPROC, glGetActiveAttrib);
|
||||
GL_IMPORT(PFNGLGETATTRIBLOCATIONPROC, glGetAttribLocation);
|
||||
GL_IMPORT(PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform);
|
||||
GL_IMPORT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation);
|
||||
GL_IMPORT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
|
||||
GL_IMPORT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray);
|
||||
GL_IMPORT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer);
|
||||
GL_IMPORT(PFNGLVERTEXATTRIB1FPROC, glVertexAttrib1f);
|
||||
GL_IMPORT(PFNGLVERTEXATTRIB2FPROC, glVertexAttrib2f);
|
||||
GL_IMPORT(PFNGLVERTEXATTRIB3FPROC, glVertexAttrib3f);
|
||||
GL_IMPORT(PFNGLVERTEXATTRIB4FPROC, glVertexAttrib4f);
|
||||
GL_IMPORT(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer);
|
||||
GL_IMPORT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers);
|
||||
GL_IMPORT(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers);
|
||||
GL_IMPORT(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus);
|
||||
GL_IMPORT(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer);
|
||||
GL_IMPORT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D);
|
||||
GL_IMPORT(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer);
|
||||
GL_IMPORT(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers);
|
||||
GL_IMPORT(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers);
|
||||
GL_IMPORT(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage);
|
||||
GL_IMPORT(PFNGLUNIFORM1IPROC, glUniform1i);
|
||||
GL_IMPORT(PFNGLUNIFORM1IVPROC, glUniform1iv);
|
||||
GL_IMPORT(PFNGLUNIFORM1FPROC, glUniform1f);
|
||||
GL_IMPORT(PFNGLUNIFORM1FVPROC, glUniform1fv);
|
||||
GL_IMPORT(PFNGLUNIFORM2FVPROC, glUniform2fv);
|
||||
GL_IMPORT(PFNGLUNIFORM3FVPROC, glUniform3fv);
|
||||
GL_IMPORT(PFNGLUNIFORM4FVPROC, glUniform4fv);
|
||||
GL_IMPORT(PFNGLUNIFORMMATRIX3FVPROC, glUniformMatrix3fv);
|
||||
GL_IMPORT(PFNGLUNIFORMMATRIX4FVPROC, glUniformMatrix4fv);
|
||||
GL_IMPORT(false, PFNGLACTIVETEXTUREPROC, glActiveTexture);
|
||||
GL_IMPORT(false, PFNGLCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2D);
|
||||
GL_IMPORT(false, PFNGLBINDBUFFERPROC, glBindBuffer);
|
||||
GL_IMPORT(false, PFNGLDELETEBUFFERSPROC, glDeleteBuffers);
|
||||
GL_IMPORT(false, PFNGLGENBUFFERSPROC, glGenBuffers);
|
||||
GL_IMPORT(false, PFNGLBUFFERDATAPROC, glBufferData);
|
||||
GL_IMPORT(false, PFNGLBUFFERSUBDATAPROC, glBufferSubData);
|
||||
GL_IMPORT(false, PFNGLCREATEPROGRAMPROC, glCreateProgram);
|
||||
GL_IMPORT(false, PFNGLCREATESHADERPROC, glCreateShader);
|
||||
GL_IMPORT(false, PFNGLDELETEPROGRAMPROC, glDeleteProgram);
|
||||
GL_IMPORT(false, PFNGLDELETESHADERPROC, glDeleteShader);
|
||||
GL_IMPORT(false, PFNGLATTACHSHADERPROC, glAttachShader);
|
||||
GL_IMPORT(false, PFNGLCOMPILESHADERPROC, glCompileShader);
|
||||
GL_IMPORT(false, PFNGLSHADERSOURCEPROC, glShaderSource);
|
||||
GL_IMPORT(false, PFNGLGETSHADERIVPROC, glGetShaderiv);
|
||||
GL_IMPORT(false, PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog);
|
||||
GL_IMPORT(false, PFNGLLINKPROGRAMPROC, glLinkProgram);
|
||||
GL_IMPORT(false, PFNGLGETPROGRAMIVPROC, glGetProgramiv);
|
||||
GL_IMPORT(false, PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog);
|
||||
GL_IMPORT(false, PFNGLUSEPROGRAMPROC, glUseProgram);
|
||||
GL_IMPORT(false, PFNGLGETACTIVEATTRIBPROC, glGetActiveAttrib);
|
||||
GL_IMPORT(false, PFNGLGETATTRIBLOCATIONPROC, glGetAttribLocation);
|
||||
GL_IMPORT(false, PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform);
|
||||
GL_IMPORT(false, PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation);
|
||||
GL_IMPORT(false, PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
|
||||
GL_IMPORT(false, PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray);
|
||||
GL_IMPORT(false, PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer);
|
||||
GL_IMPORT(false, PFNGLVERTEXATTRIB1FPROC, glVertexAttrib1f);
|
||||
GL_IMPORT(false, PFNGLVERTEXATTRIB2FPROC, glVertexAttrib2f);
|
||||
GL_IMPORT(false, PFNGLVERTEXATTRIB3FPROC, glVertexAttrib3f);
|
||||
GL_IMPORT(false, PFNGLVERTEXATTRIB4FPROC, glVertexAttrib4f);
|
||||
GL_IMPORT(false, PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer);
|
||||
GL_IMPORT(false, PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers);
|
||||
GL_IMPORT(false, PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers);
|
||||
GL_IMPORT(false, PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus);
|
||||
GL_IMPORT(false, PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer);
|
||||
GL_IMPORT(false, PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D);
|
||||
GL_IMPORT(false, PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer);
|
||||
GL_IMPORT(false, PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers);
|
||||
GL_IMPORT(false, PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers);
|
||||
GL_IMPORT(false, PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage);
|
||||
GL_IMPORT(false, PFNGLUNIFORM1IPROC, glUniform1i);
|
||||
GL_IMPORT(false, PFNGLUNIFORM1IVPROC, glUniform1iv);
|
||||
GL_IMPORT(false, PFNGLUNIFORM1FPROC, glUniform1f);
|
||||
GL_IMPORT(false, PFNGLUNIFORM1FVPROC, glUniform1fv);
|
||||
GL_IMPORT(false, PFNGLUNIFORM2FVPROC, glUniform2fv);
|
||||
GL_IMPORT(false, PFNGLUNIFORM3FVPROC, glUniform3fv);
|
||||
GL_IMPORT(false, PFNGLUNIFORM4FVPROC, glUniform4fv);
|
||||
GL_IMPORT(false, PFNGLUNIFORMMATRIX3FVPROC, glUniformMatrix3fv);
|
||||
GL_IMPORT(false, PFNGLUNIFORMMATRIX4FVPROC, glUniformMatrix4fv);
|
||||
|
||||
GL_IMPORT(true, PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary);
|
||||
GL_IMPORT(true, PFNGLPROGRAMBINARYPROC, glProgramBinary);
|
||||
GL_IMPORT(true, PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri);
|
||||
|
@ -17,7 +17,7 @@
|
||||
namespace bgfx
|
||||
{
|
||||
#if BX_PLATFORM_WINDOWS
|
||||
#define GL_IMPORT(_proto, _func) _proto _func
|
||||
#define GL_IMPORT(_optional, _proto, _func) _proto _func
|
||||
#include "glimports.h"
|
||||
#undef GL_IMPORT
|
||||
#endif // BX_PLATFORM_WINDOWS
|
||||
@ -136,10 +136,10 @@ namespace bgfx
|
||||
result = wglMakeCurrent(m_hdc, m_context);
|
||||
BX_CHECK(0 != result, "wglMakeCurrent failed!");
|
||||
|
||||
# define GL_IMPORT(_proto, _func) \
|
||||
# define GL_IMPORT(_optional, _proto, _func) \
|
||||
{ \
|
||||
_func = (_proto)wglGetProcAddress(#_func); \
|
||||
BGFX_FATAL(NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. wglGetProcAddress %s", #_func); \
|
||||
BGFX_FATAL(!_optional && NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. wglGetProcAddress %s", #_func); \
|
||||
}
|
||||
# include "glimports.h"
|
||||
# undef GL_IMPORT
|
||||
@ -254,7 +254,7 @@ namespace bgfx
|
||||
|
||||
glXMakeCurrent(display, window, m_context);
|
||||
|
||||
glClearColor(0, 0.5, 1, 1);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
glXSwapBuffers(display, window);
|
||||
|
||||
@ -382,11 +382,12 @@ namespace bgfx
|
||||
{
|
||||
enum Enum
|
||||
{
|
||||
GL_EXT_texture_format_BGRA8888,
|
||||
GL_EXT_texture_compression_dxt1,
|
||||
GL_CHROMIUM_texture_compression_dxt3,
|
||||
GL_CHROMIUM_texture_compression_dxt5,
|
||||
GL_OES_standard_derivatives,
|
||||
EXT_texture_format_BGRA8888,
|
||||
EXT_texture_compression_dxt1,
|
||||
CHROMIUM_texture_compression_dxt3,
|
||||
CHROMIUM_texture_compression_dxt5,
|
||||
OES_standard_derivatives,
|
||||
ARB_get_program_binary,
|
||||
|
||||
Count
|
||||
};
|
||||
@ -405,6 +406,7 @@ namespace bgfx
|
||||
{ "GL_CHROMIUM_texture_compression_dxt3", false, true },
|
||||
{ "GL_CHROMIUM_texture_compression_dxt5", false, true },
|
||||
{ "GL_OES_standard_derivatives", false, true },
|
||||
{ "GL_ARB_get_program_binary", false, false },
|
||||
};
|
||||
|
||||
static const GLenum s_primType[] =
|
||||
@ -596,6 +598,54 @@ namespace bgfx
|
||||
return ConstantType::End;
|
||||
}
|
||||
|
||||
void Material::create(const Shader& _vsh, const Shader& _fsh)
|
||||
{
|
||||
m_id = glCreateProgram();
|
||||
BX_TRACE("material create: %d: %d, %d", m_id, _vsh.m_id, _fsh.m_id);
|
||||
|
||||
GL_CHECK(glAttachShader(m_id, _vsh.m_id) );
|
||||
GL_CHECK(glAttachShader(m_id, _fsh.m_id) );
|
||||
GL_CHECK(glLinkProgram(m_id) );
|
||||
|
||||
if (s_extension[Extension::ARB_get_program_binary].m_supported)
|
||||
{
|
||||
GL_CHECK(glProgramParameteri(m_id, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE) );
|
||||
}
|
||||
|
||||
GLint linked = 0;
|
||||
GL_CHECK(glGetProgramiv(m_id, GL_LINK_STATUS, &linked) );
|
||||
|
||||
if (0 == linked)
|
||||
{
|
||||
char log[1024];
|
||||
GL_CHECK(glGetProgramInfoLog(m_id, sizeof(log), NULL, log) );
|
||||
BX_TRACE("%d: %s", linked, log);
|
||||
|
||||
GL_CHECK(glDeleteProgram(m_id) );
|
||||
return;
|
||||
}
|
||||
|
||||
if (s_extension[Extension::ARB_get_program_binary].m_supported)
|
||||
{
|
||||
GLint length;
|
||||
GLenum format;
|
||||
GL_CHECK(glGetProgramiv(m_id, GL_PROGRAM_BINARY_LENGTH, &length) );
|
||||
void* data = g_realloc(NULL, length);
|
||||
GL_CHECK(glGetProgramBinary(m_id, length, NULL, &format, data) );
|
||||
g_free(data);
|
||||
|
||||
dbgPrintfData(data, length, "Binary 0x%08x", format);
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
void Material::destroy()
|
||||
{
|
||||
GL_CHECK(glUseProgram(0) );
|
||||
GL_CHECK(glDeleteProgram(m_id) );
|
||||
}
|
||||
|
||||
void Material::init()
|
||||
{
|
||||
GLint activeAttribs;
|
||||
@ -815,7 +865,7 @@ namespace bgfx
|
||||
if (!s_renderCtx.m_dxtSupport
|
||||
|| 0 == dds.m_type)
|
||||
{
|
||||
fmt = s_extension[Extension::GL_EXT_texture_format_BGRA8888].m_supported ? GL_BGRA_EXT : GL_RGBA;
|
||||
fmt = s_extension[Extension::EXT_texture_format_BGRA8888].m_supported ? GL_BGRA_EXT : GL_RGBA;
|
||||
|
||||
uint8_t bpp = 4;
|
||||
if (dds.m_type == 0
|
||||
@ -1329,9 +1379,9 @@ namespace bgfx
|
||||
}
|
||||
|
||||
s_renderCtx.m_dxtSupport = true
|
||||
&& s_extension[Extension::GL_EXT_texture_compression_dxt1].m_supported
|
||||
&& s_extension[Extension::GL_CHROMIUM_texture_compression_dxt3].m_supported
|
||||
&& s_extension[Extension::GL_CHROMIUM_texture_compression_dxt5].m_supported
|
||||
&& s_extension[Extension::EXT_texture_compression_dxt1].m_supported
|
||||
&& s_extension[Extension::CHROMIUM_texture_compression_dxt3].m_supported
|
||||
&& s_extension[Extension::CHROMIUM_texture_compression_dxt5].m_supported
|
||||
;
|
||||
}
|
||||
|
||||
@ -1659,7 +1709,7 @@ namespace bgfx
|
||||
|
||||
if ( (BGFX_STATE_PT_POINTS|BGFX_STATE_POINT_SIZE_MASK) & changedFlags)
|
||||
{
|
||||
float pointSize = (float)( (newFlags&BGFX_STATE_POINT_SIZE_MASK)>>BGFX_STATE_POINT_SIZE_SHIFT);
|
||||
float pointSize = (float)(uint32_max(1, (newFlags&BGFX_STATE_POINT_SIZE_MASK)>>BGFX_STATE_POINT_SIZE_SHIFT) );
|
||||
GL_CHECK(glPointSize(pointSize) );
|
||||
}
|
||||
#endif // BGFX_CONFIG_RENDERER_OPENGLES
|
||||
|
@ -6,20 +6,21 @@
|
||||
#ifndef __RENDERER_GL_H__
|
||||
#define __RENDERER_GL_H__
|
||||
|
||||
#if BX_PLATFORM_NACL
|
||||
#if BGFX_CONFIG_RENDERER_OPENGL
|
||||
# include <gl/GL.h>
|
||||
# include <gl/glext.h>
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGLES
|
||||
# include <GLES2/gl2.h>
|
||||
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||
|
||||
#if BX_PLATFORM_NACL
|
||||
# include <ppapi/gles2/gl2ext_ppapi.h>
|
||||
# include <ppapi/c/pp_completion_callback.h>
|
||||
# include <ppapi/c/ppb_instance.h>
|
||||
# include <ppapi/c/ppb_graphics_3d.h>
|
||||
#elif BX_PLATFORM_ANDROID
|
||||
# include <GLES2/gl2.h>
|
||||
#elif BX_PLATFORM_WINDOWS
|
||||
# include <windows.h>
|
||||
# include <gl/GL.h>
|
||||
# include <gl/glext.h>
|
||||
#elif BX_PLATFORM_LINUX
|
||||
# include <GL3/gl3.h>
|
||||
# include <GL/glx.h>
|
||||
# include <X11/Xlib.h>
|
||||
#endif // BX_PLATFORM_
|
||||
@ -65,7 +66,7 @@ namespace bgfx
|
||||
#endif // BGFX_CONFIG_DEBUG
|
||||
|
||||
#if BX_PLATFORM_WINDOWS
|
||||
#define GL_IMPORT(_proto, _func) extern _proto _func
|
||||
#define GL_IMPORT(_optional, _proto, _func) extern _proto _func
|
||||
#include "glimports.h"
|
||||
#undef GL_IMPORT
|
||||
#endif // BX_PLATFORM_WINDOWS
|
||||
@ -218,37 +219,8 @@ namespace bgfx
|
||||
|
||||
struct Material
|
||||
{
|
||||
void create(const Shader& _vsh, const Shader& _fsh)
|
||||
{
|
||||
m_id = glCreateProgram();
|
||||
BX_TRACE("material create: %d: %d, %d", m_id, _vsh.m_id, _fsh.m_id);
|
||||
|
||||
GL_CHECK(glAttachShader(m_id, _vsh.m_id) );
|
||||
GL_CHECK(glAttachShader(m_id, _fsh.m_id) );
|
||||
GL_CHECK(glLinkProgram(m_id) );
|
||||
|
||||
GLint linked = 0;
|
||||
GL_CHECK(glGetProgramiv(m_id, GL_LINK_STATUS, &linked) );
|
||||
|
||||
if (0 == linked)
|
||||
{
|
||||
char log[1024];
|
||||
GL_CHECK(glGetProgramInfoLog(m_id, sizeof(log), NULL, log) );
|
||||
BX_TRACE("%d: %s", linked, log);
|
||||
|
||||
GL_CHECK(glDeleteProgram(m_id) );
|
||||
return;
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
GL_CHECK(glUseProgram(0) );
|
||||
GL_CHECK(glDeleteProgram(m_id) );
|
||||
}
|
||||
|
||||
void create(const Shader& _vsh, const Shader& _fsh);
|
||||
void destroy();
|
||||
void init();
|
||||
void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user