tests/getteximage: test more texture sizes, including npot
This commit is contained in:
parent
a746ef28df
commit
cd7a8225e8
|
@ -15,7 +15,7 @@ static int Win;
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
TestGetTexImage(void)
|
TestGetTexImage(GLboolean npot)
|
||||||
{
|
{
|
||||||
GLuint iter;
|
GLuint iter;
|
||||||
GLubyte *data = (GLubyte *) malloc(1024 * 1024 * 4);
|
GLubyte *data = (GLubyte *) malloc(1024 * 1024 * 4);
|
||||||
|
@ -27,8 +27,8 @@ TestGetTexImage(void)
|
||||||
|
|
||||||
for (iter = 0; iter < 8; iter++) {
|
for (iter = 0; iter < 8; iter++) {
|
||||||
GLint p = (iter % 8) + 3;
|
GLint p = (iter % 8) + 3;
|
||||||
GLint w = (1 << p);
|
GLint w = npot ? (p * 20) : (1 << p);
|
||||||
GLint h = (1 << p);
|
GLint h = npot ? (p * 10) : (1 << p);
|
||||||
GLuint i;
|
GLuint i;
|
||||||
GLint level = 0;
|
GLint level = 0;
|
||||||
|
|
||||||
|
@ -83,63 +83,94 @@ ColorsEqual(const GLubyte ref[4], const GLubyte act[4])
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
TestGetTexImageRTT(void)
|
TestGetTexImageRTT(GLboolean npot)
|
||||||
{
|
{
|
||||||
GLuint iter;
|
GLuint iter;
|
||||||
GLuint fb, tex;
|
|
||||||
GLint w = 512;
|
|
||||||
GLint h = 256;
|
|
||||||
GLint level = 0;
|
|
||||||
|
|
||||||
glGenTextures(1, &tex);
|
|
||||||
glGenFramebuffersEXT(1, &fb);
|
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, tex);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0,
|
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
|
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
|
||||||
GL_TEXTURE_2D, tex, level);
|
|
||||||
|
|
||||||
printf("Render to texture + glGetTexImage:\n");
|
printf("Render to texture + glGetTexImage:\n");
|
||||||
printf(" Testing %d x %d tex image\n", w, h);
|
|
||||||
for (iter = 0; iter < 8; iter++) {
|
for (iter = 0; iter < 8; iter++) {
|
||||||
GLubyte color[4];
|
|
||||||
GLubyte *data2 = (GLubyte *) malloc(w * h * 4);
|
|
||||||
GLuint i;
|
|
||||||
|
|
||||||
/* random clear color */
|
GLuint fb, tex;
|
||||||
for (i = 0; i < 4; i++) {
|
GLint w, h;
|
||||||
color[i] = rand() % 256;
|
GLint level = 0;
|
||||||
|
|
||||||
|
if (npot) {
|
||||||
|
w = 200 + iter * 40;
|
||||||
|
h = 200 + iter * 12;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
w = 4 << iter;
|
||||||
|
h = 4 << iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
glClearColor(color[0] / 255.0,
|
glGenTextures(1, &tex);
|
||||||
color[1] / 255.0,
|
glGenFramebuffersEXT(1, &fb);
|
||||||
color[2] / 255.0,
|
|
||||||
color[3] / 255.0);
|
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glBindTexture(GL_TEXTURE_2D, tex);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0,
|
||||||
|
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
|
||||||
/* get */
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
|
||||||
glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, data2);
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
|
GL_TEXTURE_2D, tex, level);
|
||||||
|
|
||||||
/* compare */
|
glViewport(0, 0, w, h);
|
||||||
for (i = 0; i < w * h; i += 4) {
|
|
||||||
if (!ColorsEqual(color, data2 + i * 4)) {
|
printf(" Testing %d x %d tex image\n", w, h);
|
||||||
printf("Render to texture failure!\n");
|
{
|
||||||
abort();
|
static const GLubyte blue[4] = {0, 0, 255, 255};
|
||||||
|
GLubyte color[4];
|
||||||
|
GLubyte *data2 = (GLubyte *) malloc(w * h * 4);
|
||||||
|
GLuint i;
|
||||||
|
|
||||||
|
/* random clear color */
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
color[i] = rand() % 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glClearColor(color[0] / 255.0,
|
||||||
|
color[1] / 255.0,
|
||||||
|
color[2] / 255.0,
|
||||||
|
color[3] / 255.0);
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
/* draw polygon over top half, in blue */
|
||||||
|
glColor4ubv(blue);
|
||||||
|
glRectf(0, 0.5, 1.0, 1.0);
|
||||||
|
|
||||||
|
/* get */
|
||||||
|
glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, data2);
|
||||||
|
|
||||||
|
/* compare */
|
||||||
|
for (i = 0; i < w * h; i += 4) {
|
||||||
|
if (i < w * h / 2) {
|
||||||
|
/* lower half */
|
||||||
|
if (!ColorsEqual(color, data2 + i * 4)) {
|
||||||
|
printf("Render to texture failure (expected clear color)!\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* upper half */
|
||||||
|
if (!ColorsEqual(blue, data2 + i * 4)) {
|
||||||
|
printf("Render to texture failure (expected blue)!\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(data2);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(data2);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||||
}
|
glDeleteFramebuffersEXT(1, &fb);
|
||||||
|
glDeleteTextures(1, &tex);
|
||||||
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
}
|
||||||
glDeleteFramebuffersEXT(1, &fb);
|
|
||||||
glDeleteTextures(1, &tex);
|
|
||||||
|
|
||||||
printf("Passed\n");
|
printf("Passed\n");
|
||||||
}
|
}
|
||||||
|
@ -152,11 +183,16 @@ Draw(void)
|
||||||
{
|
{
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
TestGetTexImage();
|
TestGetTexImage(GL_FALSE);
|
||||||
|
if (glutExtensionSupported("GL_ARB_texture_non_power_of_two"))
|
||||||
|
TestGetTexImage(GL_TRUE);
|
||||||
|
|
||||||
if (glutExtensionSupported("GL_EXT_framebuffer_object") ||
|
if (glutExtensionSupported("GL_EXT_framebuffer_object") ||
|
||||||
glutExtensionSupported("GL_ARB_framebuffer_object"))
|
glutExtensionSupported("GL_ARB_framebuffer_object")) {
|
||||||
TestGetTexImageRTT();
|
TestGetTexImageRTT(GL_FALSE);
|
||||||
|
if (glutExtensionSupported("GL_ARB_texture_non_power_of_two"))
|
||||||
|
TestGetTexImageRTT(GL_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
glutDestroyWindow(Win);
|
glutDestroyWindow(Win);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -171,10 +207,10 @@ Reshape(int width, int height)
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
|
glOrtho(0, 1, 0, 1, -1, 1);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glTranslatef(0.0, 0.0, -15.0);
|
glTranslatef(0.0, 0.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue