Hallo alle zusammen!
Ich habe ein merkwürdiges Problem. Ich habe eine OpenGL Umgebung in der ich dynamisch (das ist eine Anforderung) Texturen laden will und dies auch schon kann. Nun dauert das laden auf die Grafikkarte (glTexImage2D) relativ lange drum wollt ich diesen Vorgang als Thread in den Hintergrund legen. Gesagt getan. Um Speicher zu sparen möchte ich alte, nicht mehr verwendete OpenGL Texturen wiederverwenden bzw. alte überschreiben. Problem ist, dass wenn ich das synchron mache funktioniert das. Sobald ich das hochladen in einen Thread auslagere werden immer nur die zuerst geladenen Texturen angezeigt.
Hier mal der Code:
Ausgaben vor und in dem Thread haben mir bestätigt, das der Imagepointer und der Pixeldatenpointer auch wirklich die richtigen sind, die in die Funktion eingesetzt werden.
Wenn ich Zeile 8 und 9 einkommentiere dafür die 10 auskommentiere, dann funktioniert das laden der Texturen so wie es soll, nur das der Ladevorgang zu lange blockiert.
Was ist hier falsch?
Ich habe ein merkwürdiges Problem. Ich habe eine OpenGL Umgebung in der ich dynamisch (das ist eine Anforderung) Texturen laden will und dies auch schon kann. Nun dauert das laden auf die Grafikkarte (glTexImage2D) relativ lange drum wollt ich diesen Vorgang als Thread in den Hintergrund legen. Gesagt getan. Um Speicher zu sparen möchte ich alte, nicht mehr verwendete OpenGL Texturen wiederverwenden bzw. alte überschreiben. Problem ist, dass wenn ich das synchron mache funktioniert das. Sobald ich das hochladen in einen Thread auslagere werden immer nur die zuerst geladenen Texturen angezeigt.
Hier mal der Code:
PHP:
void Texture::useTexture(Image *image) {
// if the opengl texture id already exists
if(_textureID) {
// if the texture has been changed
if(image->getID() != _imageID) {
_imageID = image->getID();
// glBindTexture(GL_TEXTURE_2D, _textureID);
// glTexImage2D(GL_TEXTURE_2D, 0, image->getColorFormat(), image->getWidth(), image->getHeight(), 0, image->getColorFormat(), GL_UNSIGNED_BYTE, image->getPixelData());
load(image, _textureID, _imageID);
}
} else {
GLuint textureID;
// Use tightly packed data
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// Generate a texture object
glGenTextures(1, &textureID);
// Bind the texture object
glBindTexture(GL_TEXTURE_2D, textureID);
// upload the texture
glTexImage2D(GL_TEXTURE_2D, 0, image->getColorFormat(), image->getWidth(), image->getHeight(), 0, image->getColorFormat(), GL_UNSIGNED_BYTE, image->getPixelData());
// Set the filtering mode
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
// glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
// glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
_textureID = textureID;
}
}
PHP:
struct texture_t {
Image *image;
int textureID;
int imageID;
};
void createTexture(void *value) {
pthread_detach(NULL);
Image *image = ((texture_t*)value)->image;
// critical section cause of Texture::bind()
pthread_mutex_lock( &mutex );
glBindTexture(GL_TEXTURE_2D, ((texture_t*)value)->textureID);
glTexImage2D(GL_TEXTURE_2D, 0, image->getColorFormat(), image->getWidth(), image->getHeight(), 0, image->getColorFormat(), GL_UNSIGNED_BYTE, image->getPixelData());
pthread_mutex_unlock( &mutex );
// end of critical section
delete (texture_t*)value;
pthread_exit(NULL);
}
void load(Image *image, int texid, int imageID) {
pthread_t thread;
texture_t *tex = new texture_t;
tex->textureID = texid;
tex->imageID = imageID;
tex->image = image;
pthread_create(&thread, NULL, (void* (*)(void*))createTexture, (void*)tex);
}
Ausgaben vor und in dem Thread haben mir bestätigt, das der Imagepointer und der Pixeldatenpointer auch wirklich die richtigen sind, die in die Funktion eingesetzt werden.
Wenn ich Zeile 8 und 9 einkommentiere dafür die 10 auskommentiere, dann funktioniert das laden der Texturen so wie es soll, nur das der Ladevorgang zu lange blockiert.
Was ist hier falsch?