Hello Jonas, I tested your program and on my system (Fedora 19) on an Evergreen (Radeon HD 5850) and I have the same issue indeed. Here is my result :
Mesa 9.2.4 (from F19 repo) => Data does NOT match up! Mesa 9.2.5 => Data does NOT match up! Mesa 10.0.5 => Data does NOT match up! Mesa 10.1.0 => Data matches. So this is fixed in newer version. That said, Mesa 9.2 is not supported anymore and I really don't know if there will be a new Mesa 10.0.x release given the imminence of Mesa 10.2. If yes, I can bisect and you can open a bug. Mesa-dev, any new 10.0.x release planned ? Regards. Benjamin Le 06/05/2014 13:40, Jonas Kulla a écrit : > Hello list, > > after about 3 days of debugging, I was able to isolate a rather weird > behavior in Mesa GL. > The gist of it is the following: When I create a buffer object and > allocate uninitilaized > memory for it (glBufferData() with nullptr as 'data'), > then glCopyBufferSubData() data into > it from another buffer object, then subsequently fill a part of it > with glBufferSubData(), > this new data isn't visible to the buffer object. In fact, it seems > that the SubData'ed bytes > are completely lost. Any further data uploads however work as > expected. I will attach > a small C test case below that demonstrates this behavior. > > I realize that I am working with an old Mesa release (on Fedora 19), > but I'm afraid of > upgrading my system to the newest distro release as I might break my > working environment. > That's why I would like to kindly ask if someone could verify that > this problem still persists > on the newest Mesa code, in which case I would go ahead and file a bug > report. At the > same time, maybe someone could spot a critical mistake in my code that > would explain > this strange behavior I'm seeing. I think the code paths I'm hitting > here in the driver are > sufficiently obscure though. > > I should probably mention that my card is a Mobility Radeon HD 3650 > (ie. r600). > > Here's the code sample (you can replace the GL setup code with your own): > > #include <stdlib.h> > #include <string.h> > > #include <GL/glew.h> > #include <SDL2/SDL.h> > > static SDL_Window *win; > static SDL_GLContext *ctx; > > void setupGL() > { > SDL_Init(SDL_INIT_VIDEO); > win = SDL_CreateWindow("CopyBufferBug", > SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 64, 64, > SDL_WINDOW_OPENGL); > ctx = SDL_GL_CreateContext(win); > glewInit(); > } > > static void teardownGL() > { > SDL_GL_DeleteContext(ctx); > SDL_DestroyWindow(win); > > SDL_Quit(); > } > > int main(int argc, char *argv[]) > { > setupGL(); > > /* These don't matter I think */ > #define BLOCK_SIZE 128 > #define BUFFER1_SIZE BLOCK_SIZE > #define BUFFER2_SIZE BLOCK_SIZE > #define BUFFER1_TARGET GL_COPY_READ_BUFFER > #define BUFFER2_TARGET GL_COPY_WRITE_BUFFER > #define BUFFER1_USAGE GL_DYNAMIC_DRAW > #define BUFFER2_USAGE GL_DYNAMIC_DRAW > > GLuint buffers[2]; > glGenBuffers(2, buffers); > > /* We allocate both buffers with undefined memory */ > glBindBuffer(BUFFER1_TARGET, buffers[0]); > glBufferData(BUFFER1_TARGET, BUFFER1_SIZE, 0, BUFFER1_USAGE); > > glBindBuffer(BUFFER2_TARGET, buffers[1]); > glBufferData(BUFFER2_TARGET, BUFFER2_SIZE, 0, BUFFER2_USAGE); > > /* Then copy (undefined) bytes from the first into the second > buffer */ > /* Note: If I comment this line out, everything works */ > glCopyBufferSubData(BUFFER1_TARGET, BUFFER2_TARGET, 0, 0, > BUFFER1_SIZE); > > /* Generate random string */ > FILE *rand = fopen("/dev/urandom", "r"); > char data[BLOCK_SIZE]; > fread(data, 1, sizeof(data), rand); > fclose(rand); > > /* We fill the second buffer with defined data */ > /* Note: If I execute this call twice (just copy paste the > line), everything works */ > glBufferSubData(BUFFER2_TARGET, 0, sizeof(data), data); > > /* Then download it again to compare its contents against our > test string */ > char data2[BLOCK_SIZE]; > glGetBufferSubData(BUFFER2_TARGET, 0, sizeof(data2), data2); > > if (memcmp(data, data2, sizeof(data))) > printf("Data does NOT match up!\n"); > else > printf("Data matches.\n"); > > glDeleteBuffers(2, buffers); > > teardownGL(); > > return 0; > } > > Thank you very much for your time. > Jonas > > > _______________________________________________ > mesa-users mailing list > mesa-us...@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-users
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev