int height()const{ if(0==value_){return -1;} int ans; glGetTextureLevelParameteriv(texture_,0,GL_TEXTURE_HEIGHT,&ans); return ans; }
int width()const{ if(0==value_){return -1;} int ans; glGetTextureLevelParameteriv(texture_,0,GL_TEXTURE_WIDTH,&ans); return ans; }
Vector2i CubeMapTexture::getImageSizeImplementationDSA(const Int level) { Vector2i size; glGetTextureLevelParameteriv(_id, level, GL_TEXTURE_WIDTH, &size.x()); glGetTextureLevelParameteriv(_id, level, GL_TEXTURE_HEIGHT, &size.y()); return size; }
/** * Do error-check tests for a non-mipmapped texture. */ static bool test_one_level_errors(GLenum target) { const GLint width = 64, height = 4, depth = 8; GLuint tex; GLint v; assert(target == GL_TEXTURE_1D || target == GL_TEXTURE_2D || target == GL_TEXTURE_3D); glCreateTextures(target, 1, &tex); glBindTextureUnit(0, tex); if (target == GL_TEXTURE_1D) { glTextureStorage1D(tex, 1, GL_RGBA8, width); } else if (target == GL_TEXTURE_2D) { glTextureStorage2D(tex, 1, GL_RGBA8, width, height); } else if (target == GL_TEXTURE_3D) { glTextureStorage3D(tex, 1, GL_RGBA8, width, height, depth); } piglit_check_gl_error(GL_NO_ERROR); glGetTextureLevelParameteriv(tex, 0, GL_TEXTURE_WIDTH, &v); if (v != width) { printf("%s: bad width: %d, should be %d\n", TestName, v, width); return false; } if (target != GL_TEXTURE_1D) { glGetTextureLevelParameteriv(tex, 0, GL_TEXTURE_HEIGHT, &v); if (v != height) { printf("%s: bad height: %d, should be %d\n", TestName, v, height); return false; } } if (target == GL_TEXTURE_3D) { glGetTextureLevelParameteriv(tex, 0, GL_TEXTURE_DEPTH, &v); if (v != depth) { printf("%s: bad depth: %d, should be %d\n", TestName, v, depth); return false; } } /* The ARB_texture_storage spec says: * * "Using any of the following commands with the same texture will * result in the error INVALID_OPERATION being generated, even if * it does not affect the dimensions or format: * * - TexImage* * - CompressedTexImage* * - CopyTexImage* * - TexStorage*" */ if (!piglit_khr_no_error && target == GL_TEXTURE_2D) { glTexImage2D(target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); if (glGetError() != GL_INVALID_OPERATION) { printf("%s: glTexImage2D failed to generate error\n", TestName); return false; } glTextureStorage2D(tex, 1, GL_RGBA8, width, height); if (glGetError() != GL_INVALID_OPERATION) { printf("%s: glTextureStorage2D() failed to generate " "error\n", TestName); return false; } glCopyTexImage2D(target, 0, GL_RGBA, 0, 0, width, height, 0); if (glGetError() != GL_INVALID_OPERATION) { printf("%s: glCopyTexImage2D() failed to generate " "error\n", TestName); return false; } } glDeleteTextures(1, &tex); return true; }
/** * Test a mip-mapped texture w/ rendering. */ static bool test_2d_mipmap_rendering(void) { GLuint tex; GLint width = 128, height = 64, levels = 8; GLint v, l; GLfloat vfloat; GLuint prog; glCreateTextures(GL_TEXTURE_2D, 1, &tex); glBindTextureUnit(0, tex); glTextureStorage2D(tex, levels, GL_RGBA8, width, height); piglit_check_gl_error(GL_NO_ERROR); /* check that the mipmap level sizes are correct */ for (l = 0; l < levels; l++) { GLubyte *buf = create_image(width, height, Colors[l]); glTextureSubImage2D(tex, l, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buf); free(buf); glGetTextureLevelParameteriv(tex, l, GL_TEXTURE_WIDTH, &v); if (v != width) { printf("%s: level %d: bad width: %d, should be %d\n", TestName, l, v, width); return false; } glGetTextureLevelParameteriv(tex, l, GL_TEXTURE_HEIGHT, &v); if (v != height) { printf("%s: level %d: bad height: %d, should be %d\n", TestName, l, v, height); return false; } /* Added to test glGetTextureLevelParameterfv */ glGetTextureLevelParameterfv(tex, l, GL_TEXTURE_WIDTH, &vfloat); if (vfloat != (GLfloat) width) { printf("%s: level %d: bad width: %.2f, " "should be %.2f\n", TestName, l, vfloat, (GLfloat) width); return false; } glGetTextureLevelParameterfv(tex, l, GL_TEXTURE_HEIGHT, &vfloat); if (vfloat != (GLfloat) height) { printf("%s: level %d: bad height: %.2f, " "should be %.2f\n", TestName, l, vfloat, (GLfloat) height); return false; } if (width > 1) width /= 2; if (height > 1) height /= 2; } /* This should generate and error (bad level) */ if (!piglit_khr_no_error) { GLubyte *buf = create_image(width, height, Colors[l]); GLenum err; glTextureSubImage2D(tex, levels, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buf); err = glGetError(); if (err == GL_NO_ERROR) { printf("%s: glTextureSubImage2D(illegal level)" " failed to generate an error.\n", TestName); return false; } free(buf); } /* now do a rendering test */ glTextureParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glTextureParameteri(tex, GL_TEXTURE_MAG_FILTER, GL_NEAREST); prog = dsa_create_program(GL_TEXTURE_2D); glUseProgram(prog); /* draw a quad using each texture mipmap level */ for (l = 0; l < levels; l++) { GLfloat expected[4]; GLint p; glTextureParameteri(tex, GL_TEXTURE_BASE_LEVEL, l); glTextureParameteri(tex, GL_TEXTURE_MAX_LEVEL, l); glClear(GL_COLOR_BUFFER_BIT); piglit_draw_rect_tex(-1.0, -1.0, 2.0, 2.0, 0.0, 0.0, 1.0, 1.0); expected[0] = Colors[l][0] / 255.0; expected[1] = Colors[l][1] / 255.0; expected[2] = Colors[l][2] / 255.0; expected[3] = Colors[l][3] / 255.0; p = piglit_probe_pixel_rgb(piglit_width/2, piglit_height/2, expected); piglit_present_results(); if (!p) { printf("%s: wrong color for mipmap level %d\n", TestName, l); return false; } } glUseProgram(0); glDeleteProgram(prog); glDeleteTextures(1, &tex); return true; }
/** * Do error-check tests for a mipmapped texture. */ static bool test_mipmap_errors(GLenum target) { GLint width = 128, height = 64, depth = 4, levels = 8; const char *targetString = piglit_get_gl_enum_name(target); GLuint tex; GLint v, l; assert(target == GL_TEXTURE_1D || target == GL_TEXTURE_2D || target == GL_TEXTURE_3D); glCreateTextures(target, 1, &tex); glBindTextureUnit(0, tex); if (target == GL_TEXTURE_1D) { glTextureStorage1D(tex, levels, GL_RGBA8, width); } else if (target == GL_TEXTURE_2D) { glTextureStorage2D(tex, levels, GL_RGBA8, width, height); } else if (target == GL_TEXTURE_3D) { glTextureStorage3D(tex, levels, GL_RGBA8, width, height, depth); } piglit_check_gl_error(GL_NO_ERROR); glGetTextureParameteriv(tex, GL_TEXTURE_IMMUTABLE_FORMAT, &v); if (!v) { printf("%s: %s GL_TEXTURE_IMMUTABLE_FORMAT query returned " "false\n", TestName, targetString); return false; } for (l = 0; l < levels; l++) { glGetTextureLevelParameteriv(tex, l, GL_TEXTURE_WIDTH, &v); if (v != width) { printf("%s: %s level %d: bad width: %d, should be %d\n", TestName, targetString, l, v, width); return false; } if (target != GL_TEXTURE_1D) { glGetTextureLevelParameteriv(tex, l, GL_TEXTURE_HEIGHT, &v); if (v != height) { printf("%s: %s level %d: bad height: %d, " "should be %d\n", TestName, targetString, l, v, height); return false; } } if (target == GL_TEXTURE_3D) { glGetTextureLevelParameteriv(tex, l, GL_TEXTURE_DEPTH, &v); if (v != depth) { printf("%s: %s level %d: bad depth: %d, " "should be %d\n", TestName, targetString, l, v, depth); return false; } } if (width > 1) width /= 2; if (height > 1) height /= 2; if (depth > 1) depth /= 2; } glDeleteTextures(1, &tex); return true; }