/** * Do error-check tests for texture targets */ static bool test_target_errors(GLenum target) { GLint width = 64, height = 14, depth = 8; const GLsizei levels = 1; GLuint tex; enum piglit_result pass = true; GLenum legalTargets[4]; unsigned int numTargets, numIllegalTargets; GLenum illegalTargets[] = { GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_RECTANGLE, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY }; GLsizei texSamples; if (piglit_is_extension_supported("GL_ARB_texture_storage_multisample")) { numIllegalTargets = ARRAY_SIZE(illegalTargets); glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &texSamples); } else { numIllegalTargets = ARRAY_SIZE(illegalTargets) -2; texSamples = 1; } glGenTextures(1, &tex); /* orig tex */ glBindTexture(target, tex); switch (target) { case GL_TEXTURE_1D: glTexStorage1D(target, levels, GL_RGBA8, width); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, 0); break; case GL_TEXTURE_1D_ARRAY: glTexStorage2D(target, levels, GL_RGBA8, width, height); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, 0); break; case GL_TEXTURE_2D: glTexStorage2D(target, levels, GL_RGBA8, width, height); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, 0); break; case GL_TEXTURE_RECTANGLE: glTexStorage2D(target, levels, GL_RGBA8, width, height); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_RECTANGLE, 0); break; case GL_TEXTURE_CUBE_MAP: width = height; glTexStorage2D(target, levels, GL_RGBA8, width, height); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_CUBE_MAP_ARRAY, 0); break; case GL_TEXTURE_3D: glTexStorage3D(target, levels, GL_RGBA8, width, height, depth); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_3D, 0); break; case GL_TEXTURE_CUBE_MAP_ARRAY: case GL_TEXTURE_2D_ARRAY: height = width; glTexStorage3D(target, levels, GL_RGBA8, width, height, depth*6); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_CUBE_MAP_ARRAY, 0); break; case GL_TEXTURE_2D_MULTISAMPLE: glTexStorage2DMultisample(target, texSamples, GL_RGBA8, width, height, GL_TRUE); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0); break; case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: glTexStorage3DMultisample(target, texSamples, GL_RGBA8, width, height, depth, GL_TRUE); numTargets = update_valid_arrays(legalTargets, illegalTargets, numIllegalTargets, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0); break; default: assert(0); numTargets = 0; break; } if (!piglit_check_gl_error(GL_NO_ERROR)) { printf("%s Found gl errors prior to testing glTextureView\n", TestName); pass = false; goto err_out; } /* ensure TextureView of legal targets works without gl errors */ pass = pass && check_target_array(GL_NO_ERROR, numTargets, legalTargets, GL_RG16, tex, levels); /* ensure TextureView of illegal targets returns an error */ pass = pass && check_target_array(GL_INVALID_OPERATION, numIllegalTargets, illegalTargets, GL_RG16, tex, levels); err_out: glDeleteTextures(1, &tex); return pass; }
/** * Do error-check tests for texture formats */ static bool test_format_errors(GLenum format_class) { const GLint width = 16, height = 16; const GLsizei levels = 5, layers = 6; GLenum target = GL_TEXTURE_CUBE_MAP; GLuint tex; bool pass = true; GLenum legalFormats[MAX_ILLEGAL_FORMATS]; unsigned int numFormats; GLenum illegalFormats[] = { /* skip compressed sized formats */ /* 128 bit */ GL_RGBA32F, GL_RGBA32UI, GL_RGBA32I, /* 96 bit */ GL_RGB32F, GL_RGB32UI, GL_RGB32I, /* 64 bit */ GL_RGBA16F, GL_RG32F, GL_RGBA16UI, GL_RG32UI, GL_RGBA16I, GL_RG32I, GL_RGBA16, GL_RGBA16_SNORM, /* 48 bit */ GL_RGB16, GL_RGB16_SNORM, GL_RGB16F, GL_RGB16UI, GL_RGB16I, /* 32 bits */ GL_RG16F, GL_R11F_G11F_B10F, GL_R32F, GL_RGB10_A2UI, GL_RGBA8UI, GL_RG16UI, GL_R32UI, GL_RGBA8I, GL_RG16I, GL_R32I, GL_RGB10_A2, GL_RGBA8, GL_RG16, GL_RGBA8_SNORM, GL_RG16_SNORM, GL_SRGB8_ALPHA8, GL_RGB9_E5, /* 24 bits */ GL_RGB8, GL_RGB8_SNORM, GL_SRGB8, GL_RGB8UI, GL_RGB8I, /* 16 bits */ GL_R16F, GL_RG8UI, GL_R16UI, GL_RG8I, GL_R16I, GL_RG8, GL_R16, GL_RG8_SNORM, GL_R16_SNORM, /* 8 bits */ GL_R8UI, GL_R8I, GL_R8, GL_R8_SNORM, /* a sampling of unsized formats */ GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_RGB, GL_RGBA, GL_DEPTH_COMPONENT, GL_COMPRESSED_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_INTENSITY, GL_COMPRESSED_RGB, GL_COMPRESSED_RGBA, GL_COMPRESSED_RGBA, GL_COMPRESSED_SRGB, GL_COMPRESSED_SRGB_ALPHA, GL_COMPRESSED_SLUMINANCE, GL_COMPRESSED_SLUMINANCE_ALPHA, /* format that is legal for TexStorage but not in table */ GL_RGB12 }; glGenTextures(1, &tex); /* orig tex */ glBindTexture(target, tex); switch (format_class) { case GL_VIEW_CLASS_128_BITS: glTexStorage2D(target, levels, GL_RGBA32F, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RGBA32F, GL_RGBA32UI, GL_RGBA32I, 0); break; case GL_VIEW_CLASS_96_BITS: glTexStorage2D(target, levels, GL_RGB32F, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RGB32F, GL_RGB32UI, GL_RGB32I, 0); break; case GL_VIEW_CLASS_64_BITS: glTexStorage2D(target, levels, GL_RGBA16F, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RGBA16F, GL_RG32F, GL_RGBA16UI, GL_RG32UI, GL_RGBA16I, GL_RG32I, GL_RGBA16, GL_RGBA16_SNORM, 0); break; case GL_VIEW_CLASS_48_BITS: glTexStorage2D(target, levels, GL_RGB16, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RGB16, GL_RGB16_SNORM, GL_RGB16F, GL_RGB16UI, GL_RGB16I, 0); break; case GL_VIEW_CLASS_32_BITS: glTexStorage2D(target, levels, GL_RG16F, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RG16F, GL_R11F_G11F_B10F, GL_R32F, GL_RGB10_A2UI, GL_RGBA8UI, GL_RG16UI, GL_R32UI, GL_RGBA8I, GL_RG16I, GL_R32I, GL_RGB10_A2, GL_RGBA8, GL_RG16, GL_RGBA8_SNORM, GL_RG16_SNORM, GL_SRGB8_ALPHA8, GL_RGB9_E5, 0); break; case GL_VIEW_CLASS_24_BITS: glTexStorage2D(target, levels, GL_RGB8, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RGB8, GL_RGB8_SNORM, GL_SRGB8, GL_RGB8UI, GL_RGB8I, 0); break; case GL_VIEW_CLASS_16_BITS: glTexStorage2D(target, levels, GL_R16F, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_R16F, GL_RG8UI, GL_R16UI, GL_RG8I, GL_R16I, GL_RG8, GL_R16, GL_RG8_SNORM, GL_R16_SNORM, 0); break; case GL_VIEW_CLASS_8_BITS: glTexStorage2D(target, levels, GL_R8I, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_R8UI, GL_R8I, GL_R8, GL_R8_SNORM, 0); break; case VIEW_CLASS_NOT_IN_TABLE: glTexStorage2D(target, levels, GL_RGB12, width, height); numFormats = update_valid_arrays(legalFormats, illegalFormats, ARRAY_SIZE(illegalFormats), GL_RGB12, 0); break; default: assert(!"Invalid format_class\n"); } if (!piglit_check_gl_error(GL_NO_ERROR)) { printf("%s Found gl errors prior to testing glTextureView\n", TestName); pass = false; goto err_out; } /* ensure TextureView of legal formats gives no gl error */ pass = check_format_array(GL_NO_ERROR, numFormats, legalFormats, target, tex, levels, layers) && pass; /* ensure TextureView of illegal formats returns an error */ pass = check_format_array(GL_INVALID_OPERATION, ARRAY_SIZE(illegalFormats), illegalFormats, target, tex, levels, layers) && pass; err_out: glDeleteTextures(1, &tex); return pass; }