Jan
// Get a reference to one of the main threads
hpx::threads::executors::main_pool_executor scheduler;
// run an async function on the main thread to do a render
hpx::future<void> render = hpx::async(scheduler, [&isoSurface]()
{
render_code_in_here(isoSurface,...);
});
This is how I call my VTK render function that uses OpenGL.
JB
On 21/01/16 15:58, "[email protected] on behalf of
Jan-Tobias Sohns" <[email protected] on behalf of
[email protected]> wrote:
>Hello hpx-users,
>
>I'm still working on my parallel rendering project and can't find a
>solution for an error for over a month now.
>Whenever i call my rendering routine through an action (component- or
>plain action), i get a Segfault at glLinkProgram().
>If i call it in hpx_main() as a normal method or through std::async, it
>works fine, so my method is not faulty (correct image, no glErrors).
>
>I want to call it in a component action to render 16 images on 16
>components of a 16-core node/locality simultaneously, but the simplified
>version of just calling it once on a 1-core locality in a plain action
>in the hpx_main() gives the same segmentation fault.
>
>I know this most likely is an error on the interaction of OpenGL and
>asynchronous actions in general, but maybe someone on this list has an
>idea or has used OpenGL with HPX.
>Thanks in advance for any hints.
>
>Best,
>Jan
>
>
>
>Code snippets:
>- in readable order
>- single core version with OSMesa
>- interesting lines marked with ++++++++++++++++++++++++++++++++++)
>- can provide more if necessary
>
>
>
>the call: +++++++++++++++++++++++++++++++++++++++++++++++
>hpx::async<process_context_action>(hpx::find_here(), locID, locnum,
>m_currentImage).get();
>
>
>
>
>int process_context(GLuint offset, GLuint groups, Image image)
>{
> const GLint z = 32, stencil = 0, accum = 0;
> OSMesaContext ctx;
> void *buffer;
> GLint cBits;
>
> GLenum type = GL_UNSIGNED_BYTE;
> GLint bits = 8;
>
> setenv( "MESA_GL_VERSION_OVERRIDE", "3.3", 0 );
> setenv( "MESA_GLSL_VERSION_OVERRIDE", "330", 0);
>
> ctx = OSMesaCreateContextExt(OSMESA_RGBA, z, stencil, accum, NULL
>);
> if (!ctx) {
> printf("OSMesaCreateContextExt() failed!\n");
> return 0;
> }
>
> // Allocate the image buffer
> buffer = malloc(width * height * 4);
> if (!buffer) {
> printf("Alloc image buffer failed!\n");
> return 0;
> }
>
> // Bind the buffer to the context and make it current
> if (!OSMesaMakeCurrent( ctx, buffer, type, width, height )) {
> printf("OSMesaMakeCurrent (%d bits/channel) failed!\n", bits);
> free(buffer);
> OSMesaDestroyContext(ctx);
> return 0;
> }
>
> /* sanity checks */
> glGetIntegerv(GL_RED_BITS, &cBits);
> if (cBits != bits) {
> fprintf(stderr, "Unable to create %d-bit/channel
>renderbuffer.\n", bits);
> fprintf(stderr, "May need to recompile Mesa with CHAN_BITS=16
>or 32.\n");
> return 0;
> }
>
> OSMesaColorClamp(GL_TRUE);
> // ++++++++++++++++++++ go in next method ++++++++++++++++++++++
> if (!render_image(offset,groups))
> {
> return 0;
> }
>
> OSMesaDestroyContext(ctx);
>
> free(buffer);
>
> return 1;
>}
>HPX_PLAIN_ACTION(process_context, process_context_action);
>
>
>
>int render_image(GLuint offs, GLuint grps)
>{
> // Enable depth test
> glEnable(GL_DEPTH_TEST);
> glDepthFunc(GL_LESS);
>
> // Initialize VAO
> GLuint VertexArray;
> glGenVertexArrays(1, &VertexArray);
> glBindVertexArray(VertexArray);
>
> // Load and compile shaders +++++++++++ go in next method
>++++++++++++++++
> GLuint program = LoadShaders();
>
> // Get indices of shader-uniforms
> GLint MVPShaderID = glGetUniformLocation(program, "MVP");
> if (MVPShaderID == -1){
> fprintf(stderr, "FAILED: MVP misspelled or not used in
>shader.\n");
> return 0;
> }
> GLint ModelMatrixID = glGetUniformLocation(program, "M");
> if (ModelMatrixID == -1){
> fprintf(stderr, "FAILED: M misspelled or not used in shader.\n");
> return 0;
> }
> GLint ViewMatrixID = glGetUniformLocation(program, "V");
> if (ViewMatrixID == -1){
> fprintf(stderr, "FAILED: V misspelled or not used in shader.\n");
> return 0;
> }
> GLint LightPosID = glGetUniformLocation(program,
>"LightPosition_worldspace");
> if (LightPosID == -1){
> fprintf(stderr, "FAILED: LightPosition_worldspace misspelled or
>not used in shader.\n");
> return 0;
> }
>
> // Projection matrix
> glm::mat4 P = glm::perspective(80.0f, // FoV
> (float)width / (float)height, // Aspect Ratio
> 0.1f, 4.0f*std::max(std::max(camPos.x, camPos.y),
>camPos.z)); // Display Range
> // Camera matrix
> glm::mat4 V = glm::lookAt(
> camPos, // Camera-Position
> glm::vec3(0,0,0), // Looks at Point
> glm::vec3(0,-1,0)); // Up-Vector
> // Model matrix
> glm::mat4 M =
>glm::translate(glm::mat4(1.0f),glm::vec3(0.0f,0.0f,0.0f));
> // Compute MVP-Matrix
> glm::mat4 MVP = P * V * M;
>
> // Load Data
> std::vector<glm::vec3> VertexBufferData;
> std::vector<glm::vec3> ColorBufferData;
> std::vector<glm::vec3> NormalBufferData;
> std::vector<unsigned int> IndexBufferData;
>
> loadOBJ("../src/suzanne.obj", VertexBufferData, ColorBufferData,
>NormalBufferData, IndexBufferData, offs, grps);
>
> // Create VertexBuffer
> GLuint VBO;
> glGenBuffers(1, &VBO);
> glBindBuffer(GL_ARRAY_BUFFER, VBO);
> glBufferData(GL_ARRAY_BUFFER, VertexBufferData.size() *
>sizeof(glm::vec3),
> &VertexBufferData[0], GL_STATIC_DRAW);
>
> // Create ColorBuffer
> GLuint CBO;
> glGenBuffers(1, &CBO);
> glBindBuffer(GL_ARRAY_BUFFER, CBO);
> glBufferData(GL_ARRAY_BUFFER, ColorBufferData.size() *
>sizeof(glm::vec3),
> &ColorBufferData[0], GL_STATIC_DRAW);
>
> // Create NormalBuffer
> GLuint NBO;
> glGenBuffers(1, &NBO);
> glBindBuffer(GL_ARRAY_BUFFER, NBO);
> glBufferData(GL_ARRAY_BUFFER, NormalBufferData.size() *
>sizeof(glm::vec3),
> &NormalBufferData[0], GL_STATIC_DRAW);
>
> // Create IndexBuffer
> GLuint IBO;
> glGenBuffers(1, &IBO);
> glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
> glBufferData(GL_ELEMENT_ARRAY_BUFFER, IndexBufferData.size() *
> sizeof(unsigned int), &IndexBufferData[0], GL_STATIC_DRAW);
>
> // Set clear color
> glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
> //glClearDepth(0.5f);
>
> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
>
> // Use shader
> glUseProgram(program);
>
> // Give shader Matrices & Light
> glUniformMatrix4fv(MVPShaderID, 1, GL_FALSE, &MVP[0][0]);
> glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &M[0][0]);
> glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &V[0][0]);
> glUniform3f(LightPosID, lightPos.x, lightPos.y, lightPos.z);
>
> // Vertices atrribute buffer
> glEnableVertexAttribArray(0);
> glBindBuffer(GL_ARRAY_BUFFER, VBO);
> glVertexAttribPointer(
> 0, // attribute
> 3, // size
> GL_FLOAT, // type
> GL_FALSE, // normalized
> 0, // stride
> (void*)0 // array buffer offset
> );
>
> // Color attribute buffer
> glEnableVertexAttribArray(1);
> glBindBuffer(GL_ARRAY_BUFFER, CBO);
> glVertexAttribPointer(
> 1, // attribute
> 3, // size
> GL_FLOAT, // type
> GL_FALSE, // normalized
> 0, // stride
> (const GLvoid*)0 // array buffer offset
> );
>
> // Normal attribute buffer
> glEnableVertexAttribArray(2);
> glBindBuffer(GL_ARRAY_BUFFER, NBO);
> glVertexAttribPointer(
> 2, // attribute
> 3, // size
> GL_FLOAT, // type
> GL_FALSE, // normalized
> 0, // stride
> (const GLvoid*)0 // array buffer offset
> );
>
> // Index Buffer
> glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
>
> // Draw triangles (mode, size, type,
>offset)
> glDrawElements(GL_TRIANGLES, IndexBufferData.size(),
>GL_UNSIGNED_INT, 0);
>
> // Cleanup VAO-Attributes
> glDisableVertexAttribArray(0);
> glDisableVertexAttribArray(1);
> glDisableVertexAttribArray(2);
>
> /* Make sure buffered commands are finished! */
> glFinish();
>
> // Cleanup VBO and shader
> glDeleteBuffers(1, &VBO);
> glDeleteBuffers(1, &CBO);
> glDeleteBuffers(1, &NBO);
> glDeleteBuffers(1, &IBO);
> glDeleteProgram(program);
> glDeleteVertexArrays(1, &VertexArray);
>
> return 1;
>}
>
>
>
>
>
>
>GLuint LoadShaders(){
>
> // Create the shaders
> GLuint VertexShader = glCreateShader(GL_VERTEX_SHADER);
> GLuint FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
>
> // Vertex Shader code
> const char* VertexShaderCode = "\
>#version 330 core\n\
>layout(location = 0) in vec3 vertexPosition_modelspace;\
>layout(location = 1) in vec3 color;\
>layout(location = 2) in vec3 vertexNormal_modelspace;\
>out vec3 col;\
>out vec3 vertexNormal_cameraspace;\
>out vec3 EyeDirection_cameraspace;\
>out vec3 LightDirection_cameraspace;\
>uniform mat4 MVP;\
>uniform mat4 M;\
>uniform mat4 V;\
>uniform vec3 LightPosition_worldspace;\
>void main(){\
> gl_Position = MVP * vec4(vertexPosition_modelspace,1.0);\
> vec3 vertexPosition_cameraspace = (V * M *
>vec4(vertexPosition_modelspace,1)).xyz;\
> EyeDirection_cameraspace = vec3(0,0,0) - vertexPosition_cameraspace;\
> vec3 LightPosition_cameraspace = ( V *
>vec4(LightPosition_worldspace,1)).xyz;\
> LightDirection_cameraspace = LightPosition_cameraspace +
>EyeDirection_cameraspace;\
> col = color;\
> vertexNormal_cameraspace = (V * M *
>vec4(vertexNormal_modelspace,0.0)).xyz;\
>}";
>
> // Fragment Shader code
> const char* FragmentShaderCode = "\
>#version 330 core\n\
>in vec3 col;\
>in vec3 vertexNormal_cameraspace;\
>in vec3 EyeDirection_cameraspace;\
>in vec3 LightDirection_cameraspace;\
>out vec4 FragColor;\
>void main(){\
> vec3 MaterialDiffuseColor = col;\
> vec3 MaterialAmbientColor = vec3(0.3,0.3,0.3) *
>MaterialDiffuseColor;\
> vec3 MaterialSpecularColor = vec3(0.3,0.3,0.3);\
> vec3 n = normalize(vertexNormal_cameraspace);\
> vec3 l = normalize(LightDirection_cameraspace);\
> float cosTheta = clamp(dot(n,l), 0, 1);\
> vec3 E = normalize(EyeDirection_cameraspace);\
> vec3 R = reflect(-l,n);\
> float cosAlpha = clamp(dot(E,R), 0, 1);\
> FragColor = \
> vec4(MaterialAmbientColor +\
> MaterialDiffuseColor * cosTheta +\
> MaterialSpecularColor * pow(cosAlpha,5), 1.0);\
>}";
>
> GLint Result = GL_FALSE;
> int InfoLogLength;
>
> // Compile Vertex Shader
> glShaderSource(VertexShader, 1, &VertexShaderCode, NULL);
> glCompileShader(VertexShader);
>
> // Check Vertex Shader
> glGetShaderiv(VertexShader, GL_COMPILE_STATUS, &Result);
> if (!Result) {
> printf("VertexShader compilation failed:\n");
> }
> glGetShaderiv(VertexShader, GL_INFO_LOG_LENGTH, &InfoLogLength);
> if ( InfoLogLength > 0 ){
> std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
> glGetShaderInfoLog(VertexShader, InfoLogLength, NULL,
> &VertexShaderErrorMessage[0]);
> printf("%s", &VertexShaderErrorMessage[0]);
> }
>
> // Compile Fragment Shader
> glShaderSource(FragmentShader, 1, &FragmentShaderCode, NULL);
> glCompileShader(FragmentShader);
>
> // Check Fragment Shader
> glGetShaderiv(FragmentShader, GL_COMPILE_STATUS, &Result);
> if (!Result) {
> printf("FragmentShader compilation failed:\n");
> }
> glGetShaderiv(FragmentShader, GL_INFO_LOG_LENGTH, &InfoLogLength);
> if ( InfoLogLength > 0 ){
> std::vector<char> FragmentShaderErrorMessage(InfoLogLength+1);
> glGetShaderInfoLog(FragmentShader, InfoLogLength, NULL,
> &FragmentShaderErrorMessage[0]);
> printf("%s", &FragmentShaderErrorMessage[0]);
> }
>
> // Link the program
> GLuint program = glCreateProgram();
> glAttachShader(program, VertexShader);
> glAttachShader(program, FragmentShader);
>
> GLenum glErr;
> glErr = glGetError();
> if (glErr != 0){
> std::cout << "OpenGL error: " << glErr << endl;
> }
> printf("Linking Program...\n");
> glLinkProgram(program); +++++++++++++++++ SEGFAULT HERE
>++++++++++++++
> printf("Program linked\n");
>
> // Check the program
> glGetProgramiv(program, GL_LINK_STATUS, &Result);
> glGetProgramiv(program, GL_INFO_LOG_LENGTH, &InfoLogLength);
> if ( InfoLogLength > 0 ){
> std::vector<char> ProgramErrorMessage(InfoLogLength+1);
> glGetProgramInfoLog(program, InfoLogLength, NULL,
>&ProgramErrorMessage[0]);
> printf("%s", &ProgramErrorMessage[0]);
> }
>
> // Detach & delete shaders
> glDetachShader(program, VertexShader);
> glDetachShader(program, FragmentShader);
> glDeleteShader(VertexShader);
> glDeleteShader(FragmentShader);
>
> return program;
>}
>_______________________________________________
>hpx-users mailing list
>[email protected]
>https://mail.cct.lsu.edu/mailman/listinfo/hpx-users
_______________________________________________
hpx-users mailing list
[email protected]
https://mail.cct.lsu.edu/mailman/listinfo/hpx-users