SpoutGLextensions.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. //
  2. //
  3. // spoutGLextensions.h
  4. //
  5. // Used for load of openGL extensions with options to
  6. // use Glew or disable dynamic load of specific extension types
  7. //
  8. // If Glew is used, none of the extensions are loaded dynamically.
  9. // Individual extension types can be disabled if they conflict
  10. // with extensions already managed by particular applications.
  11. //
  12. // NVIDIA GL/DX interop extensions
  13. // Fbo extensions
  14. // Fbo blit extensions
  15. // Pbo extensions
  16. // wglSwapInterval extensions
  17. //
  18. // Spout project FBO PBO GLEW SWAP BLIT GLDX
  19. // FFGL - SpoutReceiver, SpoutSender - - - + + +
  20. // MAX - jit.gl.spoutsender, jit.gl.spoutreceiver - - - + + +
  21. // PROCESSING - Jspout JNI dll + - - + + +
  22. // SpoutCam + - - + + +
  23. // SpoutPanel + - - + + +
  24. // Spout dll + + - + + +
  25. // WinSpout + - - + + +
  26. // OpenFrameWorks + - - + + +
  27. // Cinder + - - + + +
  28. //
  29. // 03.11.14 - added additional defines for framebuffer status checks
  30. // 02.01.15 - added GL_BGR for SpoutCam
  31. //
  32. /*
  33. Copyright (c) 2014-2015, Lynn Jarvis. All rights reserved.
  34. Redistribution and use in source and binary forms, with or without modification,
  35. are permitted provided that the following conditions are met:
  36. 1. Redistributions of source code must retain the above copyright notice,
  37. this list of conditions and the following disclaimer.
  38. 2. Redistributions in binary form must reproduce the above copyright notice,
  39. this list of conditions and the following disclaimer in the documentation
  40. and/or other materials provided with the distribution.
  41. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
  42. EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  43. OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  44. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  45. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  46. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  47. INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  49. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  50. */
  51. #pragma once
  52. #ifndef __spoutGLextensions__ // standard way as well
  53. #define __spoutGLextensions__
  54. // set this to use GLEW instead of dynamic load of extensions
  55. // #define USE_GLEW
  56. // set this to use glew32s.lib instead of glew32.lib
  57. // #define GLEW_STATIC
  58. // *** Load of FBO extensions conflicts with FFGL or Jitter, disable them here ***
  59. #define USE_FBO_EXTENSIONS // don't use for jitter
  60. // If load of PBO extensions conflicts with Jitter disable them here
  61. // #define USE_PBO_EXTENSIONS // don't use for openframeworks or jitter
  62. #include <windows.h>
  63. #include <stdio.h> // for debug print
  64. #ifdef USE_GLEW
  65. #include <GL\glew.h>
  66. #include <GL\wglew.h> // wglew.h and glxew.h, which define the available WGL and GLX extensions
  67. #endif
  68. // For Max/Msp Jitter
  69. #ifndef USE_GLEW
  70. #include <GL\GL.h>
  71. #ifndef USE_FBO_EXTENSIONS
  72. #include "jit.gl.h"
  73. #define glDeleteFramebuffersEXT (_jit_gl_get_proctable()->DeleteFramebuffersEXT)
  74. #endif
  75. #endif
  76. #ifndef GL_CLAMP_TO_EDGE
  77. #define GL_CLAMP_TO_EDGE 0x812F
  78. #endif
  79. #ifndef GL_READ_FRAMEBUFFER_EXT
  80. #define GL_READ_FRAMEBUFFER_EXT 0x8CA8
  81. #endif
  82. #ifndef GL_DRAW_FRAMEBUFFER_EXT
  83. #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9
  84. #endif
  85. #ifndef GL_DRAW_FRAMEBUFFER_BINDING_EXT
  86. #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6
  87. #endif
  88. #ifndef GL_READ_FRAMEBUFFER_BINDING_EXT
  89. #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA
  90. #endif
  91. #ifndef GL_INVALID_FRAMEBUFFER_OPERATION_EXT
  92. #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
  93. #endif
  94. //------------------------------------
  95. // EXTENSION SUPPORT FLAGS
  96. //------------------------------------
  97. #define GLEXT_SUPPORT_NVINTEROP 1
  98. #define GLEXT_SUPPORT_FBO 2
  99. #define GLEXT_SUPPORT_FBO_BLIT 4
  100. #define GLEXT_SUPPORT_PBO 8
  101. #define GLEXT_SUPPORT_SWAP 16
  102. //-----------------------------------------------------
  103. // GL consts that are needed and aren't present in GL.h
  104. //-----------------------------------------------------
  105. #define GL_TEXTURE_2D_MULTISAMPLE 0x9100
  106. #define WGL_ACCESS_READ_ONLY_NV 0x0000
  107. #define WGL_ACCESS_READ_WRITE_NV 0x0001
  108. #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002
  109. #define GL_CLAMP_TO_EDGE 0x812F
  110. #define GL_BGR 0x80E0 // 02.01.15 - For SpoutCam
  111. #ifndef USE_GLEW
  112. // ----------------------------
  113. // Memory management extensions
  114. // ----------------------------
  115. #define GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX 0x9048
  116. #define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049
  117. //----------------------
  118. // GL interop extensions
  119. //----------------------
  120. typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice);
  121. typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);
  122. typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);
  123. typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);
  124. typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void *dxResource, HANDLE shareHandle);
  125. typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects);
  126. typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE *hObjects);
  127. extern PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV;
  128. extern PFNWGLDXCLOSEDEVICENVPROC wglDXCloseDeviceNV;
  129. extern PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV;
  130. extern PFNWGLDXUNREGISTEROBJECTNVPROC wglDXUnregisterObjectNV;
  131. extern PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV;
  132. extern PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV;
  133. extern PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV;
  134. //---------------
  135. // FBO extensions
  136. //---------------
  137. #ifdef USE_FBO_EXTENSIONS
  138. #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
  139. #define GL_FRAMEBUFFER_UNDEFINED_EXT 0x8219
  140. #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
  141. #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
  142. #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
  143. #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
  144. #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
  145. #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
  146. #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
  147. #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
  148. #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
  149. #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
  150. #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
  151. #define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8
  152. #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
  153. #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
  154. #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
  155. #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
  156. #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
  157. #define GL_FRAMEBUFFER_STATUS_ERROR_EXT 0x8CDE
  158. #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
  159. #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
  160. #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
  161. #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
  162. #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
  163. #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
  164. #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
  165. #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
  166. #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
  167. #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
  168. #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
  169. #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
  170. #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
  171. #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
  172. #define GL_COLOR_ATTACHMENT13_EXT 0x8CED
  173. #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
  174. #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
  175. #define GL_DEPTH_ATTACHMENT_EXT 0x8D00
  176. #define GL_STENCIL_ATTACHMENT_EXT 0x8D20
  177. #define GL_FRAMEBUFFER_EXT 0x8D40
  178. #define GL_RENDERBUFFER_EXT 0x8D41
  179. #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
  180. #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
  181. #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
  182. #define GL_STENCIL_INDEX_EXT 0x8D45
  183. #define GL_STENCIL_INDEX1_EXT 0x8D46
  184. #define GL_STENCIL_INDEX4_EXT 0x8D47
  185. #define GL_STENCIL_INDEX8_EXT 0x8D48
  186. #define GL_STENCIL_INDEX16_EXT 0x8D49
  187. #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56
  188. #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8
  189. typedef void (APIENTRY *glBindFramebufferEXTPROC) (GLenum target, GLuint framebuffer);
  190. typedef void (APIENTRY *glBindRenderbufferEXTPROC) (GLenum target, GLuint renderbuffer);
  191. typedef GLenum (APIENTRY *glCheckFramebufferStatusEXTPROC) (GLenum target);
  192. typedef void (APIENTRY *glDeleteFramebuffersEXTPROC) (GLsizei n, const GLuint* framebuffers);
  193. typedef void (APIENTRY *glDeleteRenderBuffersEXTPROC) (GLsizei n, const GLuint* renderbuffers);
  194. typedef void (APIENTRY *glFramebufferRenderbufferEXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
  195. typedef void (APIENTRY *glFramebufferTexture1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
  196. typedef void (APIENTRY *glFramebufferTexture2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
  197. typedef void (APIENTRY *glFramebufferTexture3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
  198. typedef void (APIENTRY *glGenFramebuffersEXTPROC) (GLsizei n, GLuint* framebuffers);
  199. typedef void (APIENTRY *glGenRenderbuffersEXTPROC) (GLsizei n, GLuint* renderbuffers);
  200. typedef void (APIENTRY *glGenerateMipmapEXTPROC) (GLenum target);
  201. typedef void (APIENTRY *glGetFramebufferAttachmentParameterivEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);
  202. typedef void (APIENTRY *glGetRenderbufferParameterivEXTPROC) (GLenum target, GLenum pname, GLint* params);
  203. typedef GLboolean (APIENTRY *glIsFramebufferEXTPROC) (GLuint framebuffer);
  204. typedef GLboolean (APIENTRY *glIsRenderbufferEXTPROC) (GLuint renderbuffer);
  205. typedef void (APIENTRY *glRenderbufferStorageEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
  206. extern glBindFramebufferEXTPROC glBindFramebufferEXT;
  207. extern glBindRenderbufferEXTPROC glBindRenderbufferEXT;
  208. extern glCheckFramebufferStatusEXTPROC glCheckFramebufferStatusEXT;
  209. extern glDeleteFramebuffersEXTPROC glDeleteFramebuffersEXT;
  210. extern glDeleteRenderBuffersEXTPROC glDeleteRenderBuffersEXT;
  211. extern glFramebufferRenderbufferEXTPROC glFramebufferRenderbufferEXT;
  212. extern glFramebufferTexture1DEXTPROC glFramebufferTexture1DEXT;
  213. extern glFramebufferTexture2DEXTPROC glFramebufferTexture2DEXT;
  214. extern glFramebufferTexture3DEXTPROC glFramebufferTexture3DEXT;
  215. extern glGenFramebuffersEXTPROC glGenFramebuffersEXT;
  216. extern glGenRenderbuffersEXTPROC glGenRenderbuffersEXT;
  217. extern glGenerateMipmapEXTPROC glGenerateMipmapEXT;
  218. extern glGetFramebufferAttachmentParameterivEXTPROC glGetFramebufferAttachmentParameterivEXT;
  219. extern glGetRenderbufferParameterivEXTPROC glGetRenderbufferParameterivEXT;
  220. extern glIsFramebufferEXTPROC glIsFramebufferEXT;
  221. extern glIsRenderbufferEXTPROC glIsRenderbufferEXT;
  222. extern glRenderbufferStorageEXTPROC glRenderbufferStorageEXT;
  223. #endif
  224. //-------------------
  225. // Blit FBO extension
  226. //-------------------
  227. #define READ_FRAMEBUFFER_EXT 0x8CA8
  228. #define DRAW_FRAMEBUFFER_EXT 0x8CA9
  229. typedef void (APIENTRY *glBlitFramebufferEXTPROC) (GLint srcX0,GLint srcY0,GLint srcX1,GLint srcY1,GLint dstX0,GLint dstY0,GLint dstX1,GLint dstY1,GLbitfield mask,GLenum filter);
  230. extern glBlitFramebufferEXTPROC glBlitFramebufferEXT;
  231. // ------------------------------
  232. // OpenGL sync control extensions
  233. // ------------------------------
  234. #ifdef USE_FBO_EXTENSIONS
  235. typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
  236. typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
  237. extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
  238. extern PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;
  239. #endif
  240. //----------------
  241. // PBO extensions
  242. //----------------
  243. #ifdef USE_PBO_EXTENSIONS
  244. #define GL_PIXEL_PACK_BUFFER 0x88EB
  245. #define GL_PIXEL_UNPACK_BUFFER 0x88EC
  246. #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED
  247. #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
  248. #define GL_STREAM_DRAW 0x88E0
  249. #define GL_WRITE_ONLY 0x88B9
  250. // PBO functions
  251. typedef ptrdiff_t GLsizeiptr;
  252. typedef void (APIENTRY *glGenBuffersPROC) (GLsizei n, const GLuint* buffers);
  253. typedef void (APIENTRY *glDeleteBuffersPROC) (GLsizei n, const GLuint* buffers);
  254. typedef void (APIENTRY *glBindBufferPROC) (GLenum target, const GLuint buffer);
  255. typedef void (APIENTRY *glBufferDataPROC) (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
  256. typedef void * (APIENTRY *glMapBufferPROC) (GLenum target, GLenum access);
  257. typedef void (APIENTRY *glUnmapBufferPROC) (GLenum target);
  258. extern glGenBuffersPROC glGenBuffers;
  259. extern glDeleteBuffersPROC glDeleteBuffers;
  260. extern glBindBufferPROC glBindBuffer;
  261. extern glBufferDataPROC glBufferData;
  262. extern glMapBufferPROC glMapBuffer;
  263. extern glUnmapBufferPROC glUnmapBuffer;
  264. #endif // USE_PBO_EXTENSIONS
  265. #endif // end GLEW
  266. //----------------
  267. // Local functions
  268. //----------------
  269. bool InitializeGlew();
  270. unsigned int loadGLextensions();
  271. bool loadInteropExtensions();
  272. bool loadFBOextensions();
  273. bool loadBLITextension();
  274. bool loadSwapExtensions();
  275. bool loadPBOextensions();
  276. #endif