Advertisement
Guest User

Untitled

a guest
May 21st, 2019
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.99 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from ctypes import c_int
  5. from ctypes import c_uint
  6. from ctypes import c_float
  7. from ctypes import c_void_p
  8. from ctypes import c_char
  9. from ctypes import POINTER
  10. from ctypes import CDLL
  11. from ctypes import CFUNCTYPE
  12. from ctypes import byref
  13. from ctypes.util import find_library
  14. from functools import partial
  15. from numpy import zeros
  16. from numpy import uint8
  17. from numpy import array
  18.  
  19. EGLNativeDisplayType = c_void_p
  20. EGLDisplay = c_void_p
  21. EGL_DEFAULT_DISPLAY = EGLNativeDisplayType(0)
  22. EGLBoolean = c_uint
  23. EGLint = c_int
  24. EGL_OPENGL_API = 0x30A2
  25. EGLenum = c_uint
  26. EGL_BLUE_SIZE = 0x3022
  27. EGL_GREEN_SIZE = 0x3023
  28. EGL_RED_SIZE = 0x3024
  29. EGL_DEPTH_SIZE = 0x3025
  30. EGL_SURFACE_TYPE = 0x3033
  31. EGL_NONE = 0x3038
  32. EGL_PBUFFER_BIT = 0x01
  33. EGLConfig = c_void_p
  34. EGL_HEIGHT = 0x3056
  35. EGL_WIDTH = 0x3057
  36. EGLSurface = c_void_p
  37. EGL_CONTEXT_CLIENT_VERSION = 0x3098
  38. EGLContext = c_void_p
  39. EGL_NO_CONTEXT = EGLContext(0)
  40. EGL_NO_SURFACE = EGLSurface(0)
  41.  
  42. GL_NO_ERROR = 0
  43. GLenum = c_uint
  44. GLuint = c_uint
  45. GLsizei = c_int
  46. GL_RENDERBUFFER = 0x8D41
  47. GL_RGB8 = 0x8051
  48. GL_RGBA8 = 0x8058
  49. GL_RGB32F = 0x8815
  50. GL_RGBA32F = 0x8814
  51. GL_FRAMEBUFFER = 0x8D40
  52. GL_COLOR_ATTACHMENT0 = 0x8CE0
  53. GL_COLOR_ATTACHMENT1 = 0x8CE1
  54. GL_COLOR_ATTACHMENT2 = 0x8CE2
  55. GL_COLOR_ATTACHMENT3 = 0x8CE3
  56. GL_COLOR_ATTACHMENT4 = 0x8CE4
  57. GL_FRAMEBUFFER_COMPLETE = 0x8CD5
  58. GL_FRAGMENT_SHADER = 0x8B30
  59. GL_VERTEX_SHADER = 0x8B31
  60. GLchar = c_char
  61. GLint = c_int
  62. GLfloat = c_float
  63. GLbitfield = c_uint
  64. GLint = c_int
  65. GLsizei = c_int
  66. GLvoid_p = c_void_p
  67. GL_FALSE = 0
  68. GL_TRUE = 1
  69. GL_COMPILE_STATUS = 0x8B81
  70. GL_INFO_LOG_LENGTH = 0x8B84
  71. GL_COLOR_BUFFER_BIT = 0x00004000
  72. GL_DEPTH_BUFFER_BIT = 0x00000100
  73. GL_RGB = 0x1907
  74. GL_UNSIGNED_BYTE = 0x1401
  75.  
  76. eglLib = CDLL(find_library('EGL'))
  77. glLib = CDLL(find_library('GL'))
  78.  
  79. def load(lib, name, restype, *args):
  80. return (CFUNCTYPE(restype, *args))((name, lib))
  81.  
  82. def makeCtypeArray(ctype, contents):
  83. arrayType = ctype * len(contents)
  84. return arrayType(*contents)
  85.  
  86. loadEgl = partial(load, eglLib)
  87. eglGetDisplay = loadEgl('eglGetDisplay', EGLDisplay, EGLNativeDisplayType)
  88. eglInitialize = loadEgl('eglInitialize', EGLBoolean, EGLDisplay , POINTER(EGLint), POINTER(EGLint))
  89. eglBindAPI = loadEgl('eglBindAPI', EGLBoolean, EGLenum)
  90. eglChooseConfig = loadEgl('eglChooseConfig', EGLBoolean, EGLDisplay, POINTER(EGLint), POINTER(EGLConfig), EGLint, POINTER(EGLint))
  91. eglCreatePbufferSurface = loadEgl('eglCreatePbufferSurface', EGLSurface, EGLDisplay, EGLConfig, POINTER(EGLint))
  92. eglCreateContext = loadEgl('eglCreateContext', EGLContext, EGLDisplay, EGLConfig, EGLContext, POINTER(EGLint))
  93. eglMakeCurrent = loadEgl('eglMakeCurrent', EGLBoolean, EGLDisplay, EGLSurface, EGLSurface, EGLContext)
  94. eglDestroySurface = loadEgl('eglDestroySurface', EGLBoolean, EGLDisplay, EGLSurface)
  95. eglDestroyContext = loadEgl('eglDestroyContext', EGLBoolean, EGLDisplay, EGLContext)
  96. eglTerminate = loadEgl('eglTerminate', EGLBoolean, EGLDisplay)
  97.  
  98. loadGl = partial(load, glLib)
  99. glGetError = loadGl('glGetError', GLenum)
  100. glGenRenderbuffers = loadGl('glGenRenderbuffers', None, GLsizei, POINTER(GLuint))
  101. glBindRenderbuffer = loadGl('glBindRenderbuffer', None, GLenum, GLuint)
  102. glRenderbufferStorage = loadGl('glRenderbufferStorage', None, GLenum, GLenum, GLsizei, GLsizei)
  103. glGenFramebuffers = loadGl('glGenFramebuffers', None, GLsizei, POINTER(GLuint))
  104. glBindFramebuffer = loadGl('glBindFramebuffer', None, GLenum, GLuint)
  105. glFramebufferRenderbuffer = loadGl('glFramebufferRenderbuffer', None, GLenum, GLenum, GLenum, GLuint)
  106. glDrawBuffers = loadGl('glDrawBuffers', None, GLsizei, POINTER(GLenum))
  107. glCheckFramebufferStatus = loadGl('glCheckFramebufferStatus', GLenum, GLenum)
  108. glCreateShader = loadGl('glCreateShader', GLuint, GLenum)
  109. glShaderSource = loadGl('glShaderSource', None, GLuint, GLsizei, POINTER(POINTER(GLchar)), POINTER(GLint))
  110. glCompileShader = loadGl('glCompileShader', None, GLuint)
  111. glGetShaderiv = loadGl('glGetShaderiv', None, GLuint, GLenum, POINTER(GLint))
  112. glGetShaderInfoLog = loadGl('glGetShaderInfoLog', None, GLuint, GLsizei, POINTER(GLsizei), POINTER(GLchar))
  113. glCreateProgram = loadGl('glCreateProgram', GLuint)
  114. glClearColor = loadGl('glClearColor', None, GLfloat, GLfloat, GLfloat, GLfloat)
  115. glClear = loadGl('glClear', None, GLbitfield)
  116. glAttachShader = loadGl('glAttachShader', None, GLuint, GLuint)
  117. glDeleteShader = loadGl('glDeleteShader', None, GLuint)
  118. glBindAttribLocation = loadGl('glBindAttribLocation', None, GLuint, GLuint, POINTER(GLchar))
  119. glBindFragDataLocation = loadGl('glBindFragDataLocation', None, GLuint, GLuint, POINTER(GLchar))
  120. glLinkProgram = loadGl('glLinkProgram', None, GLuint)
  121. glUseProgram = loadGl('glUseProgram', None, GLuint)
  122. glReadBuffer = loadGl('glReadBuffer', None, GLenum)
  123. glReadPixels = loadGl('glReadPixels', None, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid_p)
  124.  
  125. # EGL Display
  126. display = eglGetDisplay(EGL_DEFAULT_DISPLAY)
  127. if not display:
  128. raise Exception('no EGL display')
  129.  
  130. # EGL Initialize
  131. major = EGLint(0)
  132. minor = EGLint(0)
  133. if not eglInitialize(display, byref(major), byref(minor)):
  134. raise Exception('cannot initialize EGL display')
  135.  
  136. # EGL BindAPI
  137. if not eglBindAPI(EGLenum(EGL_OPENGL_API)):
  138. raise Exception('cannot bind API')
  139.  
  140. # EGL ChooseConfig
  141. attribList = makeCtypeArray(EGLint, [
  142. EGL_BLUE_SIZE, 8,
  143. EGL_GREEN_SIZE, 8,
  144. EGL_RED_SIZE, 8,
  145. EGL_DEPTH_SIZE, 24,
  146. EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
  147. EGL_NONE])
  148.  
  149. config = EGLConfig()
  150. configSize = EGLint(1)
  151. numConfig = EGLint(0)
  152. if not eglChooseConfig(display, attribList, byref(config), configSize, byref(numConfig)):
  153. raise Exception('no suitable configs available on display')
  154.  
  155. # EGL Surface
  156. surfaceAttribList = makeCtypeArray(EGLint, [
  157. EGL_WIDTH, 100,
  158. EGL_HEIGHT, 100,
  159. EGL_NONE])
  160.  
  161. surface = eglCreatePbufferSurface(display, config, surfaceAttribList)
  162. if not surface:
  163. raise Exception('cannot create pbuffer surface')
  164.  
  165. # EGL Context
  166. contextAttribList = makeCtypeArray(EGLint, [EGL_NONE])
  167. context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribList)
  168. if not context:
  169. raise Exception('cannot create GL context')
  170.  
  171. # EGL MakeCurrent
  172. if not eglMakeCurrent(display, surface, surface, context):
  173. raise Exception('cannot make GL context current')
  174.  
  175. # Generate render buffer
  176. n = 1
  177. renderbuffers = zeros(n, dtype=GLuint)
  178. glGenRenderbuffers(GLsizei(n), renderbuffers.ctypes.data_as(POINTER(GLuint)))
  179. if not glGetError() == GL_NO_ERROR:
  180. raise Exception('glGenRenderbuffers failed')
  181.  
  182. # Bind render buffer
  183. glBindRenderbuffer(GL_RENDERBUFFER, GLuint(renderbuffers[0]))
  184. if not glGetError() == GL_NO_ERROR:
  185. raise Exception('glBindRenderbuffer failed')
  186.  
  187. # Create buffer storage for render buffer
  188. width,height = 100,100
  189. glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, GLsizei(width), GLsizei(height))
  190. if not glGetError() == GL_NO_ERROR:
  191. raise Exception('glRenderbufferStorage failed')
  192.  
  193. # Unbind render buffer
  194. glBindRenderbuffer(GL_RENDERBUFFER, GLuint(0))
  195. if not glGetError() == GL_NO_ERROR:
  196. raise Exception('glBindRenderbuffer failed')
  197.  
  198. # Generate frame buffer
  199. n = 1
  200. ids = zeros(n, dtype=GLuint)
  201. glGenFramebuffers(GLsizei(n), ids.ctypes.data_as(POINTER(GLuint)))
  202. if not glGetError() == GL_NO_ERROR:
  203. raise Exception('glGenFramebuffers failed')
  204.  
  205. # Bind frame buffer
  206. glBindFramebuffer(GL_FRAMEBUFFER, ids[0])
  207. if not glGetError() == GL_NO_ERROR:
  208. raise Exception('glBindFramebuffer failed')
  209.  
  210. # Attach render buffer
  211. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffers[0])
  212. if not glGetError() == GL_NO_ERROR:
  213. raise Exception('glFramebufferRenderbuffer failed')
  214.  
  215. # Set as color buffer
  216. bufs = array([GL_COLOR_ATTACHMENT0], dtype=GLenum)
  217. glDrawBuffers(GLsizei(1), bufs.ctypes.data_as(POINTER(GLenum)))
  218. if not glGetError() == GL_NO_ERROR:
  219. raise Exception('glDrawBuffers failed')
  220.  
  221. # Verify frame buffer
  222. status = glCheckFramebufferStatus(GL_FRAMEBUFFER)
  223. if not glGetError() == GL_NO_ERROR:
  224. raise Exception('glCheckFramebufferStatus failed')
  225. if not status == GL_FRAMEBUFFER_COMPLETE:
  226. raise Exception('framebuffer not completed')
  227.  
  228. # Clear render buffer
  229. glClearColor(GLfloat(1.0), GLfloat(1.0), GLfloat(1.0), GLfloat(1.0))
  230. if not glGetError() == GL_NO_ERROR:
  231. raise Exception('glClearColor failed')
  232.  
  233. glClear(GLbitfield(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))
  234. if not glGetError() == GL_NO_ERROR:
  235. raise Exception('glClear failed')
  236.  
  237. # Create shader object
  238. vobj = glCreateShader(GL_VERTEX_SHADER)
  239. if not glGetError() == GL_NO_ERROR:
  240. raise Exception('glCreateShader failed')
  241. fobj = glCreateShader(GL_FRAGMENT_SHADER)
  242. if not glGetError() == GL_NO_ERROR:
  243. raise Exception('glCreateShader failed')
  244.  
  245. # Load shader related functions
  246.  
  247. # Create program
  248. program = glCreateProgram()
  249. if not glGetError() == GL_NO_ERROR:
  250. raise Exception('glCreateProgram failed')
  251.  
  252. # Load program related functions
  253.  
  254. # IPython
  255. import IPython
  256. IPython.embed()
  257.  
  258. # EGL Destroy
  259. if not eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT):
  260. print('eglMakeCurrent failed')
  261.  
  262. if not eglDestroySurface(display, surface):
  263. print('eglDestroySurface failed')
  264.  
  265. if not eglDestroyContext(display, context):
  266. print('eglDestroyContext failed')
  267.  
  268. if not eglTerminate(display):
  269. print('eglTerminate failed')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement