From: Marek Olšák <[email protected]> --- tests/texturing/tex-miplevel-selection.c | 173 ++++++++++++++++++++----------- 1 file changed, 115 insertions(+), 58 deletions(-)
diff --git a/tests/texturing/tex-miplevel-selection.c
b/tests/texturing/tex-miplevel-selection.c
index e6304bc..85522ad 100644
--- a/tests/texturing/tex-miplevel-selection.c
+++ b/tests/texturing/tex-miplevel-selection.c
@@ -551,15 +551,97 @@ draw_quad(int x, int y, int w, int h, int baselevel, int
fetch_level, int expect
glEnd();
}
+static bool
+colors_equal(const float *c1, const unsigned char *c2)
+{
+ int i;
+
+ for (i = 0; i < 3; i++)
+ if (fabs(c1[i] - (c2[i]/255.0)) > 0.01)
+ return false;
+ return true;
+}
+
+static bool
+check_result(const unsigned char *probed, int expected_level,
+ int fetch_level, int baselevel, int maxlevel, int minlod, int
maxlod,
+ int bias, int mipfilter)
+{
+ const float (*colors)[3] = IS_SHADOW(target) ? shadow_colors :
clear_colors;
+
+ if (!colors_equal(colors[expected_level], probed)) {
+ int i;
+ static const float black[] = {0, 0, 0};
+
+ printf("Failure:\n");
+#if 0 /* disabled, not needed unless you are debugging the test */
+ printf(" Expected: %f %f %f\n", colors[expected_level][0],
+ colors[expected_level][1],
colors[expected_level][2]);
+ printf(" Observed: %f %f %f\n", probed[0]/255.0,
+ probed[1]/255.0, probed[2]/255.0);
+#endif
+ printf(" Expected level: %i\n", expected_level);
+
+ if (IS_SHADOW(target)) {
+ if (colors_equal(black, probed))
+ puts(" Observed: shadow comparison failed");
+ else
+ puts(" Observed: unknown value (broken
driver?)");
+ }
+ else {
+ for (i = 0; i < LAST_LEVEL; i++) {
+ if (colors_equal(colors[i], probed)) {
+ printf(" Observed level: %i\n", i);
+ break;
+ }
+ }
+ if (i == LAST_LEVEL) {
+ if (colors_equal(black, probed))
+ puts(" Observed: wrong
layer/face/slice or wrong level");
+ else
+ puts(" Observed: unknown value (broken
driver?)");
+ }
+ }
+
+ printf(" Fetch level: %i, baselevel: %i, maxlevel: %i, "
+ "minlod: %i, maxlod: %i, bias: %i, mipfilter: %s\n",
+ fetch_level, baselevel, maxlevel, minlod,
+ no_lod ? LAST_LEVEL : maxlod, bias, mipfilter ? "yes" :
"no");
+ return false;
+ }
+ return true;
+}
+
+static int
+calc_expected_level(int fetch_level, int baselevel, int maxlevel, int minlod,
+ int maxlod, int bias, int mipfilter)
+{
+ int expected_level;
+
+ if (mipfilter) {
+ if (no_lod) {
+ expected_level = CLAMP(fetch_level + bias,
+ baselevel,
+ maxlevel);
+ } else {
+ expected_level = CLAMP(fetch_level + bias,
+ MIN2(baselevel + minlod,
maxlevel),
+ MIN2(baselevel + maxlod,
maxlevel));
+ }
+ } else {
+ expected_level = baselevel;
+ }
+ assert(expected_level >= 0 && expected_level <= LAST_LEVEL);
+ return expected_level;
+}
+
enum piglit_result
piglit_display(void)
{
int fetch_level, baselevel, maxlevel, minlod, maxlod, bias, mipfilter;
- int expected_level, x, y, total, failed, c;
+ int expected_level, x, y, total, failed;
int start_bias, end_bias;
int start_min_lod, end_min_lod, end_max_lod;
- unsigned char *pix, *p;
- const float (*colors)[3] = IS_SHADOW(target) ? shadow_colors :
clear_colors;
if (no_bias) {
start_bias = 0;
@@ -597,45 +679,42 @@ piglit_display(void)
set_sampler_parameter(GL_TEXTURE_MIN_LOD, minlod);
set_sampler_parameter(GL_TEXTURE_MAX_LOD, maxlod);
}
- if (!no_bias)
+ if (!no_bias &&
test != GL3_TEXTURE_BIAS)
set_sampler_parameter(GL_TEXTURE_LOD_BIAS, bias);
set_sampler_parameter(GL_TEXTURE_MIN_FILTER,
-
mipfilter ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST);
+
mipfilter ? GL_NEAREST_MIPMAP_NEAREST
+
: GL_NEAREST);
x = (total %
(piglit_width/3)) * 3;
y = (total /
(piglit_width/3)) * 3;
- if (mipfilter) {
- if
(no_lod) {
-
expected_level = CLAMP(fetch_level + bias,
-
baselevel,
-
maxlevel);
- } else {
-
expected_level = CLAMP(fetch_level + bias,
-
MIN2(baselevel + minlod, maxlevel),
-
MIN2(baselevel + maxlod, maxlevel));
- }
- } else {
-
expected_level = baselevel;
- }
-
assert(expected_level <= LAST_LEVEL);
+ expected_level
= calc_expected_level(fetch_level, baselevel,
+
maxlevel, minlod, maxlod, bias,
+
mipfilter);
+
+ draw_quad(x, y,
3, 3, baselevel, bias,
+
fetch_level, expected_level);
+
+ if
(in_place_probing) {
+
unsigned char probe[3];
- draw_quad(x, y,
3, 3, baselevel, fetch_level, expected_level);
+
glReadPixels(x, y, 1, 1, GL_RGB,
+
GL_UNSIGNED_BYTE, probe);
- if
(in_place_probing &&
-
!piglit_probe_pixel_rgb(x, y, colors[expected_level])) {
-
failed++;
-
printf(" Expected mipmap level: %i\n", expected_level);
-
printf(" Fetch level: %i, baselevel: %i, maxlevel: %i, "
-
"minlod: %i, maxlod: %i, bias: %i, mipfilter: %s\n",
-
fetch_level, baselevel, maxlevel, minlod,
-
no_lod ? LAST_LEVEL : maxlod, bias, mipfilter ? "yes" : "no");
- }
+ if
(!check_result(probe, expected_level,
+
fetch_level, baselevel,
+
maxlevel, minlod, maxlod,
+
bias, mipfilter)) {
+
failed++;
+ }
+ }
total++;
}
if (!in_place_probing) {
+ unsigned char *pix, *p;
+
pix = malloc(piglit_width * piglit_height * 4);
glReadPixels(0, 0, piglit_width, piglit_height, GL_RGBA,
GL_UNSIGNED_BYTE, pix);
@@ -647,40 +726,18 @@ piglit_display(void)
for (maxlod = minlod; maxlod <=
end_max_lod; maxlod++)
for (bias = start_bias;
bias <= end_bias; bias++)
for (mipfilter
= 0; mipfilter < 2; mipfilter++) {
- if
(mipfilter) {
-
if (no_lod) {
-
expected_level = CLAMP(fetch_level + bias,
-
baselevel,
-
maxlevel);
-
} else {
-
expected_level = CLAMP(fetch_level + bias,
-
MIN2(baselevel + minlod, maxlevel),
-
MIN2(baselevel + maxlod, maxlevel));
-
}
- } else {
-
expected_level = baselevel;
- }
-
assert(expected_level <= 5);
+
expected_level = calc_expected_level(fetch_level,
+
baselevel, maxlevel, minlod,
+
maxlod, bias, mipfilter);
x =
(total % (piglit_width/3)) * 3;
y =
(total / (piglit_width/3)) * 3;
p = pix
+ (y*piglit_width + x)*4;
- for (c
= 0; c < 3; c++) {
-
if (fabs(colors[expected_level][c] - (p[c]/255.0)) > 0.01) {
-
failed++;
-
-
printf("Probe color at (%i,%i)\n", x, y);
-
printf(" Expected: %f %f %f\n", colors[expected_level][0],
-
colors[expected_level][1], colors[expected_level][2]);
-
printf(" Observed: %f %f %f\n", p[0]/255.0, p[1]/255.0, p[2]/255.0);
-
printf(" Expected mipmap level: %i\n", expected_level);
-
printf(" Fetch level: %i, baselevel: %i, maxlevel: %i, "
-
"minlod: %i, maxlod: %i, bias: %i, mipfilter: %s\n",
-
fetch_level, baselevel, maxlevel, minlod,
-
no_lod ? LAST_LEVEL : maxlod, bias, mipfilter ? "yes" : "no");
-
break;
-
}
+ if
(!check_result(p, expected_level, fetch_level,
+
baselevel, maxlevel, minlod,
+
maxlod, bias, mipfilter)) {
+
failed++;
}
total++;
}
--
1.9.1
_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit
