Quantcast
Channel: AMD Developer Forums: Message List - OpenGL & Vulkan
Viewing all articles
Browse latest Browse all 631

glMapBuffer and secondary thread problem

$
0
0

glDrawArray doesn't draw anything when using secondary thread + glMapBuffer(thread receive pointer and use it as a buffer) to update data in VBO. Example code:

 

#include <thread>
#include <GL/glew.h>
#include <GLFW/glfw3.h>


const char vsource [] = "#version 330 core\nin vec3 position;\nvoid main(void){gl_Position = vec4(position,1.0f);}\0";
const char fsource [] = "#version 330 core\nvoid main(void){gl_FragColor = vec4(1.0f,0.0f,0.0f,1.0f);}\0";


bool ext = 0;


void gen_function(float *data, unsigned count)
{
    srand(time(NULL));    while (!ext)    {        for (unsigned i = 0; i < (count/3)*3; i+=3)        {            data[i] = ((rand() % 2001) * 0.001f) - 1.0f;            data[i+1] = ((rand() % 2001) * 0.001f) - 1.0f;            data[i+2] = 0.0f;        }    }
}


int main()
{
    if (!glfwInit())        return 1;    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);    GLFWwindow* window = glfwCreateWindow(640, 480, "Test", NULL, NULL);    glfwMakeContextCurrent(window);    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);    glewExperimental = GL_TRUE;    glewInit();    GLuint vshader = glCreateShader(GL_VERTEX_SHADER);    char const* source_pointer = vsource;    glShaderSource (vshader,1,&source_pointer,NULL);    glCompileShader(vshader);    GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);    source_pointer = fsource;    glShaderSource (fshader,1,&source_pointer,NULL);    glCompileShader(fshader);    GLuint program = glCreateProgram();    glAttachShader(program,vshader);    glAttachShader(program,fshader);    glLinkProgram(program);    GLuint VAO;    glGenVertexArrays(1,&VAO);    glBindVertexArray(VAO);    GLuint VBO;    glGenBuffers(1,&VBO);    glBindBuffer(GL_ARRAY_BUFFER,VBO);    glBufferData(GL_ARRAY_BUFFER,300*sizeof(float),NULL,GL_DYNAMIC_DRAW);    void* ptr = glMapBuffer(GL_ARRAY_BUFFER,GL_WRITE_ONLY | GL_MAP_UNSYNCHRONIZED_BIT);    GLint pos = glGetAttribLocation(program,"position\0");    glVertexAttribPointer(pos,3,GL_FLOAT,GL_FALSE,0,0);    glEnableVertexAttribArray(pos);    glUseProgram(program);    std::thread thread1(gen_function,(float*)ptr,300);    glPointSize(2.0f);    do    {        glClear(GL_COLOR_BUFFER_BIT);        glDrawArrays(GL_POINTS,0,100);        glfwSwapBuffers(window);        glfwPollEvents();    } while (glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&             glfwWindowShouldClose(window) == 0);    ext = 1;    thread1.join();    glDisableVertexAttribArray(pos);    glUnmapBuffer(GL_ARRAY_BUFFER);    glDeleteBuffers(1,&VBO);    glDeleteVertexArrays(1,&VAO);    glDeleteProgram(program);    glDeleteShader(vshader);    glDeleteShader(fshader);    glfwTerminate();    return 0;
}

 

If I use open source driver(mesa(r600g)) then program draws without problems.
Hardware: 6480G + 7470M
OS: Kubuntu 14.10 daily
Driver: AMD Catalyst 14.6 jul11


Viewing all articles
Browse latest Browse all 631

Trending Articles