#include "utils/logger.h" #include "render/gl_shared.h" #include "render/render_shared.h" #include "render/render.h" HDC hDC = NULL; HGLRC hRC = NULL; const char *GL_ErrorString( int err ) { switch( err ) { case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW"; case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW"; case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; case GL_INVALID_VALUE: return "GL_INVALID_VALUE"; case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; default: return "UNKNOWN ERROR"; } } void GL_CheckError() { GLenum err; if ( (err = glGetError()) != GL_NO_ERROR ) LogMsg( "OpenGL Error: %s", GL_ErrorString( err ) );// Msg("OpenGL Error: %s [%s]\n", GL_ErrorString(err), GL_TargetToString(tex->target)); } void GL_CheckErrorEx( const char* filename, int line ) { GLenum err; if ( (err = glGetError()) != GL_NO_ERROR ) LogMsg( "OpenGL Error: %s at %s:%i", GL_ErrorString( err ), filename, line );// Msg("OpenGL Error: %s [%s]\n", GL_ErrorString(err), GL_TargetToString(tex->target)); } void GL_CheckErrorFunction(const char* expression, const char* filename, int line) { GLenum err; if ( (err = glGetError()) != GL_NO_ERROR ) LogMsg( "OpenGL Error: %s (%s) at %s:%i", expression, GL_ErrorString( err ), filename, line );// Msg("OpenGL Error: %s [%s]\n", GL_ErrorString(err), GL_TargetToString(tex->target)); } void GL_SetTexture( int slot, uint texture ) { } uint GetGLBlendFactor(BlendFactor factor) { switch (factor) { case BF_ZERO: return GL_ZERO; case BF_ONE: return GL_ONE; case BF_SRC_COLOR: return GL_SRC_COLOR; case BF_ONE_MINUS_SRC_COLOR: return GL_ONE_MINUS_SRC_COLOR; case BF_DST_COLOR: return GL_DST_COLOR; case BF_ONE_MINUS_DST_COLOR: return GL_ONE_MINUS_DST_COLOR; case BF_SRC_ALPHA: return GL_SRC_ALPHA; case BF_ONE_MINUS_SRC_ALPHA: return GL_ONE_MINUS_SRC_ALPHA; case BF_DST_ALPHA: return GL_DST_ALPHA; case BF_ONE_MINUS_DST_ALPHA: return GL_ONE_MINUS_DST_ALPHA; case BF_CONSTANT_COLOR: return GL_CONSTANT_COLOR; case BF_ONE_MINUS_CONSTANT_COLOR: return GL_ONE_MINUS_CONSTANT_COLOR; case BF_CONSTANT_ALPHA: return GL_CONSTANT_ALPHA; case BF_ONE_MINUS_CONSTANT_ALPHA: return GL_ONE_MINUS_CONSTANT_ALPHA; default: break; } return 0; } GLint GetGlWrap(TextureWrap wrap) { GLint param = 0; if (wrap == TW_REPEAT) param = GL_REPEAT; else if (wrap == TW_MIRRORED_REPEAT) param = GL_MIRRORED_REPEAT; else if (wrap == TW_CLAMP_TO_EDGE) param = GL_CLAMP_TO_EDGE; else if (wrap == TW_CLAMP_TO_BORDER) param = GL_CLAMP_TO_BORDER; return param; } GLint GetGlTexFilter(TextureFilter filter) { GLint param = 0; if (filter == TF_LINEAR) param = GL_LINEAR; else if (filter == TF_NEAREST) param = GL_NEAREST; else if (filter == TF_LINEAR_MIPMAP_LINEAR) param = GL_LINEAR_MIPMAP_LINEAR; else if (filter == TF_LINEAR_MIPMAP_NEAREST) param = GL_LINEAR_MIPMAP_NEAREST; else if (filter == TF_NEAREST_MIPMAP_LINEAR) param = GL_NEAREST_MIPMAP_LINEAR; else if (filter == TF_NEAREST_MIPMAP_NEAREST) param = GL_NEAREST_MIPMAP_NEAREST; return param; } uint GetGLPF(PixelFormat pf) { return 0; //return uint32_t(); } // Kirill: Remove to render_main.cpp or something else uint GetGLInternalPF(PixelFormat pf) { switch (pf) { case PF_UNKNOWN: return 0; case PF_R8G8B8: case PF_R8G8B8F: return GL_RGB; case PF_R8G8B8A8: case PF_R8G8B8A8F: return GL_RGBA; } return 0; } uint GetGLTypePF(PixelFormat pf) { switch (pf) { case PF_UNKNOWN: return 0; case PF_R8G8B8: case PF_R8G8B8A8: return GL_UNSIGNED_BYTE; case PF_R8G8B8F: case PF_R8G8B8A8F: return GL_FLOAT; } return 0; } #define LOAD_GL_FUNC(functype, funcname) \ { \ funcname = (functype)wglGetProcAddress(#funcname); \ if (funcname == NULL) \ LogMsg("Failed to load %s", #funcname); \ } bool GL_CheckExtensions(const char* name) { const char* extensions = (const char*)glGetString(GL_EXTENSIONS); if (strstr(extensions, name)) { LogMsg("Found: %s", name); return true; } LogMsg("Not found: %s", name); return false; } void GL_CreateContext() { // create opengl context PIXELFORMATDESCRIPTOR pfd; int iFormat; HWND hWnd = (HWND)R_GetWindow(); /* get the device context (DC) */ hDC = GetDC(hWnd); /* set the pixel format for the DC */ ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, iFormat, &pfd); LogMsg("SetPixelFormat successful"); /* create and enable the render context (RC) */ hRC = wglCreateContext(hDC); LogMsg("wglCreateContext successful"); wglMakeCurrent(hDC, hRC); } void GL_Load() { GL_CreateContext(); const char* vendor_string = (const char*)glGetString(GL_VENDOR); const char* renderer_string = (const char*)glGetString(GL_RENDERER); const char* version_string = (const char*)glGetString(GL_VERSION); const char* extensions_string = (const char*)glGetString(GL_EXTENSIONS); LogMsg("GL_VENDOR: %s", vendor_string); LogMsg("GL_RENDERER: %s", renderer_string); LogMsg("GL_VERSION: %s", version_string); LogMsg("GL_EXTENSIONS: %s", extensions_string); // OpenGL 1.3 LOAD_GL_FUNC( PFNGLACTIVETEXTUREPROC, glActiveTexture); LOAD_GL_FUNC( PFNGLSAMPLECOVERAGEPROC, glSampleCoverage); LOAD_GL_FUNC( PFNGLCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3D); LOAD_GL_FUNC( PFNGLCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2D); LOAD_GL_FUNC( PFNGLCOMPRESSEDTEXIMAGE1DPROC, glCompressedTexImage1D); LOAD_GL_FUNC( PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D); LOAD_GL_FUNC( PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D); LOAD_GL_FUNC( PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC, glCompressedTexSubImage1D); LOAD_GL_FUNC( PFNGLGETCOMPRESSEDTEXIMAGEPROC, glGetCompressedTexImage); LOAD_GL_FUNC( PFNGLCLIENTACTIVETEXTUREPROC, glClientActiveTexture); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1DPROC, glMultiTexCoord1d); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1DVPROC, glMultiTexCoord1dv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1FPROC, glMultiTexCoord1f); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1FVPROC, glMultiTexCoord1fv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1IPROC, glMultiTexCoord1i); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1IVPROC, glMultiTexCoord1iv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1SPROC, glMultiTexCoord1s); LOAD_GL_FUNC( PFNGLMULTITEXCOORD1SVPROC, glMultiTexCoord1sv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2DPROC, glMultiTexCoord2d); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2DVPROC, glMultiTexCoord2dv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2FPROC, glMultiTexCoord2f); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2FVPROC, glMultiTexCoord2fv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2IPROC, glMultiTexCoord2i); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2IVPROC, glMultiTexCoord2iv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2SPROC, glMultiTexCoord2s); LOAD_GL_FUNC( PFNGLMULTITEXCOORD2SVPROC, glMultiTexCoord2sv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3DPROC, glMultiTexCoord3d); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3DVPROC, glMultiTexCoord3dv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3FPROC, glMultiTexCoord3f); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3FVPROC, glMultiTexCoord3fv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3IPROC, glMultiTexCoord3i); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3IVPROC, glMultiTexCoord3iv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3SPROC, glMultiTexCoord3s); LOAD_GL_FUNC( PFNGLMULTITEXCOORD3SVPROC, glMultiTexCoord3sv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4DPROC, glMultiTexCoord4d); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4DVPROC, glMultiTexCoord4dv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4FPROC, glMultiTexCoord4f); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4FVPROC, glMultiTexCoord4fv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4IPROC, glMultiTexCoord4i); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4IVPROC, glMultiTexCoord4iv); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4SPROC, glMultiTexCoord4s); LOAD_GL_FUNC( PFNGLMULTITEXCOORD4SVPROC, glMultiTexCoord4sv); LOAD_GL_FUNC( PFNGLLOADTRANSPOSEMATRIXFPROC, glLoadTransposeMatrixf); LOAD_GL_FUNC( PFNGLLOADTRANSPOSEMATRIXDPROC, glLoadTransposeMatrixd); LOAD_GL_FUNC( PFNGLMULTTRANSPOSEMATRIXFPROC, glMultTransposeMatrixf); LOAD_GL_FUNC( PFNGLMULTTRANSPOSEMATRIXDPROC, glMultTransposeMatrixd); // OpenGL 1.5 LOAD_GL_FUNC(PFNGLGENQUERIESPROC, glGenQueries); LOAD_GL_FUNC(PFNGLDELETEQUERIESPROC, glDeleteQueries); LOAD_GL_FUNC(PFNGLISQUERYPROC, glIsQuery); LOAD_GL_FUNC(PFNGLBEGINQUERYPROC, glBeginQuery); LOAD_GL_FUNC(PFNGLENDQUERYPROC, glEndQuery); LOAD_GL_FUNC(PFNGLGETQUERYIVPROC, glGetQueryiv); LOAD_GL_FUNC(PFNGLGETQUERYOBJECTIVPROC, glGetQueryObjectiv); LOAD_GL_FUNC(PFNGLGETQUERYOBJECTUIVPROC, glGetQueryObjectuiv); LOAD_GL_FUNC(PFNGLBINDBUFFERPROC, glBindBuffer); LOAD_GL_FUNC(PFNGLDELETEBUFFERSPROC, glDeleteBuffers); LOAD_GL_FUNC(PFNGLGENBUFFERSPROC, glGenBuffers); LOAD_GL_FUNC(PFNGLISBUFFERPROC, glIsBuffer); LOAD_GL_FUNC(PFNGLBUFFERDATAPROC, glBufferData); LOAD_GL_FUNC(PFNGLBUFFERSUBDATAPROC, glBufferSubData); LOAD_GL_FUNC(PFNGLGETBUFFERSUBDATAPROC, glGetBufferSubData); LOAD_GL_FUNC(PFNGLMAPBUFFERPROC, glMapBuffer); LOAD_GL_FUNC(PFNGLUNMAPBUFFERPROC, glUnmapBuffer); LOAD_GL_FUNC(PFNGLGETBUFFERPARAMETERIVPROC, glGetBufferParameteriv); LOAD_GL_FUNC(PFNGLGETBUFFERPOINTERVPROC, glGetBufferPointerv); //LogMsg("GL_Load: glActiveTexture=%i glGenBuffers=%i", !!glActiveTexture, !!glGenBuffers); g_EXTFramebufferSupport = GL_CheckExtensions("GL_EXT_framebuffer_object"); if (g_EXTFramebufferSupport) { LOAD_GL_FUNC(PFNGLISRENDERBUFFEREXTPROC, glIsRenderbufferEXT); LOAD_GL_FUNC(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT); LOAD_GL_FUNC(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT); LOAD_GL_FUNC(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT); LOAD_GL_FUNC(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT); LOAD_GL_FUNC(PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, glGetRenderbufferParameterivEXT); LOAD_GL_FUNC(PFNGLISFRAMEBUFFEREXTPROC, glIsFramebufferEXT); LOAD_GL_FUNC(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT); LOAD_GL_FUNC(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT); LOAD_GL_FUNC(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT); LOAD_GL_FUNC(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT); LOAD_GL_FUNC(PFNGLFRAMEBUFFERTEXTURE1DEXTPROC, glFramebufferTexture1DEXT); LOAD_GL_FUNC(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT); LOAD_GL_FUNC(PFNGLFRAMEBUFFERTEXTURE3DEXTPROC, glFramebufferTexture3DEXT); LOAD_GL_FUNC(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT); LOAD_GL_FUNC(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, glGetFramebufferAttachmentParameterivEXT); LOAD_GL_FUNC(PFNGLGENERATEMIPMAPEXTPROC, glGenerateMipmapEXT); } } void GL_SwapBuffers(int inverval) { } // Extensions bool g_EXTFramebufferSupport = false; // OpenGL 1.3 PFNGLACTIVETEXTUREPROC glActiveTexture = NULL; PFNGLSAMPLECOVERAGEPROC glSampleCoverage = NULL; PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D = NULL; PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D = NULL; PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D = NULL; PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage = NULL; PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture = NULL; PFNGLMULTITEXCOORD1DPROC glMultiTexCoord1d = NULL; PFNGLMULTITEXCOORD1DVPROC glMultiTexCoord1dv = NULL; PFNGLMULTITEXCOORD1FPROC glMultiTexCoord1f = NULL; PFNGLMULTITEXCOORD1FVPROC glMultiTexCoord1fv = NULL; PFNGLMULTITEXCOORD1IPROC glMultiTexCoord1i = NULL; PFNGLMULTITEXCOORD1IVPROC glMultiTexCoord1iv = NULL; PFNGLMULTITEXCOORD1SPROC glMultiTexCoord1s = NULL; PFNGLMULTITEXCOORD1SVPROC glMultiTexCoord1sv = NULL; PFNGLMULTITEXCOORD2DPROC glMultiTexCoord2d = NULL; PFNGLMULTITEXCOORD2DVPROC glMultiTexCoord2dv = NULL; PFNGLMULTITEXCOORD2FPROC glMultiTexCoord2f = NULL; PFNGLMULTITEXCOORD2FVPROC glMultiTexCoord2fv = NULL; PFNGLMULTITEXCOORD2IPROC glMultiTexCoord2i = NULL; PFNGLMULTITEXCOORD2IVPROC glMultiTexCoord2iv = NULL; PFNGLMULTITEXCOORD2SPROC glMultiTexCoord2s = NULL; PFNGLMULTITEXCOORD2SVPROC glMultiTexCoord2sv = NULL; PFNGLMULTITEXCOORD3DPROC glMultiTexCoord3d = NULL; PFNGLMULTITEXCOORD3DVPROC glMultiTexCoord3dv = NULL; PFNGLMULTITEXCOORD3FPROC glMultiTexCoord3f = NULL; PFNGLMULTITEXCOORD3FVPROC glMultiTexCoord3fv = NULL; PFNGLMULTITEXCOORD3IPROC glMultiTexCoord3i = NULL; PFNGLMULTITEXCOORD3IVPROC glMultiTexCoord3iv = NULL; PFNGLMULTITEXCOORD3SPROC glMultiTexCoord3s = NULL; PFNGLMULTITEXCOORD3SVPROC glMultiTexCoord3sv = NULL; PFNGLMULTITEXCOORD4DPROC glMultiTexCoord4d = NULL; PFNGLMULTITEXCOORD4DVPROC glMultiTexCoord4dv = NULL; PFNGLMULTITEXCOORD4FPROC glMultiTexCoord4f = NULL; PFNGLMULTITEXCOORD4FVPROC glMultiTexCoord4fv = NULL; PFNGLMULTITEXCOORD4IPROC glMultiTexCoord4i = NULL; PFNGLMULTITEXCOORD4IVPROC glMultiTexCoord4iv = NULL; PFNGLMULTITEXCOORD4SPROC glMultiTexCoord4s = NULL; PFNGLMULTITEXCOORD4SVPROC glMultiTexCoord4sv = NULL; PFNGLLOADTRANSPOSEMATRIXFPROC glLoadTransposeMatrixf = NULL; PFNGLLOADTRANSPOSEMATRIXDPROC glLoadTransposeMatrixd = NULL; PFNGLMULTTRANSPOSEMATRIXFPROC glMultTransposeMatrixf = NULL; PFNGLMULTTRANSPOSEMATRIXDPROC glMultTransposeMatrixd = NULL; // OpenGL 1.5 PFNGLGENQUERIESPROC glGenQueries = NULL; PFNGLDELETEQUERIESPROC glDeleteQueries = NULL; PFNGLISQUERYPROC glIsQuery = NULL; PFNGLBEGINQUERYPROC glBeginQuery = NULL; PFNGLENDQUERYPROC glEndQuery = NULL; PFNGLGETQUERYIVPROC glGetQueryiv = NULL; PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv = NULL; PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv = NULL; PFNGLBINDBUFFERPROC glBindBuffer = NULL; PFNGLDELETEBUFFERSPROC glDeleteBuffers = NULL; PFNGLGENBUFFERSPROC glGenBuffers = NULL; PFNGLISBUFFERPROC glIsBuffer = NULL; PFNGLBUFFERDATAPROC glBufferData = NULL; PFNGLBUFFERSUBDATAPROC glBufferSubData = NULL; PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData = NULL; PFNGLMAPBUFFERPROC glMapBuffer = NULL; PFNGLUNMAPBUFFERPROC glUnmapBuffer = NULL; PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv = NULL; PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv = NULL; // GL_EXT_framebuffer_object PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL; PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL; PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = NULL; PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = NULL; PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL; PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT = NULL; PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT = NULL; PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL; PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL; PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL; PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL; PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT = NULL; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL; PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL;