Advertisement
KeinBaum

OpenGL persistently mapped SSBO example (not working)

Jul 4th, 2018
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 5.69 KB | None | 0 0
  1. import org.lwjgl.glfw.Callbacks.glfwFreeCallbacks
  2. import org.lwjgl.glfw.GLFW._
  3. import org.lwjgl.glfw.GLFWErrorCallback
  4. import org.lwjgl.opengl.GL
  5. import org.lwjgl.opengl.GL11._
  6. import org.lwjgl.opengl.GL20._
  7. import org.lwjgl.opengl.GL30._
  8. import org.lwjgl.opengl.GL32._
  9. import org.lwjgl.opengl.GL43._
  10. import org.lwjgl.opengl.GL44._
  11. import org.lwjgl.opengl.GL45._
  12. import org.lwjgl.system.MemoryUtil.{NULL, memUTF8}
  13.  
  14. object StandaloneExample extends App {
  15.   GLFWErrorCallback.createPrint(System.err).set()
  16.  
  17.   if (!glfwInit())
  18.     throw new IllegalStateException("Unable to initialize GLFW")
  19.  
  20.   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4)
  21.   glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5)
  22.   glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
  23.   glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE)
  24.   glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE)
  25.   glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE)
  26.  
  27.   val window = glfwCreateWindow(800, 800, "Test", NULL, NULL)
  28.   if (window == NULL)
  29.     throw new RuntimeException("Failed to create the GLFW window")
  30.  
  31.   glfwSetKeyCallback(window, (window, key, _, action, _) => {
  32.     if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
  33.       glfwSetWindowShouldClose(window, true)
  34.   })
  35.  
  36.   glfwMakeContextCurrent(window)
  37.   glfwSwapInterval(1)
  38.   glfwShowWindow(window)
  39.  
  40.   GL.createCapabilities()
  41.  
  42.   glDebugMessageCallback(printDebugMessage, 0l)
  43.  
  44.   glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, Array.empty[Int], true)
  45.  
  46.   {
  47.     val w = Array.ofDim[Int](1)
  48.     val h = Array.ofDim[Int](1)
  49.     glfwGetFramebufferSize(window, w, h)
  50.     glViewport(0, 0, w(0), h(0))
  51.   }
  52.  
  53.   glClearColor(0.5f, 0.0f, 0.5f, 1.0f)
  54.  
  55.   val progId = {
  56.     val shaderSrc = """#version 450 core
  57.                      |layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
  58.                      |layout (std430, binding = 0) buffer particles {
  59.                      |    float Particle[];
  60.                      |};
  61.                      |
  62.                      |void main() {
  63.                      |    for (int i = 0; i < 24; ++i) {
  64.                      |        Particle[i] = i + 1;
  65.                      |    }
  66.                      |}""".stripMargin
  67.  
  68.     val pId = glCreateProgram
  69.     val shaderId = glCreateShader(GL_COMPUTE_SHADER)
  70.     glShaderSource(shaderId, shaderSrc)
  71.     glCompileShader(shaderId)
  72.  
  73.     if(glGetShaderi(shaderId, GL_COMPILE_STATUS) == GL_FALSE) {
  74.       println("Shader compilation failed.")
  75.       println(glGetShaderInfoLog(shaderId))
  76.       sys.exit(1)
  77.     }
  78.  
  79.     glAttachShader(pId, shaderId)
  80.  
  81.     def checkProgStatus(pId: Int, statusType: Int, desc: String) {
  82.       if(glGetProgrami(pId, statusType) == GL_FALSE) {
  83.         println(s"$desc error:\n${glGetProgramInfoLog(pId)}")
  84.         sys.exit(1)
  85.       }
  86.     }
  87.  
  88.     glLinkProgram(pId)
  89.     checkProgStatus(pId, GL_LINK_STATUS, "Program link")
  90.  
  91.     glValidateProgram(pId)
  92.     checkProgStatus(pId, GL_VALIDATE_STATUS, "Program validation")
  93.  
  94.     glDetachShader(pId, shaderId)
  95.     glDeleteShader(shaderId)
  96.  
  97.     pId
  98.   }
  99.  
  100.   val bufferFlags = GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT
  101.   val bufferSize = 24 * 4
  102.   val bufferId = glCreateBuffers()
  103.  
  104.   glNamedBufferStorage(bufferId, bufferSize, bufferFlags)
  105.  
  106.   val mappedBuffer = glMapNamedBufferRange(bufferId, 0, bufferSize, bufferFlags)
  107.  
  108.   mappedBuffer.rewind()
  109.   val mappedFloatBuffer = mappedBuffer.asFloatBuffer()
  110.  
  111.   mappedFloatBuffer.rewind()
  112.  
  113.   val ssboIndex = glGetProgramResourceIndex(progId, GL_SHADER_STORAGE_BLOCK, "particles")
  114.  
  115.   val props = Array(GL_BUFFER_BINDING)
  116.   val params = Array(-1)
  117.   glGetProgramResourceiv(progId, GL_SHADER_STORAGE_BLOCK, ssboIndex, props, null, params)
  118.  
  119.   glBindBufferBase(GL_SHADER_STORAGE_BUFFER, params(0), bufferId)
  120.  
  121.   glUseProgram(progId)
  122.  
  123.   val sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)
  124.   glDispatchCompute(1, 1, 1)
  125.  
  126.   glClientWaitSync(sync, 0, 1000000000) match {
  127.     case GL_TIMEOUT_EXPIRED =>
  128.       println("Timeout expired")
  129.  
  130.     case GL_WAIT_FAILED =>
  131.       println("Wait failed. " + glGetError())
  132.  
  133.     case _ =>
  134.       println("Result:")
  135.  
  136.       while(mappedFloatBuffer.hasRemaining) {
  137.         println(mappedFloatBuffer.get())
  138.       }
  139.   }
  140.  
  141.   println("Done.")
  142.  
  143.   glfwFreeCallbacks(window)
  144.   glfwDestroyWindow(window)
  145.  
  146.   glfwTerminate()
  147.   glfwSetErrorCallback(null).free()
  148.  
  149.  
  150.  
  151.   def printDebugMessage(src: Int, typ: Int, id: Int, severity: Int, length: Int, msg: Long, uparam: Long) {
  152.     val srcs = src match {
  153.       case GL_DEBUG_SOURCE_API => "API"
  154.       case GL_DEBUG_SOURCE_APPLICATION => "APP"
  155.       case GL_DEBUG_SOURCE_OTHER => "Other"
  156.       case GL_DEBUG_SOURCE_SHADER_COMPILER => "Shader compiler"
  157.       case GL_DEBUG_SOURCE_THIRD_PARTY => "3rd party"
  158.       case GL_DEBUG_SOURCE_WINDOW_SYSTEM => "Window sys"
  159.       case i => i.toString
  160.     }
  161.  
  162.     val typs = typ match {
  163.       case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR => "Deprecated"
  164.       case GL_DEBUG_TYPE_ERROR => "Error"
  165.       case GL_DEBUG_TYPE_MARKER => "Marker"
  166.       case GL_DEBUG_TYPE_OTHER => "Other"
  167.       case GL_DEBUG_TYPE_PERFORMANCE => "Performance"
  168.       case GL_DEBUG_TYPE_POP_GROUP => "Pop group"
  169.       case GL_DEBUG_TYPE_PORTABILITY => "Portability"
  170.       case GL_DEBUG_TYPE_PUSH_GROUP => "Push group"
  171.       case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR => "Undefined behaviour"
  172.       case i => i.toString
  173.     }
  174.  
  175.     val severities = severity match {
  176.       case GL_DEBUG_SEVERITY_NOTIFICATION => "Notification"
  177.       case GL_DEBUG_SEVERITY_LOW => "Low"
  178.       case GL_DEBUG_SEVERITY_MEDIUM => "Medium"
  179.       case GL_DEBUG_SEVERITY_HIGH => "High"
  180.       case i => i.toString
  181.     }
  182.  
  183.     println(s"[$severities][$typs][$srcs][$id]: ${memUTF8(msg)}")
  184.   }
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement