diff options
author | 2010-12-22 21:39:39 +0000 | |
---|---|---|
committer | 2010-12-22 21:39:39 +0000 | |
commit | ac10a2d039c5d52eed66e27cbbc503ab523c1cd5 (patch) | |
tree | c5be0c3dd15052016e7d32f376507cb1ea7101dd /gpu/include/GrGLConfig.h | |
parent | ea8509cd3b1771b36054313d3ccd56679df56044 (diff) |
add gpu backend (not hooked up yet)
git-svn-id: http://skia.googlecode.com/svn/trunk@649 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gpu/include/GrGLConfig.h')
-rw-r--r-- | gpu/include/GrGLConfig.h | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/gpu/include/GrGLConfig.h b/gpu/include/GrGLConfig.h new file mode 100644 index 0000000000..90763abc5c --- /dev/null +++ b/gpu/include/GrGLConfig.h @@ -0,0 +1,323 @@ +/* + Copyright 2010 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +#ifndef GrGLConfig_DEFINED +#define GrGLConfig_DEFINED + +#include "GrTypes.h" + +#if GR_WIN32_BUILD + // glew has to be included before gl + #define GR_INCLUDE_GLDESKTOP <GL/glew.h> + #define GR_INCLUDE_GLDESKTOPext <GL/gl.h> + #define GR_GL_FUNC __stdcall + // undo stupid windows defines + #undef near + #undef far +#elif GR_MAC_BUILD + #define GR_INCLUDE_GLDESKTOP <OpenGL/gl.h> + #define GR_INCLUDE_GLDESKTOPext <OpenGL/glext.h> + #define GR_GL_FUNC +#elif GR_IOS_BUILD + #define GR_INCLUDE_GLES1 <OpenGLES/ES1/gl.h> + #define GR_INCLUDE_GLES1ext <OpenGLES/ES1/glext.h> + #define GR_INCLUDE_GLES2 <OpenGLES/ES2/gl.h> + #define GR_INCLUDE_GLES2ext <OpenGLES/ES2/glext.h> + #define GR_GL_FUNC +#elif GR_ANDROID_BUILD + #ifndef GL_GLEXT_PROTOTYPES + #define GL_GLEXT_PROTOTYPES + #endif + #define GR_INCLUDE_GLES2 <GLES2/gl2.h> + #define GR_INCLUDE_GLES2ext <GLES2/gl2ext.h> + #define GR_GL_FUNC +#elif GR_LINUX_BUILD + // need to distinguish between ES and Deskop versions for linux + #ifndef GL_GLEXT_PROTOTYPES + #define GL_GLEXT_PROTOTYPES + #endif + #define GR_INCLUDE_GLES1 <GLES/gl.h> + #define GR_INCLUDE_GLES1ext <GLES/glext.h> + #define GR_INCLUDE_GLES2 <GLES2/gl2.h> + #define GR_INCLUDE_GLES2ext <GLES2/gl2ext.h> + #define GR_GL_FUNC +#elif GR_QNX_BUILD + #ifndef GL_GLEXT_PROTOTYPES + #define GL_GLEXT_PROTOTYPES + #endif + // This is needed by the QNX GLES2 headers + #define GL_API_EXT + #define GR_INCLUDE_GLES2 <GLES2/gl2.h> + #define GR_INCLUDE_GLES2ext <GLES2/gl2ext.h> + #define GR_INCLUDE_EGL <EGL/egl.h> + #define GR_GL_FUNC +#else + #error "unsupported GR_???_BUILD" +#endif + +// Ensure we're at least defined +// + +#ifndef GR_SUPPORT_GLES1 + #if defined(GR_INCLUDE_GLES1) + #define GR_SUPPORT_GLES1 1 + #else + #define GR_SUPPORT_GLES1 0 + #endif +#endif + +#ifndef GR_SUPPORT_GLES2 + #if defined(GR_INCLUDE_GLES2) + #define GR_SUPPORT_GLES2 1 + #else + #define GR_SUPPORT_GLES2 0 + #endif +#endif + +#ifndef GR_SUPPORT_GLDESKTOP + #if defined(GR_INCLUDE_GLDESKTOP) + #define GR_SUPPORT_GLDESKTOP 1 + #else + #define GR_SUPPORT_GLDESKTOP 0 + #endif +#endif + +#ifndef GR_SUPPORT_EGL + #if defined(GR_INCLUDE_EGL) + #define GR_SUPPORT_EGL 1 + #else + #define GR_SUPPORT_EGL 0 + #endif +#endif +// Filter the includes based on what we support +// + +#if !GR_SUPPORT_GLES1 + #undef GR_INCLUDE_GLES1 + #undef GR_INCLUDE_GLES1ext +#endif + +#if !GR_SUPPORT_GLES2 + #undef GR_INCLUDE_GLES2 + #undef GR_INCLUDE_GLES2ext +#endif + +#if !GR_SUPPORT_GLDESKTOP + #undef GR_INCLUDE_GLDESKTOP + #undef GR_INCLUDE_GLDESKTOPext +#endif + +#if !GR_SUPPORT_EGL + #undef GR_INCLUDE_EGL +#endif + +// Begin including GL headers +// + +#ifdef GR_INCLUDE_GLES1 + #include GR_INCLUDE_GLES1 +#endif +#ifdef GR_INCLUDE_GLES1ext + #include GR_INCLUDE_GLES1ext +#endif +#ifdef GR_INCLUDE_GLES2 + #include GR_INCLUDE_GLES2 +#endif +#ifdef GR_INCLUDE_GLES2ext + #include GR_INCLUDE_GLES2ext +#endif +#ifdef GR_INCLUDE_GLDESKTOP + #include GR_INCLUDE_GLDESKTOP +#endif +#ifdef GR_INCLUDE_GLDESKTOPext + #include GR_INCLUDE_GLDESKTOPext +#endif +#ifdef GR_INCLUDE_EGL + #include GR_INCLUDE_EGL +#endif + +// +// End including GL headers + +#if GL_VERSION_1_1 + #define GR_GL_DESKTOP 1 + #define GR_GL_ES 0 +#else + #ifndef GL_ES_VERSION_2_0 + GR_STATIC_ASSERT(GL_VERSION_ES_CM_1_0 || + GL_VERSION_ES_CL_1_0 || + GL_VERSION_ES_CM_1_1 || + GL_VERSION_ES_CL_1_1); + #endif + #define GR_GL_DESKTOP 0 + #define GR_GL_ES 1 +#endif + +#if GR_SCALAR_IS_FIXED + #define GrGLType GL_FIXED +#elif GR_SCALAR_IS_FLOAT + #define GrGLType GL_FLOAT +#else + #error "unknown GR_SCALAR type" +#endif + +#if GR_TEXT_SCALAR_IS_USHORT + #define GrGLTextType GL_UNSIGNED_SHORT + #define GR_GL_TEXT_TEXTURE_NORMALIZED 1 +#elif GR_TEXT_SCALAR_IS_FLOAT + #define GrGLTextType GL_FLOAT + #define GR_GL_TEXT_TEXTURE_NORMALIZED 0 +#elif GR_TEXT_SCALAR_IS_FIXED + #define GrGLTextType GL_FIXED + #define GR_GL_TEXT_TEXTURE_NORMALIZED 0 +#else + #error "unknown GR_TEXT_SCALAR type" +#endif + +// Pick a pixel config for 32bit bitmaps. Our default is GL_RGBA +#ifndef SK_GL_32BPP_COLOR_FORMAT + #define SK_GL_32BPP_COLOR_FORMAT GL_RGBA +#endif + +//////////////////////////////////////////////////////////////////////////////// +// setup for opengl ES/desktop extensions +// we make a struct of function pointers so that each GL context +// can have it's own struct. (Some environments may have different proc +// addresses for different contexts). + +extern "C" { +struct GrGLExts { +// FBO + GLvoid (GR_GL_FUNC *GenFramebuffers)(GLsizei n, GLuint *framebuffers); + GLvoid (GR_GL_FUNC *BindFramebuffer)(GLenum target, GLuint framebuffer); + GLvoid (GR_GL_FUNC *FramebufferTexture2D)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, + GLint level); + GLenum (GR_GL_FUNC *CheckFramebufferStatus)(GLenum target); + GLvoid (GR_GL_FUNC *DeleteFramebuffers)(GLsizei n, const + GLuint *framebuffers); + GLvoid (GR_GL_FUNC *RenderbufferStorage)(GLenum target, + GLenum internalformat, + GLsizei width, GLsizei height); + GLvoid (GR_GL_FUNC *GenRenderbuffers)(GLsizei n, GLuint *renderbuffers); + GLvoid (GR_GL_FUNC *DeleteRenderbuffers)(GLsizei n, + const GLuint *renderbuffers); + GLvoid (GR_GL_FUNC *FramebufferRenderbuffer)(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer); + GLvoid (GR_GL_FUNC *BindRenderbuffer)(GLenum target, GLuint renderbuffer); + +// Multisampling + // same prototype for ARB_FBO, EXT_FBO, GL 3.0, & Apple ES extension + GLvoid (GR_GL_FUNC *RenderbufferStorageMultisample)(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height); + // desktop: ext_fbo_blit, arb_fbo, gl 3.0 + GLvoid (GR_GL_FUNC *BlitFramebuffer)(GLint srcX0, GLint srcY0, + GLint srcX1, GLint srcY1, + GLint dstX0, GLint dstY0, + GLint dstX1, GLint dstY1, + GLbitfield mask, GLenum filter); + // apple's es extension + GLvoid (GR_GL_FUNC *ResolveMultisampleFramebuffer)(); + + // IMG'e es extension + GLvoid (GR_GL_FUNC *FramebufferTexture2DMultisample)(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples); + +// Buffer mapping (extension in ES). + GLvoid* (GR_GL_FUNC *MapBuffer)(GLenum target, GLenum access); + GLboolean (GR_GL_FUNC *UnmapBuffer)(GLenum target); +}; +} + +// FBO +#define GR_FRAMEBUFFER 0x8D40 +#define GR_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GR_COLOR_ATTACHMENT0 0x8CE0 +#define GR_FRAMEBUFFER_BINDING 0x8CA6 +#define GR_RENDERBUFFER 0x8D41 +#define GR_STENCIL_ATTACHMENT 0x8D20 +#define GR_STENCIL_INDEX8 0x8D48 +#define GR_STENCIL_INDEX16 0x8D49 +#define GR_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GR_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GR_UNSIGNED_INT_24_8 0x84FA +#define GR_DEPTH_STENCIL 0x84F9 +#define GR_RGBA8 0x8058 +#define GR_RGB565 0x8D62 + + +// Multisampling + +// IMG MAX_SAMPLES uses a different value than desktop, Apple ES extension. +#define GR_MAX_SAMPLES 0x8D57 +#define GR_MAX_SAMPLES_IMG 0x9135 +#define GR_READ_FRAMEBUFFER 0x8CA8 +#define GR_DRAW_FRAMEBUFFER 0x8CA9 + +// Buffer mapping +#define GR_WRITE_ONLY 0x88B9 +#define GR_BUFFER_MAPPED 0x88BC + +// Palette texture +#define GR_PALETTE8_RGBA8 0x8B91 + +extern void GrGLInitExtensions(GrGLExts* exts); +//////////////////////////////////////////////////////////////////////////////// + +extern void GrGLCheckErr(const char* location, const char* call); + +static inline void GrGLClearErr() { + while (GL_NO_ERROR != glGetError()) {} +} + +// GR_FORCE_GLCHECKERR can be defined by GrUserConfig.h +#if defined(GR_FORCE_GLCHECKERR) + #define GR_LOCAL_CALL_CHECKERR GR_FORCE_GLCHECKERR +#else + #define GR_LOCAL_CALL_CHECKERR GR_DEBUG +#endif +static inline void GrDebugGLCheckErr(const char* location, const char* call) { +#if GR_LOCAL_CALL_CHECKERR + GrGLCheckErr(location, call); +#endif +} +#undef GR_LOCAL_CALL_CHECKERR + +#if GR_GL_LOG_CALLS + extern bool gPrintGL; + #define GR_GL(X) gl ## X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X); if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n") + #define GR_GL_NO_ERR(X) GrGLClearErr(); gl ## X; if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n") + #define GR_GLEXT(exts, X) exts. X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X); if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n") + #define GR_GLEXT_NO_ERR(exts, X) GrGLClearErr(); exts. X; if (gPrintGL) GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n") +#else + #define GR_GL(X) gl ## X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X) + #define GR_GL_NO_ERR(X) GrGLClearErr(); gl ## X + #define GR_GLEXT(exts, X) exts. X; GrDebugGLCheckErr(GR_FILE_AND_LINE_STR, #X) + #define GR_GLEXT_NO_ERR(exts, X) GrGLClearErr(); exts. X +#endif + +#endif + |