glGetTexImage with GL_TEXTURE_3D
Markus Müller <[email protected]>
| Newsgroups | gmane.comp.video.mesa3d.user |
|---|---|
| Message-ID | <[email protected]> |
Hello,
I'm using the Gallium llvmpipe software renderer on Windows and have the
problem that when downloading 3D textures with glGetTexImage, only the
first slice is copied to the provided buffer. I attached a small example
that works with the default nvidia driver and Mesa 10.3.1 but fails with
Mesa 10.6.9 (also 11 and 12).
The following patch seems to fix this but I'm not sure if it breaks
something else:
diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index f97d0ef..83bf122 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -509,14 +509,16 @@ get_tex_rgba_uncompressed(struct gl_context *ctx,
GLuint dimensions,
*/
if (format == rgba_format) {
rgba = dest;
- } else if (rgba == NULL) { /* Allocate the RGBA buffer only
once */
+ } else {
need_convert = true;
- rgba = malloc(height * rgba_stride);
- if (!rgba) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage()");
- ctx->Driver.UnmapTextureImage(ctx, texImage, img);
- return;
- }
+ if (rgba == NULL) { /* Allocate the RGBA buffer
only once */
+ rgba = malloc(height * rgba_stride);
+ if (!rgba) {
+ _mesa_error(ctx,
GL_OUT_OF_MEMORY, "glGetTexImage()");
+ ctx->Driver.UnmapTextureImage(ctx, texImage, img);
+ return;
+ }
+ }
}
_mesa_format_convert(rgba, rgba_format, rgba_stride,
Regards,
Markus
_______________________________________________
mesa-users mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-users
main.cpp
(text/plain, 1.3 KB)
#include "glew/include/GL/glew.h"
#include "glfw/include/GLFW/glfw3.h"
#include "assert.h"
#include "string.h"
#include "stdio.h"
int main(void)
{
GLFWwindow* window;
if (!glfwInit())
return -1;
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK)
return -1;
int size = 64;
unsigned short* pixelsIn = new unsigned short[size*size*size];
memset(pixelsIn, 0xAA, size*size*size*sizeof(unsigned short));
GLuint tex = -1;
glGenTextures(1, &tex);
assert(tex >= 0);
glBindTexture(GL_TEXTURE_3D, tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, 8);
glTexImage3D(GL_TEXTURE_3D, 0, GL_INTENSITY16, size, size, size, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixelsIn);
assert(glGetError() == GL_NO_ERROR);
unsigned short* pixelsOut = new unsigned short[size*size*size];
memset(pixelsOut, 0x00, size*size*size*sizeof(unsigned short));
glPixelStorei(GL_PACK_ALIGNMENT, 8);
glGetTexImage(GL_TEXTURE_3D, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, pixelsOut);
assert(glGetError() == GL_NO_ERROR);
int same = memcmp(pixelsIn, pixelsOut, size*size*size*sizeof(unsigned short));
assert(same == 0);
glfwTerminate();
delete[] pixelsIn;
delete[] pixelsOut;
return 0;
}